Signatur
Beschreibung
mysqli_stmt_bind_param() verknüpft PHP-Variablen mit den Platzhaltern (?) einer mit mysqli_prepare() vorbereiteten SQL-Anweisung. Die Funktion ist ein zentrales Werkzeug für sichere Datenbankabfragen, da Benutzereingaben niemals direkt in den SQL-String eingebettet werden – SQL-Injection-Angriffe werden damit strukturell verhindert.
Der Parameter $types ist ein String, dessen Zeichen die Datentypen der gebundenen Variablen beschreiben: i steht für Integer, d für Gleitkommazahl (double), s für String und b für Binärdaten (BLOB, die per mysqli_stmt_send_long_data() gesendet werden). Die Anzahl der Zeichen muss exakt mit der Anzahl der ?-Platzhalter im SQL-Statement übereinstimmen.
Die Variablen werden per Referenz gebunden. Das bedeutet, dass der aktuelle Wert der Variablen erst beim Aufruf von mysqli_stmt_execute() ausgelesen wird. Dadurch lässt sich dasselbe Statement effizient in einer Schleife mit wechselnden Werten ausführen, ohne jedes Mal neu binden zu müssen.
Die objektorientierte Entsprechung dieser Funktion ist mysqli_stmt::bind_param(). Für neue Projekte wird generell der OOP-Stil empfohlen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Ein von mysqli_prepare() zurückgegebenes Statement-Objekt. |
|
| $types Pflicht | string | Ein String, der für jeden gebundenen Parameter genau ein Typzeichen enthält: i (integer), d (double/float), s (string) oder b (blob/binär). Die Länge muss der Anzahl der ?-Platzhalter entsprechen. |
|
| $var Pflicht | mixed | Die erste PHP-Variable, die per Referenz an den ersten Platzhalter gebunden wird. | |
| $vars | mixed | Weitere PHP-Variablen (per Referenz), die an die weiteren Platzhalter gebunden werden. Die Gesamtzahl aller gebundenen Variablen muss der Anzahl der ? im SQL entsprechen. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. falsche Anzahl von Parametern oder ungültiger Typ-String).Beispiele
Einfaches INSERT mit gebundenen Parametern
<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'shop');
if (!$mysqli) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
$sql = "INSERT INTO produkte (name, preis, lagerbestand) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($mysqli, $sql);
$name = 'Kaffeemaschine';
$preis = 49.99;
$lagerbestand = 10;
// s = string, d = double, i = integer
mysqli_stmt_bind_param($stmt, 'sdi', $name, $preis, $lagerbestand);
mysqli_stmt_execute($stmt);
echo 'Eingefügte ID: ' . mysqli_stmt_insert_id($stmt);
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
Mehrfachausführung in einer Schleife (Bulk-Insert)
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'shop');
$produkte = [
['Wasserkocher', 29.95, 5],
['Toaster', 19.99, 8],
['Mixer', 34.50, 3],
];
$sql = "INSERT INTO produkte (name, preis, lagerbestand) VALUES (?, ?, ?)";
$stmt = $mysqli->prepare($sql);
// Variablen einmalig binden – Werte werden erst bei execute() gelesen
mysqli_stmt_bind_param($stmt, 'sdi', $name, $preis, $lagerbestand);
foreach ($produkte as [$name, $preis, $lagerbestand]) {
mysqli_stmt_execute($stmt);
echo "Produkt '{$name}' eingefügt.\n";
}
mysqli_stmt_close($stmt);
$mysqli->close();
SELECT mit Benutzereingabe (SQL-Injection-sicher)
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'shop');
// Benutzereingabe – niemals direkt in SQL einsetzen!
$suchbegriff = "%' OR '1'='1"; // typischer Injection-Versuch
$sql = "SELECT id, name, preis FROM produkte WHERE name LIKE ?";
$stmt = $mysqli->prepare($sql);
mysqli_stmt_bind_param($stmt, 's', $suchbegriff);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
echo $row['name'] . ': ' . $row['preis'] . ' EUR\n';
}
mysqli_stmt_close($stmt);
$mysqli->close();
// Wichtig · Fallstricke
Sicherheit: mysqli_stmt_bind_param() schützt zuverlässig vor SQL-Injection, da Parameterwerte niemals als SQL-Code interpretiert werden. Sie ersetzen vollständig das unsichere Einbetten von Werten via String-Konkatenation.
Typkonvertierung: MySQL konvertiert Werte implizit, wenn der angegebene Typ nicht exakt passt. Dennoch sollte der korrekte Typ gewählt werden, um unerwartetes Verhalten zu vermeiden – z. B. kann ein Float als i (integer) unbeabsichtigt gerundet werden.
BLOB-Daten (b): Beim Typ b wird der Wert nicht direkt gebunden, sondern muss anschließend in Chunks via mysqli_stmt_send_long_data() übertragen werden.
Alternative: PDO mit PDOStatement::bindParam() oder PDOStatement::bindValue() bietet eine datenbankagnostische Alternative mit ähnlichem Sicherheitsniveau.