使用mysql触发器调用php文件

时间:2013-12-07 04:52:33

标签: php mysql sql triggers

我试图通过使用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; 

提前致谢

1 个答案:

答案 0 :(得分:6)

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

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

      

    在决定是否需要此功能时要非常小心。 UDF是   可供所有数据库用户使用 - 您无法授予EXECUTE权限   对他们来说由于传递给sys_exec的命令字符串可以做很多事情   一切,暴露该功能会带来非常真实的安全隐患。   即使对于良性用户,也可能意外地做很多事情   用它造成的伤害。该呼叫将以该权限执行   运行MySQL的os用户,因此删除MySQL是完全可行的   数据目录,或更糟。

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

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

  4. 推荐阅读:


    现在,即使我们搁置了上述所有内容,您的代码也存在一些问题

    1. 您将DELIMITER更改为$$,但随后使用@@终止了触发器定义。
    2. 不需要cmd变量。
    3. 触发器在运行MySQL的OS用户的上下文中执行,因此您必须为php可执行文件和php脚本提供绝对路径
    4. 据说工作版可能看起来像

      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 ;