fetch_row
Aprenda a usar mysqli_fetch_row() em PHP para buscar linhas de um resultado MySQLi como array enumerado, com exemplos e dicas práticas.
A função mysqli_fetch_row() busca uma linha de um conjunto de resultados MySQLi e a retorna como um array enumerado — um array simples indexado numericamente onde $row[0] é a primeira coluna selecionada, $row[1] a segunda, e assim por diante. Esta página aborda sua sintaxe e valor de retorno, como percorrer um conjunto de resultados em loop, os estilos procedural e orientado a objetos, quando preferí-la em relação às alternativas e os pontos de atenção.
Sintaxe
// Procedural style
mysqli_fetch_row(mysqli_result $result): array|null|false
// Object-oriented style
$result->fetch_row(): array|null|falseO único argumento é $result — um objeto de resultado retornado por mysqli_query(), mysqli_store_result() ou mysqli_use_result().
Valor de retorno
| Situação | Valor de retorno |
|---|---|
| Uma linha foi lida | Um array enumerado ($row[0], $row[1], …) |
| Sem mais linhas | null |
| Falha | false |
Cada chamada avança um cursor interno para a próxima linha, o que faz com que funcione perfeitamente dentro de um loop while. Os valores das colunas retornam como strings (ou null para SQL NULL), independentemente do tipo SQL da coluna, a menos que você habilite a conversão de tipos nativos via mysqlnd.
Exemplo básico: percorrendo linhas em loop
Como mysqli_fetch_row() retorna null quando as linhas se esgotam, a condição do loop termina automaticamente:
<?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);
?>Conectamos, verificamos um erro de conexão e depois executamos um SELECT. Dentro do loop while, cada chamada a mysqli_fetch_row() retorna a próxima linha como um array indexado na ordem do SELECT — é exatamente por isso que selecionar colunas explícitas (id, name) em vez de SELECT * é recomendado: isso define com precisão qual índice corresponde a qual coluna.
Dica: Sempre chame
mysqli_free_result()quando terminar com um conjunto de resultados para liberar sua memória, especialmente em scripts de longa duração.
Estilo orientado a objetos
A mesma lógica com a API OOP, que a maioria do código moderno utiliza:
<?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();
?>Quando usar mysqli_fetch_row()
Recorra a mysqli_fetch_row() quando:
- Você selecionar um conjunto pequeno e fixo de colunas e preferir acesso compacto por índice.
- Estiver copiando ou transmitindo linhas brutas e os nomes das colunas não importarem.
- Quiser o fetch com menor sobrecarga possível (nenhum array de chaves associativas é criado).
Prefira uma das alternativas quando nomes ou objetos forem mais convenientes:
mysqli_fetch_assoc()— retorna um array associativo indexado pelo nome da coluna ($row['name']). Mais legível e robusto se a ordem do SELECT mudar.mysqli_fetch_array()— retorna tanto chaves numéricas quanto associativas.mysqli_fetch_object()— retorna cada linha como um object ($row->name).mysqli_fetch_all()— retorna todas as linhas de uma vez em um único array.
Pontos de atenção comuns
- Os índices seguem a ordem do SELECT, não a ordem da tabela.
SELECT *torna$rowfrágil porque adicionar uma coluna à tabela desloca os índices silenciosamente. Selecione colunas explicitamente. - Os valores são strings. Uma coluna numérica retorna como
"42", não42. Faça o cast ((int) $row[0]) se precisar de um número real. nullvs.false. Um loopwhiletrata ambos como falsy, então termina corretamente nos dois casos — mas se você buscar uma única linha manualmente, distinga "sem mais linhas" (null) de "erro" (false).- Buffered vs. unbuffered. Com
mysqli_use_result()(unbuffered), você deve buscar todas as linhas antes de executar outra consulta na mesma conexão.
Para uma visão geral de conexão e consultas, consulte a visão geral do MySQLi e mysqli_connect().