【问题标题】:Calling a php file by using mysql trigger [duplicate]使用mysql触发器调用php文件[重复]
【发布时间】:2013-12-24 14:56:19
【问题描述】:

我正在尝试使用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; 

提前致谢

【问题讨论】:

  • 你根本做不到。 MySQL 没有机制可以像这样在触发器或其他任何地方调用 PHP。

标签: php mysql sql triggers


【解决方案1】:

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

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

    在决定是否需要此功能时要非常小心。 UDF 是 可供所有数据库用户使用 - 您不能授予 EXECUTE 权限 为他们。由于传递给 sys_exec 的命令字符串可以做很多事情 一切,暴露功能会带来非常现实的安全隐患。 即使对于一个善良的用户,也有可能不小心做很多事情 伤害它。调用将使用以下权限执行 os用户运行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 ;

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多