Почему includ не работает с глобальными переменными?

Рейтинг: -1Ответов: 2Опубликовано: 01.05.2015

Почему первая, вторая строки не работаю, а третья работает?

include_once($_SERVER['HTTP_HOST']."/connection.php");
include_once($_SERVER['SERVER_NAME']."/connection.php");
include_once("../connection.php");

И даже так не работают они:

include_once("$_SERVER['SERVER_NAME']/connection.php");

Скрипт работает из каталога "Soft" (1-ый уровень), a connection.php лежит в корне сайта (0-ой уровень).
В чём тут фикус-пикус?

Ответы

▲ 2Принят

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

Теоретически, HTTP_HOST и SERVER_NAME могут быть использованы для инклюда, но я очень сомневаюсь, что в корне веб-сайта на диске была создана папка с именем сервера. Скорее всего, ты просто путаешь, как все начинающие, файл на диске и НТТР ресурс на сервере. Вот хорошая статья, которая объясняет разницу.

Скорее всего тебе нужен DOCUMENT_ROOT, но сначала ты должен определиться, какой путь тебе вообще нужен, а потом уже пытаться построить его с помощью переменных.

Если подробно разобрать эти примеры, то, допустим, что сайт у нас лежит в /home/www/example.com/htdocs. Тогда первые два примера будут вести в

/home/www/example.com/htdocs/Soft/example.com/connection.php

в то время как должны вести в

/home/www/example.com/htdocs/connection.php

при этом в DOCUMENT_ROOT на правильно настроенном сервере должен лежать как раз нужный тебе путь /home/www/example.com/htdocs - и вот его и надо подставлять в инклюд.

А третий пример некорректен с синтаксической точки зрения. Если писать внутри двойных кавычек, то можно вот так:

include_once("$_SERVER[DOCUMENT_ROOT]/connection.php");
include_once("{$_SERVER['DOCUMENT_ROOT']}/connection.php");

но я бы предпочел вариант через точку.

▲ 1

Потому что include в php указывает на адрес каталога, а не url страницы как в javascript. Если в $_SERVER['SERVER_NAME'] содержится www.example.com, то получаем include_once('www.example.com/connection.php'), что бессмысленно с точки зрения php, вам возможно нужен $_SERVER['DOCUMENT_ROOT']