如何避免此PDO异常:在其他未缓冲的查询处于活动状态时无法执行查询

vit*_*tto 6 php mysql select pdo exception

我想在我的页面中打印一个简单的表格,其中有3列building name,tagsarchitecture 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
Run Code Online (Sandbox Code Playgroud)

我的问题开始是为我刚刚编写的查询的每个建筑物重新保存前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
Run Code Online (Sandbox Code Playgroud)

查询本身工作得很好,但不是我想用它的地方:

<?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;
Run Code Online (Sandbox Code Playgroud)

我对查询没有经验,所以我虽然这样,但它会引发错误:

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.
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能避免这种情况?我应该更改所有内容并以不同的方式搜索以获得此类查询吗?

rye*_*guy 3

你说你发布了代码的简化版本。当您将其发布到此处时,您是否更改了其他内容?当您同时“打开”多个查询时,通常会导致此错误。例如,您调用fetch(),但直到它耗尽才调用它,然后尝试检索第二个查询。

从上面的代码来看,这种情况不应该发生,因为您正在使用fetchAll(). 通常,解决此问题的方法是调用closeCursor() [docs]。您可以尝试在每个之后调用它fetchAll,看看是否有任何作用。