Start · Sprachen · PHP · Referenz · mysqli_stmt_reset

mysqli_stmt_reset

Funktion

Setzt eine vorbereitete Anweisung zurück, ohne sie zu schließen, und ermöglicht damit eine erneute Ausführung mit neuen Parametern.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_reset(mysqli_stmt $statement): bool

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

Typ
bool
Beschreibung
Gibt 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);
Benutzer 1: Alice Benutzer 2: Bob

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();
}
Beide Einträge erfolgreich gespeichert.

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