Выполнить PHP-код на сайте

17 Июн 2008
Опубликовано VladSavitsky

Решение

Внимание:
Неиспользуемый код нужно сразу удалить, потому что это может быть опасно!
Не оставляйте лазейку для пытливого ума хакера!

Варианты

Выполнить код (сниппет) можно:

  • В блоке
  • В блоке Execute PHP модуля Devel
  • На странице
  • В отдельном файле

В блоке

Блок позволяет гибко ограничить доступ для разных ролей, а также выводить блок на определённых страницах или только на какой-то одной.
Недостатки метода в том, что:

  • Для того, чтобы увидеть работу кода нужно сохранить блок. Если что-то нужно изменить, то в отличии от страниц, где есть предпросмотр, - блок нужно будет снова открывать и сохранять.
  • Код в блоке, для которого не выставлены ограничения видимости, может сделать весь сайт недоступным. В этом случае нужно выключить блок, используя SQL-сниппет.

Для выполнения кода нужно установить формат ввода: PHP.

На странице

Недостатки:

  • Для страницы нет возможности, в отличии от блока, гибко задавать права доступа и область видимости.

Преимущество страницы перед блоком в том, что:

  • У страниц есть предпросмотр, который позволяет получить результат работы кода (сниппета) без сохранения документа. Это удобно тем, что можно делать отладку и коррекцию кода, а также можно вообще не сохранять документ, если код не нужен постоянно.
  • Если в коде страницы оказалась ошибка, то весь сайт остаётся работоспособным, как и админ-часть, где можно просто удалить "сломанную" страницу. Код в блоке, для которого не выставлены ограничения видимости, может сделать весь сайт недоступным. В этом случае нужно выключить блок, используя SQL-сниппет.

Настройка:

  • Для выполнения кода нужно вставить этот код в тело блока с обязательными тегами:
      //код, который нужно выполнить...
  • Установить формат ввода: PHP
  • Заполнить необходимые поля
  • Нажать "Предпросмотр", если код не нужно использовать постоянно или "Сохранить", чтобы сохранить документ.

В блоке Execute PHP модуля Devel

Для этого способа нужен установленный модуль Devel.
Работает также как и вставка кода в блок (см. выше).

Отдельном файле

Для этого метода нужен доступ к файлам сайта.

Настройка:

  • Создать файл с расширением ".php" в папке, которая видна веб-серверу
  • Вставить в новый файл код:
      //Если файл не в корне веб-сервера, то нужно исправить путь:
      require_once './includes/bootstrap.inc';
      drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

      //код, который нужно выполнить...
  • Сохранить файл
  • Вызвать файл из браузера: http://example.com/my_code.php
  • Удалить файл, если он больше не нужен, или ограничить доступ к нему в файле .htaccess.
    См. рецепт Ограничение доступа к файлу cron.php.

Вывод

  • Для отладки кода лучше использовать вставку в тело страницы.
  • Если нужно ограничить доступ к коду - лучше использовать код в блоке.
  • Файл можно использовать только, если есть доступ к файлам.

Комментарии

попробовал вариант в отдельном файле:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Z:\home\drupal.site\www\1.php:2) in Z:\home\drupal.site\www\includes\bootstrap.inc on line 995

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\drupal.site\www\1.php:2) in Z:\home\drupal.site\www\includes\bootstrap.inc on line 596

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\drupal.site\www\1.php:2) in Z:\home\drupal.site\www\includes\bootstrap.inc on line 597

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\drupal.site\www\1.php:2) in Z:\home\drupal.site\www\includes\bootstrap.inc on line 598

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\drupal.site\www\1.php:2) in Z:\home\drupal.site\www\includes\bootstrap.inc on line 599
Hello!!1
Page execution time was 156.25 ms. Executed 7 queries in -29.33 milliseconds.

но код выполнился, такчто можно считать вариант рабочим) друпал 6

Гость | Дек 1st, 2008 в 4:41 утра

Это предупреждения. Их вывод можно отключить.
Кроме того, важно только первое предупреждение, а последующие вызваны первым.
Проверьте, возможно до тега <?php у вас есть какие-то символы и они отправляются в браузер ещё до отправки заголовков - именно на это он ругается...

VladSavitsky | Дек 9th, 2008 в 3:24 после полудня

А если нужно вызвать из подкаталога например
/forum/file.php ?
заранее спасибо, сижу, никак не могу прорваться...

Юрик | Фев 26th, 2009 в 10:04 утра
 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>