115 votes

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

Comment inclure un fichier qui se trouve à plus de deux répertoires. Je sais que vous pouvez utiliser ../index.php pour inclure un fichier qui se trouve à deux répertoires en arrière, mais comment le faire pour trois répertoires en arrière ? Cela a-t-il un sens ? 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.

176voto

Konrad Rudolph Points 231505

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

../../index.php

Ce serait deux répertoires plus haut.

53voto

Dan Hulton Points 1051

Pour inclure un fichier situé un répertoire plus loin, utilisez '../file' . Pour deux répertoires en arrière, utilisez '../../file' . Et ainsi de suite.

Bien que, de manière réaliste, vous ne devriez pas effectuer des inclusions relatives au répertoire actuel. Que se passerait-il si vous vouliez déplacer ce fichier ? Tous les liens seraient rompus. Une façon de s'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 la suivante :

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

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

31voto

Joe Skora Points 6535
. = current directory
.. = parent directory

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

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

23voto

user1121352 Points 1066
include dirname(__FILE__).'/../../index.php';

est la meilleure solution, car elle permet d'éviter la plupart des problèmes de chemins relatifs que vous pouvez rencontrer avec d'autres solutions.

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

Extrait de la documentation PHP :

Les fichiers sont inclus en fonction du chemin d'accès au fichier donné ou, si aucun n'est donné, le include_path spécifié. Si le fichier n'est pas trouvé dans le include_path, include vérifiera finalement dans le propre répertoire du script appelant et le répertoire de travail actuel 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éez une mise en page comme celle-ci :

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

Sur parent.php , mis :

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

Sur sub/included.php , mis :

<?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 on peut le voir, dans le premier cas, le chemin est résolu à partir du script appelant. parent.php tandis qu'en utilisant le dirname(__FILE__).'/path' l'inclusion se fait à partir du script. included.php où le code est placé.

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

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

En effet, en ajoutant / fonctionnera, mais il sera résolu comme include ../../index.php de l'appelant script (la différence est que include_path ne sera pas regardée après coup si elle échoue). Extrait de la documentation PHP :

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

16voto

Brian Points 541

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

Définir des constantes peut réduire la confusion car vous allez forer vers l'avant dans les répertoires vers l'arrière.

Vous pourriez définir des constantes comme ceci :

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

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

En utilisant 'BD' ou mon 'répertoire de base', cela ressemble à ceci :

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

define() ; référence

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X