【问题标题】:PHP's PDO Prepare Method Fails While in a LoopPHP 的 PDO 准备方法在循环中失败
【发布时间】:2009-04-21 19:22:56
【问题描述】:

给定以下代码:

// 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 循环中失败,但没有退出。我给出的示例代码显然被淡化了,只是为了说明问题。

【问题讨论】:

  • 我不明白你在说什么。如果您在循环中使用 prepare() ,那么您做错了。循环外准备,内执行。

标签: php mysql pdo


【解决方案1】:

问题是当一个无缓冲的查询正在运行时我不能做某事(它在 WHILE 循环中)

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 对不起,我想我不是更清楚。我正在这样做,但它在我的产品服务器上失败了。经过一些测试,我注意到它失败了,因为它在哪里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2023-03-29
    相关资源
    最近更新 更多