web-dev-qa-db-fra.com

MySQLi équivalent à mysql_result ()?

Je porte un ancien code PHP de mysql vers MySQLi et j'ai rencontré un problème mineur. 

N'y a-t-il pas d'équivalent à l'ancienne fonction mysql_result()?

Je sais que mysql_result() est plus lent que les autres fonctions lorsque vous travaillez avec plus d'une ligne, mais souvent, je n'ai qu'un seul résultat et un seul champ. Son utilisation 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 qui me manque? Ou vais-je devoir tout gâcher et tout faire:

if ($r && $r->num_rows)  
{  
    $row = $r->fetch_assoc();  
    $blarg = $row['blah'];  
}
38
DOOManiac

PHP 5.4 supporte maintenant fonction dereferencing tableau , ce qui signifie que vous pouvez faire ceci:

if ($r && $r->num_rows)  
{  
    $row = $r->fetch_assoc()['blah'];  
}
14
Clamburger

Alors que répondait, je pensais pouvoir améliorer la réponse donnée après avoir posé la même question. La fonction suivante réplique entièrement la fonction mysql_result () et renvoie false lorsque vous êtes hors limites sur votre demande (résultat vide, aucune ligne de ce nombre, aucune colonne de ce nombre). Il présente l'avantage supplémentaire que, si vous ne spécifiez pas la ligne, il suppose 0,0 (une valeur de moins à transmettre). La fonction a été mise à jour pour permettre le décalage numérique du champ ou du 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;
}
34
Mario Lurig

Vous pouvez le faire en récupérant 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 une méthode de chaînage comme celle-ci.

Si vous utilisez une procédure procédurale MySQLi, vous pouvez également écrire votre propre fonction mysqli_result qui correspond à mysql_result.

4
HertzaHaeon
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
Cris

Eh bien, vous pouvez toujours le réduire à quelque chose comme ceci:

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

Mais cela pourrait être aussi bon que vous allez obtenir.

3
Dereleased

Je vous suggère d'ajouter cette ligne à la solution de Cris afin de pouvoir obtenir un résultat à la fois en faisant db_result('mytable.myfield) et db_result('myfield') puisqu'il s'agit du comportement par défaut de la fonction mysql_result d'origine.

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
nfroidure

Si vous sélectionnez un seul champ dans la requête et que vous attendez uniquement les données renvoyées d'un champ sélectionné, cela fonctionne: 

function mysqli_datum($result)
{
    if ($result->num_rows == 0)
        return;
    $result->data_seek(0);
    $row=$result->fetch_row();     
    return $row[0];
}
0
netrox

Voici une adaptation de la réponse de Mario Lurig en utilisant un objet mysqli_result au lieu de la version procédurale de mysqli.

/**
 * Accepts int column index or column name.
 *
 * @param mysqli_result $result
 * @param int $row
 * @param int|string $col
 * @return bool
 */
function resultMysqli(mysqli_result $result,$row=0,$col=0) { 
    //PHP7 $row can use "int" type hint in signature
    $row = (int)$row; // PHP5 - cast to int
    if(!is_numeric($col) ) { // cast to string or int
        $col = (string)$col;
    } else {
        $col = (int)$col;
    }
    $numrows = $result->num_rows;
    if ($numrows && $row <= ($numrows-1) && $row >=0) {
        $result->data_seek($row);
        $resrow = (is_numeric($col)) ? $result->fetch_row() : $result->fetch_assoc();
        if (isset($resrow[$col])){
            return $resrow[$col];
        }
    }
    return false;
}
0
Buttle Butkus