Start · Sprachen · PHP · Referenz · mysqli_stmt_fetch

mysqli_stmt_fetch

Funktion

Ruft die nächste Ergebniszeile einer vorbereiteten Anweisung ab und schreibt die Werte in die zuvor mit <code>mysqli_stmt_bind_result()</code> gebundenen Variablen.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_fetch(mysqli_stmt $statement): bool|null

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

Typ
bool|null
Beschreibung
  • 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();
ID: 1 | Name: Alice | E-Mail: alice@example.com ID: 2 | Name: Bob | E-Mail: bob@example.com

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();
Anzahl Treffer: 3 Produkt #5: Schreibblock Produkt #9: Kugelschreiber Produkt #12: Radiergummi

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