Пожалуйста, не кидайтесь сразу какахами и не посылайте в rtfm (хотя наверное туда и дорога ) Собирал я свой велосипед на апаче под виндой, в вроде бы всё работало, но появилась необходимость перенести его не бесплатный хостинг, а следовательно под линукс, где мне стало ругаться на мои инклуды, которые я писал ввиде include '/../folder/file.php' - т.е. выйти на 1 папку назад, в ней зайти в folder и тд. Код пишу для себя, он может быть индийским, вообщем как есть Почитав маны (или это были не маны ), я понял что мне надо инклуды параписывать ввиде: include './folder1/file1.php' - это если я хочу в текущей папке перейти в folder1... include '../folder2/file2.php' - это если мне надо вернуться на 1 папку ниже. Вроде-бы пока правильно ? Тогда вопрос. Вот структура (чисто теоретически): root/index.php root/login.php root/folder/data.php root/config/conf.php Открывается login.php с кнопкой, при нажатии вызывается data.php внутри которой инклудится conf.php т.е. в data.php: include '../config/conf.php' - из папки дата я выхожу на 1 назад, дальше захожу в config. Почему не срабатывает ? А срабатывает только если или include './config/conf.php' (почему ? я же вроде из папки data вызываю) или include '/../config/conf.php' (это я так понимаю что ниже рута не опускается просто и потом идёт вверх)
есть путь /path/to/file.php внутри этого файла: ./ = /path/to ./elif.php = /path/to/elif.php ../ = /path ../ot = /path/ot ../../ = / и так далее НО в половине твоих ссылок первым символом идет слеш - это ты указываешь абсолютный путь от корня файловой системы. поэтому файл и не находится.
/path/folder/login.php внутри ../config/conf.php (/path/config/conf.php) <- так не видит. (видит если ./config/conf.php) Там же рядом лежит второй файл /path/folder/show_login.php внутри ../config/check.php (/path/config/check.php) <- видит
/path/folder/login.php и вызов из него ./config/conf.php слева направо дот-слеш = каталогу содержащему текущий файл (логин). этот каталог /path/folder относительно него путь "кофниг/конф.пхп" = /path/folder/config/conf.php не понял что значит там же рядом. очевидная неоднозначная формулировка. ну да ладно /path/folder/show_login.php и путь ../config/check.php дот-дот-слеш - родительский каталог каталога содержащего текущий файл. дот-слеш у нас /path/folder значит ../ указывает на /path и в нем config/check.php то есть /path/config/check.php вопрос-то какой?
Может он не понимает, что путь нужно писать относительно первого загруженного файла? Есть файлы: /www/index.php /www/conf/default.php /www/conf/dev.php index.php <-первый загружаемый Код (PHP): include './conf/default.php'; default.php Код (PHP): include './conf/dev.php'; // отсчитываем от папки /www, так как index.php в ней dev.php Код (PHP): echo $_SERVER['PHP_SELF'];
Возможно. Постараюсь ещё раз. У меня есть 3 пути: 1. /path/index.php 2. /path/config/conf.php /path/config/check.php 3. /path/folder/login.php /path/folder/show_login.php В login.php я хочу подключить conf.php и делаю: include '../config/conf.php' (и если я так делаю то его не видно - методом тыка если я сделаю ./config - то его будет видно) В show_login.php я подключаю check.php include '../config/check.php' (ошибок нет - подключает) Может быть проблема из-за того что у меня login.php вызывается из index'a который лежит уровнем ниже ? (моё предположение)
Спасибо, почитаю. Добавлено спустя 9 минут 50 секунд: Ещё вопрос по этой же теме. Если с php ясно, а как насчёт css. Можно ли в нём оставить такие пути как есть ? Линукс не будет ругаться на такие ? Код (Text): .tcalInput { background: url('/../img/simple-calendar/cal.gif') 100% 50% no-repeat; } Это из разряда "скачал и подключил". Не моих рук дело
http://phpfaq.ru/paths а вот чего там нет: в PHP файле относительные пути расчитываются от текущей папки. для php-cgi и mod_php текущая папка это папка с первым подключенным php (точка входа). в php-cli текущая папка это текущая папка процесса, который открыл файл, то есть любая ))) в CSS файле относительные пути расчитываются относительно этого самого CSS файла. вот так '/../' неправильно, правильно так: '../' или так '/чтототам/еще/../иеще' в PHP есть разница между include 'path/to/file.php' и include './path/to/file.php' в первом случае указанный путь будет подклеиваться ко всем сегментам настройки include_path, пока не найдется файл. во втором случае incude_path игнорируется, путь расчитывается один раз от текущей папки.
Ага. То есть, если на примере дира, то я должен у себя сделать к примеру так: Код (Text): include __DIR__ . "/" (добавить слеш, т.к. дир возвращает без него) . "../config/conf.cfg"; Либо, как я понимаю, через: $dr = $_SERVER['DOCUMENT_ROOT']; include $dr . '/config/conf.php'; В любом случае большое спасибо.
для сайта с точкой входа в корневой папке (сайта), DocumentRoot совпадает с текущей папкой. то есть Код (Text): $dr = $_SERVER['DOCUMENT_ROOT']; include $dr . '/config/conf.php'; аналогично Код (Text): include './config/conf.php';
когда ты пишешь не относительный путь - он у тебя начинает считать от разных точек. artoodetoo уже показал примеры. ключ DOCUMENT_ROOT суперглобального массива _SERVER доступен не во всех версиях SAPI. например в консольном его не может быть просто как факт. более универсальный путь (имхо) - использовать константу __DIR__ для фиксации "текущего каталога текущего файла" и уже относительно этого пути ходить вверх-вниз по иерархии которую видим - будет работать во всех случаях. даже с символическими ссылками корректно работает. Добавлено спустя 2 минуты 41 секунду: вот к этой мысли тоже свои пять копеек вставлю. если используется какой-то общий файл, который вызывается из многих точек входа - через __DIR__ . '/../../../path/to/common.php' находим этот общий файл а в нем объявляем define('ROOT', __DIR__); и всё остальное приложение уже может спокойно отталкиваться от этого рута.