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'];
}
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'];
}
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;
}
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
.
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;
}
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.
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)]:''));
}
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];
}
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;
}