fetch_row
Aprende a usar mysqli_fetch_row() en PHP para obtener la siguiente fila de un conjunto de resultados MySQLi como un array enumerado.
La función mysqli_fetch_row() obtiene una fila de un conjunto de resultados MySQLi y la devuelve como un array enumerado — un array indexado numéricamente donde $row[0] es la primera columna seleccionada, $row[1] la segunda, y así sucesivamente. Esta página cubre su sintaxis y valor de retorno, cómo iterar sobre un conjunto de resultados, los estilos procedimental y orientado a objetos, cuándo preferirla sobre las alternativas y los errores comunes a tener en cuenta.
Sintaxis
// Procedural style
mysqli_fetch_row(mysqli_result $result): array|null|false
// Object-oriented style
$result->fetch_row(): array|null|falseEl único argumento es $result — un object de resultado devuelto por mysqli_query(), mysqli_store_result() o mysqli_use_result().
Valor de retorno
| Situación | Valor de retorno |
|---|---|
| Se leyó una fila | Un array enumerado ($row[0], $row[1], …) |
| No hay más filas | null |
| Error | false |
Cada llamada avanza un cursor interno a la siguiente fila, lo que hace que funcione perfectamente dentro de un bucle while. Los valores de las columnas se devuelven como strings (o null para SQL NULL), independientemente del tipo SQL de la columna, a menos que habilites la conversión de tipos nativos mediante mysqlnd.
Ejemplo básico: iterando sobre filas
Debido a que mysqli_fetch_row() devuelve null una vez que se agotan las filas, la condición del bucle termina por sí sola:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (mysqli_connect_errno()) {
die("Connection failed: " . mysqli_connect_error());
}
$result = mysqli_query($mysqli, "SELECT id, name FROM users");
if ($result) {
while ($row = mysqli_fetch_row($result)) {
// $row[0] = id, $row[1] = name (in the order they were SELECTed)
printf("%s: %s\n", $row[0], $row[1]);
}
mysqli_free_result($result);
} else {
echo "Query failed: " . mysqli_error($mysqli);
}
mysqli_close($mysqli);
?>Nos conectamos, comprobamos si hay un error de conexión y luego ejecutamos un SELECT. Dentro del bucle while, cada llamada a mysqli_fetch_row() devuelve la siguiente fila como un array indexado en el orden del SELECT — que es exactamente la razón por la que se recomienda seleccionar columnas explícitas (id, name) en lugar de SELECT *: fija qué índice corresponde a qué columna.
Consejo: Siempre llama a
mysqli_free_result()cuando hayas terminado con un conjunto de resultados para liberar su memoria, especialmente en scripts de larga duración.
Estilo orientado a objetos
La misma lógica con la API OOP, que es la que usa la mayoría del código moderno:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
die("Connection failed: " . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_row()) {
printf("%s: %s\n", $row[0], $row[1]);
}
$result->free();
$mysqli->close();
?>Cuándo usar mysqli_fetch_row()
Utiliza mysqli_fetch_row() cuando:
- Seleccionas un conjunto pequeño y fijo de columnas y prefieres el acceso por índice compacto.
- Estás copiando o transmitiendo filas sin procesar y los nombres de las columnas no importan.
- Quieres la búsqueda con menos overhead (no se construye ningún array de claves asociativas).
Prefiere una de las alternativas cuando los nombres o los objetos sean más convenientes:
mysqli_fetch_assoc()— devuelve un array asociativo con clave por nombre de columna ($row['name']). Más legible y robusto si cambia el orden del SELECT.mysqli_fetch_array()— devuelve claves tanto numéricas como asociativas.mysqli_fetch_object()— devuelve cada fila como un object ($row->name).mysqli_fetch_all()— devuelve todas las filas a la vez en un único array.
Errores comunes
- Los índices siguen el orden del SELECT, no el orden de la tabla.
SELECT *hace que$rowsea frágil porque agregar una columna a la tabla desplaza silenciosamente los índices. Selecciona las columnas explícitamente. - Los valores son strings. Una columna numérica devuelve
"42", no42. Conviértelo ((int) $row[0]) si necesitas un número real. nullfrente afalse. Un buclewhiletrata ambos como falsy, por lo que termina correctamente en cualquier caso — pero si obtienes una sola fila manualmente, distingue "no hay más filas" (null) de "error" (false).- Resultado en buffer frente a sin buffer. Con
mysqli_use_result()(sin buffer) debes obtener todas las filas antes de ejecutar otra consulta en la misma conexión.
Para una visión general de la conexión y las consultas, consulta la descripción general de MySQLi y mysqli_connect().