我正在尝试在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连接上执行多个创建触发器查询?
答案 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"');
但是,您最好将舱口盖住-这对于黑客造成严重破坏是一种绝妙的方式。