2014-02-26 72 views
0

我有類似於下面的東西,在這同時刪除文件和數據庫條目的功能:ZF2已經活躍查詢阻止執行

$adapter = $this->getAdapter(); 
$query = $adapter->query("call find_results_by_job_id(?)", array($jobId)); 
$items = array(); 
while (($current = $query->current()) !== false) 
{ 
    $id = $current['id']; 
    $items[] = $id; 
    $query->next(); 
} 
$this->deleteFromDataStore($items); 
$result = $adapter->query("call delete_results_by_job_id(?)", array($jobId), \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE); 

(一些可能看起來不像做的最好的辦法,因爲我簡化它這個例子)

我就上線收到此錯誤:SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active.

我假設的問題是因爲查詢/適配器沒有關閉從迭代結果的連接但是當我嘗試執行另一個聲明。如果是這樣的話,那麼如何重用適配器,關閉查詢,或者最後一行之前我必須做的任何事情?

奇怪的部分是,幾乎完全相同的模式下的代碼在另一種方法中起作用。


答:

當使用PDO的驅動程序,$query->getDataSource()->getResource()->closeCursor();修復它

回答

3

好像你使用的是unbuffered query in MySQL

如果是這樣,您將不得不打開緩衝或打破執行以前查詢似乎掛起?

喜歡的東西$query->close()

編輯:

如果$queryStatementInterface情況下,再有就是getResource()返回mysqli_stmt,你可以在它上面調用close()

EDIT2:(納入最終決議)

如果它使用PDO,你可以得到PDOStatement,並呼籲closeCursor()

+0

是的,像$查詢 - > close()方法將是有益的,如果它存在。可悲的是,我找不到類似的結果集對象或數據庫適配器 – rwilson04

+0

@ rwilson04使用我發現的編輯 – jkavalik

+2

$ query是\ Zend \ Db \ ResultSet \ ResultSet的一個實例。它有一個'getDataSource()'方法,它返回一個\ Zend \ Db \ Adapter \ Driver \ Pdo \ Result,它有一個'getResource()'方法,但它返回一個PDOStatement。這兩種都沒有'close()'方法。 – rwilson04

0
$this->adapter 
->query($sql) 
->execute() 
->getResource() 
->fetchAll(\PDO::FETCH_ASSOC); 
+0

你能否解釋你的答案如何解決問題中的問題?僅有代碼的答案並不是很有用,特別是對於那些偶然發現這篇文章的讀者。謝謝! – Cristik

0

假設你有一個查詢的結果在你的手中,你不要知道它是一個ResultSet還是一個Result,下面的工作就可以完成。 測試爲Zend框架3.

use Zend\Db\ResultSet\ResultSet; 
... 

public function closeResult($result) 
{ 
    if(is_a($result, ResultSet::class)) 
    { 
     $stmt = $result->getDataSource()->getResource(); 
    } 
    else 
    { 
     $stmt = $result->getResource(); 
    } 
    $stmt->closeCursor(); 
}