好的,所以我开发了这个网站(业余)使用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)并且在此之前工作正常。它只返回一个结果。
答案 0 :(得分:2)
我已经使用了$query->closeCursor();
,如某些链接的SO问题中所述,对于在此页面上执行的每个选择查询都可以达到工作状态。
这不太理想,我希望我们能够确定这个问题的真正原因和解决方案。不幸的是,我没有服务器配置访问权来检查其他一些解决方案。
这也有效,但有些评论说它不适合他们:
$link->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
答案 1 :(得分:2)
这不一定是这个问题的答案,但这可能会对将来有所帮助。
我遇到了完全相同的错误,花了几个小时才发现错误。事实证明,它一直只是一个非常小的语法问题。如果你实际上没有使用任何缓冲,但仍然有这样的错误,就像我一样,这可能是你的问题 - 所以检查你的代码。
当我遇到这个错误时,我正在进行正常的数据库查询 - 不是故意使用任何缓冲技术 - 所以我高度怀疑它与缓冲有什么关系。我阅读了关于它的每一个问题,并深入研究它。
这是我的 STUPID 语法问题:
$SQL = "UPDATE articles SET
topicID = :topic; <-------- semicolon - woops!
heading = :heading,
subheading = :subheading,
keywords = :keywords,
rawContent = :rawContent,
content = :content,
...
...
这导致我收到此缓冲错误。我修复了代码,它就消失了。最令人讨厌的是,PDO错误指向另一个查询,下一个查询,但该查询是在代码中的其他位置执行的函数,而且通过我很快就离开了一段时间!