require_once içindeki göreli yol çalışmıyor


103

Aşağıdaki yapıya sahibim

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

include.php dosyası aşağıdakilere sahiptir

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';

ve index.php sayfasına dahil ettiğim

require_once 'include/include.php';

Index.php sayfasını açtığımda aşağıdaki uyarı ve ölümcül hatayı alıyorum. Bu hataya neyin sebep olduğunu anlamıyorum. Mutlak yolu verdiğimde işe yarıyor. Ama mutlak yolun iyi bir fikir olmadığına inanıyorum.

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

Şimdiden teşekkürler


Genellikle Objective-C yapıyorum ve php komut dosyası oluşturmaya çalışıyorum ve PHP'de dosyaları nasıl doğru şekilde ekleyeceğimi bulmak için 2 saatimi boşa harcadığımı görmek üzücü. X koduyla işler çok kolay.
rohan-patel

Bu hatayla sık sık karşılaşılır ve sorunu hızla gidermek için şu adımları izleyin: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Yanıtlar:


217

Kullanım

__DIR__

betiğin geçerli yolunu almak için ve bu sorununuzu çözmelidir.

Yani:

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

Bu, bir PHP betiğini farklı bir klasörden çalıştırabileceğiniz durumları engeller ve bu nedenle ilgili yollar çalışmaz.

Düzenleme: eğik çizgi sorunu düzeltildi


42
Dikkat et! __DIR__PHP 5.3'te yenidir. Bu betiğin PHP'nin önceki sürümlerinde çalıştırılmasına ihtiyacınız varsa, dirname(__FILE__)onun yerine kullanmalısınız .
Charles

27
Sondaki eğik çizgiyi sonrasına manuel olarak eklemeniz gerektiğini unutmayın __DIR__. Yani: require_once(__DIR__.'/../class/user.php'); Başına belgeler , sondaki eğik çizgi kök dizininde haricinde kullanılmaz.
Ariel Allon

9
Yardım için teşekkürler, ama neden __DIR__gerekli olduğunu hala anlamıyorum . PHP belgeleri, PHP'nin varsayılan olarak geçerli betiğin dizinini arayacağını söylüyor. Biri biraz ışık tutabilir mi?
David

1
@David Aynı anda 2 yerden bir dosya içe aktarırken buna ihtiyaç olduğunu düşünüyorum. Örneğin, ile bir dosyanız var require "../a.php". Bu dosya başka bir dosyadan (x) içe aktarılırsa, dir1/dir2/x.phpdahil edilen dosyada olacaktır dir1/a.php, ancak x içeride ise dir1/dir2/dir3/x.php, dahil edilen dosya dir1/dir2/a.phpvb. Yanılıyor muyum?
José Ramón

1
Bu sık karşılaşılan hata için artık bir sorun giderme kontrol listesi var: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

php sürüm 5.2.17 için __DIR__çalışmayacak, sadece php 5.3 ile çalışacak

Ancak php'nin eski sürümü için dirname(__FILE__)mükemmel

Örneğin böyle yaz

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

1

Benim durumumda işe yaramazsa __DIR__veya getcwd()yanlış yolu seçmeye devam etse bile, ihtiyacım olan her dosyada projenin mutlak temel yolu ile bir maliyet oluşturucu tanımlayarak çözdüm:

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

Php 5.4.10 ile MAMP kullanıyorum ve klasör hiyerarşim temelde:

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

....


0

Bir başka kapsama dahil ettiğim noktaya kadar, her şeyin yolunda gittiği aynı problemle karşılaştım.

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')

Çözüm 1. (genel html klasör adımın istenmeyen kodlaması, ancak çalışıyor):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

Çözüm 2. (sadece php 5.3'ten beri çalışan DIR hakkında yukarıdaki istenmeyen yorum, ancak çalışıyor):

require_once __DIR__. '/../script/pdocrud.php';

3. Çözüm (Herhangi bir dezavantaj göremiyorum ve php 5.3'ümde mükemmel çalışıyor):

require_once dirname(__FILE__). '/../script/pdocrud.php';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.