Я хотел бы распечатать простую таблицу на своей странице с 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
Моя проблема запускает на retreaving первые 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.
Что я могу сделать для предотвращения этого? Я должен изменить все и искать различный способ получить этот вид запросов?
Вы говорите, что разместили упрощенную версию кода. Вы меняли что-нибудь еще, когда размещали это здесь? Эта ошибка обычно возникает, когда у вас одновременно «открыто» несколько запросов. Например, вы вызываете fetch ()
, но не вызываете его, пока он не будет исчерпан, а затем вы пытаетесь получить второй запрос.
Судя по приведенному выше коду, этого не должно происходить, потому что вы используете fetchAll ()
. Обычно решение этой проблемы - вызвать closeCursor ()
[docs] . Вы можете попробовать вызывать его после каждого fetchAll
и посмотреть, что это даст.
в цикле, который вы фактически снова выбираете 1-й оператор (обратите внимание на вызов
$building_stmt-> fetchAll ()
):
$tags_stmt->execute ();
$tags = $buildings_stmt->fetchAll (PDO::FETCH_ASSOC);
то, что вы, вероятно, захотите сделать, это получить оператор $ tags_stmt
?
$tags_stmt->execute ();
$tags = $tags_stmt->fetchAll (PDO::FETCH_ASSOC);