Start · Sprachen · PHP · Referenz · mysqli_stmt_init

mysqli_stmt_init

Funktion

Initialisiert ein <code>mysqli_stmt</code>-Objekt für die spätere Verwendung mit <code>mysqli_stmt_prepare()</code>.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_init(mysqli $mysql): mysqli_stmt|false

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

Typ
mysqli_stmt|false
Beschreibung
Gibt ein initialisiertes 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);
Benutzer: Max Mustermann (max@example.com)

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();
Eingefügte Datensatz-ID: 7

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