Signatur
Beschreibung
mysqli_stmt_execute() führt eine mit mysqli_prepare() vorbereitete SQL-Anweisung aus. Vor dem Ausführen müssen alle Platzhalter (?) entweder über mysqli_stmt_bind_param() gebunden oder – ab PHP 8.1.0 – direkt als Array im zweiten Parameter $params übergeben werden.
Die Funktion ist der prozedurale Gegenstück zur objektorientierten Methode mysqli_stmt::execute(). Prepared Statements sind essenziell für sichere Datenbankoperationen, da sie SQL-Injection strukturell verhindern: Parameter werden niemals als SQL-Text interpretiert, sondern separat an den Datenbankserver übertragen.
Bei SELECT-Anweisungen müssen die Ergebnisspalten nach dem Ausführen mit mysqli_stmt_bind_result() gebunden oder das Resultset per mysqli_stmt_get_result() abgerufen werden. Die gleiche vorbereitete Anweisung kann mehrfach mit unterschiedlichen Parameterwerten ausgeführt werden, was bei Massenoperationen Performance-Vorteile bietet.
Schlägt die Ausführung fehl, gibt die Funktion false zurück; Fehlermeldungen lassen sich über mysqli_stmt_error() bzw. mysqli_error() abrufen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Ein von mysqli_prepare() zurückgegebenes mysqli_stmt-Objekt, das die auszuführende vorbereitete Anweisung enthält. |
|
| $params | array|null | null | Seit PHP 8.1.0: Ein optionales Array mit Werten für alle ?-Platzhalter der Anweisung (in der Reihenfolge ihres Vorkommens). Wird dieses Array angegeben, müssen keine separaten Bindings per mysqli_stmt_bind_param() vorgenommen werden. Alle Werte werden als MYSQLI_TYPE_STRING übergeben. |
Rückgabewert
true zurück, wenn die Anweisung erfolgreich ausgeführt wurde, andernfalls false. Im Fehlerfall können Details über mysqli_stmt_error() abgerufen werden.Beispiele
Datensatz einfügen mit bind_param
<?php
$mysqli = mysqli_connect('localhost', 'user', 'secret', 'testdb');
if (!$mysqli) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
$stmt = mysqli_prepare($mysqli, "INSERT INTO users (name, email) VALUES (?, ?)");
if (!$stmt) {
die('Prepare fehlgeschlagen: ' . mysqli_error($mysqli));
}
$name = 'Max Mustermann';
$email = 'max@example.com';
mysqli_stmt_bind_param($stmt, 'ss', $name, $email);
if (mysqli_stmt_execute($stmt)) {
echo 'Datensatz eingefügt, ID: ' . mysqli_insert_id($mysqli);
} else {
echo 'Fehler: ' . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
Parameter direkt als Array übergeben (PHP 8.1+)
<?php
$mysqli = mysqli_connect('localhost', 'user', 'secret', 'testdb');
$stmt = mysqli_prepare($mysqli, "SELECT id, name FROM users WHERE email = ? AND active = ?");
// Ab PHP 8.1: Parameter direkt im execute()-Aufruf
if (mysqli_stmt_execute($stmt, ['max@example.com', 1])) {
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
echo $row['id'] . ': ' . $row['name'] . "\n";
}
mysqli_free_result($result);
} else {
echo 'Fehler: ' . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
Masseninsert mit mehrfacher Ausführung
<?php
$mysqli = mysqli_connect('localhost', 'user', 'secret', 'testdb');
$stmt = mysqli_prepare($mysqli, "INSERT INTO tags (label) VALUES (?)");
$tags = ['PHP', 'MySQL', 'SQL-Injection-Schutz'];
foreach ($tags as $tag) {
mysqli_stmt_bind_param($stmt, 's', $tag);
mysqli_stmt_execute($stmt);
}
echo count($tags) . ' Tags wurden eingefügt.';
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
// Wichtig · Fallstricke
Sicherheit: Prepared Statements mit mysqli_stmt_execute() schützen zuverlässig vor SQL-Injection, da Benutzerdaten niemals in den SQL-Quelltext eingefügt werden. Trotzdem sollten Eingaben stets validiert werden, bevor sie in die Datenbank geschrieben werden.
Typen beim Array-Parameter (PHP 8.1+): Werden Parameter über das $params-Array übergeben, sendet PHP alle Werte als String an MySQL. Das kann bei BIGINT-Spalten oder bestimmten Vergleichen zu unerwartetem Verhalten führen. Bei typsensitiven Abfragen weiterhin mysqli_stmt_bind_param() mit dem korrekten Typ-String verwenden.
Fehlerbehandlung: Um Fehler nicht zu übersehen, sollte mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) aktiviert werden; dann wirft mysqli_stmt_execute() bei Fehlern eine mysqli_sql_exception statt stillschweigend false zurückzugeben.