Comment puis-je inclure un fichier sur 2 répertoires en arrière?

94

Comment inclure un fichier contenant plus de 2 répertoires. Je sais que vous pouvez utiliser ../index.phppour inclure un fichier qui est 2 répertoires en arrière, mais comment faites-vous pour 3 répertoires en arrière? Est-ce que ça a du sens? J'ai essayé .../index.phpmais ça ne marche pas.

J'ai un fichier /game/forum/files/index.phpet il utilise PHP include pour inclure un fichier. Qui est situé dans /includes/boot.inc.php; /étant le répertoire racine.

hakre
la source
chdir («../»);
maheshmnj

Réponses:

152

..sélectionne le répertoire parent dans le répertoire courant. Bien sûr, cela peut être enchaîné:

../../index.php

Ce serait deux répertoires en place.

Konrad Rudolph
la source
1
@Brian Eh bien, c'est absurde, vous comparez des pommes et des oranges. Vous avez raison de dire que a defineserait utilisé ici mais (1) ce n'était même pas de loin la question ici. Et (2) vous utiliseriez toujours un chemin relatif dans votre define, à moins que vous ne codiez en dur le chemin du serveur absolu et je m'en abstiendrais car cela n'a que des inconvénients. Ou (la troisième alternative) vous pouvez utiliser la manipulation de chaînes pour extraire le répertoire parent du chemin courant (développé) mais encore une fois cela n'a aucun avantage à utiliser des chemins relatifs.
Konrad Rudolph
Malheureusement, cela peut fonctionner sur un appareil et pas un autre, /../peut fonctionner ou ../peut fonctionner, ou aucun des deux ne peut fonctionner sur trois ordinateurs différents avec exactement la même configuration d'environnement
Douglas Gaskell
@DouglasGaskell Non, c'est incorrect. La notation de chemin relatif, y compris ../et ../../(note: pas de barre oblique!), Fonctionne sur tous les systèmes d'exploitation modernes. Il permet de ne pas fonctionner sur Windows et ( à long Macintosh il y a) , mais il fonctionne maintenant partout, et a pour au moins les dix dernières années. Si cela ne fonctionne pas quelque part, la raison en est que la structure des fichiers est différente et / ou que vous vous trouvez dans un répertoire de travail différent. Mais ce n'est pas lié à ce code.
Konrad Rudolph
Konrad, je le mentionne car je viens de traiter ce problème il n'y a pas 10 minutes après avoir partagé un référentiel avec un collègue, en utilisant un instantané de VM. Pour une raison quelconque, tous les chemins devaient avoir /../au lieu de ../sur son environnement.
Douglas Gaskell
@DouglasGaskell Et je peux vous dire avec certitude que l'erreur n'est pas liée. En fait, le chemin /../n'a tout simplement aucun sens sur aucun système (c'est équivalent à /, ou une erreur). Êtes-vous sûr de ne pas coller quelque chose devant lui?
Konrad Rudolph
51

Pour inclure un fichier dans un répertoire, utilisez '../file'. Pour deux répertoires en arrière, utilisez '../../file'. Etc.

Bien que, de manière réaliste, vous ne devriez pas effectuer d'inclusions par rapport au répertoire actuel. Et si vous vouliez déplacer ce fichier? Tous les liens se rompraient. Un moyen de vous assurer que vous pouvez toujours créer des liens vers d'autres fichiers, tout en conservant ces liens si vous déplacez votre fichier, est:

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

DOCUMENT_ROOT est une variable serveur qui représente le répertoire de base dans lequel se trouve votre code.

Dan Hulton
la source
2
Hey Dan question rapide: vous dites "de manière réaliste, vous ne devriez pas effectuer d'inclusions par rapport au répertoire courant ". Qu'en est-il de tous les chemins relatifs qui sont jonchés dans la plupart des documents HTML? Si je déplaçais mon dossier, est-ce que ceux-ci ne se casseraient pas aussi? Existe-t-il une norme indiquant quand utiliser des liens relatifs ou absolus? Merci d'avance!
Govind Rai
2
je pense qu'il manque un slash, il devrait être: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ répertoire / répertoire / fichier');
user889030
@ user889030 pour autant que je sache, cette barre oblique n'est pas nécessaire, du moins dans la plupart des cas
BotMaster3000
1
@ BotMaster3000 hmmm: sandbox.onlinephpfunctions.com/code/…
user889030
27
. = current directory
.. = parent directory

Donc, ../vous récupère un répertoire et non deux .

Enchaînez ../autant de fois que nécessaire pour monter de 2 niveaux ou plus.

Joe Skora
la source
21
include dirname(__FILE__).'/../../index.php';

est votre meilleur pari ici, et cela évitera la plupart des bogues de chemin relatifs que vous pouvez rencontrer avec d'autres solutions.

En effet, cela forcera l'inclusion à toujours être relative à la position du script courant où ce code est placé (quel emplacement est probablement stable, puisque vous définissez l'architecture de votre application). Ceci est différent de simplement faire include '../../index.php' qui inclura relativement au script en cours d'exécution (également appelé "appel") et ensuite relativement au répertoire de travail actuel , qui pointera vers le script parent qui inclut votre script, au lieu de résoudre à partir du chemin de votre script inclus .

Depuis la documentation PHP:

Les fichiers sont inclus en fonction du chemin d'accès au fichier donné ou, si aucun n'est indiqué, du chemin d'inclusion spécifié. Si le fichier n'est pas trouvé dans include_path, include va finalement archiver le propre répertoire du script appelant et le répertoire de travail actuel avant d'échouer.

