无缓冲查询错误-如何在本地主机上获取它们

时间:2019-03-22 19:04:18

标签: php mysql

有时我会收到此错误(仅在远程服务器上):

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"); 

错误在最后一行

1 个答案:

答案 0 :(得分:3)

简单答案

  1. 创建一个新的(附加)连接。

一旦您处于未缓冲请求的中间,则连接被锁定/阻塞。几乎无法使用。

  1. 或者不这样做(在缓冲查询正在进行时)。

因此,如果您需要查询其他内容,请在未缓冲部分之前执行此操作,或者打开与数据库的第二个缓冲(正常)连接。

我曾经用一个无缓冲的查询从数据库中取出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中修复非常容易,而且不这样做非常糟糕。

干杯!