Относительный путь в require_once не работает
У меня есть следующая структура
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
Заранее спасибо
Ответы
Ответ 1
Используйте
__DIR__
чтобы получить текущий путь script, и это должно устранить вашу проблему.
Итак:
require_once(__DIR__.'/../class/user.php');
Это предотвратит случаи, когда вы можете запустить PHP script из другой папки, и поэтому пути родственников не будут работать.
Изменить: исправлена проблема с косой чертой
Ответ 2
для php версии 5.2.17 __DIR__
не будет работать, будет работать только с php 5.3
Но для более старой версии PHP dirname(__FILE__)
идеально
Например, напишите так
require_once dirname(__FILE__) . '/db_config.php';
Ответ 3
В моем случае это не сработает, даже с __DIR__
или getcwd()
он продолжает выбирать неправильный путь, я решил, определив costant в каждом файле, который мне нужен, с абсолютным базовым путем проекта:
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
....
Ответ 4
Я только что столкнулся с той же проблемой, когда все работало нормально, вплоть до момента, когда у меня были включения в другие включения.
require_once '../script/pdocrud.php'; //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')
Решение 1. (нежелательное жесткое кодирование моего публичного html-имени папки, но оно работает):
require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';
Решение 2. (нежелательный комментарий выше о DIR, работающем только с php 5.3, но это работает):
require_once __DIR__. '/../script/pdocrud.php';
Решение 3. (я не вижу никаких недостатков, и он отлично работает в моем php 5.3):
require_once dirname(__FILE__). '/../script/pdocrud.php';