मैं 2 निर्देशिकाओं से अधिक फ़ाइल कैसे शामिल करूं?


93

आप ऐसी फ़ाइल कैसे शामिल करते हैं जो 2 से अधिक निर्देशिकाओं में वापस हो। मुझे पता है कि आप ../index.phpएक फाइल को शामिल करने के लिए उपयोग कर सकते हैं जो कि 2 निर्देशिकाओं में वापस है, लेकिन आप इसे 3 निर्देशिकाओं के लिए कैसे करते हैं? इसका कोई मतलब भी है क्या? मैंने कोशिश की .../index.phpलेकिन यह काम नहीं कर रहा है।

मेरे पास एक फ़ाइल है /game/forum/files/index.phpऔर यह PHP का उपयोग करता है जिसमें एक फ़ाइल शामिल है। जो भीतर स्थित है /includes/boot.inc.php; /मूल निर्देशिका होने के नाते।


1
यह PHP की तरह अधिक है, HTML नहीं ...
kender

chdir ( '' ../ '');
महेशमंज

जवाबों:


152

..वर्तमान से मूल निर्देशिका का चयन करता है। बेशक, यह जंजीर हो सकता है:

../../index.php

यह दो निर्देशिकाएं होंगी।


1
@ ब्रायन ठीक है, यह बकवास है, आप सेब और संतरे की तुलना कर रहे हैं। आप सही कह रहे हैं कि defineयहाँ इस्तेमाल किया जाएगा, लेकिन (1) जो यहाँ भी दूर से सवाल नहीं था। और (2) आप अभी भी अपने में एक रिश्तेदार पथ का उपयोग करेंगे define, जब तक कि आप वास्तव में पूरे निरपेक्ष सर्वर पथ को हार्ड-कोड न करें और मैं इससे बचना चाहूंगा क्योंकि इसके केवल नुकसान हैं। या (तीसरा विकल्प) आप मौजूदा पथ से (विस्तारित) मूल निर्देशिका से निकालने के लिए स्ट्रिंग हेरफेर का उपयोग कर सकते हैं, लेकिन एक बार फिर से रिश्तेदार पथों का उपयोग करने के लिए यह कोई लाभ नहीं है ।
कोनराड रुडोल्फ

अफसोस की बात है कि यह एक डिवाइस पर काम कर सकता है और दूसरा नहीं, /../काम कर ../सकता है या नहीं कर सकता है, या न ही एक ही पर्यावरण सेटअप के साथ तीन अलग-अलग कंप्यूटरों पर काम कर सकता है
डगलस गस्केल

@DouglasGaskell नहीं, यह गलत है। सापेक्ष पथ संकेतन, सहित ../और ../../(नोट: कोई अग्रणी स्लैश!), सभी आधुनिक ऑपरेटिंग सिस्टम पर काम करता है। यह करने के लिए इस्तेमाल विंडोज पर काम नहीं और ( लंबे समय तक पूर्व) लबादा लेकिन अब यह हर जगह काम करता है, और कम से कम पिछले दस वर्षों के लिए है। यदि यह कहीं काम नहीं करता है, तो इसका कारण यह है कि फ़ाइल संरचना अलग है, और / या आप एक अलग कार्यशील निर्देशिका में हैं। लेकिन यह इस कोड से असंबंधित है।
कोनराड रुडोल्फ

कोनराड, मैं इसका उल्लेख करता हूं क्योंकि मैं सिर्फ 10 मिनट पहले इस मुद्दे से निपटता हूं, एक सहकर्मी के साथ एक संग्रह को साझा करने के बाद, एक वीएम स्नैपशॉट का उपयोग करके। किसी कारणवश सभी रास्तों पर उसके पर्यावरण के /../बजाय होना ../था।
डगलस गास्केल

@DouglasGaskell और मैं आपको विश्वास के साथ बता सकता हूं कि त्रुटि असंबंधित है। वास्तव में, पथ /../किसी भी प्रणाली पर कोई अर्थ नहीं रखता (यह इसके बराबर है /, या एक त्रुटि है)। क्या आप सुनिश्चित हैं कि आप इसके सामने कुछ नहीं चिपका रहे हैं ?
कोनराड रूडोल्फ

51

एक फ़ाइल एक निर्देशिका वापस शामिल करने के लिए, का उपयोग करें '../file'। वापस दो निर्देशिकाओं के लिए, का उपयोग करें '../../file'। और इसी तरह।

यद्यपि, वास्तविक रूप से आपको प्रदर्शन नहीं करना चाहिए, यह वर्तमान निर्देशिका के सापेक्ष शामिल है। यदि आप उस फ़ाइल को स्थानांतरित करना चाहते हैं तो क्या होगा? लिंक के सभी टूट जाएगा। यह सुनिश्चित करने का एक तरीका कि आप अभी भी अन्य फ़ाइलों से लिंक कर सकते हैं, यदि आप अपनी फ़ाइल को स्थानांतरित करते हैं, तो उन लिंक को बनाए रखना है:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT एक सर्वर चर है जो आधार निर्देशिका का प्रतिनिधित्व करता है जो आपके कोड में स्थित है।


