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