2010-03-10 16 views
6

Sayfamda 3 sütun, building name, ve architecture style ile basit bir tablo yazdırmak istiyorum. Ben building names ve arch. styles listesini almak denerseniz hiçbir sorun:Bu PDO istisnası nasıl önlenir: Diğer arabelleğe almayan sorgular etkinken sorgular yürütülemiyor

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 

Benim sorunum sadece yazdım sorguyu her bina için ilk 5 etiketlerini retreaving başlar.

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 

sorgu kendisi mükemmel çalışıyor, ancak bunu kullanmak için düşünülen burada: Ben sorgulara deneyimli değilim

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

, bu yüzden olsa böyle bir şey, ama bu hatayı atar:

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. 

Bundan kaçınmak için ne yapabilirim? Bu tür sorguları almak için hepsini değiştirmeli ve farklı bir yol aramalı mıyım?

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

ne muhtemelen yapmak istiyorum $tags_stmt deyimi getirme edilir:

aslında yine 1 ifadeyi alıyorsanız döngüde

cevap

3

Kodun basitleştirilmiş bir sürümünü gönderdiğinizi söylüyorsunuz. Onu buraya gönderdiğinde başka bir şey değiştirdin mi? Bu hata normalde, aynı anda birden çok "açık" sorgunuz olduğunda ortaya çıkar. Örneğin, fetch() numaralı telefonu arayın, ancak tükenene kadar arama yapmazsınız ve sonra ikinci bir sorguyu almaya çalışırsınız.

Yukarıdaki kodunuza bakarak, bu fetchAll() kullanıyorsunuz çünkü bu olmamalıdır. Normalde, bu problemin çözümü closeCursor()[docs]'u aramaktır. Her bir fetchAll'dan sonra bunu deneyebilir ve bunun bir şey yapıp yapmadığını deneyebilirsiniz.

+0

cevabınız için teşekkürler, belgeleri göreceğim, sadece fetchAll() kullanıyorum, sadece sorgulama işleminde phpMyAdmin üzerinde denediysem, yalnızca iç birleştirme ve tabloların sayısına göre sorgu uzunluğunu sadeleştirdim. İçinde ol – vitto

+0

Evet! şimdi çalışıyor! yardım için teşekkürler! – vitto

1

(

$buildings_stmt->fetchAll() aramayı fark)?

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

Üzgünüz, genellikle uzun sorulardan kaçınmak için kodumu basitleştiriyorum, bir yarıçap hatasıydı, sorun değil, bildirim için teşekkürler – vitto

+0

Bu benim sorunumun çözümü oldu, teşekkürler! –