Вызов 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
Библиотека, вы не должны делать это. Это неправильно всеми возможными способами. Чтобы упомянуть только несколько:
Использование этих UDF само по себе представляет огромную угрозу безопасности. Вот короткая цитата из документации библиотеки:
Будьте очень осторожны, решая, нужна ли вам эта функция. UDF доступны для всех пользователей базы данных - вы не можете предоставлять им привилегии EXECUTE. Поскольку строка команд, передаваемая sys_exec, может делать практически все, раскрытие функции представляет собой реальную угрозу безопасности. Даже для добросовестного пользователя можно случайно нанести ему много вреда. Вызов будет выполнен с привилегиями пользователя os, который запускает MySQL, поэтому вполне возможно удалить каталог данных MySQL или, что еще хуже.
Выполнение любых нетранзакционных операций в триггере неверно. Изменения данных, сделанные оператором DML (в вашем случае это обновление), могут быть и будут отменены в реальном сценарии. Вы не сможете отменить вызовы к вашему php-скрипту.
Вы продлеваете время обновления транзакции, возможно, вызывая тайм-ауты блокировки для других операций обновления / вставки.
Рекомендуемое чтение:
Теперь, даже если мы отложим все вышеупомянутое, у вас есть несколько проблем с вашим кодом
- Вы меняете
DELIMITER
в$$
но затем завершить определение триггера@@
, - Там нет необходимости
cmd
переменная. - Триггер выполняется в контексте пользователя ОС, под которым работает 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 ;