2012-10-11 29 views
26

The PHP documentation on closeCursor() dice que¿Cuándo debería usar closeCursor() para las declaraciones PDO?

libera la conexión con el servidor para que otras sentencias SQL pueden ser emitidas, pero deja la declaración en un estado que permite que se ejecute de nuevo.

Cuando he utilizado el comando aunque no parece importar si está allí o no entre mis instrucciones de consulta, y estoy empezando a preguntarme si lo necesito en absoluto.

¿Es diferente usarlo para llamadas de bases de datos que no devuelven datos en comparación con las que sí lo hacen?

+11

Sabrá que tiene que usar 'closeCursor()' cuando PDO se queja de que no puede ejecutar consultas mientras se ejecutan otras consultas sin búfer. Eso generalmente ocurre cuando intenta invocar un procedimiento almacenado a través del objeto 'PDOStatement'. En pocas palabras: a menos que obtenga el error mencionado, no se preocupe. –

+0

Otra pregunta de SO que puede interesarle: http://stackoverflow.com/questions/1046614/do-sql-connections-opened-with-pdo-in-php-have-to-be-closed –

+0

¿Qué controlador está usando? para PDO? Eso podría hacer una diferencia. MySqli pdo, sqlsrv pdo? –

Respuesta

6

Esto depende del controlador utilizado. Creo que para mysql esto no hará nada más que aclarar el resultado de la declaración. Después de llamar a closeCursor() ya no puedes llamar a fetch(). Sin embargo, ejecutar la declaración nuevamente no debería ser un problema. Intenta mirar mysql_free_result(), hace algo similar.

-1

Para responder a la pregunta de MySQL

Según lo mencionado por N. B. antes de ejecutar() el mismo PDOStatement preparado.

Ejem: (. Esto es una mala práctica, pero simple ejemplo, normalmente se le fetchAll o REGISTRARSE más secuencias de comandos complejas, como con consultas anidadas (véase más arriba sobre uniones), hace que este ejemplo más 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; 
?> 

Además de ser específico para MySQL, también puede establecer opcionalmente el atributo PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY en falso, lo que requiere que PHP compruebe siempre la base de datos y no necesite cerrar el cursor. http://php.net/manual/en/mysqlinfo.concepts.buffering.php

Cuestiones relacionadas