Bu nasıl PDO istisna önlemek için: diğer tamponsuz sorgular aktif iken sorguları yürütmek olamaz

2 Cevap php

Ben, 3 sütun ile benim sayfa building name, tags ve architecture style basit bir tablo yazdırmak istiyorum. I building names ve arch. styles hiçbir sorun yoktur listesini almak için deneyin:

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 yazmıştım sorgu 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ışır, ancak bunu kullanmak için düşünce değil burada:

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

Ben sorgularda deneyimli değilim, bu yüzden bu i gibi olsa bir şey, ama bu hata atıyor:

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.

Bunu önlemek için ne yapabilirim? Ben bütün değiştirmek ve sorguları bu tür almak için farklı bir yol aramak gerekir?

2 Cevap

Eğer kod basitleştirilmiş bir versiyonu yayınlanmıştır söylüyorlar. Buradan yayınlanmıştır zaman başka bir şey değişmez mi? Eğer aynı anda "açık" birden fazla sorgu varsa bu hata normalde neden olur. Örneğin, fetch() diyoruz, ama, bitene kadar bunu demiyorlar, ve sonra ikinci bir sorgu almak için deneyin.

Eğer fetchAll() kullanıyorsanız çünkü yukarıdaki kodu tarafından bakılırsa, bu olmamalıydı. Normal olarak bu sorunun çözümü aramak için closeCursor() [docs]. Her bundan sonra çağrı try fetchAll ve bir şey yaparsa görebiliyordu.

döngüde aslında fark (yine 1 deyimi getiriliyor edilir

$buildings_stmt->fetchAll() çağrı):

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

ne muhtemelen yapmak istiyorum $tags_stmt açıklama getirebilir mi?

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