(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)
PDOStatement::closeCursor — Schließt den Cursor, damit die Anweisung erneut ausgeführt werden kann
PDOStatement::closeCursor() gibt die Verbindung zum Server frei, damit andere SQL-Anweisungen ausgeführt werden können, belässt die Anweisung aber in einem Zustand, in dem sie erneut ausgeführt werden kann.
Diese Methode ist nützlich für Datenbanktreiber, die die Ausführung eines PDOStatement-Objekts nicht unterstützen, wenn ein zuvor ausgeführtes PDOStatement-Objekt noch nicht abgrufene Zeilen enthält. Wenn der Datenbanktreiber diese Einschränkung aufweist, kann es zu einem Out-of-Sequence-Fehler kommen.
PDOStatement::closeCursor() ist entweder als optionale treiberspezifische Methode implementiert (für maximale Effizienz), oder als generischer PDO-Fallback, wenn keine treiberspezifische Funktion installiert ist. Der generische PDO-Fallback ist semantisch dasselbe wie der folgende Code in einem PHP-Skript:
<?php
do {
while ($stmt->fetch())
;
if (!$stmt->nextRowset())
break;
} while (true);
?>
Diese Funktion besitzt keine Parameter.
Gibt einen Fehler der Stufe E_WARNING
aus, wenn das Attribut PDO::ATTR_ERRMODE
auf PDO::ERRMODE_WARNING
gesetzt ist.
Löst eine PDOException aus, wenn das Attribut PDO::ATTR_ERRMODE
auf PDO::ERRMODE_EXCEPTION
gesetzt ist.
Beispiel #1 PDOStatement::closeCursor()-Beispiel
Im folgenden Beispiel gibt das PDOStatement-Objekt $stmt mehrere Zeilen zurück, aber die Anwendung ruft nur die erste Zeile ab, wodurch das PDOStatement-Objekt in einem Zustand mit nicht abgerufenen Zeilen verbleibt. Um sicherzustellen, dass die Anwendung mit allen Datenbanktreibern funktioniert, wird hier PDOStatement::closeCursor() für $stmt aufgerufen, bevor das PDOStatement-Objekt $otherStmt ausgeführt wird.
<?php
/* Erstellen eines PDOStatement-Objekts */
$stmt = $dbh->prepare('SELECT foo FROM bar');
/* Erstellen eines zweiten PDOStatement-Objekts */
$otherStmt = $dbh->prepare('SELECT foobaz FROM foobar');
/* Ausführen der ersten Anweisung */
$stmt->execute();
/* Nur die erste Zeile der Ergebnisse wird abgerufen */
$stmt->fetch();
/* Bei manchen Treibern kann der folgende Aufruf von closeCursor() erforderlich sein */
$stmt->closeCursor();
/* Nun kann die zweite Anweisung ausgeführt werden */
$otherStmt->execute();
?>