¿Equivalente MySQLi de mysql_result()?
Estoy transfiriendo un código PHP antiguo de mysql a MySQLi y me encontré con un problema menor.
¿ No existe ningún equivalente a la mysql_result()
función anterior?
Sé que mysql_result()
es más lento que las otras funciones cuando trabajas con más de 1 fila, pero muchas veces solo tengo 1 resultado y 1 campo. Usarlo me permite condensar 4 líneas en 1.
Código antiguo:
if ($r && mysql_num_rows($r))
$blarg = mysql_result($r, 0, 'blah');
Código deseado:
if ($r && $r->num_rows)
$blarg = $r->result(0, 'blah');
Pero no existe tal cosa. :(
¿Se me escapa algo? ¿O tendré que aguantar y hacer todo?
if ($r && $r->num_rows)
{
$row = $r->fetch_assoc();
$blarg = $row['blah'];
}
La siguiente función replica completamente la mysql_result()
función y regresa false
cuando está fuera de los límites de su solicitud (resultado vacío, sin fila de ese número, sin columna de ese número). Tiene el beneficio adicional de que, si no especifica la fila, se supone 0,0 (se debe pasar un valor menos). La función permite el desplazamiento numérico del campo o el nombre del campo.
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;
}
PHP 5.4 ahora admite la desreferenciación de matrices de funciones y 7.0 admite un operador coalescente nulo , lo que significa que simplemente puedes hacer esto:
$value = $r->fetch_assoc()['blah'] ?? false;
o incluso una variante más genérica donde no es necesario proporcionar el nombre de la columna,
$value = $r->fetch_row()[0] ?? false;
tenga en cuenta que ni siquiera necesita la if ($r && $r->num_rows)
condición.
Puedes hacer esto buscando un objeto en lugar de una matriz.
$mysqli->query("SELECT email FROM users WHERE userid = 'foo'")->fetch_object()->email;
Bueno, siempre puedes acortarlo a algo como esto:
if ($r && $r->num_rows)
list($blarg) = $r->fetch_row();
Pero eso podría ser lo mejor que obtendrás.