9
votes

inclure_once, chemin relatif dans php

J'ai 3 fichiers: home, échec_atempé, connectez-vous.

Le fichier home and a échoué_atempérez tous référence au fichier de connexion. P>

La chose agaçante est qu'ils jettent une erreur disant que le fichier de connexion ne dit pas exister. La maison jettera une exception si je fais cela, mais échoué_atempérez-vous. p> xxx pré>

Incluse_once (".// Sans titre / sanitize_string.php"); p>

Et si je fais cela: p>

PoliticalForum
->home.php
->StoredProcedure/connect.php
->untitled/sanitize_string.php
->And other irrelevant files


2 commentaires

Votre question n'est pas très claire. Les fichiers domestiques, échoués et identifiants dans le même répertoire? Pouvez-vous publier votre structure de répertoire? Comment faire exactement la maison et les pages échouées sur lesquelles "se réfèrent" au fichier de connexion? Dans quel fichier le code ci-dessus apparaît-il?


StoredProChedure est mon dossier et il a des fichiers à l'intérieur. Tout comme indiqué .. Le fichier de connexion est que 2 inclure dans celui-ci qui échoue à charger, en fonction de l'endroit où vous les appelez ... Page d'accueil ou Login_atempère Page qui est dans un répertoire différent


5 Réponses :


2
votes

faire quelque chose comme exiger (DIRNAME (__ File__). '[Piste relatif ici]');


5 commentaires

Voulez-vous dire quelque chose comme ceci: [code] Incluse_once (Dirname ( Fichier ). "../SToredProcedure/connect.php"); inclure_once (Dirname ( fichier ). "../ Sans titre / sanitize_string.php"); .. il ne fonctionne pas [/ code]


DirName ( Fichier ) retournera actuellement le répertoire actuel dans lequel le fichier comportant le code n'existe pas, il suffit d'ajouter un chemin relatif de ce fichier. Pour faciliter, vous pouvez imprimer une valeur du dirname ( fichier ) et voir ce qui se passe.


Mais cela ne fonctionne pas parfaitement include_once (Dirname ( Fichier ). "../ STOREDPROCEDURE / UTILISATEUR / LOGIN.PH P"); Quand j'inclus Connexion, cela fait des problèmes ... Votre ligne de code ne fonctionne pas


Voir le commentaire de 'Daeck' Sous la question et de la structure de répertoire d'écriture en question.


mis à jour. Si le dir me donne le répertoire que je suis à .. donc si je suis au répertoire "sans titre" sur mon site web et home.php est dans le répertoire principal .. Comment cela aide-t-il si je mets le Nom du répertoire avant le chemin relatif?



11
votes

choses comme realpath () et __ dir __ sont vos amis quand il s'agit de créer des chemins dans PHP.

realpath http://php.net/manual/fr/funck.realpath.php

constantes magiques http: // php. NET / MANUEL / EN / LANGUE.CONSTANTS.PREDEFIND.PHP

Comme indiquez et nécessite des constructions de langue (plutôt que des fonctions), elles n'ont pas besoin de crochets. En règle générale, vous utiliseriez include pour inclure les "modèles" (fichiers de sortie) et nécessitent pour inclure des fichiers php tels que des classes.

afin que vous puissiez Utilisez quelque chose comme: xxx

(Utiliser dirname (__ fichier __) au lieu de __ dir __ sur php <5)

Il vaut la peine d'évaluer le chemin avant de tenter d'exiger que le fichier comme realpath () renvoie false si le fichier n'existe pas et tente de nécessite de faux; SPAFFS OUT Une erreur PHP.

Vous pouvez simplement utiliser des chemins absolus comme:

Exiger /home/inc/mysite.com/htdocs/inc/somefile.php


6 commentaires

Cela ne fonctionne pas aussi: include_once (realpath ("../ Sans titre / sanitize string.php"));


Il a supprimé les erreurs. Mais que si RealPath retourne faux? Cela signifie-t-il que le fichier ne sera pas inclus. Quand Realpath revient-il faux ??


realpath () retourne false si le chemin entré car le paramètre n'existe pas, par exemple realpath ("this / fichier / pas / n'existe pas / n'existe pas / n'existe pas / n'existait pas FALSE - Si le fichier fait existe alors, il renvoie le chemin réel sur le fichier donné, de sorte que realpath (__ dir__. '/ this / fichier / existe / existe / existent'); pourrait retourner quelque chose comme /home/mysite.com/htdocs/this/file/does/exist - par exemple le chemin effectif complet.


J'ai utilisé essayé et attraper la fonction __AutoLoad..Je n'avait aucun choix ..non idée de savoir comment surmonter ce conflit. Pourquoi un chemin absolu ne travaillerait pas ... Comme ce politique politique / sans titre.


Une autre solution autour d'il peut être de mettre tout votre inclusion dans un seul dossier et de définir cela comme "Inclure le chemin" en utilisant quelque chose comme set_include_path () (il y a d'autres façons cependant) ... php.net/manual/fr/funfunction.set-include-path.php < / a>


hmm..sounds intéressants. Il n'y a pas un peu lourd sur le système inclure à nouveau tous ces fichiers et encore chaque fois que je me réfère à ce fichier? Mais toujours, cela crée un problème..quause si je mettez des fichiers à l'intérieur des fichiers, cela signifie que je dois le faire ../../relativepath.php, alors que, pour d'autres fichiers, je devrai faire cela ../RelativePath.php et pour les fichiers dans le répertoire principal ou le même répertoire que j'appelle l'inclusion, je dois faire ce RelativePath.php. De sorte que le chemin relatif est une invention des ordures. Y a-t-il une alternative à cela?



1
votes

1 commentaires

Je sais à leur sujet..Aussi vous démarrez la page que les fichiers sont chargés..vous mettez votre inclusion à l'intérieur d'eux..mais cela ne résout pas le problème à mon quesiton le fait?



9
votes

Voici trois solutions possibles. Les seconde ne sont vraiment que des contours qui utilisent des chemins absolus de manière intelligente.

1: CHDIR dans le répertoire correct strong> p> xxx pré> note que cela ne fonctionnera que si votre dossier de déprodure de stockage est dans le répertoire le plus élevé de tous les fichiers qui pourraient avoir besoin d'inclure les fichiers qu'il contient. p>

2: Utilisez des chemins absolus forts> p>

Maintenant avant de dire que cela n'est pas portable, cela dépend en fait de la manière dont vous l'appliquez. Voici un exemple qui fonctionne avec Apache: p> xxx pré>

Alternativement, à nouveau avec Apache, placez ce qui suit dans votre répertoire racine: p>

php_value include_path '/path/to/my/includes/folder:/path/to/another/includes/folder'


2 commentaires

Je suis un peu obscur sur la façon dont la première méthode fonctionne. Mais je vais essayer les deuxième et troisième méthodes


J'ai ajouté des commentaires à la première méthode. Pour plus d'informations, voir La page manuelle CHDIR .



5
votes

Pour les débutants, cela aidera à comprendre. Utilisez simplement les éléments suivants en fonction de votre chemin relatif:

//include sibling files from same directory:
include_once('connect.php');


1 commentaires

Mon cas est le deuxième scénario, cela a fonctionné pour moi.