Équivalent MySQLi du résultat mysql ()?

je transfère un vieux code PHP de mysql à MySQLi, et j'ai rencontré un problème mineur.

Est-il pas l'équivalent de l'ancien mysql_result() fonction?

je sais mysql_result() est plus lent que les autres fonctions lorsque vous travaillez avec plus d'une rangée, mais la plupart du temps je n'ai qu'un résultat et un champ. L'utiliser me permet de condenser 4 lignes en 1.

ancien code:

if ($r && mysql_num_rows($r))  
    $blarg = mysql_result($r, 0, 'blah');

code désiré:

if ($r && $r->num_rows)  
    $blarg = $r->result(0, 'blah');

Mais il n'y a pas une telle chose. : (

y a-t-il quelque chose que je manque? Ou vais-je devoir l'aspirer et tout faire:

if ($r && $r->num_rows)  
{  
    $row = $r->fetch_assoc();  
    $blarg = $row['blah'];  
}
37
demandé sur Michael Berkowski 2010-01-19 01:07:58

10 réponses

PHP 5.4 supporte maintenant dereferencing des tableaux de fonctions, ce qui signifie que vous pouvez faire ceci:

if ($r && $r->num_rows)  
{  
    $row = $r->fetch_assoc()['blah'];  
}
14
répondu Clamburger 2012-12-07 14:18:57

répondu, j'ai pensé que je pourrais améliorer la réponse donnée après avoir la même question. La fonction suivante reproduit entièrement la fonction mysql_result (), et retourne false lorsque vous êtes hors limite sur votre requête (résultat vide, aucune ligne de ce nombre, aucune colonne de ce nombre). Il a l'avantage que, si vous ne spécifiez pas la ligne, il suppose 0,0 (moins de valeur à être passé). La fonction a été mise à jour pour permettre le numérique décalage du champ ou le nom du champ.

function mysqli_result($res,$row=0,$col=0){ 
    $numrows = mysqli_num_rows($res); 
    if ($numrows && $row <= ($numrows-1) && $row >=0){
        mysqli_data_seek($res,$row);
        $resrow = (is_numeric($col)) ? mysqli_fetch_row($res) : mysqli_fetch_assoc($res);
        if (isset($resrow[$col])){
            return $resrow[$col];
        }
    }
    return false;
}
30
répondu Mario Lurig 2014-12-27 06:49:55
function db_result($result,$row,$field) { 
  if($result->num_rows==0) return 'unknown'; 
  $result->data_seek($row);
  $ceva=$result->fetch_assoc(); 
  $rasp=$ceva[$field]; 
  return $rasp; 
}
4
répondu Cris 2011-05-05 16:18:54

Vous pouvez le faire en allant chercher un objet au lieu d'un tableau.

$mysqli->query("SELECT email FROM users WHERE userid = 'foo'")->fetch_object()->email;

vous avez besoin de PHP 5+ pour utiliser le chaînage de méthode comme ceci.

alternativement, si vous utilisez mysqli procédural, il est facile d'écrire votre propre mysqli_result fonction qui correspond à mysql_result.

4
répondu HertzaHaeon 2017-06-13 03:43:53

Eh bien, vous pouvez toujours raccourcir à quelque chose comme ceci:

if ($r && $r->num_rows)
    list($blarg) = $r->fetch_row();

mais ce pourrait être aussi bon que vous allez obtenir.

3
répondu Dereleased 2010-01-18 22:11:56

je vous suggère d'ajouter cette ligne à la solution de Cris afin de pouvoir obtenir un résultat en faisant tous les deux db_result('mytable.myfield) et db_result('myfield') puisque c'est le comportement par défaut de l'original mysql_result fonction.

function db_result($result,$row,$field) { 
    if($result->num_rows==0) return 'unknown'; 
    $result->data_seek($row);
    $ceva=$result->fetch_assoc(); 
    return (isset($ceva[$field])?$ceva[$field]
        :(strpos($field,'.')?$ceva[substr($field,strrpos($field,'.')+1)]:'')); 
}
1
répondu nfroidure 2017-06-13 03:51:45

si vous sélectionnez un seul champ dans la requête et que vous attendez seulement une seule donnée retournée d'un champ sélectionné, alors cela fonctionne:

function mysqli_datum($result)
{
    if ($result->num_rows == 0)
        return;
    $result->data_seek(0);
    $row=$result->fetch_row();     
    return $row[0];
}
0
répondu netrox 2017-06-13 03:53:22

C'est une bonne réponse de http://php.net/manual/es/class.mysqli-result.php

<?php
function mysqli_result($result,$row,$field=0) {
    if ($result===false) return false;
    if ($row>=mysqli_num_rows($result)) return false;
    if (is_string($field) && !(strpos($field,".")===false)) {
        $t_field=explode(".",$field);
        $field=-1;
        $t_fields=mysqli_fetch_fields($result);
        for ($id=0;$id<mysqli_num_fields($result);$id++) {
            if ($t_fields[$id]->table==$t_field[0] && $t_fields[$id]->name==$t_field[1]) {
                $field=$id;
                break;
            }
        }
        if ($field==-1) return false;
    }
    mysqli_data_seek($result,$row);
    $line=mysqli_fetch_array($result);
    return isset($line[$field])?$line[$field]:false;
}
?>
-1
répondu Fred 2014-12-16 00:25:23

j'ai utiliser la fonction suivante pour remplacer mysql_result()

function mysqli_result($result, $iRow, $field = 0)
{
    if(!mysqli_data_seek($result, $iRow))
        return false;
    if(!($row = mysqli_fetch_array($result)))
        return false;
    if(!array_key_exists($field, $row))
        return false;
    return $row[$field];
}
-1
répondu Dima L. 2015-10-29 12:42:12

si vous cherchez une bibliothèque robuste pour faire la connexion de base de données, je vous suggère d'utiliser AdoDB. Cette bibliothèque peut se connecter à plusieurs bases de données, et vous n'avez pas à réécrire votre requête si vous changez la base de données, tant qu'elle ne contient pas de SQL spécifique pour un certain moteur de base de données. Vérifier cette page pour une utilisation de l'échantillon. De plus, si vous utilisez PHP5, vous pouvez utiliser pour chaque itération.

j'espère que cela va vous aider à convertir n'importe quel vieux code vers un code de base de données plus robuste et croisé.

-4
répondu Donny Kurnia 2017-06-13 03:45:58