给出以下代码:
// 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循环完成,所以当我尝试准备一个新查询时,它说“nope太多连接已经”并且出去了。
有什么想法吗?
编辑:是的我知道没有必要这样做两次,在我的实际代码中它只能在WHILE循环中准备好,但就像我说的那样在我的生产服务器上失败所以经过一些测试我发现一个简单的SELECT *查询在WHILE循环中失败但没有失败。我给出的示例代码显然非常淡化,只是为了说明问题。
答案 0 :(得分:0)
不应该多次准备$ example_query。只需在循环中执行查询。
编辑:如果必须在每次循环迭代中准备一个新查询,则循环结束时显式的$ example_query-> closeCursor()应该释放与该语句对象关联的任何资源。
答案 1 :(得分:0)
问题是当一个无缓冲的查询正在运行时我无法做某事(它在WHILE循环中)
解决方案是添加以下行以确保使用缓冲查询:
$database->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);