2010-10-31 5 views
1

Lorsque j'essaie d'utiliser require ou require_once, cela fonctionnera correctement si le fichier requis est dans le même sous-répertoire, mais au moment où il voit un fichier en dehors de leur sous-répertoire, il génère une erreur fatale. Voici essentiellement ce que l'arborescence des fichiers ressemble:Comment demander des fichiers dans d'autres branches de répertoire?

* main.php 
+ login/ 
    * login.php 
+ includes/ 
    * session.php 

... donc en gros, si je devais avoir main.php besoin de connexion/login.php, il est très bien, mais si je tente de faire directory traversal pour login.php d'exiger includes/session.php, elle échoue, entraîne l'erreur:

PHP Fatal error: require_once(): Failed opening required [...]

le code de ce concept serait:

require('login/login.php') #works fine (main.php) 
require('../includes/session.php') #quits (login.php) 

J'ai essayé d'utiliser $_SERVER('DOCUMENT_ROOT'), $_SERVER('SERVER_ADDR'), dir(_FILE_) et chdir(../). Je me souviens d'avoir travaillé sur un projet il y a quelques mois que j'ai résolu ce problème, c'était une fonction simple qui traversait les chemins de fichiers, mais je ne le trouve plus. Des idées?

+0

« \' » est pour le code en ligne. Pour [blocs de code] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks), indiquez chaque ligne quatre espaces supplémentaires. Le bouton "{}" dans la barre d'outils de l'éditeur le fait pour vous. "\ *", "-" ou "+" peut être utilisé pour les listes. Examinez mes modifications pour voir comment. Cliquez sur le point d'interrogation orange dans la barre d'outils de l'éditeur pour plus d'informations et des conseils sur le formatage. – outis

+0

Voulez-vous utiliser la notation de fonction (parenthèses) au lieu de l'indexation de tableau (crochets) lorsque vous faites référence à la variable '$ _SERVER'? Si c'est le cas, c'est peut-être la raison pour laquelle vous ne pouvez pas les faire travailler. – outis

Répondre

1

Il ne s'agit pas d'une récursivité, mais simplement d'une simple traversée de répertoire. N'utilisez JAMAIS de chemins relatifs pour include/require. Vous ne savez jamais à partir de quel répertoire votre script a été appelé, il est donc toujours possible que vous soyez dans le mauvais répertoire de travail. Ceci est juste une recette pour les maux de tête.

TOUJOURS utiliser dirname(__FILE__) pour obtenir le chemin absolu du répertoire dans lequel le fichier actuel est situé. Si vous êtes sur PHP 5.3, vous pouvez simplement faire __DIR__. (Remarquez que deux underscores avant et arrière.)

require dirname(__FILE__).'/../includes/session.php'; 

(Soit dit en passant, vous n'avez pas besoin entre parenthèses sont autour/require parce qu'il est une construction linguistique, et non une fonction.)

Utilisation de chemins absolus pourrait ont également de meilleures performances car PHP n'a pas besoin de regarder dans chaque répertoire include_path. (Mais cela ne vaut que si vous avez plusieurs répertoires dans votre include_path.)

+0

Désolé, je travaillais sur la récursivité en même temps que ce numéro et c'est juste un gros mal de tête. – Nik

+0

Les chemins relatifs ont leurs utilisations. Et "NE JAMAIS utiliser de chemins relatifs" est un peu hypocrite, étant donné que vous faites exactement la même chose (déguisée même!) Avec 'dirname (__ FILE __)'. – cHao

3

Utilisez set_include_path(), ça va vous rendre la vie beaucoup plus facile.

+0

Test maintenant .... – Nik

+0

Works. Je ai juste besoin de trouver un moyen de l'avoir dynamiquement définir le chemin d'accès en fonction de la racine du répertoire. – Nik

+1

Vous utiliseriez une procédure d'amorçage, votre premier include pour votre page devrait toujours être votre fichier bootstrap.php qui définit votre chemin. – Scott

Questions connexes