include_once, chemin d'accès relatif en php
J'ai 3 fichiers: maison, failed_attempt, connexion.
Le fichier à la maison et failed_attempt tous reportez-vous à connexion d'un fichier.
L'ennuyeux, c'est qu'ils jettent une erreur disant que le fichier de connexion n'existent pas. la maison va lever une exception si je fais cela, mais failed_attempt d'habitude.
include_once("../StoredProcedure/connect.php");
include_once("../untitled/sanitize_string.php");
et si je fais ceci:
include_once("StoredProcedure/connect.php");
include_once("untitled/sanitize_string.php");
l'inverse qui se produit, failed_attempt déclenche une exception , mais à la maison, d'habitude. Comment puis-je résoudre ce problème..
Dois-je dire à l'inclure à aller jusqu'à une page en mettant cette ../, et donc home.php n'a pas besoin d'aller d'une page, par conséquent, il jette cette exception..
Comment puis-je faire les deux fichiers accepter ces inclueds comme valide.. peut-être pas par rapport à où ils sont placés.. c'est à dire sans que ../
Structure de répertoire:
PoliticalForum
->home.php
->StoredProcedure/connect.php
->untitled/sanitize_string.php
->And other irrelevant files
storedProcedure est mon dossier et il a des fichiers à l'intérieur. tout comme indiqué.. login fichier a obtenu 2 inclut, dans celui qui ne parviennent pas à charge, selon l'endroit où vous les appelez à partir de...page d'accueil ou login_attempt page qui est à l'intérieur d'un répertoire différent
OriginalL'auteur Matrix001 | 2011-10-20
Vous devez vous connecter pour publier un commentaire.
Voici trois solutions possibles. La deuxième, ce sont vraiment juste des solutions de rechange que d'utiliser des chemins absolus dans une manière intelligente.
1: chdir dans le bon répertoire
Notez que cela ne fonctionne que si votre StoredProcedure dossier est dans le premier répertoire de tous les fichiers qu'il pourrait être nécessaire d'inclure les fichiers qu'il contient.
2: Utiliser des chemins absolus
Maintenant, avant de vous dire que ce n'est pas portable, il dépend en réalité de comment la mettre en œuvre. Voici un exemple qui fonctionne avec Apache:
Également, toujours avec apache, placez le code suivant dans votre .htaccess dans le répertoire de racine:
Puis dans example.php:
Et enfin dans vos fichiers:
3: Définir le include_path de PHP
Voir l'entrée de manuel pour la directive include_path. Si vous n'avez pas accès au php.ini, alors ce peut être défini .htaccess, si vous êtes à l'aide d'Apache et de PHP est pas installé en tant que CGI, comme suit:
J'ai ajouté des commentaires à la première méthode. Pour plus d'informations, voir chdir page de manuel.
OriginalL'auteur megaflop
Des choses comme
realpath()
et__DIR__
sont vos amis quand il s'agit de créer des chemins dans PHP.Realpath http://php.net/manual/en/function.realpath.php
Les constantes magiques http://php.net/manual/en/language.constants.predefined.php
Depuis include et require sont les constructions de langage (plutôt que des fonctions), ils n'ont pas besoin de parenthèses. En général, vous devriez utiliser
include
d'inclure des "templates" (fichiers de sortie) etrequire
pour inclure les fichiers PHP, tels que les classes.Afin que vous pouvez utiliser quelque chose comme:
(utiliser
dirname(__FILE__)
au lieu de__DIR__
sur PHP < 5)Il est intéressant d'évaluer le chemin avant de tenter d'exiger le fichier en tant que
realpath()
retourne false si le fichier n'existe pas, et la tentative derequire false;
spaffs une erreur PHP.Alternativement, vous pouvez simplement utiliser des chemins absolus comme:
require /home/www/mysite.com/htdocs/inc/somefile.php
Il a fait retirer les erreurs. Mais que faire si la fonction realpath renvoie false? wouldnt signifier le fichier ne sera pas inclus.. quand realpath renvoie false??
realpath()
retourne false si le chemin d'accès entré en tant que paramètre n'existe pas, par exemplerealpath('this/file/does/not/exist');
serait return false si le fichier existent, puis il va revenir le vrai chemin d'accès à la donnée de fichier, de sorterealpath(__DIR__ . '/this/file/does/exist');
peut retourner quelque chose comme/home/mysite.com/htdocs/this/file/does/exist
- par exemple, la pleine chemin d'accès réel.J'ai utilisé essayé et les attraper dans l' __autoload fonction..je n'avais pas le choix ..aucune idée de la façon de surmonter ce conflit. Pourquoi un chemin absolu, pas de travail...comme ce PoliticalForum/sans titre.. pourquoi ne peux que le chemin de travail pour tous les fichiers, peu importe ce qu'ils sont..je déteste chemin relatif
Un autre moyen de contourner cela pourrait être de mettre tous vos inclut dans un seul dossier et de le définir comme le "chemin" en utilisant quelque chose comme
set_include_path()
(il existe d'autres moyens) ... php.net/manual/en/function.set-include-path.phpOriginalL'auteur CD001
Pour les débutants, cela l'aidera à comprendre. Utilisez simplement le suivant basé sur votre chemin relatif:
OU
OU
OU
OriginalL'auteur Reza Mamun
Faire quelque chose comme
require(dirname(__FILE__) . '[RELATIVE PATH HERE]');
dirname(FICHIER) retourne le répertoire dans lequel le fichier ayant inclure le code existe, ajoutez simplement relative chemin d'accès à ce fichier. Pour plus de facilité, vous pouvez imprimer la valeur de dirname(FICHIER) et de voir ce qui se passe.
mais il ne marche pas très droit include_once(dirname(FICHIER)."../StoredProcedure/User/login.php"); quand j'inclus à vous connecter, cela crée des problèmes ...de votre ligne de code ne marche pas
Voir le commentaire de 'daiscog' en question, et écrire la structure de répertoire en question.
mis à jour. Si le DIR me donner le répertoire, je suis à la.. donc si je suis au "sans titre" - répertoire dans le répertoire de mon site web et home.php est dans le répertoire principal.. comment peut-il aider si j'ai mis le nom du répertoire avant de le chemin relatif?
OriginalL'auteur Dev
Les autres gars ont répondu à votre question correctement, mais j'ai pensé que je pourrais apporter quelque chose d'autre: les chargeurs automatiques.
Automatiques vous permettent de définir une fonction qui inclura automatiquement certains fichiers, lorsque vous essayez d'utiliser une classe.
La documentation est ici et peut l'expliquer mieux que je peux: http://php.net/manual/en/language.oop5.autoload.php
Voudrais vraiment vous recommandons de les utiliser, vous gagnerez du temps et est une meilleure pratique.
OriginalL'auteur