当其他未缓冲查询处于活动状态时,无法执行查询


Cannot execute queries while other unbuffered queries are active

好吧,所以我使用PHP 5.4的本地测试服务器(100%工作)开发了这个网站,但是在上传到远程主机时,我遇到了不间断的问题,可能都是由PHP版本的差异引起的。远程服务器使用PHP 5.1。在此页上,从前页传递一个值,该值用于填写表单。

我已经通过试验和错误跟踪了这个问题,但不知道是什么原因导致它,到目前为止已经阅读了至少30个相关的SO问题。此页上的代码在prepare语句处立即停止执行。我不能得到任何类型的错误信息。

我知道$link连接是打开的,因为在此之前我有一个查询,它工作得很好。

if (('POST' === $_SERVER['REQUEST_METHOD']) && (isset($_POST['details'])))
{
$sql='select * from this where that=:that';
echo $sql; //added for testing
$query=$link->prepare($sql);
echo "this never shows up"; //verified problem area
$query->bindValue(':that', $_POST['details']);
$query->execute();
$row=$query->fetch();
//more things
}

感谢所有的帮助!

编辑:不注意,错误:

不能在其他未缓冲查询活动时执行查询。考虑使用PDOStatement::fetchAll()。或者,如果您的代码只会对mysql运行,你可以启用查询通过设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性来缓冲

非常模糊的错误,当我注释掉前面的查询时就消失了。这很奇怪,因为前面的查询在几个页面上,并且没有问题。此外,它只返回一个结果,所以我不确定这个错误的真正含义。下面是前面的查询:

$sql='select bgcolor from settings inner join users on id=userid where username=:user';
$query=$link->prepare($sql);
$query->bindValue(':user', $_SESSION['Username']);
$query->execute();
$row=$query->fetch();
$rgb = str_split($row['bgcolor'], 3);

它在每个页面上运行(因为我是新手,效率低下,不保存SESSION和COOKIE),在此之前运行良好。它只返回一个结果。

我使用了$query->closeCursor();,正如在一些链接的SO问题中所指出的那样,对于本页上执行的每个选择查询都达到工作状态。

这是不太理想的,我希望我们能确定这个问题的真正原因和解决方案。不幸的是,我没有服务器配置访问权限来检查其他一些解决方案。

这也可以工作,但一些评论说它不适合他们:

$link->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

这不一定是这个问题的答案,但这可能在将来对某人有所帮助。

我遇到了完全相同的错误,花了几个小时才发现错在哪里。事实证明,这只是一个非常小的语法问题。如果你实际上没有使用任何缓冲,但仍然有这个错误,像我一样,这可能是你的问题-所以检查你的代码。

当我遇到这个错误时,我正在进行正常的数据库查询——没有故意使用任何缓冲技术——所以我高度怀疑它与缓冲有关。我读了关于它的每一个问题,并深入研究了它。 这是我的愚蠢的语法问题:
$SQL = "UPDATE articles SET
            topicID = :topic;    <-------- semicolon - woops!
            heading = :heading,
            subheading = :subheading,
            keywords = :keywords,
            rawContent = :rawContent,
            content = :content,
            ...
            ...

这导致我得到这个缓冲错误。我修改了代码,它就消失了。最烦人的是,PDO错误指向另一个查询,下一个查询,但该查询是在代码中其他地方的函数中,并且通过我很好地偏离了一段时间!