Вызов php-файла с помощью триггера mysql

Я пытаюсь вызвать.php с помощью триггера MySQL. Это код 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 ответ

Хотя это технически возможно с помощью lib_mysqludf_sys Библиотека, вы не должны делать это. Это неправильно всеми возможными способами. Чтобы упомянуть только несколько:

  1. Использование этих UDF само по себе представляет огромную угрозу безопасности. Вот короткая цитата из документации библиотеки:

    Будьте очень осторожны, решая, нужна ли вам эта функция. UDF доступны для всех пользователей базы данных - вы не можете предоставлять им привилегии EXECUTE. Поскольку строка команд, передаваемая sys_exec, может делать практически все, раскрытие функции представляет собой реальную угрозу безопасности. Даже для добросовестного пользователя можно случайно нанести ему много вреда. Вызов будет выполнен с привилегиями пользователя os, который запускает MySQL, поэтому вполне возможно удалить каталог данных MySQL или, что еще хуже.

  2. Выполнение любых нетранзакционных операций в триггере неверно. Изменения данных, сделанные оператором DML (в вашем случае это обновление), могут быть и будут отменены в реальном сценарии. Вы не сможете отменить вызовы к вашему php-скрипту.

  3. Вы продлеваете время обновления транзакции, возможно, вызывая тайм-ауты блокировки для других операций обновления / вставки.

Рекомендуемое чтение:


Теперь, даже если мы отложим все вышеупомянутое, у вас есть несколько проблем с вашим кодом

  1. Вы меняете DELIMITER в $$ но затем завершить определение триггера @@,
  2. Там нет необходимости cmd переменная.
  3. Триггер выполняется в контексте пользователя ОС, под которым работает MySQL, поэтому вы должны указать абсолютные пути как к исполняемому файлу 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 ;
Другие вопросы по тегам