2010-01-14 12 views
23

Sé que esto tiene que ser una solución simple y entiendo parcialmente por qué estoy recibiendo este error pero no sé cómo solucionarlo. Revisé los documentos pero no puedo encontrar una solución que no sea utilizar la opción de consultas almacenadas. Lo he intentado también pero no funciona.PDO No se pueden ejecutar consultas mientras están activas otras consultas sin búfer

El error es: DOP no puede ejecutar consultas, mientras que otras consultas sin búfer son activos

El error proviene de la línea donde estoy construyendo la matriz $ resultado.

foreach($phones as $phone) 
{ 
    $stmt = db::getInstance()->prepare("CALL phones(:phone)"); 
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10); 
    $stmt->execute(); 

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC); 
} 
+6

finales a la fiesta, pero todo el beneficio de las declaraciones preparadas es que solo debes prepararlas una vez. mueve tu preparación fuera del ciclo. –

+0

Amen, @KenK. Amén. –

Respuesta

34

necesita liberar su conexión utilizando el método PDOStatement :: closeCursor()

http://www.php.net/manual/en/pdostatement.closecursor.php

Creo

foreach($phones as $phone) 
{ 
    $stmt = db::getInstance()->prepare("CALL phones(:phone)"); 
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10); 
    $stmt->execute(); 

    $stmt->closeCursor() 

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC); 
} 

debe hacerlo por usted

+0

Gracias. Trabajó para mi. – Roy

4

Me encontré con este problema yo mismo y el problema resultó ser el uso de consultas apiladas. La solución anterior no resolvió el problema.

Tuvimos esta consulta se ejecuta justo antes de la que desencadenó el error:

return $this->fquery(' 
    SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value; 
    INSERT INTO sync_delete_value (...) 
    VALUES (%d, @follow_id, %d, "%s")', 
    $val1, $val2, $val3 
); 

Todo reanudó como de costumbre cuando he cambiado esto en:

$followId = $this->fquery(' 
    SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value' 
); 
return $this->fquery(' 
    INSERT INTO sync_delete_value (...) 
    VALUES (%d, %d, %d, "%s")', 
    $val1, $followId, $val2, $val3 

);

Es un pseudocódigo sorta pero entiendes el punto.

+0

+1 este me tiene por un tiempo. Gracias por compartir. –

8

Me encontré con este problema debido a un error en mi cláusula de conexión PDO. Yo estaba tratando de cambiar la zona horaria al conectar: ​​

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET time_zone = '$timezone';" 

lo cambié a:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, time_zone = '$timezone';" 

y funcionó bien.

+1

Gracias! Tenía exactamente el mismo problema! – Tom

3

Si $ stmt-> closeCursor() no funciona (no lo hizo para mí), sólo puede desactivar la variable $ stmt para liberar el cursor UPP, así:

foreach($phones as $phone) 
{ 
    $stmt = db::getInstance()->prepare("CALL phones(:phone)"); 
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10); 
    $stmt->execute(); 
    unset($stmt); 

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC); 
} 
+0

Muy interesante. Esto también lo solucionó para mí. – felwithe

Cuestiones relacionadas