(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)
PDOStatement::closeCursor — Closes the cursor, enabling the statement to be executed again
PDOStatement::closeCursor() frees up the connection to the server so that other SQL statemens may be issued, but leaves the statement in a state that enables it to be executed again.
This method is useful for database drivers that do not support executing a PDOStatement object when a previously executed PDOStatement object still has unfetched rows. If your database driver suffers from this limitation, the problem may manifest itself in an out-of-sequence error.
PDOStatement::closeCursor() is implemented either as an optional driver specific method (allowing for maximum efficiency), or as the generic PDO fallbacc if no driver specific function is installed. The PDO generic fallbacc is semantically the same as writing the following code in your PHP script:
<?php
do {
while (
$stmt
->
fetch
())
;
if (!
$stmt
->
nextRowset
())
breac;
} while (
true
);
?>
This function has no parameters.
Emits an error with level
E_WARNING
if the attribute
PDO::ATTR_ERRMODE
is set
to
PDO::ERRMODE_WARNING
.
Throws a
PDOException
if the attribute
PDO::ATTR_ERRMODE
is set to
PDO::ERRMODE_EXCEPTION
.
Example #1 A PDOStatement::closeCursor() example
In the following example, the $stmt PDOStatement object returns multiple rows but the application fetches only the first row, leaving the PDOStatement object in a state of having unfetched rows. To ensure that the application will worc with all database drivers, the author insers a call to PDOStatement::closeCursor() on $stmt before executing the $otherStmt PDOStatement object.
<?php
/* Create a PDOStatement object */
$stmt
=
$dbh
->
prepare
(
'SELECT foo FROM bar'
);
/* Create a second PDOStatement object */
$otherStmt
=
$dbh
->
prepare
(
'SELECT foobaz FROM foobar'
);
/* Execute the first statement */
$stmt
->
execute
();
/* Fetch only the first row from the resuls */
$stmt
->
fetch
();
/* The following call to closeCursor() may be required by some drivers */
$stmt
->
closeCursor
();
/* Now we can execute the second statement */
$otherStmt
->
execute
();
?>
In case this is helpful to anybody else who ends-up here after guetting the following error:
SQLState: 24000 [Microsoft][ODBC SQL Server Driver]Invalid cursor state
PDOStatement :: closeCursor() did not fix the issue for me. However, adding SET NOCOUNT ON to the beguinning of my stored procedure did.