我试图通过使用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;
提前致谢
答案 0 :(得分:6)
即使在lib_mysqludf_sys
库的帮助下技术上可行,也不应该这样做。在所有可能的方面都是错的。仅举几例:
单独使用这些UDF是一种巨大的安全威胁。以下是lib文档的简短引用:
在决定是否需要此功能时要非常小心。 UDF是 可供所有数据库用户使用 - 您无法授予EXECUTE权限 对他们来说由于传递给sys_exec的命令字符串可以做很多事情 一切,暴露该功能会带来非常真实的安全隐患。 即使对于良性用户,也可能意外地做很多事情 用它造成的伤害。该呼叫将以该权限执行 运行MySQL的os用户,因此删除MySQL是完全可行的 数据目录,或更糟。
在触发器中执行任何非事务性操作都是错误的。 DML语句(在您的情况下,它是一个更新)所做的数据更改可以并将在现实世界的场景中回滚。您将无法撤消对PHP脚本的调用。
您正在延长更新事务的时间,可能导致其他更新/插入操作的锁定等待超时。
推荐阅读:
现在,即使我们搁置了上述所有内容,您的代码也存在一些问题
DELIMITER
更改为$$
,但随后使用@@
终止了触发器定义。cmd
变量。据说工作版可能看起来像
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 ;