Start · Sprachen · PHP · Referenz · mysqli_stmt_execute

mysqli_stmt_execute

Funktion

Führt eine zuvor vorbereitete SQL-Anweisung aus und gibt <code>true</code> bei Erfolg zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_execute(mysqli_stmt $statement, array|null $params = null): bool

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

Typ
bool
Beschreibung
Gibt 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);
Datensatz eingefügt, ID: 1

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);
1: Max Mustermann

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);
3 Tags wurden eingefügt.

// 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.