有时我会收到此错误(仅在远程服务器上):
General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll()...
我将这行代码添加到了我的php代码之上-没有成功:
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute;
两个问题:
如果可能的话,不使用fetchAll()
,如何正确避免此错误?
如果存在错误,我应该怎么做才能在本地主机上收到此错误?
我正在Windows 7,xampp,phpmyadmin ...
这是代码
$st = $db->query("select title from folders where id = " . $_GET['fd'] . " limit 1");
$st->execute();
$title = $st->fetchColumn();
$stb = $db->query("select * from arts where folder = " . $_GET['fd'] . " order by ind asc");
错误在最后一行
答案 0 :(得分:3)
简单答案
一旦您处于未缓冲请求的中间,则连接被锁定/阻塞。几乎无法使用。
因此,如果您需要查询其他内容,请在未缓冲部分之前执行此操作,或者打开与数据库的第二个缓冲(正常)连接。
我曾经用一个无缓冲的查询从数据库中取出1.4亿行。现在他们在MongoDB中(即使我对此有不同的感觉)。 PS。如果有人知道如何提高mongo的计数性能,我会很惊讶。
如果使用大型数据集,则只需要un-buffered query
,我的意思是> 500k行。我将其作为最后的手段。
无论如何,祝你好运。这很痛苦。
更新
对于您而言,您需要使PDOStatement对象消失或调用PDOStatement::closeCursor
。
$st = $db->query("select title from folders where id = " . $_GET['fd'] . " limit 1");
$st->execute();
$title = $st->fetchColumn();
unset($st); //<---- unset the statement object
$stb = $db->query("select * from arts where folder = " . $_GET['fd'] . " order by ind asc");
如果我考虑正确,unset
应该照顾好它。通常,当它超出范围时(例如,方法或函数的末尾且没有对其的引用),就会发生这种情况。这有点像free_result
或Mysqli的
我只是假设你有这样的东西:
$st = $db->query("select title from folders where id = " . $_GET['fd'] . " limit 1");
$st->execute();
foreach($st->fetchColumn() as $col){
$stb = $db->query("select * from arts where folder = {$col} order by ind asc");
}
将开放查询的结果用于新查询的位置。这是禁忌。在上述情况下,您唯一能做的就是为循环中的零件打开一个新连接,因为可能无法在一个查询中完成所有连接(无论出于何种原因)。
在任何情况下,请将其更改为适当的预准备语句:
$st = $db->prepare("select title from folders where id = :id limit 1");
$st->execute(['id' => $_GET['fd']]);
因为它很容易受到SQLInjection的攻击。在PDO中修复非常容易,而且不这样做非常糟糕。
干杯!