Signatur
Beschreibung
mysqli_fetch_row() liest die nächste Zeile aus einer MySQL-Ergebnismenge und gibt sie als numerisch indiziertes Array zurück, bei dem der Index 0 der ersten Spalte entspricht. Die Funktion ist das prozedurale Äquivalent zur objektorientierten Methode mysqli_result::fetch_row().
Im Gegensatz zu mysqli_fetch_assoc() (Spaltenname als Schlüssel) oder mysqli_fetch_array() (beides kombinierbar) liefert mysqli_fetch_row() ausschließlich numerische Schlüssel. Das hat den Vorteil, dass Spalten mit identischen Namen nicht überschrieben werden und der Speicherverbrauch minimal gehalten wird.
Die Funktion wird typischerweise in einer while-Schleife eingesetzt, die so lange läuft, bis der Rückgabewert null ist, also alle Zeilen abgerufen wurden. Jeder Aufruf bewegt den internen Zeiger der Ergebnismenge automatisch zur nächsten Zeile.
Für neue Projekte empfiehlt sich die Verwendung von PDO oder der objektorientierten Schnittstelle von mysqli, da diese eine flexiblere Fehlerbehandlung und bessere Testbarkeit bieten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $result Pflicht | mysqli_result | Das Ergebnisobjekt, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wurde. |
Rückgabewert
null zurück, wenn keine weiteren Zeilen in der Ergebnismenge vorhanden sind. Gibt false zurück, wenn ein Fehler aufgetreten ist.Beispiele
Alle Zeilen einer Abfrage ausgeben
<?php
$link = mysqli_connect('localhost', 'benutzer', 'passwort', 'meinedb');
if (!$link) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$result = mysqli_query($link, 'SELECT id, vorname, nachname FROM kunden ORDER BY nachname');
if ($result === false) {
die('Abfragefehler: ' . mysqli_error($link));
}
while ($zeile = mysqli_fetch_row($result)) {
// $zeile[0] = id, $zeile[1] = vorname, $zeile[2] = nachname
printf("ID: %d | Name: %s %s\n", $zeile[0], $zeile[1], $zeile[2]);
}
mysqli_free_result($result);
mysqli_close($link);
Spalten mit gleichem Namen – Vorteil numerischer Indizes
<?php
$link = mysqli_connect('localhost', 'benutzer', 'passwort', 'meinedb');
// JOIN: beide Tabellen haben eine Spalte 'name'
$result = mysqli_query(
$link,
'SELECT k.name, s.name FROM kunden k JOIN stadte s ON k.stadt_id = s.id LIMIT 3'
);
while ($zeile = mysqli_fetch_row($result)) {
// $zeile[0] = Kundenname, $zeile[1] = Stadtname — kein Datenverlust!
echo 'Kunde: ' . htmlspecialchars($zeile[0]) . ' | Stadt: ' . htmlspecialchars($zeile[1]) . PHP_EOL;
}
mysqli_free_result($result);
mysqli_close($link);
// Wichtig · Fallstricke
Sicherheit: Benutzeringaben dürfen niemals direkt in SQL-Abfragen eingebettet werden. Verwende stets Prepared Statements mit mysqli_prepare() und mysqli_bind_param(), um SQL-Injection zu verhindern. mysqli_fetch_row() selbst ist sicher, aber die Abfrage, die das Ergebnis erzeugt, muss abgesichert sein.
Speicher: Bei sehr großen Ergebnismengen kann mysqli_use_result() (Streaming) anstelle von mysqli_store_result() sinnvoll sein, da die Zeilen dann zeilenweise vom Server gelesen werden, anstatt komplett in den Speicher geladen zu werden.
Rückgabe null vs. false: Ab PHP 8.1 gibt die Funktion bei keiner weiteren Zeile null zurück (zuvor ebenfalls null), und false signalisiert einen echten Fehler. In einer while-Schleife wird sowohl null als auch false als falsy bewertet, weshalb die Schleife in beiden Fällen korrekt abbricht.