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

Php PDO中的多创建触发器查询,php,mysql,pdo,innodb,Php,Mysql,Pdo,Innodb,我正在尝试在PDO中运行以下SQL字符串。我可以确认代码确实直接在MySQL中执行,但在PHP PDO中运行它会抛出一个错误 据我所知,分隔符$$在PDO接口上不可用。根据这个理论,只需在查询中保留分隔符就可以了 查询字符串: CREATE DEFINER=CURRENT_USER TRIGGER `M5_tblMVTransactionVat_VatInsert` AFTER INSERT ON `M2_tblVatRevisions` FOR EACH ROW BEGIN UPDATE

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

据我所知,
分隔符$$
在PDO接口上不可用。根据这个理论,只需在查询中保留分隔符就可以了

查询字符串:

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一次只运行一个Create触发器不会导致相同的错误,并且触发器已成功创建。


如何在PDO连接上执行多个create trigger查询?

不要一次执行多个语句

没有理由这样做,而且

MySQL的前工程总监曾经告诉我,没有理由存在multi_查询,它只会造成伤害(这是我的解释)


在调用
PDO::exec()

的过程中执行每个CREATE TRIGGER语句更简单、更安全。您想在一个文件中包含一堆初始化内容吗?那么为什么要费心使用PHP;做

mysql ... -e "source foo.sql"
好的,你想让PHP运行吗?然后从php执行此操作:

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

但是,您最好关闭窗口--这对于黑客来说是一种很好的破坏方式。

好的,那么如果我想通过PHP PDO在数据库上应用大量create触发器作为数据库初始化序列,则需要将它们放入不同的文件中,或者编写自己的分隔符/解析器?是的。你认为mysql客户机是如何做到的?我以为它是通过mysql CLI实现的,它有一个内置的解析器?编辑:既然您提到了它,我看到像DELETE视图这样的内容在历史记录中被列为单独的语句。客户机有一个非常简单的解析器:它一直读取到分隔符字符串,然后它将读取的内容发送到服务器,作为单个语句执行。然后它读取到下一个分隔符并重复这个过程,然后将其作为可重用的PHP包来运行SQL脚本,并将其作为开源产品发布,这样其他人就不必重新发明这个轮子。到目前为止,我还没有看到一个真正有效的方法。似乎这比编写自己的客户机来解释SQL文件更简单。谢谢这是我问题的解决方案,但不是对我问题的“技术”回答。所以我会选择“你不能”作为比尔的答案-karwin@EatonEmmerich-本论坛上的许多问题没有说明最初的问题,而只是说明在撞到砖墙之前发生的问题。(我确实喜欢并同意比尔的回答。)