Discussion:
inclure dans un include
(trop ancien pour répondre)
Thief13
2007-02-21 07:24:17 UTC
Permalink
Bonsoir à tous !

Bon, j'ai une question qui va peut etre paraitre stupide, mais elle me
turlupine depuis un moment, et je ne vois pas comment me débrouiller :
Voilà, lorsque j'inclu un fichier avec une chemin relatif dans un
fichier qui est lui meme inclu dans un script, le chemin relatif de la
première inclusion se fait par rapport au chemin du script et non par
rapport au chemin du fichier dans lequel il est inclu.

Comment faire pour que le chemin relatif d'une inclusion se fasse
directement depuis le chemin du fichier DANS LEQUEL il est inclu, et non
pas dans le script qui execute tout les fichiers inclu.

Avoir la réponse à cette question me permettrait notament d'arreter
d'utiliser de header() pour naviger de script en script sur mon
application et d'utiliser plutot des include, parce qu'il parait que
c'est mieux.

Merci d'avance
Eric
2007-02-21 11:24:28 UTC
Permalink
Post by Thief13
Bonsoir à tous !
Bon, j'ai une question qui va peut etre paraitre stupide, mais elle me
Voilà, lorsque j'inclu un fichier avec une chemin relatif dans un
fichier qui est lui meme inclu dans un script, le chemin relatif de la
première inclusion se fait par rapport au chemin du script et non par
rapport au chemin du fichier dans lequel il est inclu.
Moi, je vois deux solutions, la première n'est pas top, je l'ai
utilisée lors d'une "rénovation" de site, comprendre là où je ne
pouvais pas tout refaire de 0.
Mon arborescence était comme ça :
+ racine : redirection vers repertoire1/index.php
--+ répertoire 1 : public, fichiers PHP pas sensibles pour la
thématique 1 du site
--+ répertoire 2 : public, fichiers PHP pas sensibles pour la
thématique 2 du site
--+ répertoire 3 : privé protégé par htaccess : fichiers communs
--+ répertoire 4 : public, images
etc.
Tous mes includes étaient de la forme "../repertoireX/
fichier.php" (retour à la racine en dur puis redirection vers le bon
répertoire)

Autre solution (plus propre), tu définis en haut de chaque fichier une
constante EMPLACEMENT qui indique son emplacement relatif par rapport
à la racine du site, les includes sont de la forme
EMPLACEMENT."repertoireX/fichier.php"

Eric
CrazyCat
2007-02-21 11:24:28 UTC
Permalink
Post by Thief13
Comment faire pour que le chemin relatif d'une inclusion se fasse
directement depuis le chemin du fichier DANS LEQUEL il est inclu, et non
pas dans le script qui execute tout les fichiers inclu.
C'est impossible. Les fichiers inclus font partie intégrante du fichier
appelant.
La solution la plus répandue est de définir le root de ton site dans un
fichier commun et de faire les inclusions par rapport à ce root.
Ce qui donne:
commun.php
<? define('SITE_ROOT', dirname(dirname(__FILE__))."/"); ?>

Et tes inclusions sont:
<? include SITE_ROOT.'rep/sous-rep/fichier.php'; ?>
--
Discussions et débats sur l'actualité: http://www.sujets-d-actu.eu
Thierry
2007-02-21 13:52:01 UTC
Permalink
"CrazyCat" <***@nospam.c-p-f.org> a écrit dans le message de news:
45dc0487$0$21148$***@news.club-internet.fr...
^
Post by CrazyCat
C'est impossible. Les fichiers inclus font partie intégrante du fichier
appelant.
La solution la plus répandue est de définir le root de ton site dans un
fichier commun et de faire les inclusions par rapport à ce root.
commun.php
<? define('SITE_ROOT', dirname(dirname(__FILE__))."/"); ?>
Et comment tu l'inclus ?? :-)

La meilleure solution ne serait pas d'ajouter de SITE_ROOT dans
l'include_path de PHP ?
Thierry
2007-02-21 11:41:29 UTC
Permalink
bonjour,

Je suis pas sur d'avoir tout compris.
Je pars donc du principe que l'inclusion correspond au include / require
PHP.

