Signatur
Beschreibung
mysqli_stmt_close() schließt ein Prepared Statement und gibt alle dafür allokierten Ressourcen – sowohl auf der PHP-Seite als auch auf dem Datenbankserver – wieder frei. Nach dem Aufruf ist das übergebene Statement-Objekt nicht mehr verwendbar.
Diese Funktion sollte immer aufgerufen werden, wenn ein Prepared Statement nicht mehr benötigt wird. Insbesondere bei Schleifen, die viele Statements öffnen, verhindert das explizite Schließen Ressourcenlecks. In einer objektorientierten Umgebung kann alternativ die Methode $stmt->close() verwendet werden.
Beim Schließen eines Statements werden auch alle noch nicht abgerufenen Ergebnismengen verworfen. Es ist daher nicht notwendig, vorher mysqli_stmt_free_result() aufzurufen – mysqli_stmt_close() übernimmt dies implizit.
Das zugrundeliegende mysqli-Verbindungsobjekt bleibt nach dem Schließen des Statements weiterhin offen und kann für weitere Abfragen genutzt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das mysqli_stmt-Objekt, das geschlossen werden soll. Es wird durch mysqli_prepare() oder mysqli_stmt_init() erzeugt. |
Rückgabewert
true bei Erfolg zurück, oder false bei einem Fehler.Beispiele
Einfaches Schließen eines Prepared Statements (prozedural)
<?php
$mysqli = mysqli_connect('localhost', 'benutzer', 'passwort', 'testdb');
if (!$mysqli) {
die('Verbindungsfehler: ' . mysqli_connect_error());
}
$stmt = mysqli_prepare($mysqli, 'SELECT id, name FROM benutzer WHERE aktiv = ?');
if ($stmt) {
$aktiv = 1;
mysqli_stmt_bind_param($stmt, 'i', $aktiv);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($zeile = mysqli_fetch_assoc($result)) {
echo $zeile['id'] . ': ' . $zeile['name'] . PHP_EOL;
}
// Statement schließen und Ressourcen freigeben
mysqli_stmt_close($stmt);
}
mysqli_close($mysqli);
Objektorientierter Stil mit mehreren Statements
<?php
$mysqli = new mysqli('localhost', 'benutzer', 'passwort', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
// Erstes Statement: Datensatz einfügen
$stmtInsert = $mysqli->prepare('INSERT INTO benutzer (name, email) VALUES (?, ?)');
if ($stmtInsert) {
$name = 'Max Mustermann';
$email = 'max@example.com';
$stmtInsert->bind_param('ss', $name, $email);
$stmtInsert->execute();
echo 'Eingefügte ID: ' . $mysqli->insert_id . PHP_EOL;
$stmtInsert->close(); // Statement schließen
}
// Zweites Statement: Datensatz abrufen
$stmtSelect = $mysqli->prepare('SELECT id, name FROM benutzer WHERE email = ?');
if ($stmtSelect) {
$email = 'max@example.com';
$stmtSelect->bind_param('s', $email);
$stmtSelect->execute();
$result = $stmtSelect->get_result();
while ($zeile = $result->fetch_assoc()) {
echo $zeile['id'] . ': ' . $zeile['name'] . PHP_EOL;
}
$stmtSelect->close(); // Statement schließen
}
$mysqli->close();
// Wichtig · Fallstricke
Reihenfolge beim Aufräumen: Wenn sowohl ein Ergebnis-Objekt (mysqli_result) als auch das Statement (mysqli_stmt) geschlossen werden müssen, sollte zuerst das Ergebnis-Objekt mit mysqli_free_result() freigegeben werden, bevor das Statement geschlossen wird – auch wenn mysqli_stmt_close() dies intern übernimmt, verbessert die explizite Reihenfolge die Lesbarkeit des Codes.
Prepared Statements in Schleifen: Werden Prepared Statements in Schleifen verwendet und nicht geschlossen, kann dies zu Ressourcenengpässen oder sogar zu Too many connections-Fehlern auf dem Datenbankserver führen. Daher sollte mysqli_stmt_close() stets aufgerufen werden, sobald das Statement nicht mehr benötigt wird.
Objekt nach dem Schließen: Nach dem Aufruf von close() darf das Statement-Objekt nicht mehr verwendet werden. Ein erneuter Aufruf von execute() oder anderen Methoden auf dem geschlossenen Statement führt zu einem Fehler.