2010-03-10 5 views
6

Je voudrais imprimer une simple table dans ma page avec 3 colonnes, building name, tags et architecture style. Si je tente de récupérer la liste des building names et arch. styles il n'y a pas de problème:Comment éviter cette exception PDO: Impossible d'exécuter des requêtes pendant que d'autres requêtes sans tampon sont actives

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 

Mon problème commence retreaving les 5 premières balises pour chaque bâtiment de la requête que je viens écrit.

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 

La requête elle-même fonctionne parfaitement, mais pas là où je pensais l'utiliser:

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

Je ne suis pas expérimenté sur les requêtes, donc je bien quelque chose comme ça, mais il jette l'erreur:

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. 

Que puis-je faire pour éviter cela? Dois-je tout changer et chercher d'une autre manière pour obtenir ce genre de requêtes?

Répondre

3

Vous dites que vous avez publié une version simplifiée du code. Avez-vous changé quelque chose quand vous l'avez posté ici? Cette erreur est normalement provoquée lorsque vous avez plusieurs requêtes "ouvertes" en même temps. Par exemple, vous appelez fetch(), mais vous ne l'appelez pas jusqu'à épuisement, puis vous essayez d'extraire une deuxième requête.

A en juger par votre code ci-dessus, cela ne devrait pas arriver parce que vous utilisez fetchAll(). Normalement, la solution à ce problème est d'appeler closeCursor()[docs]. Vous pouvez essayer d'appeler cela après chaque fetchAll et voir si cela fait quoi que ce soit.

+0

merci pour la réponse, je vais voir la documentation, j'utilise seulement fetchAll(), j'ai seulement simplifié la longueur de la requête par le nombre de jointures internes et les tables impliquées, si je l'essaie sur phpMyAdmin la requête fonctionne, il ne devrait pas t y être – vitto

+0

Oui! maintenant ça marche! Merci pour l'aide! – vitto

1

dans la boucle vous fait à nouveau la récupérez 1ère déclaration (notez l'appel

$buildings_stmt->fetchAll()):

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

ce que vous voulez sans doute faire est de chercher la déclaration $tags_stmt?

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

désolé, généralement je semplify mon code pour éviter de longues questions, c'était une erreur de semplification, ce n'est pas le problème, merci pour avis – vitto

+0

C'était la solution à mon problème, merci! –