проблема с include

Миша

Guest
проблема с include

Привет!

Я начитающий товарищ поэтому вопрос уверен банален. Тем не менее не могу найти внятного объяснения.

Мне надо включить файл, прописав его АБСОЛЮТНЫЙ путь, который, в ASP например начинается с корневого каталога: '/include/tabs.class.php'.

Т.е. в ASP например это было бы так:
<!--#include virtual="/include/tabs.class.asp" -->

На PHP попытался сделать два варианта:

1)
require($_SERVER["DOCUMENT_ROOT"].'/_includes/global.settings.php');

НЕ РАБОТАЕТ.

2)
require('/_includes/global.settings.php');
НЕ РАБОТАЕТ.

Если указать относительный путь:
require('_includes/global.settings.php');

То все работает но мне это неподходит, поскольку документы будут в разных папках на разных уровнях а темплейт один. Т.е. путь должен быть абсолютным.

Где у меня ошибка?

Спасибо!
 

svetasmirnova

маленький монстрик
Ты что-то с путями напутал. Сделай echo ПУТЬ_КОТОРЫЙ_ТЕБЕ_НУЖЕН и посмотри где ошибка.

P.S.: абсолютный путь - это путь от корневой директории ОС, а не web-сервера
 

Миша

Guest
что значит - "сделай путь который тебе нужен"?
У меня корневой каталог - и в нем лежит папка includes
Я не вижу того, что находится выше.

Если на ASP у меня была возможность Server.Mappath() и этот метод выдавал на гора с:\wwwroot\......\include\мой скрипт" то не понятно как это вообще работает в PHP?

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

А вообще - вопрос прост66

Как правильно включать файл, чтобы он подключался из любой ветки дерева каталогов?

А иначе надо будет в каждом файле далать (в зависимости от уровня):

require('_includes/global.settings.php');
require('../_includes/global.settings.php');
require('../../_includes/global.settings.php');
require('../../../_includes/global.settings.php');

но это же не годится.
 

ksnk

прохожий
поясняя мысль svetasmirnova :
сделай
PHP:
echo $_SERVER["DOCUMENT_ROOT"].'/_includes/global.settings.php' ;
и посмотри чего не в порядке с путем.
Может оказаться, что слеши в обратную сторону, может с путем чего-йто не тоё. В принципе - этот код бы должен давать то, что надо...
 

Миша

Guest
Сделал.
На гора выдалось:

/_includes/global.settings.php

такое впечатление, что $_SERVER["DOCUMENT_ROOT"] - пуста.

-~{}~ 30.08.05 22:16:

Заработало вот это:
require('c:\websites\moondev\kostrov\www\_includes\global.settings.php');

Но это же фигня.

А как мне програмно получить часть:
'c:\websites\moondev\kostrov\www\'

для случаев, когда я не знаю структуру папок сервера???
 

ksnk

прохожий
У тебя PHP как CGI?
Или может быть ты просто запускаешь скрипт из консоли с помошью PHP ?
 

Миша

Guest
PHP как CGI (наверное).

Все что я пытаюсь сделать, это в самом верху файла index.php включить файл с классом:


PHP:
require('c:\websites\moondev\kostrov\www\_includes\global.settings.php');
require('c:\websites\moondev\kostrov\www\_includes\global.functions.php');
	
$loadclass = _autoload('tabs');
но необходимость писать:'c:\websites\moondev\kostrov\www\' в руть меня не сильно радует, так как я понятия не имею как это будет на удаленном сервере. Путь 100% будет другим, а вот как его получить програмно - я не знаю.
 

svetasmirnova

маленький монстрик
>А как мне програмно получить часть:
Поищи в мане. Есть много возможностей. От [m]chdir[/m] до dirname(__FILE__) . 'относительный путь от скрипта'
 

SiMM

Новичок
PHP:
require dirname(__FILE__).'/_includes/global.settings.php';
если инклудящий файл находится уровнем выше _includes
PS: слэши разумнее указывать именно такие - под Windows - по барабану, зато под *nix'ами проблем лишних не будет.
 

Миша

Guest
СПАСИБО!

Я про это пока не знал (перехожу на PHP с ASP.NET в срочном порядке - стажа у меня аж 3 недели)

теперь вот это код работает отлично:

PHP:
require(dirname(__FILE__).'\_includes\global.settings.php');
require(dirname(__FILE__).'\_includes\global.functions.php');


СПАСИБО ОГРОМНОЕ ЗА ПОМОЩЬ!
 

ksnk

прохожий
Если CGI, то можно почитать про getenv

-~{}~ 30.08.05 22:32:

Следует учесть, что то, что написано выше - то-же самое, что и
PHP:
require('..\_includes\global.settings.php');
Оно действительно тебе нужно?
 

Миша

Guest
Да, на всякий случай, может кому пригодится.
этот код:
PHP:
echo dirname(__FILE__).'\_includes\global.settings.php';
выдает:
c:\websites\moondev\kostrov\www\_includes\global.settings.php

т.е. АБСОЛЮТНЫЙ путь скрипта а не относительный.
Т.е. - именно то что нужно.
Хотя если бы он выдал праильное количество:
../../ перед/_includes/global.settings.php' то все равно все работало бы.


Спасибо еще раз!

-~{}~ 30.08.05 22:36:

Автор оригинала: ksnk
Если CGI, то можно почитать про getenv

-~{}~ 30.08.05 22:32:

Следует учесть, что то, что написано выше - то-же самое, что и
PHP:
require('..\_includes\global.settings.php');
Оно действительно тебе нужно?
Нифига :) я тоже так думал а выдает АБСОЛЮТНЫЙ путь.
 

ksnk

прохожий
И все таки! ЕСли функция ведет себя не так как написано в документации - "не верь глазам своим :)".
dirname всего-лишь убивает из строки имя файла. Возможно тут играет роль странные свойства обратного слэша?

В любом случае - вот еще совет.
getenv("PATH_TRANSLATED") выдает имя файла с точки зрения http сервера. Если отнять его от имени файла с точки зрения файловой системы - получим DOCUMENT_ROOT...
 

Z.O.S.

Новичок
Автор оригинала: Миша

Нифига :) я тоже так думал а выдает АБСОЛЮТНЫЙ путь.
а теперь возьми вот этот скриптик:
PHP:
echo dirname(__FILE__).'\_includes\global.settings.php';
и переложи на уровень выше, или ниже, да хотябы в саму папку _includes, может разочарует!!!
 

Demphest

Guest
Делается элементарно, просто определяется в файле настроек к примеру, корневая директория всего сайта:
к примеру как это делаю я
PHP:
define("ROOT_DIR", dirname(__FILE__). DIRECTORY_SEPARATOR);
после чего везде где мне необходимо что то подключать использую конструкцию
PHP:
include ROOT_DIR.'file.php';
 

svetasmirnova

маленький монстрик
Кстати, любители относительных путей. Я тут напоролась как раз.
Имею конструкцию:
PHP:
chdir('../..');
в одном файле, после чего инклюды идут. В процессе рефакторинга подключаю его в другом файле из другой директории. Как вы думаете, что мне PHP выдал?
PHP:
chdir(dirname(__FILE__) . '/../..');
спасло
 
Сверху