【问题标题】:'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active带有消息“SQLSTATE [HY000]”的“PDOException”:一般错误:2014 在其他无缓冲查询处于活动状态时无法执行查询
【发布时间】:2013-06-10 19:29:08
【问题描述】:

我知道这个问题已经被问过很多次,但普遍接受的答案对我没有帮助。但很偶然,我偶然发现了一个答案。

设置如下:我有大量查询(主要是 CREATE TABLE)通过连接。但是 CREATE TRIGGER 不断抛出可怕的 2014 错误。这与打开的游标无关,因为即使它是程序中唯一的命令也会发生。例如,这失败了:

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

这似乎类似于其他涉及创建存储过程的问题。

这是 php 5.4.5、MySql 5.5、Windows XP(虽然在其他 Windows 上也失败了)

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    折腾了一些,但我发现当我把 ATTR_EMULATE_PREPARES=false 拿出来(默认是模拟)时,它起作用了:

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

    希望这对某人有所帮助

    【讨论】:

    • 感谢未来的你
    【解决方案2】:

    即使 PDO::ATTR_EMULATE_PREPARES = false,也可以通过 PDO::exec() 创建触发器:

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

    【讨论】:

    • 知道这一点很有用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2015-12-24
    • 2013-06-30
    • 2019-12-23
    相关资源
    最近更新 更多