Как избежать этого исключения PDO: невозможно выполнить запросы, когда другие небуферизованные запросы активны - PullRequest
6 голосов
/ 11 марта 2010

Я хотел бы напечатать простую таблицу на моей странице с 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.

Что я могу сделать, чтобы избежать этого? Должен ли я изменить все и искать другой способ получить такой запрос?

Ответы [ 2 ]

3 голосов
/ 11 марта 2010

Вы говорите, что выложили упрощенную версию кода. Вы что-нибудь изменили, когда разместили это здесь? Эта ошибка обычно возникает, когда у вас есть несколько запросов, «открытых» одновременно. Например, вы вызываете fetch(), но не вызываете его, пока он не исчерпан, а затем пытаетесь получить второй запрос.

Судя по приведенному выше коду, этого не должно произойти, потому что вы используете fetchAll(). Обычно решение этой проблемы заключается в вызове closeCursor() [docs] . Вы можете попробовать вызывать это после каждого fetchAll и посмотреть, будет ли это что-нибудь делать.

1 голос
/ 11 марта 2010

в цикле вы фактически выбираете 1-й оператор снова (обратите внимание на

$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...