ZF2已经激活的查询阻止了执行

时间:2014-02-26 01:24:02

标签: php mysql zend-framework2

我在删除文件和数据库条目的函数中有如下内容:

$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 个答案:

答案 0 :(得分:3)

好像你正在使用unbuffered query in MySQL

如果是这样,你要么必须打开缓冲,要么打破先前查询的执行似乎挂起?

$query->close()

这样的东西

编辑:

如果$queryStatementInterface的实例,则getResource()会返回mysqli_stmt,您可以在其上调用close()

EDIT2 :(纳入最终决议)

如果它使用PDO,您可以获得PDOStatement并致电closeCursor()

答案 1 :(得分:0)

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

答案 2 :(得分:0)

假设您手中有查询结果并且您不知道它是ResultSet还是Result,以下内容将完成此任务。 从Zend Framework 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();
}