我在删除文件和数据库条目的函数中有如下内容:
$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();
修复了它
答案 0 :(得分:3)
好像你正在使用unbuffered query in MySQL。
如果是这样,你要么必须打开缓冲,要么打破先前查询的执行似乎挂起?
像$query->close()
编辑:
如果$query
是StatementInterface
的实例,则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();
}