fetch_all
Découvrez la fonction mysqli_fetch_all() en PHP pour récupérer toutes les lignes d'un résultat MySQLi en un seul appel, avec exemples et conseils.
La fonction mysqli_fetch_all() récupère toutes les lignes d'un résultat MySQLi en une seule fois et les retourne sous forme d'un tableau bidimensionnel unique. Au lieu de boucler avec mysqli_fetch_assoc() ligne par ligne, vous obtenez l'intégralité du résultat en un seul appel — ce qui est pratique lorsque vous souhaitez passer les données à un template, les encoder en JSON ou les traiter en masse.
Cet article couvre la syntaxe, les constantes de type de résultat, la valeur de retour, des exemples concrets et les pièges courants.
Syntaxe et paramètres
mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array| Paramètre | Description |
|---|---|
$result | Un objet mysqli_result retourné par mysqli_query(), mysqli_store_result() ou mysqli_use_result(). |
$mode | Optionnel. Contrôle la façon dont chaque ligne est indexée. L'une des valeurs MYSQLI_ASSOC, MYSQLI_NUM (par défaut) ou MYSQLI_BOTH. |
Valeur de retour : un tableau bidimensionnel contenant toutes les lignes. Si le résultat est vide, la fonction retourne un tableau vide [].
| Constante | Chaque ligne est indexée par |
|---|---|
MYSQLI_ASSOC | Les noms de colonnes ($row['name']). |
MYSQLI_NUM | Les index numériques des colonnes ($row[0]). C'est la valeur par défaut. |
MYSQLI_BOTH | À la fois les noms et les index numériques. |
Remarque :
mysqli_fetch_all()nécessite le pilote mysqlnd. Elle est disponible depuis PHP 5.3 et fonctionne aussi bien avec le style procédural présenté ici qu'avec le style orienté objet$result->fetch_all().
Comment utiliser mysqli_fetch_all()
Appelez la fonction sur un résultat valide après l'exécution d'une requête. Ici, nous récupérons chaque ligne sous forme de tableau associatif :
<?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);
?>Étape par étape : mysqli_connect() ouvre la connexion, et nous vérifions qu'elle a réussi afin d'éviter une erreur fatale ultérieure. mysqli_query() exécute le SELECT et retourne un mysqli_result. Nous appelons ensuite mysqli_fetch_all($result, MYSQLI_ASSOC), qui retourne un tableau comme celui-ci :
[
['column1' => 'Anna', 'column2' => 'NYC'],
['column1' => 'Bob', 'column2' => 'LA'],
]Puisque chaque ligne est indexée par le nom de colonne, la boucle foreach lit $row['column1'] et $row['column2'] directement.
Récupérer sous forme de tableau numérique ou combiné
L'argument $mode change la façon dont les lignes sont indexées. Passez MYSQLI_NUM pour obtenir des index numériques, ou MYSQLI_BOTH pour obtenir à la fois les noms et les index dans chaque ligne. Ici nous récupérons un tableau numérique :
<?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);
?>Ici les lignes sont indexées par position, donc nous lisons les deux premières colonnes via $row[0] et $row[1]. Avec MYSQLI_BOTH, $row[0] et $row['column1'] pointent vers la même valeur — pratique lors de la migration de code, mais cela double la mémoire utilisée par chaque ligne.
fetch_all() vs. fetch_assoc() dans une boucle
mysqli_fetch_all() charge l'intégralité du résultat en mémoire PHP en une seule fois, vous libérant ainsi de la boucle. En revanche, mysqli_fetch_assoc() extrait une ligne par appel, de sorte qu'une boucle while traite les lignes une à la fois :
// Equivalent output, but only one row in memory at a time:
while ($row = mysqli_fetch_assoc($result)) {
echo $row['column1'] . " - " . $row['column2'] . "\n";
}Utilisez mysqli_fetch_all() lorsque le résultat est de taille petite à modérée et que vous souhaitez toutes les lignes ensemble (par exemple pour les encoder avec json_encode()). Préférez la boucle while avec mysqli_fetch_assoc() pour les très grands résultats, où charger tout en même temps risquerait d'épuiser la mémoire.
Pièges courants
$resultdoit être valide. Si la requête a échoué,mysqli_query()retournefalseet non un objet résultat — vérifiez toujours avant de récupérer les données, comme le font les exemples.- Un résultat vide n'est pas une erreur. Lorsqu'aucune ligne ne correspond, vous obtenez
[]et leforeachne fait simplement rien. - Utilisez toujours des requêtes préparées avec des données non fiables. Le
SELECT * FROM my_tablelittéral ci-dessus ne prend aucune entrée utilisateur ; pour tout ce qui est dynamique, liez les paramètres afin de prévenir les injections SQL.
Fonctions associées
mysqli_fetch_assoc()— récupère une ligne à la fois sous forme de tableau associatif.mysqli_fetch_array()— récupère une ligne sous forme associative, numérique ou les deux.mysqli_fetch_row()— récupère une ligne sous forme de tableau numérique.mysqli_fetch_object()— récupère une ligne sous forme d'objet.mysqli_query()— exécute la requête qui produit le résultat.
Conclusion
mysqli_fetch_all() est le moyen le plus rapide de récupérer l'intégralité d'un résultat MySQLi dans un tableau PHP. Choisissez MYSQLI_ASSOC pour des clés lisibles basées sur les noms de colonnes, MYSQLI_NUM pour des clés numériques compactes, ou MYSQLI_BOTH lorsque vous avez besoin des deux. N'oubliez pas que cette fonction charge toutes les lignes en mémoire, donc pour les grands jeux de données, une boucle ligne par ligne avec mysqli_fetch_assoc() est le choix le plus sûr.