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

शामिल। 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';

जब मैं पृष्ठ अनुक्रमणिका खोलता हूं। मुझे निम्नलिखित चेतावनी और घातक त्रुटि मिलती है। मुझे समझ नहीं आता कि इस त्रुटि का क्या कारण है। जब मैंने पूर्ण मार्ग दिया तो यह काम करता है। लेकिन पूर्ण मार्ग एक अच्छा विचार नहीं है जो मैं मानता हूं।

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

अग्रिम में धन्यवाद


मैं आमतौर पर ऑब्जेक्टिव-सी कर रहा हूं और php स्क्रिप्टिंग पर अपने हाथ लाने की कोशिश कर रहा हूं और यह देखकर दुखी हूं कि मैंने पहले ही 2 घंटे बर्बाद कर दिए हैं और यह पता लगा रहा हूं कि PHP में फाइलों को सही तरीके से कैसे शामिल किया जाए। एक्स-कोड के साथ चीजें इतनी आसान हैं।
रोहन-पटेल

एक अक्सर इस त्रुटि में चलता है, और जल्दी से इसका निवारण करने के लिए, इन चरणों का पालन करें: 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
@ मुझे लगता है कि यह आवश्यक है जब आप एक ही समय में 2 स्थानों से फ़ाइल आयात करते हैं। उदाहरण के लिए, आपके पास एक फ़ाइल है 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
विक सीडवेब्यूलेव्यू

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*/

मेरा php 5.4.10 के साथ MAMP है और मेरा फ़ोल्डर पदानुक्रम बेसिलर है:

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. (डीआरपी के बारे में उपरोक्त टिप्पणी केवल php 5.3 के बाद से काम कर रहा है, लेकिन यह काम करता है):

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

समाधान 3. (मैं किसी भी डाउनसाइड को नहीं देख सकता, और यह मेरी php 5.3 में पूरी तरह से काम करता है):

require_once dirname(__FILE__). '/../script/pdocrud.php';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.