Signatur
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
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();
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']);
}
// 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.