Start · Sprachen · PHP · Referenz · mysqli_fetch_row

mysqli_fetch_row

Funktion

Liefert die nächste Zeile einer Ergebnismenge als numerisch indiziertes Array oder <code>null</code>, wenn keine weiteren Zeilen vorhanden sind.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_fetch_row(mysqli_result $result): array|null|false

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

Typ
array|null|false
Beschreibung
Gibt ein numerisch indiziertes Array zurück, das die Werte der aktuellen Zeile enthält. Gibt 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);
ID: 1 | Name: Anna Bauer ID: 2 | Name: Karl Müller ID: 3 | Name: Lena Schmidt

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);
Kunde: Anna Bauer | Stadt: Berlin Kunde: Karl Müller | Stadt: München Kunde: Lena Schmidt | Stadt: Hamburg

// 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.