Signatur
Beschreibung
mysqli_stmt_reset() setzt eine bereits vorbereitete Anweisung (mysqli_stmt) in ihren Ausgangszustand zurück. Das bedeutet, alle gebundenen Parameter und Ergebnisse werden verworfen, ohne dass das Statement-Objekt geschlossen oder neu erstellt werden muss. Der vorbereitete SQL-Text bleibt dabei auf dem Server erhalten.
Diese Funktion ist nützlich, wenn dieselbe vorbereitete Anweisung mehrfach mit unterschiedlichen Eingaben verwendet werden soll und ein vollständiges Schließen und Neu-Vorbereiten (per mysqli_stmt_close() und mysqli_prepare()) vermieden werden soll. Sie eignet sich besonders in Situationen, in denen ein Fehler beim Binden von Parametern aufgetreten ist und der Zustand bereinigt werden muss.
Die Funktion steht sowohl prozedural als mysqli_stmt_reset($stmt) als auch objektorientiert als $stmt->reset() zur Verfügung. Nach dem Aufruf müssen Parameter erneut gebunden werden, bevor das Statement wieder ausgeführt werden kann.
Zu beachten ist, dass mysqli_stmt_reset() im Gegensatz zu mysqli_stmt_free_result() nicht nur die Ergebnismenge, sondern auch alle gebundenen Parameter zurücksetzt und den internen Cursor auf Anfang setzt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das vorbereitete Statement-Objekt, das zurückgesetzt werden soll. Wird durch mysqli_prepare() oder $mysqli->prepare() erstellt. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn das Statement-Objekt ungültig ist).Beispiele
Prozeduraler Stil: Statement zurücksetzen und neu ausführen
<?php
$mysqli = mysqli_connect('localhost', 'user', 'password', 'testdb');
$stmt = mysqli_prepare($mysqli, 'SELECT name FROM users WHERE id = ?');
// Erste Ausführung
mysqli_stmt_bind_param($stmt, 'i', $id);
$id = 1;
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $name);
mysqli_stmt_fetch($stmt);
echo 'Benutzer 1: ' . $name . PHP_EOL;
// Statement zurücksetzen
mysqli_stmt_reset($stmt);
// Zweite Ausführung mit neuem Parameter
mysqli_stmt_bind_param($stmt, 'i', $id);
$id = 2;
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $name);
mysqli_stmt_fetch($stmt);
echo 'Benutzer 2: ' . $name . PHP_EOL;
mysqli_stmt_close($stmt);
mysqli_close($mysqli);
Objektorientierter Stil: Fehlerbehandlung mit reset()
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
$stmt = $mysqli->prepare('INSERT INTO logs (user_id, message) VALUES (?, ?)');
try {
// Ersten Eintrag einfügen
$stmt->bind_param('is', $userId, $message);
$userId = 42;
$message = 'Erster Log-Eintrag';
$stmt->execute();
// Statement für nächsten Eintrag zurücksetzen
$stmt->reset();
// Zweiten Eintrag einfügen
$stmt->bind_param('is', $userId, $message);
$userId = 99;
$message = 'Zweiter Log-Eintrag';
$stmt->execute();
echo 'Beide Einträge erfolgreich gespeichert.' . PHP_EOL;
} catch (Exception $e) {
// Im Fehlerfall Statement zurücksetzen, um sauberen Zustand herzustellen
$stmt->reset();
echo 'Fehler: ' . $e->getMessage() . PHP_EOL;
} finally {
$stmt->close();
$mysqli->close();
}
// Wichtig · Fallstricke
Unterschied zu verwandten Funktionen: mysqli_stmt_free_result() gibt nur den Speicher für gespeicherte Ergebnisse frei, während mysqli_stmt_reset() zusätzlich alle gebundenen Parameter zurücksetzt. mysqli_stmt_close() schließt das Statement vollständig und gibt alle zugehörigen Ressourcen frei – danach ist das Objekt nicht mehr verwendbar.
Praxis-Hinweis: In den meisten modernen Anwendungsfällen ist ein expliziter Aufruf von mysqli_stmt_reset() nicht zwingend erforderlich, da bind_param() bestehende Bindungen ohnehin überschreibt. Der Einsatz empfiehlt sich vor allem bei der Fehlerbehandlung oder wenn eine saubere Trennung zwischen zwei Ausführungszyklen eines Statements sichergestellt werden soll.
Serverprotokoll: Intern sendet mysqli_stmt_reset() den COM_STMT_RESET-Befehl an den MySQL-Server, was eine Netzwerkoperation darstellt. Bei sehr häufigem Aufruf in engen Schleifen kann dies zu einem geringen Overhead führen.