Signatur
Beschreibung
mysqli_stmt_bind_result() verknüpft eine oder mehrere PHP-Variablen mit den Spalten des Ergebnis-Sets eines vorbereiteten SELECT-Statements. Nach dem Aufruf von mysqli_stmt_execute() kann mit mysqli_stmt_fetch() jede Zeile des Ergebnisses abgerufen werden – die gebundenen Variablen werden dabei automatisch mit den Spaltenwerten der aktuellen Zeile befüllt.
Die Reihenfolge der übergebenen Variablen muss exakt der Reihenfolge der Spalten im SELECT-Statement entsprechen. Für jede im SELECT angeforderte Spalte muss genau eine Variable angegeben werden. Der PHP-Typ der Variablen wird automatisch aus dem MySQL-Datentyp der jeweiligen Spalte abgeleitet.
Diese Funktion ist besonders nützlich, wenn die Anzahl und Namen der Ergebnisspalten zur Compile-Zeit bekannt sind. Für dynamischere Szenarien kann alternativ mysqli_stmt_get_result() eingesetzt werden, das ein vollständiges Ergebnisobjekt liefert, das wie ein normales mysqli_result verarbeitet werden kann.
Die Funktion ist der prozedurale Gegenstück zur objektorientierten Methode mysqli_stmt::bind_result(). Beide Varianten sind funktional identisch.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das vorbereitete Statement-Objekt, das durch mysqli_prepare() oder mysqli_stmt_init() erzeugt wurde. |
|
| $var Pflicht | mixed | Erste PHP-Variable, die per Referenz übergeben wird und nach mysqli_stmt_fetch() den Wert der ersten Ergebnisspalte enthält. |
|
| $vars | mixed | Weitere PHP-Variablen (per Referenz), eine pro zusätzlicher Ergebnisspalte, in der gleichen Reihenfolge wie die Spalten im SELECT-Statement. |
Rückgabewert
true zurück, wenn die Bindung erfolgreich war, andernfalls false. Ein Fehler tritt z. B. auf, wenn die Anzahl der übergebenen Variablen nicht mit der Anzahl der Ergebnisspalten übereinstimmt.Beispiele
Einfaches SELECT mit gebundenen Ergebnisvariablen
<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$stmt = mysqli_prepare($mysqli, 'SELECT id, name, email FROM benutzer WHERE aktiv = ?');
mysqli_stmt_bind_param($stmt, 'i', $aktiv);
$aktiv = 1;
mysqli_stmt_execute($stmt);
// Variablen an die drei Ergebnisspalten binden
mysqli_stmt_bind_result($stmt, $id, $name, $email);
while (mysqli_stmt_fetch($stmt)) {
echo "ID: $id | Name: $name | E-Mail: $email\n";
}
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
Objektorientierte Variante mit bind_result()
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('SELECT artikel_nr, bezeichnung, preis FROM produkte ORDER BY preis ASC LIMIT 5');
$stmt->execute();
// Ergebnisvariablen binden
$stmt->bind_result($artikelNr, $bezeichnung, $preis);
$ergebnisse = [];
while ($stmt->fetch()) {
$ergebnisse[] = [
'artikel_nr' => $artikelNr,
'bezeichnung' => $bezeichnung,
'preis' => $preis,
];
}
$stmt->close();
$mysqli->close();
foreach ($ergebnisse as $produkt) {
printf("[%s] %s – %.2f €\n", $produkt['artikel_nr'], $produkt['bezeichnung'], $produkt['preis']);
}
// Wichtig · Fallstricke
Wichtig: mysqli_stmt_bind_result() muss nach mysqli_stmt_execute() aufgerufen werden, damit MySQL die Spalteninformationen des Ergebnisses kennt. Ein Aufruf davor schlägt fehl oder liefert unerwartete Ergebnisse.
Alternative: Ab PHP 5.3 / MySQL 5.1 steht mysqli_stmt_get_result() zur Verfügung, das ein mysqli_result-Objekt zurückgibt. Damit lassen sich Ergebniszeilen als assoziative Arrays abrufen (mysqli_fetch_assoc()), was bei unbekannter oder großer Spaltenanzahl deutlich komfortabler ist. mysqli_stmt_get_result() erfordert jedoch den MySQL Native Driver (mysqlnd).
NULL-Werte: Enthält eine Spalte den Wert NULL, wird die gebundene Variable auf null gesetzt. Dies sollte in der Weiterverarbeitung berücksichtigt werden.
Typen: PHP konvertiert MySQL-Datentypen automatisch in passende PHP-Typen (z. B. INT → int, VARCHAR → string). Dezimalzahlen vom Typ DECIMAL werden jedoch als string übergeben, um Gleitkomma-Ungenauigkeiten zu vermeiden.