PHP 的 PDO prepare 方法在循环中失败

PHP's PDO Prepare Method Fails While in a Loop

提问人:Andrew G. Johnson 提问时间:4/22/2009 最后编辑:Andrew G. Johnson 更新时间:3/30/2010 访问量:1262

问:

给定以下代码:

// Connect to MySQL up here

$example_query = $database->prepare('SELECT * FROM table2');
if ($example_query === false) die('prepare failed');

$query = $database->prepare('SELECT * FROM table1');
$query->execute();
while ($results = $query->fetch())
{
    $example_query = $database->prepare('SELECT * FROM table2');
    if ($example_query === false) die('prepare failed'); //it will die here
}

显然,我试图两次准备 SELET 表 2 中的所有内容。第二个(WHILE 循环中的那个)总是失败并导致错误。

这只是在我的生产服务器上,在本地开发我没有问题,所以它一定是某处的某种设置。

我立即想到的是,MySQL具有某种设置为1的max_connections设置,并且在WHILE循环完成之前,连接将保持打开状态,因此当我尝试准备新查询时,它会说“不,已经连接了太多”并拉屎了。

有什么想法吗?

编辑:是的,我知道没有必要做两次,在我的实际代码中,它只在 WHILE 循环中准备,但就像我说的那样,这在我的生产服务器上失败了,所以经过一些测试,我发现一个简单的 SELECT * 查询在 WHILE 循环中失败,但没有退出。我给出的示例代码显然非常淡化,只是为了说明这个问题。

php mysql pdo

评论

1赞 Chad Birch 4/22/2009
我不明白你在说什么。如果你在循环中使用 prepare(),你就做错了。在循环外准备,在循环内执行。

答:

0赞 Scott McCammon 4/22/2009 #1

应该不需要多次准备 $example_query。只需在循环中执行查询即可。

编辑:如果必须在每次循环迭代中准备一个新查询,则循环末尾的显式 $example_query->closeCursor() 应释放与语句对象关联的任何资源。

评论

0赞 Andrew G. Johnson 4/22/2009
对不起,我想我没有说得更清楚。我正在这样做,但它在我的生产服务器上失败了。经过一些测试,我注意到它因为在哪里而失败。
0赞 Andrew G. Johnson 4/22/2009 #2

问题是,在运行无缓冲查询时,我无法执行某些操作(它在 WHILE 循环中)

解决方案是添加以下行,以确保使用缓冲查询:

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