0

给定以下代码:

// 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
}

我显然尝试准备语句以从 table2 中选择所有内容两次。第二个(WHILE 循环中的那个)总是失败并导致错误。

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

我的直接想法是 MySQL 有某种 max_connections 设置被设置为 1 并且连接保持打开直到 WHILE 循环完成所以当我尝试准备一个新查询时它说“没有太多连接已经”并且大便.

有任何想法吗?

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

4

2 回答 2

0

问题是在运行无缓冲查询时我无法做某事(它在 WHILE 循环中)

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

$database->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
于 2009-04-21T19:52:52.820 回答
0

不需要多次准备 $example_query 。只需在循环内执行查询。

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

于 2009-04-21T19:26:19.250 回答