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ámetro | Descripción |
|---|---|
$result | Un objeto mysqli_result devuelto por mysqli_query(), mysqli_store_result() o mysqli_use_result(). |
$mode | Opcional. 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 [].
| Constante | Cada fila se indexa por |
|---|---|
MYSQLI_ASSOC | Nombres de columna ($row['name']). |
MYSQLI_NUM | Índices numéricos de columna ($row[0]). Este es el valor por defecto. |
MYSQLI_BOTH | Tanto 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
$resultdebe ser válido. Si la consulta falló,mysqli_query()devuelvefalse, 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 elforeachsimplemente no hace nada. - Usa siempre sentencias preparadas con datos no confiables. El literal
SELECT * FROM my_tableanterior no toma ninguna entrada del usuario; para cualquier consulta dinámica, vincula parámetros para prevenir inyección SQL.
Funciones relacionadas
mysqli_fetch_assoc()— obtiene una fila a la vez como array asociativo.mysqli_fetch_array()— obtiene una fila como asociativo, numérico o ambos.mysqli_fetch_row()— obtiene una fila como array numérico.mysqli_fetch_object()— obtiene una fila como objeto.mysqli_query()— ejecuta la consulta que produce el conjunto de resultados.
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.