fetch_all
Aprenda sobre a função mysqli_fetch_all() no PHP, usada para buscar todas as linhas de um conjunto de resultados MySQLi como array associativo ou numérico.
A função mysqli_fetch_all() busca todas as linhas de um conjunto de resultados MySQLi de uma vez e as retorna como um único array bidimensional. Em vez de usar um loop com mysqli_fetch_assoc() linha por linha, você obtém todo o conjunto de resultados em uma única chamada — o que é conveniente quando você quer passar os dados para um template, codificá-los como JSON ou processá-los em lote.
Este artigo cobre a sintaxe, as constantes de tipo de resultado, o valor de retorno, exemplos práticos e as armadilhas mais comuns.
Sintaxe e parâmetros
mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array| Parâmetro | Descrição |
|---|---|
$result | Um object mysqli_result retornado por mysqli_query(), mysqli_store_result() ou mysqli_use_result(). |
$mode | Opcional. Controla como cada linha é indexada. Um dos valores: MYSQLI_ASSOC, MYSQLI_NUM (padrão) ou MYSQLI_BOTH. |
Valor de retorno: um array bidimensional com todas as linhas. Se o conjunto de resultados estiver vazio, retorna um array vazio [].
| Constante | Cada linha é indexada por |
|---|---|
MYSQLI_ASSOC | Nomes de colunas ($row['name']). |
MYSQLI_NUM | Índices numéricos de colunas ($row[0]). Este é o padrão. |
MYSQLI_BOTH | Tanto nomes quanto índices numéricos. |
Nota:
mysqli_fetch_all()requer o driver mysqlnd. Está disponível desde o PHP 5.3 e funciona tanto com o estilo procedural mostrado aqui quanto com o estilo orientado a object$result->fetch_all().
Como usar mysqli_fetch_all()
Chame a função em um conjunto de resultados válido após executar uma consulta. Aqui buscamos cada linha como um array associativo:
<?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);
?>Passo a passo: mysqli_connect() abre a conexão, e verificamos se foi bem-sucedida para evitar um erro fatal posterior. mysqli_query() executa o SELECT e retorna um mysqli_result. Em seguida, chamamos mysqli_fetch_all($result, MYSQLI_ASSOC), que retorna um array como este:
[
['column1' => 'Anna', 'column2' => 'NYC'],
['column1' => 'Bob', 'column2' => 'LA'],
]Como cada linha é indexada pelo nome da coluna, o loop foreach lê $row['column1'] e $row['column2'] diretamente.
Busca como array numérico ou combinado
O argumento $mode muda como as linhas são indexadas. Passe MYSQLI_NUM para obter índices numéricos, ou MYSQLI_BOTH para obter tanto nomes quanto índices em cada linha. Aqui buscamos um 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);
?>Aqui as linhas retornam indexadas por posição, então lemos as duas primeiras colunas como $row[0] e $row[1]. Com MYSQLI_BOTH, tanto $row[0] quanto $row['column1'] apontariam para o mesmo valor — útil quando você está migrando código, mas dobra o uso de memória por linha.
fetch_all() vs. fetch_assoc() em um loop
mysqli_fetch_all() carrega o conjunto de resultados inteiro na memória PHP de uma vez, liberando você do loop. Em contrapartida, mysqli_fetch_assoc() puxa uma linha por chamada, então um loop while processa as linhas uma de cada vez:
// Equivalent output, but only one row in memory at a time:
while ($row = mysqli_fetch_assoc($result)) {
echo $row['column1'] . " - " . $row['column2'] . "\n";
}Use mysqli_fetch_all() quando o conjunto de resultados for pequeno a moderado e você quiser todas as linhas juntas (por exemplo, para usar json_encode() nelas). Prefira o loop while com mysqli_fetch_assoc() para conjuntos de resultados muito grandes, onde carregar tudo de uma vez poderia esgotar a memória.
Armadilhas comuns
$resultdeve ser válido. Se a consulta falhar,mysqli_query()retornafalse, não um object de resultado — sempre verifique antes de buscar, como os exemplos fazem.- Conjuntos de resultados vazios não são um erro. Quando nenhuma linha corresponde, você obtém
[], e oforeachsimplesmente não faz nada. - Sempre use prepared statements com entradas não confiáveis. O
SELECT * FROM my_tableliteral acima não recebe nenhuma entrada do usuário; para qualquer coisa dinâmica, use parâmetros vinculados para evitar injeção de SQL.
Funções relacionadas
mysqli_fetch_assoc()— busca uma linha de cada vez como array associativo.mysqli_fetch_array()— busca uma linha como array associativo, numérico ou ambos.mysqli_fetch_row()— busca uma linha como array numérico.mysqli_fetch_object()— busca uma linha como object.mysqli_query()— executa a consulta que produz o conjunto de resultados.
Conclusão
mysqli_fetch_all() é a forma mais rápida de extrair um conjunto de resultados MySQLi inteiro para um array PHP. Escolha MYSQLI_ASSOC para chaves legíveis com nomes de colunas, MYSQLI_NUM para chaves numéricas compactas, ou MYSQLI_BOTH quando precisar de ambas. Lembre-se de que ela carrega todas as linhas na memória, portanto, para conjuntos de dados grandes, um loop linha a linha com mysqli_fetch_assoc() é a escolha mais segura.