2010-03-10 6 views
6

Ich möchte eine einfache Tabelle auf meiner Seite mit 3 Spalten, building name, tags und architecture style drucken. Wenn ich versuche, um die Liste der building names und arch. styles abzurufen gibt es kein Problem:So vermeiden Sie diese PDO-Ausnahme: Abfragen können nicht ausgeführt werden, während andere ungepufferte Abfragen aktiv sind

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 

Mein Problem beginnt am retreaving die ersten 5-Tags für jedes Gebäude der Abfrage habe ich gerade geschrieben.

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 

Die Abfrage selbst funktioniert perfekt, aber nicht, wo ich dachte, es zu benutzen:

<?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; 

Ich bin nicht auf Anfragen erfahren, so dass ich so etwas wie dies zwar, aber es wirft den Fehler:

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. 

Was kann ich tun, um dies zu vermeiden? Sollte ich alle ändern und einen anderen Weg suchen, um diese Art von Anfragen zu erhalten?

Antwort

3

Sie sagen, dass Sie eine vereinfachte Version des Codes veröffentlicht haben. Hast du etwas anderes geändert, als du es hier gepostet hast? Dieser Fehler wird normalerweise verursacht, wenn mehrere Abfragen gleichzeitig geöffnet sind. Beispielsweise rufen Sie fetch() auf, aber Sie rufen es nicht auf, bis es erschöpft ist, und Sie versuchen dann, eine zweite Abfrage abzurufen.

Nach Ihrem obigen Code zu urteilen, sollte dies nicht passieren, weil Sie fetchAll() verwenden. Normalerweise ist die Lösung für dieses Problem closeCursor()[docs] anrufen. Du könntest versuchen, das nach jedem fetchAll anzurufen und zu sehen, ob das irgendwas macht.

+0

danke für die Antwort, ich werde die Dokumentation sehen, ich benutze nur fetchAll(), ich habe nur die Abfrage Länge um die Anzahl der inneren Joins und Tabellen beteiligt, wenn ich es auf phpMyAdmin versuchen die Abfrage funktioniert, sollte es nicht ' t es drin sein – vitto

+0

Ja! jetzt funktioniert es! danke für die Hilfe! – vitto

1

in der Schleife Sie wieder die erste Anweisung tatsächlich zu holen sind (die

$buildings_stmt->fetchAll() Anruf bemerken):

$tags_stmt->execute(); 
$tags = $buildings_stmt->fetchAll (PDO::FETCH_ASSOC); 

was wollen Sie wahrscheinlich die $tags_stmt Anweisung zu tun ist, holen?

$tags_stmt->execute(); 
$tags = $tags_stmt->fetchAll (PDO::FETCH_ASSOC); 
+0

Sorry, normalerweise semplify ich meinen Code zu lange Fragen zu vermeiden, es war ein semplification Fehler, es ist nicht das Problem, danke für die Benachrichtigung – vitto

+0

Dies war die Lösung für mein Problem, danke! –

Verwandte Themen