PDOStatement::closeCursor

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)

PDOStatement::closeCursor — Ferme le curseur, permettant Ă  la requĂȘte d'ĂȘtre de nouveau exĂ©cutĂ©e

Description

public function PDOStatement::closeCursor(): bool

PDOStatement::closeCursor() libĂšre la connexion au serveur, permettant ainsi Ă  d'autres requĂȘtes SQL d'ĂȘtre exĂ©cutĂ©es, mais laisse la requĂȘte dans un Ă©tat lui permettant d'ĂȘtre de nouveau exĂ©cutĂ©e.

Cette mĂ©thode est utile pour les drivers de base de donnĂ©es qui ne supportent pas l'exĂ©cution d'objet PDOStatement lorsqu'un objet PDOStatement exĂ©cutĂ© prĂ©cĂ©demment a encore des lignes non rĂ©cupĂ©rĂ©es. Si le driver de base de donnĂ©es souffre de cette limitation, le problĂšme se manifestera de lui-mĂȘme dans une erreur en dehors de la sĂ©quence.

PDOStatement::closeCursor() est implémenté soit en tant que méthode optionnelle spécifique au pilote, avec un maximum d'efficacité, ou en tant que solution générique si aucune fonction spécifique au pilote n'est installée. Sémantiquement, la fonction générique PDO revient à écrire le code suivant dans le script PHP :

<?php
do {
while (
$stmt->fetch())
;
if (!
$stmt->nextRowset())
break;
} while (
true);
?>

Liste de paramĂštres

Cette fonction ne contient aucun paramĂštre.

Valeurs de retour

Cette fonction retourne true en cas de succĂšs ou false si une erreur survient.

Erreurs / Exceptions

Émet une erreur de niveau E_WARNING si l'attribut PDO::ATTR_ERRMODE est dĂ©fini Ă  PDO::ERRMODE_WARNING.

LÚve une exception PDOException si l'attribut PDO::ATTR_ERRMODE est défini à PDO::ERRMODE_EXCEPTION.

Exemples

Exemple #1 Exemple avec PDOStatement::closeCursor()

Dans l'exemple suivant, l'objet PDOStatement $stmt retourne de multiples lignes, mais l'application rĂ©cupĂšre uniquement la premiĂšre ligne, laissant l'objet PDOStatement dans l'Ă©tat oĂč il lui reste des lignes non rĂ©cupĂ©rĂ©es. Pour s'assurer que l'application fonctionnera avec tous les drivers de base de donnĂ©es, l'auteur insĂšre un appel Ă  la fonction PDOStatement::closeCursor() sur $stmt avant l'exĂ©cution d'objet PDOStatement $otherStmt.

<?php
/* Création d'un objet PDOStatement */
$stmt = $dbh->prepare('SELECT foo FROM bar');

/* Création d'un second objet PDOStatement */
$otherStmt = $dbh->prepare('SELECT foobaz FROM foobar');

/* ExĂ©cute la premiĂšre requĂȘte */
$stmt->execute();

/* Récupération de la premiÚre ligne uniquement depuis le résultat */
$stmt->fetch();

/* L'appel suivant Ă  closeCursor() peut ĂȘtre requis par quelques drivers */
$stmt->closeCursor();

/* Maintenant, nous pouvons exĂ©cuter la deuxiĂšme requĂȘte */
$otherStmt->execute();
?>

Voir aussi

add a note

User Contributed Notes 2 notes

up
1
manuelj dot diazf at gmail dot com ¶
4 months ago
This is pretty useful when using PDO with MySQL after executing a stored procedure:

<?php

// PDO Connection Defintion

$query = "call custom_procedure()";
$stmt = $conn->query($query);

// Error checking

$stmt->fetch();

$stmt->closeCursor();
// Not calling closeCursor will error the query below as
// 2014 - Cannot execute queries while there are pending result sets.

$query = "select * from table";
$stmt = $conn->query($query);
up
1
Anonymous ¶
10 years ago
In case this is helpful to anybody else who ends-up here after getting 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 beginning of my stored procedure did.