Comment puis-je inclure un fichier de retour sur 2 répertoires?

comment inclure un fichier qui contient plus de 2 répertoires. Je sais que vous pouvez utiliser ../index.php pour inclure un fichier qui est 2 répertoires en arrière, mais comment faites-vous pour les 3 répertoires de retour? Est-il logique? J'ai essayé .../index.php mais ça ne marche pas.

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

70
demandé sur hakre 2008-10-02 19:08:56

18 réponses

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

../../index.php

ce serait deux répertoires plus haut.

124
répondu Konrad Rudolph 2008-10-02 15:10:07

pour inclure un fichier d'un répertoire, utilisez '../file' . Pour deux répertoires de retour, utilisez '../../file' . Et ainsi de suite.

bien que, de façon réaliste, vous ne devriez pas effectuer includes par rapport au répertoire courant. Et si vous vouliez déplacer ce fichier? Tous les liens se briser. Un moyen de s'assurer que vous pouvez toujours lier à 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 un variable server qui représente le répertoire de base dans lequel se trouve votre code.

47
répondu Dan Hulton 2012-08-11 18:24:04
. = current directory
.. = parent directory

Donc ../ vous permet de vous un répertoire de retour pas de deux .

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

25
répondu Joe Skora 2008-10-02 15:12:13

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

définir les constantes peut réduire la confusion parce que vous forerez en avant dans les versets de répertoires versets en arrière

vous pourriez définir quelques constantes comme ceci:

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

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

Lorsqu'on utilise 'BD' ou mon 'répertoire de base', on dirait:

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

définir(); référence

14
répondu Brian Dillingham 2014-09-29 16:13:57
include dirname(__FILE__).'/../../index.php';

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

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

de la documentation PHP:

les fichiers sont inclus sur la base du chemin de fichier indiqué ou, si aucun n'est indiqué, l'include_path spécifié. Si le fichier n'est pas trouvé dans le include_path, include vérifiera enfin le script de l'appel répertoire et le répertoire de travail courant avant d'échouer.

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

Vous pouvez tester avec la configuration suivante:

créer une mise en page comme ceci:

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

Dans parent.php , mettre:

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

Dans sub/included.php , mettre:

<?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 d'appel parent.php , tandis qu'en utilisant le dirname(__FILE__).'/path' astuce, l'inclusion est faite à partir du script included.php où le code est placé.

attention, ce qui suit N'est pas équivalent à l'astuce ci-dessus contrairement à ce qui peut être lu ailleurs:

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

en effet, préparer / fonctionnera, mais il résoudra tout comme include ../../index.php du script d'appel (la différence est que include_path ne sera pas regardé après si elle échoue). de PHP doc :

si un chemin est défini - si absolu (commençant par une lettre de lecteur ou \ sur Windows, ou / sur les systèmes Unix / Linux) ou relative à la répertoire courant (à compter avec . ou. .) - l'include_path sera tout simplement ignorée.

13
répondu gaborous 2016-01-30 14:43:35
../../index.php 

11
répondu bdukes 2016-06-02 23:54:06
../../../includes/boot.inc.php

chaque instance de ../ signifie en haut/en arrière un répertoire.

9
répondu leek 2016-06-03 15:24:12

voici des façons d'accéder à vos différents répertoires: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
6
répondu user2951753 2013-11-13 05:51:14

vous pouvez faire ../../directory/file.txt - cela va deux répertoires en arrière.

../../../ - ça fait trois. etc

6
répondu Ólafur Waage 2016-06-02 23:55:03
../../../index.php

6
répondu MazarD 2016-06-02 23:55:37

mais être très attention à laisser un utilisateur choisir le fichier. Vous ne voulez pas vraiment pour leur permettre d'obtenir un fichier appelé, par exemple,

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

ou d'autres fichiers système sensibles.

(Désolé, ça fait longtemps que je n'étais pas un linux sysadmin, et je pense c'est un fichier sensible, de ce dont je me souviens)

5
répondu ZombieSheep 2008-10-02 15:13:17
../../../includes/boot.inc.php
5
répondu HAXEN 2016-06-02 23:52:38

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 second paramètre" 2 "indique le nombre de niveaux

dirname referance

3
répondu ron 2016-12-06 06:34:33

Essayer ../../ . Vous pouvez le modifier en conséquence car il vous fera remonter deux répertoires. D'abord atteindre le répertoire racine, puis accéder au répertoire requis.

E. G. Vous êtes dans root/inc/usr/ap et il y a un autre répertoire root/2nd/path . Vous pouvez accéder au répertoire path de ap comme ceci: ../../2nd/path allez d'abord dans le répertoire racine. Si vous ne travaillez pas, Partagez.

2
répondu khan 2012-09-15 22:42:30

si vous incluez le / au début de la comprendre, de l'inclure seront repris le chemin depuis la racine du site.

si votre site est http://www.example.com/game/forum/files/index.php vous pouvez ajouter un include à /includes/boot.Inc.php qui résoudrait à http://www.example.com/includes/boot.inc.php .

vous devez être prudent avec .. transversal comme une toile les serveurs ont désactivé; il provoque également des problèmes lorsque vous voulez déplacer votre site vers une nouvelle machine/de l'hôte et la structure est un peu différente.

2
répondu Mauro 2016-06-02 23:56:53

y compris sur les annuaires peuvent être traités par le fichier proxy

  • root
  • ...../ _ _ 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
répondu allenn 2016-06-02 23:58:02

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

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

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

quand j'ai changé le chemin en

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

tout va bien.

1
répondu Bronek 2012-09-05 20:57:45

je recommande d'utiliser __DIR__ pour spécifier répertoire courant de fichier php . Cochez ici pour la raison.

__DIR__ . /../../index.php
1
répondu Kris Roofe 2017-05-23 10:31:31