fetch_all
Erklärung der mysqli_fetch_all()-Funktion in PHP: Syntax, Konstanten, Rückgabewert und Beispiele zum Abrufen aller Zeilen eines Ergebnisses.
Die Funktion mysqli_fetch_all() lädt alle Zeilen eines MySQLi-Ergebnisses auf einmal und gibt sie als zweidimensionales array zurück. Anstatt mit mysqli_fetch_assoc() Zeile für Zeile zu iterieren, erhält man das gesamte Ergebnis in einem einzigen Aufruf — was praktisch ist, wenn man die Daten an ein Template übergeben, als JSON kodieren oder gebündelt verarbeiten möchte.
Dieser Artikel behandelt die Syntax, die Ergebnistyp-Konstanten, den Rückgabewert, funktionierende Beispiele und häufige Fehlerquellen.
Syntax und Parameter
mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array| Parameter | Beschreibung |
|---|---|
$result | Ein mysqli_result-object, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wurde. |
$mode | Optional. Legt fest, wie jede Zeile indiziert wird. Einer der Werte: MYSQLI_ASSOC, MYSQLI_NUM (Standard) oder MYSQLI_BOTH. |
Rückgabewert: ein zweidimensionales array mit allen Zeilen. Ist das Ergebnis leer, wird ein leeres array [] zurückgegeben.
| Konstante | Jede Zeile wird indiziert nach |
|---|---|
MYSQLI_ASSOC | Spaltennamen ($row['name']). |
MYSQLI_NUM | Numerischen Spaltenindexen ($row[0]). Dies ist der Standard. |
MYSQLI_BOTH | Sowohl Namen als auch numerischen Indexen. |
Hinweis:
mysqli_fetch_all()benötigt den mysqlnd-Treiber. Die Funktion ist seit PHP 5.3 verfügbar und funktioniert sowohl mit dem hier gezeigten prozeduralen Stil als auch mit dem objektorientierten Stil$result->fetch_all().
Verwendung von mysqli_fetch_all()
Rufen Sie die Funktion nach der Ausführung einer Abfrage auf einem gültigen Ergebnisobjekt auf. Hier werden alle Zeilen als assoziatives array abgerufen:
<?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);
?>Schritt für Schritt: mysqli_connect() öffnet die Verbindung, und wir prüfen, ob sie erfolgreich war, um einen späteren schwerwiegenden Fehler zu vermeiden. mysqli_query() führt das SELECT aus und gibt ein mysqli_result zurück. Dann rufen wir mysqli_fetch_all($result, MYSQLI_ASSOC) auf, das ein array wie dieses zurückgibt:
[
['column1' => 'Anna', 'column2' => 'NYC'],
['column1' => 'Bob', 'column2' => 'LA'],
]Da jede Zeile nach dem Spaltennamen indiziert ist, liest die foreach-Schleife $row['column1'] und $row['column2'] direkt aus.
Abrufen als numerisches oder kombiniertes Array
Das Argument $mode ändert die Indizierung der Zeilen. Übergeben Sie MYSQLI_NUM für numerische Indizes oder MYSQLI_BOTH, um in jeder Zeile sowohl Namen als auch Indizes zu erhalten. Hier wird ein numerisches array abgerufen:
<?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);
?>Hier werden die Zeilen nach Position indiziert, sodass wir die ersten beiden Spalten als $row[0] und $row[1] lesen. Mit MYSQLI_BOTH würden sowohl $row[0] als auch $row['column1'] auf denselben Wert zeigen — praktisch bei der Code-Migration, aber es verdoppelt den Speicherbedarf jeder Zeile.
fetch_all() vs. fetch_assoc() in einer Schleife
mysqli_fetch_all() lädt das gesamte Ergebnis auf einmal in den PHP-Speicher und befreit Sie vom Schleifen. Im Gegensatz dazu ruft mysqli_fetch_assoc() eine Zeile pro Aufruf ab, sodass eine while-Schleife die Zeilen einzeln verarbeitet:
// Equivalent output, but only one row in memory at a time:
while ($row = mysqli_fetch_assoc($result)) {
echo $row['column1'] . " - " . $row['column2'] . "\n";
}Verwenden Sie mysqli_fetch_all(), wenn das Ergebnis klein bis mittelgroß ist und Sie alle Zeilen zusammen benötigen (z. B. um sie mit json_encode() zu kodieren). Bevorzugen Sie die while-Schleife mit mysqli_fetch_assoc() bei sehr großen Ergebnissen, bei denen das gleichzeitige Laden aller Daten den Speicher erschöpfen könnte.
Häufige Fehlerquellen
$resultmuss gültig sein. Wenn die Abfrage fehlgeschlagen ist, gibtmysqli_query()falsezurück und kein Ergebnisobjekt — prüfen Sie dies immer vor dem Abrufen, wie in den Beispielen gezeigt.- Leere Ergebnisse sind kein Fehler. Wenn keine Zeilen übereinstimmen, erhalten Sie
[], und dieforeach-Schleife tut einfach nichts. - Verwenden Sie immer Prepared Statements bei nicht vertrauenswürdigen Eingaben. Das obige
SELECT * FROM my_tableerwartet keine Benutzereingaben; für alles Dynamische binden Sie Parameter, um SQL-Injection zu verhindern.
Verwandte Funktionen
mysqli_fetch_assoc()— eine Zeile als assoziatives array abrufen.mysqli_fetch_array()— eine Zeile als assoziatives, numerisches oder kombiniertes array abrufen.mysqli_fetch_row()— eine Zeile als numerisches array abrufen.mysqli_fetch_object()— eine Zeile als object abrufen.mysqli_query()— die Abfrage ausführen, die das Ergebnis erzeugt.
Fazit
mysqli_fetch_all() ist der schnellste Weg, ein gesamtes MySQLi-Ergebnis in ein PHP-array zu laden. Wählen Sie MYSQLI_ASSOC für lesbare Spaltennamen als Schlüssel, MYSQLI_NUM für kompakte numerische Schlüssel oder MYSQLI_BOTH, wenn Sie beides benötigen. Denken Sie daran, dass alle Zeilen in den Speicher geladen werden — bei großen Datensätzen ist daher eine zeilenweise Schleife mit mysqli_fetch_assoc() die sicherere Wahl.