ZF2已经活跃查询阻止执行(ZF2 already active query prevents ex

2019-11-02 23:46发布

我有类似于下面的东西,在这同时删除文件和数据库条目的功能:

$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(); 修复它

Answer 1:

好像你正在使用的MySQL中无缓冲查询 。

如果是这样,你将不得不打开缓冲或打破这似乎挂以前查询的执行?

喜欢的东西$query->close()

编辑:

如果$query是实例StatementInterface ,再有就是getResource()返回mysqli_stmt ,你可以调用close()就可以了。

EDIT2:(纳入最终决议)

如果它使用PDO,你可以得到PDOStatement ,并调用closeCursor()



Answer 2:

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


Answer 3:

假设你在你的手中查询的结果,你不知道它是否是一个结果或结果,以下将做的工作。 经测试为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();
}


文章来源: ZF2 already active query prevents execution