відносний шлях у Requ_once не працює


103

У мене така структура

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

Спасибі заздалегідь


Я, як правило, роблю Objective-C і намагаюся зайнятись написанням скриптів на php, і мені сумно бачити, що я вже витрачав 2 години на роздуми, як правильно включити файли в PHP. З X-кодом все дуже просто.
rohan-patel

Часто стикається з цією помилкою. Щоб швидко її усунути, виконайте наступні дії:
stackoverflow.com/a/36577021/2873507

Відповіді:


216

Використовуйте

__DIR__

щоб отримати поточний шлях сценарію, і це має вирішити вашу проблему.

Так:

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

Це запобіжить випадки, коли ви можете запустити скрипт PHP з іншої папки, і тому родичі шляхи не працюватимуть.

Редагувати: усунена проблема косої риски


42
Стережись! __DIR__є новим у PHP 5.3. Якщо вам потрібен цей сценарій для запуску на більш ранніх версіях PHP, вам слід скористатися dirname(__FILE__)натомість.
Карл

27
Зауважте, що вам слід вручну включити проділ в кінці після __DIR__. Отже: require_once(__DIR__.'/../class/user.php'); Згідно з документацією , косою косою рисою опущено, крім кореневого каталогу.
Аріель Аллон

9
Дякую за допомогу, але я все ще не розумію, для чого __DIR__це потрібно. Документи PHP, схоже, говорять про те, що PHP шукає каталог поточного сценарію за замовчуванням. Чи може хтось пролити світло?
Девід

1
@David Я думаю, що це потрібно, коли ви імпортуєте файл з двох місць одночасно. Наприклад, у вас є файл із require "../a.php". Якщо цей файл імпортовано з іншого файлу (x), у dir1/dir2/x.phpфайлі включений буде dir1/a.php, але якщо x є dir1/dir2/dir3/x.php, то файл буде включений dir1/dir2/a.phpтощо. Або я помиляюся?
Хосе Рамон

1
Існує в даний час контрольний список для усунення неполадок в цій частою помилки тут: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

для php версії 5.2.17 __DIR__не буде працювати, вона працюватиме лише з php 5.3

Але для старшої версії php dirname(__FILE__)ідеально

Наприклад, пишіть так

require_once dirname(__FILE__) . '/db_config.php';

1

У моєму випадку це не працює, навіть __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

….


0

Я щойно стикався з цією самою проблемою, де все працювало нормально, до тих пір, поки не було включене в інший момент.

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';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.