我知道这个问题已经被问过很多次了,但是我已经阅读了很多问题的答案,但仍然无法理解为什么我会收到这个错误:
致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[HY000]:一般错误:2014 无法在其他无缓冲查询处于活动状态时执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。
奇怪的第一件事是,我的本地主机(wampserver)上没有错误,但我的网络服务器上确实出现了错误。我的本地主机上的 php 版本是 5.3.10,而在我的 Web 服务器上是 5.3.13。
我已经读过这个错误的来源是当数据从先前的查询留在缓冲区中时进行查询。这不是我的情况——我已经回显了所有数据,并且我知道查询中返回的每一行都被获取。
话虽如此,我发现将我的一个查询更改为fetchAll
而不是fetch
解决问题,但它根本没有,因为我知道所有返回的行都被读取。当我用于fetchAll
查询时(它是在循环中进行的),我在每个循环中打印出数组,并且对于循环中的每个查询,数组中只有一个项目。
还有一条信息。引发 PDO 错误的不是我更改为的查询fetchAll
(这会使错误消失),稍后在我的 php 文件中还有另一个查询会引发错误。我的文件基本上是这样的:
... code ...
query 1
... code ...
loop
query 2
end loop
... code ...
query 3
如果我注释掉查询 3,则没有错误。如果我注释掉或更改为fetchAll
查询 2,则没有错误。查询 1 没有任何影响。
我还想补充一点,我已经尝试添加LIMIT 1
到页面上的所有查询(同时),但错误仍然存在。我认为这证明缓冲区中没有未读数据,对吧?
我真的很困惑,所以我很感激你的建议。在有人问之前,我无法发布完整的代码,但这是我的代码的简化版本:
$stmt = $this->db->prepare('SELECT ... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt = $this->db->prepare('SELECT ... :par LIMIT 1');
for loop
makeQuery($stmt, array(':par' => $var));
$row2 = $stmt->fetch(PDO::FETCH_ASSOC);
... [use row2] ...
end for loop
$stmt = $this->db->prepare('SELECT ... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row3 = $stmt->fetch(PDO::FETCH_ASSOC);
这里是makeQuery()
。
/**************************************************************************************************************
* Function: makeQuery *
* Desc: Makes a PDO query. *
* Pre conditions: The statement/query and an array of named parameters (may be empty) must be passed. *
* Post conditions: The PDO query is executed. Exceptions are caught, displayed, and page execution stopped. *
**************************************************************************************************************/
function makeQuery($stmt, $array, $errMsg = '')
{
try
{
$stmt->execute($array);
}
catch (PDOException $e)
{
print $errMsg != ''?$errMsg:"Error!: " . $e->getMessage() . "<br/>";
die();
}
}
谢谢你的帮助!
编辑:我还尝试在查询 2 之后执行以下操作(因为这似乎是问题的根源:
$row2 = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($row2);
输出是:
bool(false)
我是否偶然发现了 PDO 错误?