2
हे डैन क्विक क्वेश्चन: आप कहते हैं " वास्तविक रूप से आपको जो प्रदर्शन नहीं करना चाहिए वह वर्तमान निर्देशिका के सापेक्ष होता है "। उन सभी रिश्तेदार रास्तों के बारे में जो अधिकांश HTML दस्तावेजों में भरे हुए हैं? अगर मैं अपनी फ़ाइल ले जाता, तो क्या वे भी नहीं टूटते? क्या रिश्तेदार बनाम निरपेक्ष लिंक का उपयोग करने का कोई मानक है? आपका अग्रिम में ही बहुत धन्यवाद!
गोविंद राय

2
मुझे लगता है कि इसका लापता एक स्लैश, यह होना चाहिए: requ_once ($ _ SERVER ['DOCUMENT_OTOT']]। / निर्देशिका / निर्देशिका / फ़ाइल ');
user889030

@ user889030 तक मुझे पता है, कि स्लैश की जरूरत नहीं है के रूप में, कम से कम में अधिकांश मामलों
BotMaster3000


27
. = current directory
.. = parent directory

तो ../तुम एक निर्देशिका वापस दो नहीं मिलता है

../2 या अधिक स्तरों तक जाने के लिए आवश्यक के रूप में कई बार चेन ।


21
include dirname(__FILE__).'/../../index.php';

यहां आपका सबसे अच्छा दांव है, और यह अधिकांश रिश्तेदार पथ के कीड़े से बचेंगे जिन्हें आप अन्य समाधानों के साथ सामना कर सकते हैं।

वास्तव में, यह शामिल करने के लिए मजबूर करेगा हमेशा वर्तमान स्क्रिप्ट की स्थिति के सापेक्ष जहां यह कोड रखा गया है (जो आपके आवेदन की वास्तुकला को परिभाषित करता है, चूंकि स्थान सबसे अधिक स्थिर है)। यह सिर्फ करने से अलग है include '../../index.php' जो अपेक्षाकृत निष्पादित (जिसे "कॉलिंग" नाम भी कहा जाता है) स्क्रिप्ट और फिर वर्तमान में काम कर रहे निर्देशिका के लिए अपेक्षाकृत शामिल होगा, जो मूल स्क्रिप्ट को इंगित करेगा जिसमें आपकी स्क्रिप्ट शामिल है, बजाय आपके शामिल स्क्रिप्ट के पथ से हल करने के लिए ।

PHP प्रलेखन से:

फ़ाइल दिए गए फ़ाइल पथ के आधार पर शामिल किए गए हैं, या यदि कोई नहीं दिया गया है, तो इसमें शामिल_पठ निर्दिष्ट है। यदि फ़ाइल शामिल_पाठ में नहीं मिली है, तो अंतिम रूप से कॉलिंग स्क्रिप्ट की अपनी निर्देशिका और वर्तमान कार्यशील निर्देशिका को विफल होने से पहले जाँच करेगा।

और सबसे पुरानी पोस्ट जो मैंने इस ट्रिक की तारीख 2003 तक की है, को टेपकेन द्वारा उद्धृत किया है

आप निम्न सेटअप के साथ परीक्षण कर सकते हैं:

इस तरह एक लेआउट बनाएँ:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

में parent.php, डाला:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

में sub/included.php, डाला:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

पहुँचते ही परिणाम parent.php:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

जैसा कि हम देख सकते हैं, पहले मामले में, कॉलिंग स्क्रिप्ट से पथ को हल किया जाता है parent.php, जबकि dirname(__FILE__).'/path'ट्रिक का उपयोग करके , स्क्रिप्ट को included.phpउस कोड से किया जाता है जहां कोड रखा गया है।

खबरदार, जो अन्यत्र पढ़ा जा सकता है, उसके विपरीत चाल के बराबर निम्नलिखित नहीं:

include '/../../index.php';

दरअसल, प्रीपेंडिंग /काम करेगा, लेकिन यह include ../../index.phpकॉलिंग स्क्रिप्ट से ही हल होगा (अंतर यह है कि include_pathबाद में देखा नहीं जाएगा यदि यह विफल हो जाता है)। PHP डॉक्टर से :

यदि कोई पथ परिभाषित किया गया है - चाहे निरपेक्ष (एक ड्राइव अक्षर से शुरू हो या \, विंडोज पर, या / यूनिक्स / लिनक्स सिस्टम पर) या वर्तमान निर्देशिका के सापेक्ष (शुरू या। ..) - शामिल_पठ को पूरी तरह से नजरअंदाज कर दिया जाएगा।


@diEcho: क्या मुझे पता है कि यह "पूरी तरह से गलत" क्यों है? मैं इसे कई पेशेवर-ग्रेड एप्लिकेशन पर उपयोग कर रहा हूं और यह विधि वास्तव में केवल एक ही है जो हर स्थिति में काम करती है। यह php मैनुअल में भी विस्तृत है : यह गलत नहीं हो सकता।
गाबोरस

