PDO中的多个创建触发器查询

时间:2018-06-21 11:06:07

标签: php mysql pdo innodb

我正在尝试在PDO中运行以下SQL字符串。我可以确认代码确实可以直接在MySQL中执行,但是在PHP PDO中运行它会引发错误。

我了解到DELIMITER $$在PDO界面上不可用。并且根据how to execute mysql command DELIMITER,将分隔符放在查询之外应该没问题。

查询字符串:

CREATE DEFINER=CURRENT_USER TRIGGER `M5_tblMVTransactionVat_VatInsert` AFTER INSERT ON `M2_tblVatRevisions`
FOR EACH ROW BEGIN
  UPDATE M5_tblMVTransactionVat
  SET M5_tblMVTransactionVat.vatID = 1;

END

CREATE DEFINER=CURRENT_USER TRIGGER `M5_tblMVTransactionVat_VatUpdate` AFTER UPDATE ON `M2_tblVatRevisions`
FOR EACH ROW BEGIN
  UPDATE M5_tblMVTransactionVat
  SET M5_tblMVTransactionVat.vatID = 2;

END

通过简单的PDO :: exec或PDOStatement :: prepare(PDO :: ATTR_EMULATE_PREPARES = 1)运行会导致错误

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an
error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'CREATE
DEFINER=CURRENT_USER TRIGGER `M5_tblMVTransactionVat_VatUpdate` AFTER
UPD' at line 8

我已经确认通过PDO一次只运行一个创建触发器不会导致相同的错误,并且触发器创建成功。

如何在PDO连接上执行多个创建触发器查询?

2 个答案:

答案 0 :(得分:2)

不要一次执行多个语句。

没有理由这样做,it causes problems if you try

MySQL的前工程总监曾经告诉我,没有任何理由要存在multi_query,它只会造成伤害(这是我的表述)。

在自己对PDO::exec()的调用中执行每个CREATE TRIGGER语句更加简单安全。

答案 1 :(得分:1)

您想要文件中的一堆初始化内容吗?那为什么还要麻烦PHP呢?做

mysql ... -e "source foo.sql"

好吧,您确实想让PHP运行东西吗?然后从php执行此操作:

execcute('mysql ... -e "source foo.sql"');

但是,您最好将舱口盖住-这对于黑客造成严重破坏是一种绝妙的方式。