The PHP documentation on closeCursor()
說,它什麼時候應該爲PDO語句使用closeCursor()?
釋放到服務器,這樣其它SQL語句可以發出的連接,但留下的聲明中,使其可以被再次執行的狀態。
當我使用了這個命令,雖然它似乎並不重要,如果它存在或不在我的查詢語句之間,我開始懷疑我是否需要它。
將它用於不返回數據的數據庫調用與那些不同的數據庫調用不同嗎?
The PHP documentation on closeCursor()
說,它什麼時候應該爲PDO語句使用closeCursor()?
釋放到服務器,這樣其它SQL語句可以發出的連接,但留下的聲明中,使其可以被再次執行的狀態。
當我使用了這個命令,雖然它似乎並不重要,如果它存在或不在我的查詢語句之間,我開始懷疑我是否需要它。
將它用於不返回數據的數據庫調用與那些不同的數據庫調用不同嗎?
這取決於所使用的驅動程序。我認爲對於mysql來說,除了清除語句的結果之外別無其他。在調用closeCursor()之後,你不能再調用fetch()。 但是再次執行語句應該不成問題。 試着看看mysql_free_result(),它做了類似的事情。
回答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
當你正在執行其他未緩衝的查詢時,你會知道你必須使用'closeCursor()'當PDO不能執行查詢。當您嘗試通過「PDOStatement」對象調用存儲過程時,通常會發生這種情況。底線 - 除非你得到提到的錯誤,不要擔心。 –
另一個可能會讓你感興趣的SO問題:http://stackoverflow.com/questions/1046614/do-sql-connections-opened-with-pdo-in-php-have-to-be-closed –
你在使用什麼驅動程序爲PDO?這可能會有所作爲。 MySqli pdo,sqlsrv pdo? –