W3docs

fetch_all

Aprende a usar mysqli_fetch_all() en PHP para obtener todas las filas de un resultado MySQLi como un array asociativo o numérico.

La función mysqli_fetch_all() obtiene todas las filas de un resultado MySQLi de una vez y las devuelve como un único array bidimensional. En lugar de iterar con mysqli_fetch_assoc() fila por fila, obtienes todo el conjunto de resultados en una sola llamada — lo cual es conveniente cuando quieres pasar los datos a una plantilla, codificarlos como JSON o procesarlos en bloque.

Este artículo cubre la sintaxis, las constantes de tipo de resultado, el valor de retorno, ejemplos de uso y los errores más comunes.

Sintaxis y parámetros

mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array
ParámetroDescripción
$resultUn objeto mysqli_result devuelto por mysqli_query(), mysqli_store_result() o mysqli_use_result().
$modeOpcional. Controla cómo se indexa cada fila. Uno de MYSQLI_ASSOC, MYSQLI_NUM (por defecto) o MYSQLI_BOTH.

Valor de retorno: un array bidimensional con todas las filas. Si el conjunto de resultados está vacío, devuelve un array vacío [].

ConstanteCada fila se indexa por
MYSQLI_ASSOCNombres de columna ($row['name']).
MYSQLI_NUMÍndices numéricos de columna ($row[0]). Este es el valor por defecto.
MYSQLI_BOTHTanto nombres como índices numéricos.

Nota: mysqli_fetch_all() requiere el driver mysqlnd. Está disponible desde PHP 5.3 y funciona tanto con el estilo procedimental mostrado aquí como con el estilo orientado a objetos $result->fetch_all().

Cómo usar mysqli_fetch_all()

Llama a la función sobre un conjunto de resultados válido después de ejecutar una consulta. Aquí obtenemos cada fila como un array asociativo:

<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");

if (!$mysqli) {
    die("Connection failed: " . mysqli_connect_error());
}

$query = "SELECT * FROM my_table";
$result = mysqli_query($mysqli, $query);

if ($result) {
    $rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
    foreach ($rows as $row) {
        echo $row['column1'] . " - " . $row['column2'] . "\n";
    }
}

mysqli_close($mysqli);
?>

Paso a paso: mysqli_connect() abre la conexión, y verificamos que tuvo éxito para evitar un error fatal posterior. mysqli_query() ejecuta el SELECT y devuelve un mysqli_result. Luego llamamos a mysqli_fetch_all($result, MYSQLI_ASSOC), que devuelve un array como este:

[
    ['column1' => 'Anna',  'column2' => 'NYC'],
    ['column1' => 'Bob',   'column2' => 'LA'],
]

Dado que cada fila está indexada por nombre de columna, el bucle foreach lee $row['column1'] y $row['column2'] directamente.

Obtener como array numérico o combinado

El argumento $mode cambia cómo se indexan las filas. Pasa MYSQLI_NUM para obtener índices numéricos, o MYSQLI_BOTH para obtener tanto nombres como índices en cada fila. Aquí obtenemos un array numérico:

<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");

if (!$mysqli) {
    die("Connection failed: " . mysqli_connect_error());
}

$query = "SELECT * FROM my_table";
$result = mysqli_query($mysqli, $query);

if ($result) {
    $rows = mysqli_fetch_all($result, MYSQLI_NUM);
    foreach ($rows as $row) {
        echo $row[0] . " - " . $row[1] . "\n";
    }
}

mysqli_close($mysqli);
?>

Aquí las filas se devuelven indexadas por posición, por lo que leemos las dos primeras columnas como $row[0] y $row[1]. Con MYSQLI_BOTH, tanto $row[0] como $row['column1'] apuntarían al mismo valor — útil cuando estás migrando código, pero duplica la memoria que usa cada fila.

fetch_all() vs. fetch_assoc() en un bucle

mysqli_fetch_all() carga el conjunto de resultados completo en la memoria de PHP de una vez, liberándote de iterar. Por el contrario, mysqli_fetch_assoc() extrae una fila por llamada, por lo que un bucle while procesa las filas de una en una:

// Equivalent output, but only one row in memory at a time:
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['column1'] . " - " . $row['column2'] . "\n";
}

Usa mysqli_fetch_all() cuando el conjunto de resultados sea pequeño o moderado y quieras todas las filas juntas (p. ej. para codificarlas con json_encode()). Prefiere el bucle while con mysqli_fetch_assoc() para conjuntos de resultados muy grandes, donde cargar todo de una vez podría agotar la memoria.

Errores comunes

  • $result debe ser válido. Si la consulta falló, mysqli_query() devuelve false, no un objeto de resultado — verifica siempre antes de obtener datos, tal como hacen los ejemplos.
  • Los conjuntos de resultados vacíos no son un error. Cuando ninguna fila coincide, obtienes [], y el foreach simplemente no hace nada.
  • Usa siempre sentencias preparadas con datos no confiables. El literal SELECT * FROM my_table anterior no toma ninguna entrada del usuario; para cualquier consulta dinámica, vincula parámetros para prevenir inyección SQL.

Funciones relacionadas

Conclusión

mysqli_fetch_all() es la forma más rápida de volcar un conjunto de resultados MySQLi completo en un array de PHP. Elige MYSQLI_ASSOC para claves legibles por nombre de columna, MYSQLI_NUM para claves numéricas compactas, o MYSQLI_BOTH cuando necesites ambas. Recuerda que carga todas las filas en memoria, por lo que para grandes conjuntos de datos un bucle fila por fila con mysqli_fetch_assoc() es la opción más segura.

Práctica

Práctica
¿Qué devuelve mysqli_fetch_all() cuando se llama sobre un conjunto de resultados?
¿Qué devuelve mysqli_fetch_all() cuando se llama sobre un conjunto de resultados?
Was this page helpful?