fetch_assoc
Erklärung der mysqli_fetch_assoc()-Funktion in PHP: Syntax, Rückgabewert, Schleifennutzung, häufige Fehler und Vergleich mit anderen Fetch-Funktionen.
Die Funktion mysqli_fetch_assoc() liest eine Zeile aus einem MySQLi-Ergebnissatz und gibt sie als assoziatives array zurück, wobei jeder Schlüssel einem Spaltennamen aus der Abfrage entspricht. Diese Seite erläutert die Syntax, den Rückgabewert, die Verwendung in einer Schleife, die häufigsten Fehler und den Unterschied zu verwandten Fetch-Funktionen.
Was mysqli_fetch_assoc() tut
Wenn Sie eine SELECT-Abfrage ausführen, liefert MySQLi Ihnen einen Ergebnissatz zurück – einen Zeiger auf die Zeilen, die die Datenbank gefunden hat. mysqli_fetch_assoc() holt die nächste Zeile aus diesem Satz und gibt sie als array mit Spaltennamen als Schlüssel zurück:
$row = mysqli_fetch_assoc($result);
echo $row['email']; // access a value by its column nameJeder Aufruf rückt einen internen Cursor weiter vor, sodass wiederholte Aufrufe der Funktion die Zeilen nacheinander durchlaufen. Wenn keine Zeilen mehr vorhanden sind, gibt die Funktion null zurück.
Syntax
mysqli_fetch_assoc(mysqli_result $result): array|null|false| Teil | Bedeutung |
|---|---|
$result | Ein Ergebnisobjekt, das von mysqli_query() (oder mysqli_store_result() / mysqli_use_result()) zurückgegeben wurde. |
| Rückgabe | Ein assoziatives array für die abgerufene Zeile, null wenn keine weiteren Zeilen vorhanden sind, oder false bei einem Fehler. |
Wenn zwei Spalten in Ihrer SELECT-Abfrage denselben Namen haben (beispielsweise bei einem JOIN, der zwei id-Spalten zurückgibt), bleibt im array nur die letzte erhalten – verwenden Sie Spalten-Aliase (SELECT a.id AS user_id), um beide zu behalten.
Zeilen in einer Schleife abrufen
mysqli_fetch_assoc() wird fast immer innerhalb einer while-Schleife aufgerufen. Da die Funktion nach der letzten Zeile null (einen falschen Wert) zurückgibt, endet die Schleife automatisch:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "shop");
if (mysqli_connect_errno()) {
die("Connection failed: " . mysqli_connect_error());
}
$result = mysqli_query($mysqli, "SELECT id, name, price FROM products");
if ($result) {
while ($row = mysqli_fetch_assoc($result)) {
echo $row['id'] . ": " . $row['name'] . " ($" . $row['price'] . ")\n";
}
mysqli_free_result($result);
} else {
echo "Query failed: " . mysqli_error($mysqli);
}
mysqli_close($mysqli);
?>Die Verbindung wird mit mysqli_connect_errno() geprüft, dann wird die Abfrage ausgeführt und in einer Schleife durchlaufen. Jede Iteration weist die nächste Zeile $row zu; wenn der Satz erschöpft ist, liefert die Zuweisung null, die while-Bedingung wird falsch und die Schleife endet. mysqli_free_result() gibt den vom Ergebnissatz belegten Speicher frei, sobald wir fertig sind.
Die zurückgegebene array-Struktur
Sie benötigen keine Datenbank, um die Form einer Zeile zu verstehen. Der folgende Ausschnitt erstellt ein array, das identisch mit dem Rückgabewert eines einzelnen mysqli_fetch_assoc()-Aufrufs ist, und gibt es aus, damit Sie die Spaltennamen-Schlüssel sehen können:
<?php
// This is the structure mysqli_fetch_assoc() hands back for one row.
$row = [
"id" => 1,
"name" => "Keyboard",
"price" => 29.99,
];
echo "Product: " . $row["name"] . "\n";
echo "Price: $" . $row["price"] . "\n";
print_r($row);
?>Die Ausgabe sieht so aus:
Product: Keyboard
Price: $29.99
Array
(
[id] => 1
[name] => Keyboard
[price] => 29.99
)Häufige Fehler
- Aufruf bei einer fehlgeschlagenen Abfrage.
mysqli_query()gibt bei einem Fehlerfalsezurück, undfalseanmysqli_fetch_assoc()zu übergeben ist ungültig. Prüfen Sie immer zuerst$result, wie in der Schleife oben gezeigt. - Vergessen, dass nur eine Zeile zurückgegeben wird. Ein einzelner Aufruf gibt die nächste Zeile zurück, nicht die gesamte Tabelle. Verwenden Sie eine Schleife, um alle Zeilen zu lesen.
==statt Zuweisung verwenden. Die Schleife verwendet$row = mysqli_fetch_assoc($result)(Zuweisung). Mit==würde der Cursor nie weiterrücken und die Schleife könnte endlos laufen.- Numerischen Zugriff versuchen. Verwenden Sie
$row['name'], nicht$row[0]. Für numerische Schlüssel verwenden Siemysqli_fetch_row(); für beides verwenden Siemysqli_fetch_array().
Vergleich mit anderen Fetch-Funktionen
| Funktion | Gibt jede Zeile zurück als |
|---|---|
mysqli_fetch_assoc() | Assoziatives array ($row['name']) |
mysqli_fetch_row() | Numerisches array ($row[0]) |
mysqli_fetch_array() | Sowohl assoziative als auch numerische Schlüssel |
mysqli_fetch_object() | Ein object ($row->name) |
mysqli_fetch_all() | Ein array mit allen Zeilen auf einmal |
Greifen Sie auf mysqli_fetch_assoc() zurück, wenn Sie lesbaren, selbstdokumentierenden Code wünschen, der Spalten namentlich referenziert, und wenn Sie Zeilen einzeln verarbeiten.
Fazit
mysqli_fetch_assoc() ist die bevorzugte Funktion zum Lesen eines MySQLi-Ergebnissatzes als assoziative arrays, die nach Spaltennamen indiziert sind. Kombinieren Sie sie mit einer while-Schleife und einer kurzen Prüfung, ob die Abfrage erfolgreich war, und Sie können Ergebnissätze sicher durchlaufen. Als Hintergrundlektüre empfehlen sich PHP MySQLi, assoziative arrays und die while-Schleife.