Signatur
Beschreibung
mysqli_fetch_assoc() liest die aktuelle Zeile aus einer MySQL-Ergebnismenge und gibt sie als assoziatives Array zurück. Die Array-Schlüssel entsprechen den Spaltennamen der Abfrage. Nach jedem Aufruf wird der interne Zeiger auf die nächste Zeile vorgerückt.
Die Funktion wird typischerweise in einer while-Schleife verwendet, um alle Zeilen einer Ergebnismenge nacheinander zu verarbeiten. Sobald keine weiteren Zeilen vorhanden sind, gibt sie null zurück und die Schleife endet.
Enthalten zwei oder mehr Spalten der Ergebnismenge denselben Namen (z. B. bei JOIN-Abfragen ohne Alias), überschreibt der zuletzt gelesene Wert den vorherigen im Array. Um dieses Problem zu vermeiden, sollten in der SQL-Abfrage explizite Aliase vergeben werden.
Als Alternative zur prozeduralen Verwendung steht die objektorientierte Methode mysqli_result::fetch_assoc() zur Verfügung. Wer gleichzeitig numerische und assoziative Indizes benötigt, kann auf mysqli_fetch_array() zurückgreifen.
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 vorhanden sind. Im Fehlerfall wird false zurückgegeben.Beispiele
Alle Datensätze einer Tabelle ausgeben
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$result = mysqli_query($mysqli, 'SELECT id, name, email FROM users ORDER BY id');
if ($result === false) {
die('Abfragefehler: ' . mysqli_error($mysqli));
}
while ($row = mysqli_fetch_assoc($result)) {
echo 'ID: ' . $row['id'] . ', Name: ' . $row['name'] . ', E-Mail: ' . $row['email'] . PHP_EOL;
}
mysqli_free_result($result);
$mysqli->close();
Einzelnen Datensatz per ID abrufen (mit Prepared Statement)
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$userId = 1; // Benutzereingabe — niemals direkt in SQL einbauen!
$stmt = $mysqli->prepare('SELECT id, name, email FROM users WHERE id = ?');
$stmt->bind_param('i', $userId);
$stmt->execute();
$result = $stmt->get_result();
$user = mysqli_fetch_assoc($result);
if ($user !== null) {
echo 'Gefundener Benutzer: ' . $user['name'] . ' (' . $user['email'] . ')';
} else {
echo 'Kein Benutzer mit ID ' . $userId . ' gefunden.';
}
$stmt->close();
$mysqli->close();
// Wichtig · Fallstricke
Sicherheitshinweis: Benutzereingaben dürfen niemals direkt in SQL-Abfragestrings eingebettet werden, da dies SQL-Injection ermöglicht. Verwende stets Prepared Statements mit mysqli_prepare() bzw. $mysqli->prepare() und bind_param().
Spalten-Namenskonflikte: Bei JOIN-Abfragen mit gleichen Spaltennamen in verschiedenen Tabellen liefert mysqli_fetch_assoc() nur den letzten Wert. Vergib in solchen Fällen in der SQL-Abfrage immer eindeutige Aliase, z. B. SELECT a.id AS a_id, b.id AS b_id ....
Ressourcen freigeben: Nach der Verarbeitung sollte das Ergebnisobjekt mit mysqli_free_result() freigegeben werden, um Speicher zurückzugeben — besonders bei großen Ergebnismengen wichtig.