Et le message le plus ancien que j'ai trouvé citant cette astuce remonte à 2003, par Tapken .

Vous pouvez tester avec la configuration suivante:

Créez une mise en page comme celle-ci:

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

Dans parent.php, mettez:

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

Dans sub/included.php, mettez:

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

Résultat lors de l'accès parent.php:

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

Comme nous pouvons le voir, dans le premier cas, le chemin est résolu à partir du script appelant parent.php, tandis qu'en utilisant l' dirname(__FILE__).'/path'astuce, l'inclusion est effectuée à partir du script dans included.phplequel le code est placé.

Attention, ce qui suit PAS équivalent à l'astuce ci-dessus contrairement à ce que l'on peut lire ailleurs:

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

En effet, le préfixe /fonctionnera, mais il se résoudra comme à include ../../index.phppartir du script appelant (la différence est que include_pathcela ne sera pas examiné par la suite en cas d'échec). Depuis la documentation PHP :

Si un chemin est défini - qu'il soit absolu (commençant par une lettre de lecteur ou \ sous Windows, ou / sur les systèmes Unix / Linux) ou relatif au répertoire courant (commençant par. Ou ..) - le include_path sera complètement ignoré.

joyeux
la source
@diEcho: puis-je savoir pourquoi c'est "complètement faux"? Je l'utilise sur plusieurs applications de niveau professionnel et cette méthode est en fait la seule qui a fonctionné dans toutes les situations. C'est aussi détaillé dans le manuel php : ça ne peut pas être si mal.
gaborous
la première ligne est complètement fausse. Vous ne pouvez pas ajouter le ..milieu du chemin (relatif / absolu).
diEcho
@diEcho Je devrais également vous diriger vers le manuel PHP: php.net/manual/en/function.include.php
gaborous
dites-moi un seul exemple, où ..est utilisé au milieu de l'inclusion. cela devrait toujours être la première partie de include
diEcho
github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Un module de qualité professionnelle pour un ERP / CRM de qualité professionnelle. Vous, monsieur, ne devriez pas parler quand vous ne savez pas ce que vous dites.
gaborous
16

../est un répertoire, Répétez pour deux répertoires ../../ou même trois: ../../../et ainsi de suite.

La définition de constantes peut réduire la confusion car vous explorerez les répertoires vers l'avant vers l'arrière.

Vous pouvez définir des constantes comme ceci:

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

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

Lorsque vous utilisez 'BD' ou mon 'répertoire de base', cela ressemble à ceci:

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

définir(); référence

Brian Dillingham
la source
15
../../index.php 

       

bdukes
la source
12
../../../includes/boot.inc.php

Chaque instance de ../signifie remonter / reculer d'un répertoire.

poireau
la source
9

Voici les moyens d'accéder à vos différents répertoires: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
user2951753
la source
7

Vous pouvez le faire ../../directory/file.txt- Cela ramène deux répertoires.

../../../- cela va trois. etc

Ólafur Waage
la source
7
../../../index.php

         

MazarD
la source
6

Mais faites très attention à ne pas laisser un utilisateur sélectionner le fichier. Vous ne voulez pas vraiment leur permettre d'obtenir un fichier appelé, par exemple,

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

ou d'autres fichiers système sensibles.

(Désolé, cela fait un moment que je n'étais pas administrateur système Linux, et je pense que c'est un fichier sensible, d'après ce dont je me souviens)

ZombieMouton
la source
5
../../../includes/boot.inc.php
HAXEN
la source
4

si vous utilisez php7, vous pouvez utiliser la fonction dirname avec le paramètre level de 2, par exemple:

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

le deuxième paramètre "2" indique combien de niveau supérieur

référence de dirname

Ron
la source
3

y compris sur les répertoires peuvent être traités par un fichier proxy

  • racine
  • ..... | __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';
Allenn
la source
2

Essayez ../../. Vous pouvez le modifier en conséquence car il vous fera remonter de deux répertoires. Accédez d'abord au répertoire racine, puis accédez au répertoire requis.

Par exemple, vous êtes root/inc/usr/apet il y a un autre répertoire root/2nd/path. Vous pouvez accéder au pathrépertoire apcomme ceci: ../../2nd/pathallez d'abord à la racine que dans le répertoire souhaité. Si cela ne fonctionne pas, veuillez partager.

khan
la source
2

si vous incluez le /au début de l'inclusion, l'inclusion sera considérée comme le chemin depuis la racine du site.

si votre site est http://www.example.com/game/forum/files/index.php, vous pouvez ajouter une inclusion à /includes/boot.inc.php qui se résoudra en http://www.example.com /includes/boot.inc.php .

Vous devez être prudent avec la ..traversée car certains serveurs Web l'ont désactivée; cela pose également des problèmes lorsque vous souhaitez déplacer votre site vers une nouvelle machine / hôte et que la structure est un peu différente.

Mauro
la source
2

Essaye ça

cet exemple est un répertoire en arrière

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

cet exemple est deux répertoires en arrière

require_once('../../images/yourimg.png');
rajpoot rehan
la source
C'est exactement la même chose ;-) Je pense que vous voulez dire «../../images/yourimg.png» sur le second?
Edwin
opps its my
error
1

J'ai vu vos réponses et j'ai utilisé un chemin d'inclusion avec la syntaxe

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

et le serveur http (Apache 2.4.3) a renvoyé l'erreur interne 500.

Quand j'ai changé le chemin pour

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

tout va bien.

Bronek
la source