W3docs

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|false

Das einzige Argument ist $result — ein Ergebnisobjekt, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wird.

Rückgabewert

SituationRückgabewert
Eine Zeile wurde gelesenEin numerisches Array ($row[0], $row[1], …)
Keine weiteren Zeilennull
Fehlerfalse

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 $row fehleranfä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 als 42. Casten Sie den Wert ((int) $row[0]), wenn Sie eine echte Zahl benötigen.
  • null vs. false. Eine while-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().

Übungen

Übung
Welche der folgenden Aussagen zur PHP-Funktion mysqli_fetch_row() sind wahr?
Welche der folgenden Aussagen zur PHP-Funktion mysqli_fetch_row() sind wahr?
Was this page helpful?