W3docs

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 name

Jeder 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
TeilBedeutung
$resultEin Ergebnisobjekt, das von mysqli_query() (oder mysqli_store_result() / mysqli_use_result()) zurückgegeben wurde.
RückgabeEin 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 Fehler false zurück, und false an mysqli_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 Sie mysqli_fetch_row(); für beides verwenden Sie mysqli_fetch_array().

Vergleich mit anderen Fetch-Funktionen

FunktionGibt 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.

Übungen

Übung
Was macht die Funktion fetch_assoc() in PHP?
Was macht die Funktion fetch_assoc() in PHP?
Was this page helpful?