This question already has answers here:
Invoking a PHP script from a MySQL trigger
(10个答案)
5年前关闭。
我试图使用mysql触发器调用.php,这是mysql的代码
delimiter $$
DROP TRIGGER IF EXISTS qwertyuiop$$
CREATE TRIGGER qwertyuiop
AFTER UPDATE ON testing
FOR EACH ROW
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result int(10);
 SET cmd=CONCAT('C:/wamp/www/index.php');
 SET result = sys_exec(cmd);
END
@@
Delimiter;

提前谢谢

最佳答案

尽管在lib_mysqludf_sys库的帮助下技术上是可行的,但您不应该这样做。这在所有可能的方面都是错误的。仅举几个例子:
单独使用这些udf是一个巨大的安全威胁。以下是lib文档中的一段简短引述:
在决定是否需要这个函数时要非常小心。UDF是
对所有数据库用户可用-不能授予执行权限
为了他们。因为传递给sys_exec的commandstring可以做很多事情
任何事情,暴露功能都会带来非常真实的安全隐患。
即使对于一个良性的用户,也有可能意外地
用它来破坏。调用将以
运行MySQL的操作系统用户,因此删除MySQL的
数据目录,或者更糟。
在触发器中执行任何非事务性操作都是错误的。DML语句所做的数据更改(在您的情况下是一个更新)可以并且将在真实场景中回滚。您将无法撤消对php脚本的调用。
您正在延长更新事务的时间,这可能会导致其他更新/插入操作的锁等待超时。
推荐阅读:
The Trouble with Triggers
现在,即使我们把上面提到的所有东西都放在一边,您的代码也有一些问题
您将DELIMITER更改为$$,但随后使用@@终止触发器定义。
不需要cmd变量。
触发器是在运行MySQL的OS用户的上下文中执行的,因此必须提供指向php可执行文件和php脚本的绝对路径
据说一个有效的版本看起来像

DELIMITER $$
CREATE TRIGGER qwertyuiop
AFTER UPDATE ON testing
FOR EACH ROW
BEGIN
  DECLARE result INT;
  SET result = sys_exec('C:/php/php.exe C:/path/to/script.php');
END$$
DELIMITER ;

10-05 23:42
查看更多