Start · Sprachen · PHP · Referenz · mysqli_stmt_bind_param

mysqli_stmt_bind_param

Funktion

Bindet PHP-Variablen als Parameter an eine vorbereitete SQL-Anweisung (<code>mysqli_stmt</code>), bevor diese ausgeführt wird.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_bind_param(mysqli_stmt $statement, string $types, mixed &$var, mixed &...$vars): bool

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

Typ
bool
Beschreibung
Gibt 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);
Eingefügte ID: 1

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();
Produkt 'Wasserkocher' eingefügt. Produkt 'Toaster' eingefügt. Produkt 'Mixer' eingefügt.

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.