Start · Sprachen · PHP · Referenz · mysql_fetch_array

mysql_fetch_array

Funktion

Liest eine Zeile aus einem MySQL-Abfrageergebnis und gibt sie wahlweise als assoziatives, numerisches oder kombiniertes Array zurück.

seit PHP 4.0.0 Kategorie: db

Signatur

mysql_fetch_array(resource $result, int $result_type = MYSQL_BOTH): array|false

Beschreibung

mysql_fetch_array() liest die jeweils nächste Zeile aus einem MySQL-Ergebnis-Ressource-Objekt und gibt sie als Array zurück. Über den Parameter result_type kann gesteuert werden, ob die Felder über ihren Spaltennamen (assoziativ), über ihren Index (numerisch) oder über beides erreichbar sein sollen.

Die Funktion wird typischerweise in einer while-Schleife eingesetzt, um alle Zeilen eines Abfrageergebnisses zu durchlaufen. Gibt es keine weiteren Zeilen, liefert sie false, womit die Schleife automatisch endet.

Achtung: Die gesamte mysql_*-Erweiterung wurde in PHP 5.5.0 als veraltet markiert und in PHP 7.0.0 vollständig entfernt. Für neuen Code sollte stattdessen mysqli_fetch_array() oder PDOStatement::fetch() verwendet werden.

Beim Standardwert MYSQL_BOTH enthält das zurückgegebene Array jeden Feldwert doppelt – einmal unter dem numerischen Index und einmal unter dem Spaltennamen –, was zu einem höheren Speicherverbrauch führt. Wo möglich, sollte daher MYSQL_ASSOC oder MYSQL_NUM bevorzugt werden.

Parameter

Name Typ Default Beschreibung
$result Pflicht resource Eine gültige MySQL-Ergebnis-Ressource, wie sie von mysql_query() zurückgegeben wird.
$result_type int MYSQL_BOTH Bestimmt, wie die Felder indiziert werden. Mögliche Werte: MYSQL_ASSOC (nur Spaltennamen), MYSQL_NUM (nur numerische Indizes) oder MYSQL_BOTH (beides).

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array zurück, das die Felder der gelesenen Zeile enthält. Sind keine weiteren Zeilen vorhanden, wird false zurückgegeben.

Beispiele

Alle Zeilen mit assoziativem Array ausgeben

<?php
$verbindung = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('meine_datenbank', $verbindung);

$ergebnis = mysql_query('SELECT id, name, email FROM benutzer', $verbindung);

while ($zeile = mysql_fetch_array($ergebnis, MYSQL_ASSOC)) {
    echo 'ID: ' . $zeile['id'] . ', Name: ' . $zeile['name'] . ', E-Mail: ' . $zeile['email'] . PHP_EOL;
}

mysql_free_result($ergebnis);
mysql_close($verbindung);
?>
ID: 1, Name: Anna Muster, E-Mail: anna@example.com ID: 2, Name: Max Muster, E-Mail: max@example.com

Moderner Ersatz mit MySQLi

<?php
// Empfohlene Alternative: mysqli_fetch_array()
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'meine_datenbank');

$ergebnis = $mysqli->query('SELECT id, name, email FROM benutzer');

while ($zeile = mysqli_fetch_array($ergebnis, MYSQLI_ASSOC)) {
    echo 'ID: ' . $zeile['id'] . ', Name: ' . $zeile['name'] . PHP_EOL;
}

$ergebnis->free();
$mysqli->close();
?>
ID: 1, Name: Anna Muster ID: 2, Name: Max Muster

// Wichtig · Fallstricke

Sicherheitshinweis: Benutzereingaben dürfen niemals unbereinigt in SQL-Abfragen eingebaut werden. Mit der alten mysql_*-Erweiterung war mysql_real_escape_string() erforderlich; moderne Alternativen wie PDO oder mysqli unterstützen vorbereitete Anweisungen (Prepared Statements), die SQL-Injection zuverlässig verhindern.

Deprecation: mysql_fetch_array() und die gesamte mysql_*-Erweiterung wurden in PHP 5.5.0 als veraltet (deprecated) eingestuft und in PHP 7.0.0 vollständig entfernt. Code, der diese Funktion verwendet, ist auf PHP 7+ nicht mehr lauffähig und muss auf mysqli_fetch_array() oder PDOStatement::fetch() migriert werden.

Bei MYSQL_BOTH (Standardwert) wird jeder Feldwert im Array doppelt gespeichert, was bei großen Ergebnismengen den Speicherverbrauch verdoppelt. Wenn nur assoziative oder nur numerische Indizes benötigt werden, sollte explizit MYSQL_ASSOC bzw. MYSQL_NUM angegeben werden.