Задача
Выполнить PHP-код в среде Друпала.
Решение
Внимание:
Неиспользуемый код нужно сразу удалить, потому что это может быть опасно!
Не оставляйте лазейку для пытливого ума хакера!
Варианты
Выполнить код (сниппет) можно:
- В блоке
- В блоке Execute PHP модуля Devel
- На странице
- Отдельном файле
В блоке
Блок позволяет гибко ограничить доступ для разных ролей, а также выводить блок на определённых страницах или только на какой-то одной.
Недостатки метода в том, что:
- Для того, чтобы увидеть работу кода нужно сохранить блок. Если что-то нужно изменить, то в отличии от страниц, где есть предпросмотр, - блок нужно будет снова открывать и сохранять.
- Код в блоке, для которого не выставлены ограничения видимости, может сделать весь сайт недоступным. В этом случае нужно выключить блок, используя SQL-сниппет.
Для выполнения кода нужно установить формат ввода: PHP.
На странице
Недостатки:
- Для страницы нет возможности, в отличии от блока, гибко задавать права доступа и область видимости.
Преимущество страницы перед блоком в том, что:
- У страниц есть предпросмотр, который позволяет получить результат работы кода (сниппета) без сохранения документа. Это удобно тем, что можно делать отладку и коррекцию кода, а также можно вообще не сохранять документ, если код не нужен постоянно.
- Если в коде страницы оказалась ошибка, то весь сайт остаётся работоспособным, как и админ-часть, где можно просто удалить "сломанную" страницу. Код в блоке, для которого не выставлены ограничения видимости, может сделать весь сайт недоступным. В этом случае нужно выключить блок, используя SQL-сниппет.
Настройка:
- Для выполнения кода нужно вставить этот код в тело блока с обязательными тегами:
<?php
//код, который нужно выполнить...
?> - Установить формат ввода: PHP
- Заполнить необходимые поля
- Нажать "Предпросмотр", если код не нужно использовать постоянно или "Сохранить", чтобы сохранить документ.
В блоке Execute PHP модуля Devel
Для этого способа нужен установленный модуль Devel.
Работает также как и вставка кода в блок (см. выше).
Отдельном файле
Для этого метода нужен доступ к файлам сайта.
Настройка:
- Создать файл с расширением ".php" в папке, которая видна веб-серверу
- Вставить в новый файл код:
<?php
//Если файл не в корне веб-сервера, то нужно исправить путь:
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);//код, который нужно выполнить...
?> - Сохранить файл
- Вызвать файл из браузера: http://example.com/my_code.php
- Удалить файл, если он больше не нужен, или ограничить доступ к нему в файле .htaccess.
См. рецепт Ограничение доступа к файлу cron.php.
Вывод
- Для отладки кода лучше использовать вставку в тело страницы.
- Если нужно ограничить доступ к коду - лучше использовать код в блоке.
- Файл можно использовать только, если есть доступ к файлам.
Оригинал статьи: Выполнить PHP-код на сайте.
Комментарии
[subscribing] Плохо, что голосовалку убрали.
Владислав, напишите подробней про этот SQL-сниппет. У меня была подобная ситуация, вылечил, поправив запись в базе.
Goodboy, спасибо за напоминание - сделал несколько статей, а ссылками связать забыл.
Отключить блок - рассмотрены разные возможности для отключения.
В какой папке лучше сохранять PHP файлы?
Как понять есть ли "доступ к файлам сайта"
Ок, это есть конечно же - просто подумал что есть какой-то другой тип доступа к фалйам - из самого друпала.. ну не суть - спасибо!
Если я положу свой скрипт.php рядом с файлом cron.php - это нормально? - проблемм не будет? - скрипт будет каждый день запускаться по расписанию, обновлять курсы валют в спецально для них созданной sql таблице.
Проблем не будет только позаботтесь о безопасности этого скрипта, просто любой "внешний" запрос (или бот) зная имя этого скрипта сможет его запустить и тем самым например загрузить вашу систему по самое ни хочу ... (кстати cron.php - это тоже касается)
благодарю.
А возможно ли как то сделать, чтобы ошибки, при выполнении скрипта, выводились, когда нажимаем превью (способ "На странице")
Ne_L,
вот статья о том, как включить вывод ошибок разными способами:
Включить показ предупреждений и ошибок PHP.
добавил - как написанно в статье
перед
всё равно ошибки не отображаются.
Скрипт находится в корневой папке сайта там же где и cron.php
error_reporting(E_ALL);
покажет все ошибкипроблемма решилась добавлением в .htaccess сайта строк
php_value error_reporting 2047
Почему код не выполняется на странице?
Вставляю простой код в текстовом поле страницы в тегах <?php ... ?>. Устанавливаю php фильтр. Нажимаю препросмотр, как советует автор. И в поле препросмотра пишется текст кода на розовом фоне, а не результат его работы. Что я не так делаю?
включите модуль PHP filter
Пытаюсь ajax запрос, но в ответ получаю код из файла. Все сделал вроде бы по инструкции, а езультат нулевой, может кто подскажет куда копать?
формат ввода "PHP code"
Решил так. Все дело оказалось в путях
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>
Файл лежал не в корне!
Правда как выполнить не из корня еще не разобрался, но это уже проще, известно куда копать.
И еще не хочет исполняться, ничего не выводит, если не вошел в систему. С этим тоже уже проще.