Signatur
Beschreibung
mysqli_fetch_all() liest sämtliche Zeilen einer durch eine MySQL-Abfrage erzeugten Ergebnismenge in einem einzigen Aufruf aus und gibt sie als zweidimensionales PHP-Array zurück. Im Gegensatz zu mysqli_fetch_assoc() oder mysqli_fetch_array(), die jeweils nur eine einzelne Zeile liefern, durchläuft diese Funktion intern alle Zeilen des Resultsets und übergibt das fertige Array direkt an PHP.
Der Parameter $mode steuert die Struktur der einzelnen Zeilen-Arrays: MYSQLI_NUM erzeugt numerisch indizierte Arrays, MYSQLI_ASSOC assoziative Arrays mit Spaltennamen als Schlüssel, und MYSQLI_BOTH liefert beide Zugriffsarten gleichzeitig – analog zu mysqli_fetch_array().
Die Funktion eignet sich besonders, wenn das gesamte Ergebnis einer Abfrage an eine Funktion oder einen Template-Layer übergeben werden soll und kein zeilenweises Streaming erforderlich ist. Bei sehr großen Ergebnismengen sollte bedacht werden, dass alle Daten gleichzeitig im Speicher gehalten werden.
Hinweis: mysqli_fetch_all() ist nur verfügbar, wenn PHP mit der mysqlnd-Treiberbibliothek kompiliert wurde. Bei Verwendung von libmysqlclient steht die Funktion nicht zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | mysqli_result | Das mysqli_result-Objekt, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wurde. |
|
| $mode | int | MYSQLI_NUM | Gibt den Typ des Rückgabe-Arrays an. Mögliche Werte: MYSQLI_NUM (numerische Indizes), MYSQLI_ASSOC (Spaltennamen als Schlüssel) oder MYSQLI_BOTH (numerisch und assoziativ). |
Rückgabewert
$mode als numerisches, assoziatives oder kombiniertes Array strukturiert. Ist die Ergebnismenge leer, wird ein leeres Array zurückgegeben.Beispiele
Alle Benutzer als assoziatives Array abrufen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'mydb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$result = $mysqli->query('SELECT id, name, email FROM users LIMIT 5');
// Alle Zeilen als assoziatives Array holen
$users = mysqli_fetch_all($result, MYSQLI_ASSOC);
$result->free();
$mysqli->close();
foreach ($users as $user) {
echo $user['id'] . ': ' . $user['name'] . ' (' . $user['email'] . ')' . PHP_EOL;
}
Ergebnismenge als JSON ausgeben (API-Endpunkt)
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'shop');
$result = $mysqli->query(
'SELECT id, title, price FROM products WHERE active = 1 ORDER BY title'
);
if (!$result) {
http_response_code(500);
echo json_encode(['error' => 'Datenbankfehler']);
exit;
}
$products = mysqli_fetch_all($result, MYSQLI_ASSOC);
$result->free();
$mysqli->close();
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['data' => $products, 'count' => count($products)]);
Numerisches Array mit MYSQLI_NUM
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'mydb');
$result = $mysqli->query('SELECT id, name FROM categories');
$rows = mysqli_fetch_all($result, MYSQLI_NUM);
$result->free();
$mysqli->close();
foreach ($rows as $row) {
// $row[0] = id, $row[1] = name
printf("ID: %d | Name: %s\n", $row[0], $row[1]);
}
// Wichtig · Fallstricke
mysqlnd-Abhängigkeit: mysqli_fetch_all() ist ausschließlich beim Einsatz des MySQL Native Driver (mysqlnd) verfügbar, der seit PHP 5.4 standardmäßig gebündelt ist. Bei älteren Installationen mit libmysqlclient wirft die Funktion einen fatalen Fehler. Vor PHP 8.0 gab die Funktion bei einem Fehler NULL statt eines leeren Arrays zurück.
Speicherverbrauch: Da alle Zeilen auf einmal in den PHP-Speicher geladen werden, ist die Funktion für sehr große Ergebnismengen (z. B. Exporte mit Millionen von Zeilen) nicht geeignet. In solchen Fällen sollte zeilenweise mit mysqli_fetch_assoc() in einer Schleife gearbeitet werden.
SQL-Injection: Wie bei jeder Datenbankabfrage müssen Benutzereingaben zwingend über Prepared Statements (mysqli_prepare()) gebunden werden – niemals direkt in den Query-String eingebaut werden.