PHP не позволяет мне извлекать определенные переменные из внешнего config.php - PullRequest
0 голосов
/ 22 сентября 2009

Я перевожу сайт PHP с разработки на рабочий сервер и тестирую новое соединение с базой данных. У меня есть страница config.php, в которой есть только это (но с реальными данными):

<?php
    // Database Constants
    defined('DB_SERVER') ? null : define('DB_SERVER', 'xxx.xxx.xxx');
    defined('DB_PORT')   ? null : define('DB_PORT', 'yyy');
    defined('DB_USER')   ? null : define('DB_USER', 'zzz');
    defined('DB_PASS')   ? null : define('DB_PASS', 'abcdefg');
    defined('DB_NAME')   ? null : define('DB_NAME', 'lmnop');
?>

Тогда у меня есть initialize.php, который содержит все мои define() константы и вызывает все мои занятия.

<?php
   // Define core paths

   // DIRECTORY_SEPARATOR is a PHP pre-defined constant
   // (\ for Windows, / for Unix)
   defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);

   defined('SITE_ROOT')     ? null : define('SITE_ROOT', 'http://...etc');
   defined('LIB_PATH')  ? null : define('LIB_PATH', SITE_ROOT.'/_includes');

   // load config file first
   require_once(LIB_PATH."/config.php");

   etc...
?>

Пока все хорошо. (Я использую URL, а не пути DIR специально, кстати.)

Но когда я создаю страницу test.ph p для выполнения запроса, я получаю сообщение об ошибке, что DB_SERVER не найден. Я могу повторить что-то в config.php, и оно появится вверху страницы на test.php, поэтому он вызывает файл config.php. А вот настоящий сумасшедший кикер:

Когда я копирую все из config.php и вставляю его в initialize.php, ничего не меняю, а затем закомментирую файл config.php ... запрос работает. По какой-то причине он просто не позволяет мне извлекать определения этих переменных из config.php.

Кто-нибудь знает, почему?

Ответы [ 5 ]

4 голосов
/ 22 сентября 2009

Вы не можете include() из URL-адреса, так как он пытается запустить сгенерированный код, который в этом случае будет просто пустым файлом. Вам нужно использовать локальный путь. Чтобы получить каталог текущего файла, например:

define('LOCALPATH', dirname(__FILE__));
2 голосов
/ 22 сентября 2009

inlude с (и require) работают с путями файловой системы , а не с URL:

define('SITE_ROOT', 'http://...etc')

неправильно. должны быть пути, или ваш LIB_PATH должен быть определен по-другому. Как объясняет руководство, вы также можете настроить его на URL, но я сомневаюсь, что вы это делаете.

1 голос
/ 22 сентября 2009

Необходимо включить allow_url_fopen или allow_url_include (начиная с PHP 5.2), чтобы использовать URL-адреса для include.

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

0 голосов
/ 22 сентября 2009

Вы можете включать файлы из URL, но вы должны понимать, что происходит.

Веб-сервер будет обрабатывать php-файл, который вы включаете, как URL, поэтому единственное, что вы на самом деле включаете, это вывод php-файла, включенного в URL.

Что - в твоем случае - ничто, пока ты что-то не повторишь.

0 голосов
/ 22 сентября 2009

Это никогда не может работать: require_once () и все другие вызовы php-include работают только с локальными файлами. ( обновление : это не совсем так)

Редактируйте после прочтения комментария, в котором говорится, что на самом деле возможно включить что-то, используя URL: Вы хотите включить действительный код из файла. Если вы добавляете что-то из URL, как вы делаете сейчас, вы, вероятно, включаете результат запуска этого файла вместо фактического php-контента.

Похоже, вы можете решить свою проблему двумя способами:

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