Signatur
Beschreibung
mysqli_stmt_prepare() bereitet eine SQL-Anweisung für die Ausführung vor, ähnlich wie mysqli_prepare(), arbeitet jedoch auf einem bereits vorhandenen mysqli_stmt-Objekt. Das ist besonders nützlich, wenn ein Statement-Handle wiederverwendet werden soll, ohne ein neues Objekt zu erstellen.
Der SQL-Query kann Platzhalter (?) enthalten, die anschließend mit mysqli_stmt_bind_param() an konkrete Werte gebunden werden. Das verhindert SQL-Injection, da die Daten sauber vom SQL-Code getrennt bleiben und vom Datenbankserver separat verarbeitet werden.
Typischerweise wird mysqli_stmt_prepare() im prozeduralen Stil verwendet, wenn man ein Statement-Objekt mit mysqli_stmt_init() erstellt hat und es dann mit einer Abfrage befüllen möchte. Im objektorientierten Stil ist $stmt->prepare() die entsprechende Methode.
Nach einem erfolgreichen Aufruf kann das Statement mit mysqli_stmt_execute() ausgeführt werden. Bei einem Fehler liefert die Funktion false; die Fehlermeldung ist über mysqli_stmt_error() abrufbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Ein mysqli_stmt-Objekt, das zuvor mit mysqli_stmt_init() erzeugt wurde. |
|
| $query Pflicht | string | Die SQL-Anweisung als String. Platzhalter werden durch ? repräsentiert. Die Anweisung darf kein Semikolon am Ende enthalten. |
Rückgabewert
true zurück, wenn die Vorbereitung der Anweisung erfolgreich war, andernfalls false. Bei einem Fehler können Details über mysqli_stmt_error() oder mysqli_stmt_errno() abgerufen werden.Beispiele
Einfaches SELECT mit Parameterbindung
<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$stmt = mysqli_stmt_init($mysqli);
if (mysqli_stmt_prepare($stmt, 'SELECT id, username FROM users WHERE email = ?')) {
$email = 'max@example.com';
mysqli_stmt_bind_param($stmt, 's', $email);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $id, $username);
while (mysqli_stmt_fetch($stmt)) {
echo "ID: $id, Benutzername: $username\n";
}
mysqli_stmt_close($stmt);
} else {
echo 'Fehler beim Vorbereiten: ' . mysqli_stmt_error($stmt);
}
mysqli_close($mysqli);
Statement wiederverwenden für mehrere INSERT-Operationen
<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$stmt = mysqli_stmt_init($mysqli);
if (!mysqli_stmt_prepare($stmt, 'INSERT INTO products (name, price) VALUES (?, ?)')) {
die('Fehler beim Vorbereiten: ' . mysqli_stmt_error($stmt));
}
$products = [
['Apfel', 0.49],
['Banane', 0.29],
['Kirsche', 1.99],
];
foreach ($products as [$name, $price]) {
mysqli_stmt_bind_param($stmt, 'sd', $name, $price);
if (!mysqli_stmt_execute($stmt)) {
echo "Fehler beim Einfügen von '$name': " . mysqli_stmt_error($stmt) . "\n";
} else {
echo "'$name' erfolgreich eingefügt.\n";
}
}
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
// Wichtig · Fallstricke
Sicherheit: Durch die Verwendung von Prepared Statements mit Platzhaltern (?) werden SQL-Injection-Angriffe effektiv verhindert, da Benutzereingaben niemals direkt in die SQL-Anweisung eingebettet werden.
Wiederverwendung: Ein bestehendes Statement kann durch erneuten Aufruf von mysqli_stmt_prepare() mit einer neuen Abfrage neu initialisiert werden, ohne ein neues Objekt erstellen zu müssen. Dabei werden alle vorherigen Bindungen verworfen.
Kein Semikolon: Die SQL-Anweisung darf kein abschließendes Semikolon (;) enthalten, da dies zu einem Fehler führt.
OOP-Äquivalent: Im objektorientierten Stil lautet die entsprechende Methode $stmt->prepare(string $query): bool.