使用mysql触发器调用php文件

ash*_*h92 2 php mysql sql triggers

我试图通过使用mysql trigger来调用.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; 
Run Code Online (Sandbox Code Playgroud)

提前致谢

pet*_*erm 6

即使在lib_mysqludf_sys图书馆的帮助下技术上可行,你也不应该这样做.在所有可能的方面都是错的.仅举几例:

  1. 单独使用这些UDF是一个巨大的安全威胁.以下是lib文档的简短引用:

    在决定是否需要此功能时要非常小心.UDF可供所有数据库用户使用 - 您无法为它们授予EXECUTE权限.由于传递给sys_exec的命令字符串几乎可以完成所有操作,因此暴露该函数会带来非常真实的安全隐患.即使对于良性使用者,也可能意外地对其造成很大的伤害.调用将以运行MySQL的操作系统用户的权限执行,因此删除MySQL的数据目录完全可行,或者更糟.

  2. 在触发器中执行任何非事务操作都是错误的.DML语句(在您的情况下,它是一个更新)所做的数据更改可以并将在现实世界的场景中回滚.您将无法撤消对PHP脚本的调用.

  3. 您正在延长更新事务的时间,可能导致其他更新/插入操作的锁定等待超时.

推荐阅读:


现在,即使我们放弃了上面提到的所有内容,您的代码也存在一些问题

  1. 您更改DELIMITER$$但随后终止触发器定义@@.
  2. 不需要cmd变量.
  3. 触发器在运行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 ;
Run Code Online (Sandbox Code Playgroud)