¿Equivalente MySQLi de mysql_result()?

Resuelto DOOManiac asked hace 54 años • 12 respuestas

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'];  
}
DOOManiac avatar Jan 01 '70 08:01 DOOManiac
Aceptado

La siguiente función replica completamente la mysql_result()función y regresa falsecuando 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;
}
Mario Lurig avatar Jan 06 '2014 23:01 Mario Lurig

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.

Clamburger avatar Dec 07 '2012 14:12 Clamburger

Puedes hacer esto buscando un objeto en lugar de una matriz.

$mysqli->query("SELECT email FROM users WHERE userid = 'foo'")->fetch_object()->email;
HertzaHaeon avatar May 05 '2011 12:05 HertzaHaeon

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.

Dereleased avatar Jan 18 '2010 22:01 Dereleased