La PHP documentation sur closeCursor()
dit que
libère la connexion au serveur afin que d'autres instructions SQL puissent être émises, mais laisse l'instruction dans un état lui permettant d'être exécutée à nouveau.
Lorsque j’ai utilisé la commande, peu importe qu’elle soit présente ou non entre les instructions de ma requête, peu importe, et je commence à me demander si j’en ai vraiment besoin.
Est-ce différent de l'utiliser pour les appels de base de données qui ne renvoient pas de données par rapport à ceux qui le font?
Cela dépend du pilote utilisé. Je pense que pour mysql, cela ne fera que clarifier le résultat de la déclaration. Après avoir appelé closeCursor (), vous ne pouvez plus appeler fetch (). Cependant, exécuter à nouveau l'instruction ne devrait pas être un problème. Essayez de regarder mysql_free_result () , il fait la même chose.
Pour répondre à la question pour MySql
Comme mentionné par N.B. avant d'exécuter () le même PDOStatement préparé.
EG: (c'est une mauvaise pratique mais un exemple simple, normalement vous fetchAll ou JOIN. Des scripts plus complexes, tels que les requêtes imbriquées (voir ci-dessus à propos des JOIN), rendent cet exemple plus viable.
<?php
$ids = array( 1, 2 );
$sth = $pdo->prepare( "SELECT name FROM company WHERE id = :id" );
foreach( $ids as $id ) {
$sth->execute( array( ':id' => $id ) );
$result = $sth->fetch( PDO::FETCH_ASSOC );
$sth->closeCursor();
echo $result['name'] . PHP_EOL;
}
unset( $result );
$sth = null;
$pdo = null;
?>
En plus de spécifique à MySQL, vous pouvez également éventuellement définir l'attribut PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY sur false, ce qui nécessite que PHP vérifie toujours la base de données et qu'il ne soit pas nécessaire de fermerCursor. http://php.net/manual/en/mysqlinfo.concepts.buffering.php