Soit l'arborescence suivante:
.
f0.php
+ r1
f1.php
+ r2
f2.php
donc 2 niveaux d'imbrications de répertoires
Soit encore le contenu suivant pour les fichiers:
f0.php
<?php
require ('r1/f1.php')
?>
f1.php
<?php
require ('r2/f2.php')
?>
f2.php
<?php
echo "coucou je suis f2";
echo __FILE__."<br />";
echo $_SERVER['PHP_SELF'];
?>

Alors l'appel dans un navigateur à f0.php va provoquer l'affichage de
coucou je suis f2

(test fait sous php 5)

donc l'inclusion php est (entre autre) relative au répertoire du fichier qui
inclu.

Par contre si dans le fichier inclu tu as un fopen ou autre instruction
équivalente,
ses arguments sont relatifs au répertoire de travail du script.
Le problème est le même si tu produit une url relative. Elle sera relative
au répertoire
de travail du script, pas du fichier inclu. Dans ce cas voir les
superglobales
__FILE__
$_SERVER['PHP_SELF']

Tout ceci illustre que je n'ai pas du comprendre ta question car le
comportement observé
est celui que tu sembles souhaiter.
J'espère que cela t'aidera a reformuler ta question pour que je puisse la
comprendre,
mes moyens étant limités.

amicalement

thierry
Thief13
2007-02-21 12:38:49 UTC
Permalink
Post by Thierry
Alors l'appel dans un navigateur à f0.php va provoquer l'affichage de
coucou je suis f2
Oui, normale, sauf que __FILE__ donne le lien vers le script f2 et
$_SERVER['PHP_SELF'] vers f0
Post by Thierry
(test fait sous php 5)
donc l'inclusion php est (entre autre) relative au répertoire du fichier qui
inclu.
Oui, en tout cas, celui qui inclu tout les autres...

Je n'ais pas bien compris ce que tu essayait de m'expliquer, mais en
tout cas, tu m'a donné une super idée pour fair ce que je voulais :
étant donné que je ne peux pas donner le chemin absolu vers le fichier
(ce serait stupide, c'est lui qui le contient, pour tout les autres
script, c'est justement pour m'éviter d'avoir à le faire), dans le
fichier qui inclu et qui est inclu, pour pouvoir inclure à partire de
son réperdoire, je vais récupérer __file__ et avec une regex, virer son
nom, comme ça, j'aurrais le path que je veux

Merci bien
Thief13
2007-02-21 13:52:01 UTC
Permalink
Pour info, le code :

$temp = __FILE__;
$temp = str_ireplace('configuration.php', '', $temp);
$config_racine = simplexml_load_file($temp.'configuration.xml');
unset($temp);

(Bon, c'est pas un include, mais tout comme, c'était le meme probleme ^^)
Thierry
2007-02-21 13:52:01 UTC
Permalink
Post by Thief13
Je n'ais pas bien compris ce que tu essayait de m'expliquer, mais en
tout cas, tu m'a donné une super idée pour
de rien

Une alternative que j'utilise dans ce qui me semble être ton cas
- mettre un fichier marqueur à la racine du site:
vousEtesIci.php

en début de chaque site initialiser une variable $relPath comme suit:
try {
$cpt = 0:
$relPath = './';
while ( ($cpt < 50) && !file_exists($relPath.'vousEtesIci.php') ) {
$relPath .= '../';
$cpt++;
}
if ( $cpt == 50 )
throw new Exception('impossible de se localiser');

// mettre son code ici
//utiliser $relPath comme racine de tous les fichiers que l'on doit
ouvrir....
}
catch (Exception $e){
//echoHeader():
echo $e->getMessage();
//echoFooter();
}

PS: on peut faire sans les exceptions
Dominique Ottello
2007-02-23 18:24:57 UTC
Permalink
Post by Thierry
try {
$relPath = './';
while ( ($cpt < 50) && !file_exists($relPath.'vousEtesIci.php') ) {
$relPath .= '../';
$cpt++;
}
C'est similaire à ce que je pratique avec le fichier "ici_racine.php",
mais en utilisant une boucle for :

for ($i=1,$dossier='./'; $i<6 &&
!file_exists($dossier.'ici_racine.php'); $i++,$dossier.='../')
--
Il vaut mieux ignorer où l'on est, et savoir qu'on l'ignore, que de se
croire avec confiance où l'on n'est pas. Jean Dominique Cassini.
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis
Continuer la lecture sur narkive:
Loading...