W3docs

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âmetroDescrição
$resultUm object mysqli_result retornado por mysqli_query(), mysqli_store_result() ou mysqli_use_result().
$modeOpcional. 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 [].

ConstanteCada linha é indexada por
MYSQLI_ASSOCNomes de colunas ($row['name']).
MYSQLI_NUMÍndices numéricos de colunas ($row[0]). Este é o padrão.
MYSQLI_BOTHTanto 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$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

  • $result deve ser válido. Se a consulta falhar, mysqli_query() retorna false, 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 o foreach simplesmente não faz nada.
  • Sempre use prepared statements com entradas não confiáveis. O SELECT * FROM my_table literal 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

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.

Prática

Prática
O que mysqli_fetch_all() retorna quando chamada em um conjunto de resultados?
O que mysqli_fetch_all() retorna quando chamada em um conjunto de resultados?
Was this page helpful?