पहली पंक्ति पूरी तरह से गलत है। आप ..पथ के मध्य (सापेक्ष / निरपेक्ष) को नहीं जोड़ सकते ।
diEcho

: @diEcho मैं भी करने के लिए PHP मैनुअल आप इंगित करना चाहिए php.net/manual/en/function.include.php
gaborous

मुझे एक एकल उदाहरण बताएं, जिसमें ..शामिल के बीच का उपयोग किया जाता है। यह हमेशा शामिल होना चाहिए
diEcho

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… एक पेशेवर ग्रेड ईआरपी / सीआरएम के लिए एक पेशेवर ग्रेड मॉड्यूल। आप, महोदय, जब आप नहीं जानते कि आप क्या कहते हैं तो बात नहीं करनी चाहिए।
जाबोरस

16

../एक निर्देशिका है, दो निर्देशिकाओं ../../या यहां तक ​​कि तीन के लिए दोहराएँ : ../../../और इसी तरह।

स्थिरांक को परिभाषित करना भ्रम को कम कर सकता है क्योंकि आप आगे पीछे छंदों में निर्देशिका ड्रिल करेंगे

आप कुछ स्थिरांक जैसे परिभाषित कर सकते हैं:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

'BD' या मेरी 'आधार निर्देशिका' का उपयोग करते समय ऐसा दिखता है:

file(BD.'location/of/file.php');

परिभाषित (); संदर्भ




9

अपनी विभिन्न निर्देशिकाओं को एक्सेस करने के तरीके निम्नलिखित हैं: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower

7

आप कर सकते हैं ../../directory/file.txt- यह दो निर्देशिकाओं को वापस ले जाता है।

../../../- यह तीन हो जाता है। आदि



6

लेकिन उपयोगकर्ता को फ़ाइल का चयन करने देने के बारे में बहुत सावधान रहें। आप वास्तव में उन्हें एक फ़ाइल के लिए अनुमति नहीं देना चाहते हैं, उदाहरण के लिए,

../../../../../../../../../../etc/passwd

या अन्य संवेदनशील सिस्टम फ़ाइलें।

(क्षमा करें, यह तब से अब तक का समय है जब मैं एक linux sysadmin था, और मुझे लगता है कि यह एक संवेदनशील फ़ाइल है, जो मुझे दिखाई देता है)




4

यदि आप php7 का उपयोग कर रहे हैं, तो आप 2 के स्तर पैरामीटर के साथ dirname फ़ंक्शन का उपयोग कर सकते हैं, उदाहरण के लिए:

dirname("/usr/local/lib", 2);

दूसरा पैरामीटर "2" इंगित करता है कि कितने स्तर ऊपर है

dirname संदर्भ


3

ओवर डाइरेक्टरी सहित प्रॉक्सी फाइल द्वारा संसाधित किया जा सकता है

  • जड़
  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___ db
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';

2

कोशिश करो ../../। आप इसे तदनुसार संशोधित कर सकते हैं क्योंकि यह आपको दो निर्देशिकाओं को वापस ले जाएगा। पहले रूट डाइरेक्टरी तक पहुँचें फिर आवश्यक डायरेक्टरी तक पहुँचें।

जैसे आप अंदर हैं root/inc/usr/apऔर एक और निर्देशिका है root/2nd/path। आप इस तरह pathसे निर्देशिका का उपयोग कर सकते हैं ap: ../../2nd/pathपहले वांछित निर्देशिका से रूट पर जाएं। अगर काम नहीं कर रहे हैं तो कृपया शेयर करें


2

यदि आप शामिल की /शुरुआत में शामिल करते हैं, तो साइट के रूट से पथ के रूप में शामिल किया जाएगा।

अगर आपकी साइट http://www.example.com/game/forum/files/index.php है, तो आप /includes/boot.inc.php में शामिल कर सकते हैं, जो http://www.example.com पर हल करेगा /includes/boot.inc.php

आपको ..ट्रैवर्सल से सावधान रहना होगा क्योंकि कुछ वेब सर्वर इसे अक्षम कर चुके हैं; जब आप अपनी साइट को एक नई मशीन / होस्ट में ले जाना चाहते हैं तो यह भी समस्या का कारण बनता है और संरचना थोड़ी अलग है।


2

इसे इस्तेमाल करे

यह उदाहरण एक निर्देशिका वापस है

require_once('../images/yourimg.png');

यह उदाहरण दो निर्देशिका वापस है

require_once('../../images/yourimg.png');

यह बिल्कुल वैसा ही है ;-) मुझे लगता है कि आपका मतलब है .. ..//images/yourimg.png 'दूसरे पर?
एडविन

मेरी गलती का
विरोध करता है

1

मैंने आपके उत्तर देखे और मैंने वाक्य रचना के साथ पथ का उपयोग किया

require_once '../file.php'; // server internal error 500

और http सर्वर (Apache 2.4.3) ने आंतरिक त्रुटि 500 ​​लौटा दी।

जब मैंने रास्ता बदल दिया

require_once '/../file.php'; // OK

सब कुछ ठीक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.