W3docs

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
ParameterBeschreibung
$resultEin mysqli_result-object, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wurde.
$modeOptional. 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.

KonstanteJede Zeile wird indiziert nach
MYSQLI_ASSOCSpaltennamen ($row['name']).
MYSQLI_NUMNumerischen Spaltenindexen ($row[0]). Dies ist der Standard.
MYSQLI_BOTHSowohl 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

  • $result muss gültig sein. Wenn die Abfrage fehlgeschlagen ist, gibt mysqli_query() false zurü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 die foreach-Schleife tut einfach nichts.
  • Verwenden Sie immer Prepared Statements bei nicht vertrauenswürdigen Eingaben. Das obige SELECT * FROM my_table erwartet keine Benutzereingaben; für alles Dynamische binden Sie Parameter, um SQL-Injection zu verhindern.

Verwandte Funktionen

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.

Übungen

Übung
Was gibt mysqli_fetch_all() zurück, wenn es auf einem Ergebnisset aufgerufen wird?
Was gibt mysqli_fetch_all() zurück, wenn es auf einem Ergebnisset aufgerufen wird?
Was this page helpful?