ссылка — Ссылка на файл в переполнении стека

Если у меня есть файл по адресу mysite.com/pages/page1.php и файл header.php, который находится в домашнем каталоге (mysite.com/header.php), как можно включить header.php?

Я старался include($_SERVER['DOCUMENT_ROOT'] . "/header.php"); или же "../header.php");

Это не работает, потому что ничего, что включено или на которое есть ссылка в header.php, не работает. Например include("meta.php"); не работает Ни один не делает include($_SERVER['DOCUMENT_ROOT'] . "/meta.php");

Есть ли другой способ вызвать header.php, который не «перемещает» его в каталог файла, вызывающего его?

-2

Решение

PHP предоставляет как минимум два «рабочих пути» для ваших файлов:

  • Функция getcwd(), который возвращает текущий рабочий каталог (объясняет его имя),
  • dirname(__FILE__), который возвращает текущий путь скрипта.

Вы можете найти больше информации здесь о getcwd :

Согласно документации include заявление ( https://secure.php.net/manual/en/function.include.php ):

Оператор include включает и оценивает указанный файл.

[…]

Файлы включаются на основе заданного пути к файлу или, если он не указан, указан include_path. Если файл не найден в include_path, include наконец проверит собственный каталог вызывающего скрипта и текущий рабочий каталог, прежде чем произойдет сбой.

Согласно документу, include будет использовать каталог скрипта, который в вашем случае является вашим текущим рабочим каталогом (cwd).


Теперь у вас следующая ситуация:

  • Файл в /meta.php,
  • Файл в /header.php, который должен включать /meta.php,
  • Файл в /pages/page1.php который должен включать /header.php,

Вопрос: где находится ваш рабочий каталог?
Если вы запустите скрипт /pages/page1.php, ваш рабочий каталог /pages/,

Итак, для доступа /header.php, вы должны использовать это утверждение внутри /pages/page1.php :

include '../../header.php';

Или же :

include $_SERVER['DOCUMENT_ROOT'] . '/header.php';

Эти заявления являются эквивалентами из-за пути /header.php,

В /header.phpследующее утверждение не выполнится:

include 'meta.php';

Зачем ? Потому что ваш текущий рабочий каталог /pages/, так include 'meta.php'; относится к include '/pages/meta.php'; которые не существуют, что приводит к ошибке. Помните, что include оператор пытается использовать текущий рабочий каталог, если URL является относительным.


Для доступа к /meta.php файл из /header.php, вы также можете :

  • использование include '../../meta.php'; в /header.php если вы вызываете свой скрипт из /pages/page1.php файл,
  • использование include dirname(__FILE__) . '/meta.php'; в /header.php,
  • использование include $_SERVER['DOCUMENT_ROOT'] . '/meta.php'; в header.php,

В твоем случае, $_SERVER['DOCUMENT_ROOT'] вероятно то же самое, что dirname(__FILE__), так как /header.php находится в корневом каталоге документа. Тем не менее, первое утверждение действительно только в том случае, если header.php путь к корню документа Последнее лучше, потому что это зависит только от пути текущего файла.


Второе решение, вероятно, лучше, потому что, например, следующее утверждение в /pages/subfolder/page.php не удастся :

include '../../../header.php';

/header.php файл будет правильно включен, но если он содержит include '../../meta.php'; Заявление, это будет относиться к include '/pages/meta.php';потому что ваш рабочий подкаталог /pages/subfolder/,

Это хороший дизайн, чтобы использовать dirname(__FILE__) Альтернатива, когда вы хотите включить скрипт относительно текущего файла, независимо от текущего рабочего каталога. Только не забудь финал / так как dirname выдает папку текущего скрипта без него.


В /pages/page1.php, используйте:

include '../../header.php';

В /header.php, используйте:

include dirname(__FILE__) . '/meta.php';
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]