Come posso includere un file su 2 directory indietro?


94

Come si include un file che è più di 2 directory indietro. So che puoi usare ../index.phpper includere un file che è di 2 directory indietro, ma come fai a farlo per 3 directory indietro? Questo ha senso? Ho provato .../index.phpma non funziona.

Ho un file in /game/forum/files/index.phpe utilizza PHP include per includere un file. Che si trova in /includes/boot.inc.php; /essendo la directory principale.


chdir ('' ../ '');
maheshmnj

Risposte:


153

..seleziona la directory principale da quella corrente. Naturalmente, questo può essere concatenato:

../../index.php

Questo sarebbe due directory in alto.


1
@Brian Beh, non ha senso, stai confrontando mele e arance. Hai ragione che definequi sarebbe stato usato un ma (1) non era nemmeno lontanamente il problema qui. E (2) useresti ancora un percorso relativo nel tuo define, a meno che tu non codifichi effettivamente l'intero percorso del server assoluto e mi asterrei da quello poiché ha solo degli svantaggi. Oppure (la terza alternativa) potresti usare la manipolazione delle stringhe per estrarre la directory genitore dal percorso corrente (espanso) ma ancora una volta questo non ha alcun vantaggio nell'usare i percorsi relativi.
Konrad Rudolph

Purtroppo questo può funzionare su un dispositivo e non su un altro, /../può funzionare o ../può funzionare, o nessuno dei due può funzionare su tre computer diversi con la stessa identica configurazione dell'ambiente
Douglas Gaskell

@DouglasGaskell No, non è corretto. La notazione del percorso relativo, inclusi ../e ../../(nota: nessuna barra iniziale!), Funziona su tutti i sistemi operativi moderni. E ' usato per non funziona su Windows e ( tempo fa) Macintosh ma ora funziona in tutto il mondo, e ha per almeno gli ultimi anni dieci. Se da qualche parte non funziona, il motivo è che la struttura del file è diversa e / o ti trovi in ​​una directory di lavoro diversa. Ma non è correlato a questo codice.
Konrad Rudolph

Konrad, lo menziono poiché ho appena affrontato questo problema non 10 minuti fa dopo aver condiviso un repository con un collega, utilizzando un'istantanea della VM. Per qualche motivo tutti i percorsi dovevano avere al /../posto del ../suo ambiente.
Douglas Gaskell

@DouglasGaskell E posso dirti con sicurezza che l'errore non è correlato. In effetti, il percorso /../semplicemente non ha senso su nessun sistema (è equivalente a /, o un errore). Sei sicuro di non incollare qualcosa davanti?
Konrad Rudolph

51

Per includere un file indietro di una directory, utilizzare '../file'. Per tornare indietro di due directory, utilizzare '../../file'. E così via.

Sebbene, realisticamente, non dovresti eseguire include relative alla directory corrente. E se volessi spostare quel file? Tutti i collegamenti si rompono. Un modo per assicurarti di poter ancora collegarti ad altri file, pur mantenendo quei collegamenti se sposti il ​​file, è:

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

DOCUMENT_ROOT è una variabile del server che rappresenta la directory di base in cui si trova il codice.


2
Ehi Dan domanda veloce: dici " realisticamente non dovresti eseguire include rispetto alla directory corrente ". Che dire di tutti i percorsi relativi disseminati nella maggior parte dei documenti HTML? Se spostassi il mio file, non si spezzerebbero anche quelli? Esiste uno standard per utilizzare i collegamenti relativi e assoluti? Grazie in anticipo!
Govind Rai

2
penso che manchi una barra, dovrebbe essere: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
user889030

@ user889030 per quanto ne so, quella barra non è necessaria, almeno nella maggior parte dei casi
BotMaster3000


27
. = current directory
.. = parent directory

Quindi ../ti riporta indietro una directory non due .

Catena ../tante volte quanto necessario per salire di 2 o più livelli.


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

è la soluzione migliore qui ed eviterà la maggior parte dei bug relativi al percorso che puoi incontrare con altre soluzioni.

Infatti, costringerà l'inclusione a essere sempre relativa alla posizione dello script corrente in cui è posizionato questo codice (la cui posizione è molto probabilmente stabile, poiché si definisce l'architettura dell'applicazione). Questoèdifferente dal solo fare include '../../index.php' che includerà relativamente allo script in esecuzione (chiamato anche "chiamante") e quindi relativamente alla directory di lavoro corrente , che punterà allo script genitore che include il tuo script, invece di risolverlo dal percorso dello script incluso .

Dalla documentazione PHP:

I file vengono inclusi in base al percorso file fornito o, se non ne viene fornito nessuno, include_path specificato. Se il file non viene trovato in include_path, include infine il controllo nella directory dello script chiamante e nella directory di lavoro corrente prima di fallire.

