2012-10-11 28 views
26

The PHP documentation on closeCursor()說,它什麼時候應該爲PDO語句使用closeCursor()?

釋放到服務器,這樣其它SQL語句可以發出的連接,但留下的聲明中,使其可以被再次執行的狀態。

當我使用了這個命令,雖然它似乎並不重要,如果它存在或不在我的查詢語句之間,我開始懷疑我是否需要它。

將它用於不返回數據的數據庫調用與那些不同的數據庫調用不同嗎?

+11

當你正在執行其他未緩衝的查詢時,你會知道你必須使用'closeCursor()'當PDO不能執行查詢。當您嘗試通過「PDOStatement」對象調用存儲過程時,通常會發生這種情況。底線 - 除非你得到提到的錯誤,不要擔心。 –

+0

另一個可能會讓你感興趣的SO問題:http://stackoverflow.com/questions/1046614/do-sql-connections-opened-with-pdo-in-php-have-to-be-closed –

+0

你在使用什麼驅動程序爲PDO?這可能會有所作爲。 MySqli pdo,sqlsrv pdo? –

回答

6

這取決於所使用的驅動程序。我認爲對於mysql來說,除了清除語句的結果之外別無其他。在調用closeCursor()之後,你不能再調用fetch()。 但是再次執行語句應該不成問題。 試着看看mysql_free_result(),它做了類似的事情。

-1

回答MySql的問題

正如N.B.然後執行()相同的準備好的PDOStatement。

EG:(這是不好的做法,但簡單的例子,通常你會使用fetchall或加入 更復雜的腳本,如用嵌套查詢(見上文關於連接),使這個例子更可行)

<?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; 
?> 

和MySQL一樣,您還可以選擇將PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY屬性設置爲false,這需要PHP始終檢查數據庫並且不需要關閉遊標。 http://php.net/manual/en/mysqlinfo.concepts.buffering.php

相關問題