php - mysqli_query - mysqli_result();
MySQLi equivalente de mysql_result()? (10)
Bueno, siempre puedes acortarlo a algo como esto:
if ($r && $r->num_rows)
list($blarg) = $r->fetch_row();
Pero eso podría ser tan bueno como lo que obtendrás.
Estoy portando un código PHP antiguo de mysql a MySQLi, y me encontré con un inconveniente menor.
¿No hay un equivalente a la antigua función mysql_result()
?
Sé que mysql_result()
es más lento que las otras funciones cuando trabajas con más de 1 fila, pero una gran parte del tiempo tengo solo 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 hay tal cosa. :(
¿Se me escapa algo? O voy a tener que aguantar y hacer todo:
if ($r && $r->num_rows)
{
$row = $r->fetch_assoc();
$blarg = $row[''blah''];
}
Esta es una buena respuesta, desde 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;
}
?>
Le sugiero que agregue esta línea a la solución de Cris para poder obtener un resultado haciendo tanto db_result(''mytable.myfield)
como db_result(''myfield'')
ya que es el comportamiento predeterminado de la función mysql_result
original.
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)]:''''));
}
Mientras respondía , pensé que podría mejorar la respuesta dada después de tener la misma pregunta. La siguiente función replica por completo la función mysql_result () y devuelve falso cuando está fuera de límites en 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, asume 0,0 (se pasará un valor menos). La función se actualizó para permitir 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 es compatible con eliminación de referencias de matriz de funciones , lo que significa que puede hacer esto:
if ($r && $r->num_rows)
{
$row = $r->fetch_assoc()[''blah''];
}
Puede hacer esto obteniendo un objeto en lugar de una matriz.
$mysqli->query("SELECT email FROM users WHERE userid = ''foo''")->fetch_object()->email;
Necesita PHP 5+ para usar el método de encadenamiento de esta manera.
Alternativamente, si usa MySQLi de procedimiento, es fácil escribir su propia función mysqli_result
que coincida con mysql_result
.
Si está buscando una biblioteca robusta para hacer una conexión de base de datos, le sugiero que use AdoDB . Esta biblioteca se puede conectar a múltiples bases de datos, y no tiene que reescribir su consulta si cambia la base de datos, siempre que no contenga ningún SQL específico para un determinado motor de base de datos. Consulte esta página para obtener una muestra de uso. Además, si usa PHP5, puede usar foreach para la iteración .
Espero que esto te ayude a convertir cualquier código antiguo en un código de base de datos más sólido y cruzado.
Si selecciona solo UN campo en la consulta y solo espera un único resultado devuelto de un campo seleccionado, entonces esto funciona:
function mysqli_datum($result)
{
if ($result->num_rows == 0)
return;
$result->data_seek(0);
$row=$result->fetch_row();
return $row[0];
}
Utilizo la siguiente función para reemplazar 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];
}
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;
}