Start · Sprachen · PHP · Referenz · mysqli_stmt_prepare

mysqli_stmt_prepare

Funktion

Bereitet eine SQL-Anweisung auf einem bestehenden Statement-Objekt zur Ausführung vor und ermöglicht das spätere Binden von Parametern.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_prepare(mysqli_stmt $statement, string $query): bool

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

Typ
bool
Beschreibung
Gibt 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);
ID: 42, Benutzername: maxmustermann

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);
'Apfel' erfolgreich eingefügt. 'Banane' erfolgreich eingefügt. 'Kirsche' erfolgreich eingefügt.

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