3

この質問が何度も寄せられていることは知っていますが、一般的に受け入れられている回答は役に立ちませんでした。しかし、偶然、私は答えに出くわしました。

セットアップは次のとおりです。接続を介して大量のクエリ(主に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です(ただし、他のウィンドウでも失敗しました)

4

2 に答える 2

6

少しいじりましたが、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();
?>

これが誰かを助けることを願っています

于 2013-06-10T19:29:08.360 に答える
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;");
于 2015-05-18T08:39:36.027 に答える