web-dev-qa-db-fra.com

Quand devrais-je utiliser closeCursor () pour les instructions PDO?

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?

30
Rafie

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.

6
mosch

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

0
fyrye