E il post più vecchio che ho trovato citando questo trucco risale al 2003, di Tapken .

Puoi eseguire il test con la seguente configurazione:

Crea un layout come questo:

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

In parent.php, metti:

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

In sub/included.php, metti:

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

Risultato durante l'accesso parent.php:

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

Come possiamo vedere, nel primo caso, il percorso viene risolto dallo script chiamante parent.php, mentre utilizzando il dirname(__FILE__).'/path'trucco, l'inclusione viene eseguita dallo script in included.phpcui è inserito il codice.

Attenzione, quanto segue NON è equivalente al trucco di cui sopra contrariamente a quanto si può leggere altrove:

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

In effetti, il prepending /funzionerà, ma si risolverà proprio come include ../../index.phpdallo script chiamante (la differenza è che include_pathnon verrà curato in seguito se fallisce). Dal documento PHP :

Se viene definito un percorso, sia assoluto (che inizia con una lettera di unità o \ su Windows o / su sistemi Unix / Linux) o relativo alla directory corrente (che inizia con. O ..), include_path del tutto ignorato.


@diEcho: posso sapere perché "è completamente sbagliato"? Lo sto usando su diverse applicazioni di livello professionale e questo metodo è in realtà l'unico che ha funzionato in ogni situazione. È anche dettagliato nel manuale php : non può essere così sbagliato.
gaborous

la prima riga è completamente sbagliata. Non è possibile aggiungere il ..centro del percorso (relativo / assoluto).
diEcho

@diEcho Dovrei anche puntare al PHP manuale: php.net/manual/en/function.include.php
gaborous

dimmi un solo esempio, dove ..viene utilizzato al centro dell'inclusione. dovrebbe sempre essere la prima parte dell'inclusione
diEcho

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Un modulo di livello professionale per un ERP / CRM di livello professionale. Lei, signore, non dovrebbe parlare quando non sa cosa dice.
gaborous

16

../è una directory, Ripeti per due directory ../../o anche tre: ../../../e così via.

La definizione di costanti può ridurre la confusione perché si eseguirà il drill in avanti nelle directory verso il contrario

Potresti definire alcune costanti in questo modo:

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

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

Quando si utilizza "BD" o la mia "directory di base" sembra così:

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

definire(); riferimento



12
../../../includes/boot.inc.php

Ogni istanza di ../significa su / indietro di una directory.


9

di seguito sono riportati i modi per accedere alle diverse directory: -

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

7

Puoi farlo ../../directory/file.txt- Questo va indietro di due directory.

../../../- questo va tre. eccetera



6

Ma stai MOLTO attento a consentire a un utente di selezionare il file. Non vuoi davvero consentire loro di ottenere un file chiamato, ad esempio,

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

o altri file di sistema sensibili.

(Scusa, è passato un po 'di tempo da quando ero un amministratore di sistema Linux, e penso che questo sia un file sensibile, da quello che ricordo)




4

se stai usando php7 puoi usare la funzione dirname con il parametro di livello 2, ad esempio:

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

il secondo parametro "2" indica quanti salire di livello

riferimento a dirname


3

comprese le directory superiori possono essere elaborate dal file proxy

  • radice
  • ..... | __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

Prova ../../. Puoi modificarlo di conseguenza in quanto ti riporterà indietro di due directory. Raggiungere prima la directory principale, quindi accedere alla directory richiesta.

Ad esempio, sei dentro root/inc/usr/ape c'è un'altra directory root/2nd/path. È possibile accedere alla pathdirectory in apquesto modo: ../../2nd/pathprima vai alla radice della directory desiderata. Se non funziona, condividi.


2

se includi /all'inizio dell'inclusione, includerà il percorso dalla radice del sito.

se il tuo sito è http://www.example.com/game/forum/files/index.php puoi aggiungere un'inclusione a /includes/boot.inc.php che si risolverà in http://www.example.com /includes/boot.inc.php .

Devi stare attento con l' ..attraversamento poiché alcuni server web lo hanno disabilitato; causa anche problemi quando si desidera spostare il sito su una nuova macchina / host e la struttura è leggermente diversa.


2

Prova questo

questo esempio è una directory indietro

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

questo esempio è di due directory indietro

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

È esattamente lo stesso ;-) Penso che intendi "../../images/yourimg.png" nel secondo?
Edwin

opps è un mio errore
rajpoot rehan

1

Ho visto le tue risposte e ho usato include path con sintassi

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

e il server http (Apache 2.4.3) ha restituito l'errore interno 500.

Quando ho cambiato il percorso in

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

va tutto bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.