fetch_row
Erfahren Sie, wie die PHP-Funktion mysqli_fetch_row() eine Zeile eines MySQLi-Ergebnisses als numerisches Array zurückgibt.
Die Funktion mysqli_fetch_row() liest eine Zeile aus einem MySQLi-Ergebnissatz und gibt sie als numerisches Array zurück — ein einfaches, numerisch indiziertes Array, bei dem $row[0] die erste ausgewählte Spalte ist, $row[1] die zweite usw. Diese Seite behandelt die Syntax und den Rückgabewert, das Durchlaufen eines Ergebnissatzes, den prozeduralen vs. objektorientierten Stil, wann man ihn den Alternativen vorziehen sollte und welche Fallstricke zu beachten sind.
Syntax
// Procedural style
mysqli_fetch_row(mysqli_result $result): array|null|false
// Object-oriented style
$result->fetch_row(): array|null|falseDas einzige Argument ist $result — ein Ergebnisobjekt, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wird.
Rückgabewert
| Situation | Rückgabewert |
|---|---|
| Eine Zeile wurde gelesen | Ein numerisches Array ($row[0], $row[1], …) |
| Keine weiteren Zeilen | null |
| Fehler | false |
Jeder Aufruf rückt einen internen Cursor zur nächsten Zeile vor, was das saubere Arbeiten innerhalb einer while-Schleife ermöglicht. Spaltenwerte werden als string (oder null für SQL NULL) zurückgegeben, unabhängig vom SQL-Typ der Spalte, sofern Sie keine native Typkonvertierung über mysqlnd aktivieren.
Einfaches Beispiel: Zeilen durchlaufen
Da mysqli_fetch_row() null zurückgibt, sobald die Zeilen erschöpft sind, endet die Schleifenbedingung von selbst:
<?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);
?>Wir verbinden uns, prüfen auf einen Verbindungsfehler und führen dann ein SELECT aus. Innerhalb der while-Schleife liefert jeder Aufruf von mysqli_fetch_row() die nächste Zeile als Array zurück, das in SELECT-Reihenfolge indiziert ist — genau deshalb wird empfohlen, explizite Spalten (id, name) statt SELECT * zu wählen: So ist festgelegt, welcher Index welcher Spalte entspricht.
Tipp: Rufen Sie immer
mysqli_free_result()auf, wenn Sie mit einem Ergebnissatz fertig sind, um dessen Speicher freizugeben — besonders in langlebigen Skripten.
Objektorientierter Stil
Dieselbe Logik mit der OOP-API, die in modernem Code üblich ist:
<?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();
?>Wann mysqli_fetch_row() verwenden?
Greifen Sie auf mysqli_fetch_row() zurück, wenn:
- Sie eine kleine, feste Menge an Spalten auswählen und kompakten Indexzugriff bevorzugen.
- Sie rohe Zeilen kopieren oder streamen und Spaltennamen keine Rolle spielen.
- Sie den Fetch-Vorgang mit dem geringsten Overhead wünschen (es wird kein assoziatives Schlüssel-Array aufgebaut).
Bevorzugen Sie eine der Alternativen, wenn Namen oder Objekte praktischer sind:
mysqli_fetch_assoc()— gibt ein assoziatives Array zurück, das nach Spaltenname indiziert ist ($row['name']). Lesbarer und robuster, wenn sich die SELECT-Reihenfolge ändert.mysqli_fetch_array()— gibt sowohl numerische als auch assoziative Schlüssel zurück.mysqli_fetch_object()— gibt jede Zeile als object zurück ($row->name).mysqli_fetch_all()— gibt alle Zeilen auf einmal in einem einzigen array zurück.
Häufige Fallstricke
- Indizes folgen der SELECT-Reihenfolge, nicht der Tabellenreihenfolge.
SELECT *macht$rowfehleranfällig, da das Hinzufügen einer Spalte zur Tabelle die Indizes stillschweigend verschiebt. Wählen Sie Spalten explizit aus. - Werte sind strings. Eine numerische Spalte kommt als
"42"zurück, nicht als42. Casten Sie den Wert ((int) $row[0]), wenn Sie eine echte Zahl benötigen. nullvs.false. Einewhile-Schleife behandelt beide als falsy, endet also in beiden Fällen korrekt — wenn Sie jedoch manuell eine einzelne Zeile abrufen, unterscheiden Sie zwischen „keine weiteren Zeilen" (null) und „Fehler" (false).- Gepuffert vs. ungepuffert. Bei
mysqli_use_result()(ungepuffert) müssen Sie jede Zeile abrufen, bevor Sie eine weitere Abfrage über dieselbe Verbindung ausführen.
Für den größeren Kontext zu Verbindung und Abfragen lesen Sie die MySQLi-Übersicht und mysqli_connect().