This question already has answers here:
Invoking a PHP script from a MySQL trigger
(10个答案)
5年前关闭。
我试图使用mysql触发器调用.php,这是mysql的代码
提前谢谢
(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 ;