web-dev-qa-db-fra.com

Comment inclure un fichier sur deux répertoires?

Comment inclure un fichier contenant plus de 2 répertoires? Je sais que vous pouvez utiliser ../index.php pour inclure un fichier contenant 2 répertoires en arrière, mais comment le faire pour 3 répertoires en arrière? Est-ce que ça a du 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. Ce fichier se trouve dans /includes/boot.inc.php; / étant le répertoire racine.

82
Marcus

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

../../index.php

Ce serait deux répertoires en place.

137
Konrad Rudolph

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

Bien que, de façon réaliste, vous ne devriez pas effectuer d’inclusions relatives au répertoire actuel. Et si vous vouliez déplacer ce fichier? Tous les liens se briseraient. Une façon de vous assurer que vous pouvez toujours créer un lien 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 serveur qui représente le répertoire de base dans lequel se trouve votre code.

49
Dan Hulton
. = current directory
.. = parent directory

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

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

27
Joe Skora
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 par rapport à la position du script actuel où ce code est placé (emplacement le plus susceptible d'être stable, car 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é "appelant") et ensuite relativement au répertoire de travail actuel , qui pointera vers le script parent cela inclut votre script, au lieu de résoudre à partir du chemin de votre script inclus.

De la PHP documentation:

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

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

Vous pouvez tester avec la configuration suivante:

Créez une mise en page comme ceci:

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

Attention, ce qui suit n'équivaut pas au tour ci-dessus contrairement à ce qu'on peut lire ailleurs:

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

En effet, le préfixe / Fonctionnera, mais il se résoudra de la même façon que include ../../index.php À partir du script d'appel (la différence est que include_path Ne sera pas examiné ultérieurement s'il échoue). De PHP doc :

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

17
gaborous

../ est un répertoire, répéter pour deux répertoires ../../ ou même trois: ../../../ etc.

La définition de constantes peut réduire la confusion, car vous allez explorer les répertoires en 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', il ressemble à ceci:

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

define (); référence

15
Brian Dillingham
../../index.php 

14
bdukes
../../../includes/boot.inc.php

Chaque instance de ../ signifie haut/bas d’un répertoire.

11
leek

voici des moyens d'accéder à vos différents répertoires: -

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

Tu peux faire ../../directory/file.txt - Cela remonte deux répertoires.

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

6
Ólafur Waage
../../../index.php

6
MazarD
../../../includes/boot.inc.php
5
HAXEN

Mais soyez [~ # ~] très [~ # ~] veillez à 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 longtemps que je ne suis pas un administrateur système Linux, et je pense qu'il s'agit d'un fichier sensible, d'après mes souvenirs)

5
ZombieSheep

Je recommande d'utiliser __DIR__ Pour spécifier répertoire du fichier php actuel . Vérifiez ici pour la raison.

__DIR__ . /../../index.php
4
Kris Roofe

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

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

le second paramètre "2" indique le nombre de niveaux

nom de référence referance

3
ron

si vous incluez le / au début de l'inclusion, l'inclusion sera considérée comme le chemin à partir de 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 résoudrait le problème en - http://www.example.com/includes/boot.inc.php .

Vous devez faire attention avec .. _ traversal car certains serveurs web l’ont désactivé; cela pose également des problèmes lorsque vous souhaitez déplacer votre site sur une nouvelle machine/hôte et que la structure est un peu différente.

2
Mauro

Essayez ../../. Vous pouvez le modifier en conséquence car cela vous ramènera dans deux répertoires. Accédez d’abord au répertoire racine, puis accédez au répertoire requis.

Par exemple. Tu es dans root/inc/usr/ap et il y a un autre répertoire root/2nd/path. Vous pouvez accéder au répertoire path à partir de ap comme ceci: ../../2nd/path aller d’abord dans le répertoire racine que désiré. Si ne fonctionne pas s'il vous plaît partager.

2
khan

y compris les répertoires peuvent être traités par un 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
allenn

J'ai vu vos réponses et j'ai utilisé include 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 à

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

tout va bien.

1
Bronek

Essayez ceci

cet exemple correspond à un répertoire

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

cet exemple correspond à deux répertoires

require_once('../../images/yourimg.png');
0
rajpoot rehan