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.
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.
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.
. = 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.
../
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');
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.
../../../includes/boot.inc.php
chaque instance de ../
signifie en haut/en arrière un répertoire.
voici des façons d'accéder à vos différents répertoires: -
./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower
vous pouvez faire ../../directory/file.txt
- cela va deux répertoires en arrière.
../../../
- ça fait trois. etc
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)
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
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.
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.
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';
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.
je recommande d'utiliser __DIR__
pour spécifier répertoire courant de fichier php . Cochez ici pour la raison.
__DIR__ . /../../index.php