Signatur
Beschreibung
mysqli_stmt_fetch() liest eine einzelne Ergebniszeile aus dem Resultset einer ausgeführten vorbereiteten Anweisung und befüllt automatisch alle Variablen, die zuvor über mysqli_stmt_bind_result() an die Ausgabespalten gebunden wurden. Die Funktion wird typischerweise in einer Schleife aufgerufen, bis sie false oder null zurückgibt.
Der prozedurale Stil mysqli_stmt_fetch($stmt) und der objektorientierte Stil $stmt->fetch() sind gleichwertig. Bevor mysqli_stmt_fetch() aufgerufen werden kann, muss die Anweisung mit mysqli_stmt_execute() ausgeführt worden sein, und die Ergebnisvariablen müssen mit mysqli_stmt_bind_result() registriert sein.
Sollen alle Zeilen auf einmal gespeichert werden (z. B. für mehrfaches Iterieren), kann zunächst mysqli_stmt_store_result() aufgerufen werden, um das gesamte Resultset in den Arbeitsspeicher zu laden. Ohne diesen Aufruf werden die Zeilen direkt vom Server gestreamt.
Für viele Anwendungsfälle bietet sich als modernere Alternative mysqli_stmt_get_result() an, die ein vollständiges mysqli_result-Objekt liefert und komfortableres Abrufen per fetch_assoc() o. Ä. ermöglicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das mysqli_stmt-Objekt, das die ausgeführte vorbereitete Anweisung repräsentiert. |
Rückgabewert
true– Eine Zeile wurde erfolgreich abgerufen und in die gebundenen Variablen geschrieben.false– Es gibt keine weiteren Zeilen (Ende des Resultsets) oder ein Fehler ist aufgetreten.null– Die Daten konnten nicht vollständig übertragen werden (data truncation).
Beispiele
Benutzerdaten per vorbereiteter Anweisung abrufen
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('SELECT id, name, email FROM benutzer WHERE aktiv = ?');
$aktiv = 1;
$stmt->bind_param('i', $aktiv);
$stmt->execute();
// Ergebnisvariablen binden
$stmt->bind_result($id, $name, $email);
// Zeile für Zeile abrufen
while ($stmt->fetch()) {
echo "ID: $id | Name: $name | E-Mail: $email\n";
}
$stmt->close();
$mysqli->close();
Ergebnis puffern und danach abrufen (store_result)
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');
$stmt = $mysqli->prepare('SELECT id, name FROM produkte WHERE preis < ?');
$maxPreis = 50.00;
$stmt->bind_param('d', $maxPreis);
$stmt->execute();
// Gesamtes Resultset in Speicher laden
$stmt->store_result();
echo 'Anzahl Treffer: ' . $stmt->num_rows . "\n";
$stmt->bind_result($id, $name);
while ($stmt->fetch()) {
echo "Produkt #$id: $name\n";
}
$stmt->free_result();
$stmt->close();
$mysqli->close();
// Wichtig · Fallstricke
Wichtig: Die Anzahl der mit mysqli_stmt_bind_result() gebundenen Variablen muss exakt mit der Anzahl der Spalten im SELECT-Statement übereinstimmen, sonst schlägt fetch() fehl.
Datensicherheit: Vorbereitete Anweisungen schützen automatisch vor SQL-Injection, da Parameter und Query getrennt übertragen werden. Dennoch sollten Ausgabedaten stets mit htmlspecialchars() codiert werden, bevor sie in HTML ausgegeben werden.
Rückgabe null: Ein null-Rückgabewert weist auf abgeschnittene Daten hin (MYSQL_DATA_TRUNCATED). In diesem Fall enthält die gebundene Variable möglicherweise einen unvollständigen Wert. Das Verhalten kann mit mysqli_stmt_errno() und mysqli_stmt_error() näher untersucht werden.
Alternative: Ab PHP 5.3 steht mysqli_stmt_get_result() zur Verfügung, welches die Arbeit mit Resultsets komfortabler gestaltet. Diese Funktion erfordert jedoch den mysqlnd-Treiber.