2010-03-10 11 views
6

Me gustaría imprimir una tabla simple en mi página con 3 columnas, building name, tags y architecture style. Si trato de recuperar la lista de building names y arch. styles no hay ningún problema:Cómo evitar esta excepción PDO: no se pueden ejecutar consultas mientras están activas otras consultas sin buffer

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 

Mi problema comienza en los primeros 5 retreaving etiquetas para todos los edificios de la consulta que acabo escribí.

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 propia consulta funciona perfectamente, pero no en el que pensé utilizarlo:

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

yo no tengo experiencia en consultas, así que si algo como esto, pero los tiros de error:

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. 

¿Qué puedo hacer para evitar esto? ¿Debo cambiar todo y buscar una forma diferente de obtener este tipo de consultas?

Respuesta

3

Usted dice que ha publicado una versión simplificada del código. ¿Cambiaste algo más cuando lo publicaste aquí? Este error normalmente se produce cuando tiene varias consultas "abiertas" al mismo tiempo. Por ejemplo, llama al fetch(), pero no lo llamas hasta que se agote, y luego tratas de recuperar una segunda consulta.

A juzgar por el código anterior, esto no debería suceder porque está usando fetchAll(). Normalmente, la solución a este problema es llamar al closeCursor()[docs]. Puedes intentar llamar después de cada fetchAll y ver si eso hace cualquier cosa.

+0

gracias por la respuesta, veré la documentación, uso fetchAll(), solo he simplificado la longitud de la consulta por el número de combinaciones internas y tablas involucradas, si lo intento en phpMyAdmin la consulta funciona, no debería t estar en él – vitto

+0

¡Sí! ¡ahora funciona! ¡gracias por la ayuda! – vitto

1

en el bucle en realidad se trae la primera declaración de nuevo (notar la llamada

$buildings_stmt->fetchAll()):

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

lo que es probable que desee hacer es buscar el comunicado $tags_stmt?

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

lo siento, por lo general, semplifico mi código para evitar preguntas largas, fue un error de secuencia, no es el problema, gracias por el aviso – vitto

+0

Esta fue la solución a mi problema, ¡gracias! –

Cuestiones relacionadas