Signatur
Beschreibung
mysqli_stmt_init() erstellt ein neues, noch nicht mit einer SQL-Anweisung verknüpftes mysqli_stmt-Objekt auf Basis einer bestehenden Datenbankverbindung. Das zurückgegebene Objekt wird anschließend mit mysqli_stmt_prepare() verwendet, um eine parametrisierte SQL-Abfrage vorzubereiten.
Die Funktion gehört zum prozeduralen Stil der MySQLi-Erweiterung. Im objektorientierten Stil steht stattdessen $mysqli->stmt_init() zur Verfügung, das identisch funktioniert. In der Praxis wird häufig direkt mysqli_prepare() genutzt, das beide Schritte (Init + Prepare) in einem Aufruf kombiniert. mysqli_stmt_init() ist sinnvoll, wenn das Statement-Objekt zunächst erstellt, aber erst später vorbereitet werden soll.
Der typische Ablauf lautet: mysqli_stmt_init() → mysqli_stmt_prepare() → mysqli_stmt_bind_param() → mysqli_stmt_execute() → mysqli_stmt_bind_result() / mysqli_stmt_get_result() → mysqli_stmt_close(). Parametrisierte Prepared Statements sind der empfohlene Weg, um SQL-Injection-Angriffe zu verhindern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $mysql Pflicht | mysqli | Eine aktive MySQLi-Datenbankverbindung, die mit mysqli_connect() oder mysqli_init() erzeugt wurde. |
Rückgabewert
mysqli_stmt-Objekt zurück. Im Fehlerfall (z. B. ungültige Verbindung) wird false zurückgegeben.Beispiele
Prozeduraler Stil: Benutzer anhand der ID laden
<?php
$mysqli = mysqli_connect('localhost', 'db_user', 'db_pass', 'meine_datenbank');
if (!$mysqli) {
die('Verbindung fehlgeschlagen: ' . mysqli_connect_error());
}
// Statement-Objekt initialisieren
$stmt = mysqli_stmt_init($mysqli);
if (!$stmt) {
die('Initialisierung fehlgeschlagen');
}
// SQL-Anweisung vorbereiten
if (!mysqli_stmt_prepare($stmt, 'SELECT id, name, email FROM users WHERE id = ?')) {
die('Prepare-Fehler: ' . mysqli_stmt_error($stmt));
}
$userId = 42;
mysqli_stmt_bind_param($stmt, 'i', $userId);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_assoc($result);
if ($row) {
echo 'Benutzer: ' . $row['name'] . ' (' . $row['email'] . ')';
} else {
echo 'Kein Benutzer gefunden.';
}
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
Objektorientierter Stil mit stmt_init()
<?php
$mysqli = new mysqli('localhost', 'db_user', 'db_pass', 'meine_datenbank');
if ($mysqli->connect_errno) {
die('Verbindung fehlgeschlagen: ' . $mysqli->connect_error);
}
// Objektorientierter Äquivalent zu mysqli_stmt_init()
$stmt = $mysqli->stmt_init();
if ($stmt->prepare('INSERT INTO produkte (name, preis) VALUES (?, ?)')) {
$name = 'Kaffeemaschine';
$preis = 49.99;
$stmt->bind_param('sd', $name, $preis);
$stmt->execute();
echo 'Eingefügte Datensatz-ID: ' . $stmt->insert_id;
$stmt->close();
} else {
echo 'Prepare-Fehler: ' . $stmt->error;
}
$mysqli->close();
// Wichtig · Fallstricke
SQL-Injection-Schutz: Verwende grundsätzlich Prepared Statements mit Platzhaltern (?) und mysqli_stmt_bind_param(), anstatt Benutzereingaben direkt in SQL-Strings einzufügen. Das gilt unabhängig davon, ob du mysqli_stmt_init() + mysqli_stmt_prepare() oder das kürzere mysqli_prepare() verwendest.
Kurzform: In den meisten Fällen ist mysqli_prepare($mysqli, $sql) die bequemere Alternative, da Init und Prepare in einem Schritt erledigt werden. mysqli_stmt_init() bietet sich an, wenn das Objekt zunächst separat erstellt und ggf. erst später oder bedingt vorbereitet werden soll.
Ressourcenverwaltung: Nach der Verwendung sollte das Statement immer mit mysqli_stmt_close() geschlossen werden, um Ressourcen freizugeben.