Start · Sprachen · PHP · Referenz · mysqli_fetch_array

mysqli_fetch_array

Funktion

Ruft die nächste Zeile einer Ergebnismenge als assoziatives und/oder numerisches Array ab.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_fetch_array(mysqli_result $result, int $mode = MYSQLI_BOTH): array|null|false

Beschreibung

mysqli_fetch_array() liest die nächste Zeile aus einer MySQLi-Ergebnismenge und gibt sie als Array zurück. Über den Parameter mode lässt sich steuern, ob das Array numerisch indiziert (MYSQLI_NUM), assoziativ (MYSQLI_ASSOC) oder beides (MYSQLI_BOTH, Standard) ist. Bei MYSQLI_BOTH enthält das Array jeden Spaltenwert doppelt – einmal unter dem Spaltennamen und einmal unter dem numerischen Index.

Die Funktion ist das prozedurale Äquivalent zur objektorientierten Methode $result->fetch_array(). Sie eignet sich für den Zugriff auf einzelne Zeilen in einer Schleife und ist besonders dann praktisch, wenn man Spalten sowohl per Name als auch per Position ansprechen möchte.

Für spezialisierte Anwendungsfälle empfiehlt sich stattdessen mysqli_fetch_assoc() (nur assoziativ) oder mysqli_fetch_row() (nur numerisch), da diese lesbarer und etwas ressourcenschonender sind. mysqli_fetch_array() mit MYSQLI_BOTH verbraucht mehr Speicher, weil jeder Wert zweifach abgelegt wird.

Der Rückgabewert ist null, wenn keine weiteren Zeilen vorhanden sind, und false bei einem Fehler. Typischerweise wird die Funktion in einer while-Schleife verwendet, die automatisch endet, sobald null zurückgegeben wird.

Parameter

Name Typ Default Beschreibung
$result Pflicht mysqli_result Das MySQLi-Ergebnisobjekt, das von mysqli_query(), mysqli_store_result() oder mysqli_use_result() zurückgegeben wurde.
$mode int MYSQLI_BOTH Legt den Array-Typ fest. Mögliche Werte: MYSQLI_ASSOC (assoziatives Array), MYSQLI_NUM (numerisch indiziertes Array) oder MYSQLI_BOTH (beide Indizes, Standard).

Rückgabewert

Typ
array|null|false
Beschreibung
Gibt ein Array mit der aktuellen Zeile der Ergebnismenge zurück. Sind keine weiteren Zeilen vorhanden, wird null zurückgegeben. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfache Abfrage mit MYSQLI_BOTH (Standard)

<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');

if ($mysqli->connect_error) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

$result = mysqli_query($mysqli, 'SELECT id, name FROM produkte LIMIT 3');

while ($zeile = mysqli_fetch_array($result, MYSQLI_BOTH)) {
    // Zugriff per Name UND per Index möglich
    echo 'ID (assoziativ): ' . $zeile['id'] . ', Name (numerisch): ' . $zeile[1] . PHP_EOL;
}

mysqli_free_result($result);
$mysqli->close();
ID (assoziativ): 1, Name (numerisch): Apfel ID (assoziativ): 2, Name (numerisch): Banane ID (assoziativ): 3, Name (numerisch): Kirsche

Nur assoziatives Array mit MYSQLI_ASSOC

<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');

if ($mysqli->connect_error) {
    die('Verbindungsfehler: ' . $mysqli->connect_error);
}

$result = mysqli_query($mysqli, 'SELECT id, name, preis FROM produkte WHERE preis > 1.00');

$produkte = [];
while ($zeile = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    $produkte[] = $zeile;
}

mysqli_free_result($result);
$mysqli->close();

foreach ($produkte as $p) {
    printf("[%d] %s — %.2f EUR\n", $p['id'], $p['name'], $p['preis']);
}
[2] Banane — 1.49 EUR [3] Kirsche — 2.99 EUR

// Wichtig · Fallstricke

Sicherheitshinweis: Benutzerinput darf niemals direkt in SQL-Abfragen eingefügt werden. Verwende stets Prepared Statements (mysqli_prepare() / $mysqli->prepare()), um SQL-Injection zu verhindern. mysqli_fetch_array() selbst ist kein Sicherheitsproblem, aber der Weg zur Ergebnismenge muss sicher sein.

Speicherverbrauch: Der Standardmodus MYSQLI_BOTH speichert jeden Spaltenwert doppelt (assoziativ + numerisch). Bei großen Ergebnismengen sollte daher explizit MYSQLI_ASSOC oder MYSQLI_NUM gewählt werden, um Speicher zu sparen.

Spaltennamen-Konflikte: Bei JOIN-Abfragen mit gleichnamigen Spalten aus verschiedenen Tabellen überschreibt im assoziativen Modus der spätere Wert den früheren. Numerische Indizes oder Spalten-Aliase (AS) sind in diesem Fall zuverlässiger.