W3docs

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|false

El único argumento es $result — un object de resultado devuelto por mysqli_query(), mysqli_store_result() o mysqli_use_result().

Valor de retorno

SituaciónValor de retorno
Se leyó una filaUn array enumerado ($row[0], $row[1], …)
No hay más filasnull
Errorfalse

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:

Errores comunes

  • Los índices siguen el orden del SELECT, no el orden de la tabla. SELECT * hace que $row sea 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", no 42. Conviértelo ((int) $row[0]) si necesitas un número real.
  • null frente a false. Un bucle while trata 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().

Práctica

Práctica
¿Cuáles de las siguientes afirmaciones son verdaderas sobre la función PHP mysqli_fetch_row()?
¿Cuáles de las siguientes afirmaciones son verdaderas sobre la función PHP mysqli_fetch_row()?
Was this page helpful?