‘PDOException’ con el mensaje ‘SQLSTATE : error general: 2014 No se pueden ejecutar consultas mientras están activas otras consultas sin búfer

Sé que esta pregunta se me ha hecho muchas veces, pero las respuestas comúnmente aceptadas no me han ayudado. Pero, por accidente, tropecé con una respuesta.

Aquí está la configuración: tuve una gran cantidad de consultas (principalmente CREATE TABLE) pasando por una conexión. Pero un CREATE TRIGGER siguió arrojando el temido error de 2014. Esto no tenía nada que ver con los cursores abiertos, porque sucedió incluso cuando era el único comando en el progtwig. Esto, por ejemplo, falló:

setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute (PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $st = $db->query ("CREATE TRIGGER `CirclesClosureSync` AFTER INSERT ON Circles FOR EACH ROW BEGIN INSERT INTO CirclesClosure (ancestor, descendant) SELECT ancestor, NEW.ID from CirclesClosure WHERE descendant=NEW.Parent; INSERT INTO CirclesClosure (ancestor, descendant) values (NEW.ID, NEW.ID); END;"); $st->closeCursor(); ?> 

Esto parecía similar a otros problemas relacionados con la creación de procedimientos almacenados.

Esto es php 5.4.5, MySql 5.5, Windows XP (aunque falló en otras ventanas también)

Solutions Collecting From Web of "‘PDOException’ con el mensaje ‘SQLSTATE : error general: 2014 No se pueden ejecutar consultas mientras están activas otras consultas sin búfer"

Tomé un poco de toquetear, pero descubrí que cuando tomaba ATTR_EMULATE_PREPARES = false out (el valor predeterminado es emular), funcionó:

 < ?php $db = new PDO ($cnstring, $user, $pwd); $db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //$db->setAttribute (PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $st = $db->query ("CREATE TRIGGER `CirclesClosureSync` AFTER INSERT ON Circles FOR EACH ROW BEGIN INSERT INTO CirclesClosure (ancestor, descendant) SELECT ancestor, NEW.ID from CirclesClosure WHERE descendant=NEW.Parent; INSERT INTO CirclesClosure (ancestor, descendant) values (NEW.ID, NEW.ID); END;"); $st->closeCursor(); ?> 

Espero que esto ayude a alguien

El desencadenador se puede crear a través de PDO :: exec () incluso cuando PDO :: ATTR_EMULATE_PREPARES = falso:

 < ?php $db = new PDO ($cnstring, $user, $pwd); $db->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute (PDO::ATTR_EMULATE_PREPARES, false); $db->setAttribute (PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $db->exec("CREATE TRIGGER `CirclesClosureSync` AFTER INSERT ON Circles FOR EACH ROW BEGIN INSERT INTO CirclesClosure (ancestor, descendant) SELECT ancestor, NEW.ID from CirclesClosure WHERE descendant=NEW.Parent; INSERT INTO CirclesClosure (ancestor, descendant) values (NEW.ID, NEW.ID); END;");