如何避免此 PDO 异常:在其他无缓冲查询处于活动状态时无法执行查询
Posted
技术标签:
【中文标题】如何避免此 PDO 异常:在其他无缓冲查询处于活动状态时无法执行查询【英文标题】:How to avoid this PDO exception: Cannot execute queries while other unbuffered queries are active 【发布时间】:2011-01-26 03:55:39 【问题描述】:我想在我的页面中打印一个包含 3 列的简单表格,building name
、tags
和 architecture style
。如果我尝试检索building names
和arch. styles
的列表没有问题:
SELECT buildings.name, arch_styles.style_name
FROM buildings
INNER JOIN buildings_arch_styles
ON buildings.id = buildings_arch_styles.building_id
INNER JOIN arch_styles
ON arch_styles.id = buildings_arch_styles.arch_style_id
LIMIT 0, 10
我的问题始于为我刚刚编写的查询的每个构建重新检索前 5 个标签。
SELECT DISTINCT name
FROM tags
INNER JOIN buildings_tags
ON buildings_tags.tag_id = tags.id
AND buildings_tags.building_id = 123
LIMIT 0, 5
查询本身完美运行,但不是我想用的地方:
<?php
// pdo connection allready active, i'm using mysql
$pdo_conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
$sql = "SELECT buildings.name, buildings.id, arch_styles.style_name
FROM buildings
INNER JOIN buildings_arch_styles
ON buildings.id = buildings_arch_styles.building_id
INNER JOIN arch_styles
ON arch_styles.id = buildings_arch_styles.arch_style_id
LIMIT 0, 10";
$buildings_stmt = $pdo_conn->prepare ($sql);
$buildings_stmt->execute ();
$buildings = $buildings_stmt->fetchAll (PDO::FETCH_ASSOC);
$sql = "SELECT DISTINCT name
FROM tags
INNER JOIN buildings_tags
ON buildings_tags.tag_id = tags.id
AND buildings_tags.building_id = :building_id
LIMIT 0, 5";
$tags_stmt = $pdo_conn->prepare ($sql);
$html = "<table>"; // i'll use it to print my table
foreach ($buildings as $building)
$name = $building["name"];
$style = $building["style_name"];
$id = $building["id"];
$tags_stmt->bindParam (":building_id", $id, PDO::PARAM_INT);
$tags_stmt->execute (); // the problem is HERE
$tags = $tags_stmt->fetchAll (PDO::FETCH_ASSOC);
$html .= "... $name ... $style";
foreach ($tags as $current_tag)
$tag = $current_tag["name"];
$html .= "... $tag ..."; // let's suppose this is an area of the table where I print the first 5 tags per building
$html .= "...</table>";
print $html;
我对查询没有经验,所以我虽然是这样,但它会引发错误:
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
我可以做些什么来避免这种情况?我应该全部更改并搜索不同的方式来获取此类查询吗?
【问题讨论】:
【参考方案1】:您说您发布了代码的简化版本。当您在这里发布时,您是否更改了其他内容?当您同时“打开”多个查询时,通常会导致此错误。例如,您调用fetch()
,但直到它耗尽时才调用它,然后您尝试检索第二个查询。
根据您上面的代码判断,这不应该发生,因为您使用的是fetchAll()
。通常,这个问题的解决方法是调用closeCursor()
[docs]。您可以尝试在每个 fetchAll
之后调用它,看看是否有任何作用。
【讨论】:
感谢您的回复,我会查看文档,我只使用 fetchAll(),如果我在 phpMyAdmin 上尝试,我只是通过所涉及的内部连接和表的数量来简化查询长度查询有效,它不应该在其中【参考方案2】:在循环中,您实际上是在再次获取第一条语句(注意
$buildings_stmt->fetchAll()
打电话):
$tags_stmt->execute ();
$tags = $buildings_stmt->fetchAll (PDO::FETCH_ASSOC);
您可能想要做的是获取$tags_stmt
语句?
$tags_stmt->execute ();
$tags = $tags_stmt->fetchAll (PDO::FETCH_ASSOC);
【讨论】:
对不起,通常我会简化我的代码以避免冗长的问题,这是一个简化错误,不是问题,谢谢通知以上是关于如何避免此 PDO 异常:在其他无缓冲查询处于活动状态时无法执行查询的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询
当应用程序从后台处于活动状态时,如何避免在本机反应中安装组件?