относительный путь в require_once не работает - PullRequest
96 голосов
/ 21 марта 2011

У меня следующая структура

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

файл include.php имеет следующий

ini_set('display_errors', 1);
error_reporting(E_ALL);

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

и на странице index.php я включил

require_once 'include/include.php';

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

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Заранее спасибо

Ответы [ 3 ]

200 голосов
/ 21 марта 2011

Использование

__DIR__

чтобы получить текущий путь к скрипту, и это должно решить вашу проблему.

Итак:

require_once(__DIR__.'/../class/user.php');

Это предотвратит случаи, когда вы можете запустить скрипт PHP из другой папки и, следовательно, пути родственников не будут работать.

Редактировать: исправлена ​​проблема с косой чертой

17 голосов
/ 03 октября 2012

для php версии 5.2.17 __ DIR __ не будет работать, будет работать только с php 5.3

Но для более старой версии php dirname ( __ FILE __ ) отлично

Например, напишите так:

require_once dirname ( __ FILE __).'/db_config.php';

1 голос
/ 09 декабря 2013

В моем случае это не работает, даже с __DIR__ или getcwd() он продолжает выбирать неправильный путь, я решил, определив в каждом файле нужного клиента с абсолютным базовым путем проекта:

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

У меня есть MAMP с php 5.4.10, и моя папка иерархическая:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....

...