Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Debutant]Pb avec les include

17 réponses
Avatar
UniversZen
Bonjour,

J'apprends le php sur le tas et en fonction de mes disponibilités.
J'avance donc à petits pas et de façon très irrégulière mais votre forum
m'aide régulièrement ! ;-)

J'ai un comportement que je ne m'explique pas mais je suis sûr qu'il ne vous
faudra pas longtemps pour m'éclairer ...

Alors voilà le topo.

Ma page A.php (/w/A.php) :
<?php include_once './commun/Funct.php'; ?>
...
<?php include_once './commun/SousMenu.php'; ?>

Ma page Funct.php (/w/commun/Funct.php):
<?php include_once '../Z/Data.php'; ?>
...

Ma page Data.php (/Z/Data.php) déclare des variables.

-> là, tout va bien, dans SousMenu.php je récupère bien les variables
initiées dans Data.php.

Par contre si je déplace SousMenu.php dans le réperoire /ZZ et que je
modifie A.php (<?php include_once './commun/SousMenu.php'; ?> devient <?php
include $root.'/ZZ/SousMenu.php'; ?>) j'ai un problème : $root et les autres
variables définies dans Data.php ne sont plus accessibles.

Où est mon erreur ?

Merci beaucoup pour votre aide (j'espère avoir été clair ... si ce n'est pas
le cas, n'hésitez pas à me le dire !).


--
UniversZen

10 réponses

1 2
Avatar
Olivier Miakinen

Alors voilà le topo.

Ma page A.php (/w/A.php) :
<?php include_once './commun/Funct.php'; ?>
...
<?php include_once './commun/SousMenu.php'; ?>

Ma page Funct.php (/w/commun/Funct.php):
<?php include_once '../Z/Data.php'; ?>
...

Ma page Data.php (/Z/Data.php) déclare des variables.

-> là, tout va bien, dans SousMenu.php je récupère bien les variables
initiées dans Data.php.


J'ai essayé de suivre, mais je suis un peu perdu, je l'avoue, dans ton
arborescence.

Par contre si je déplace SousMenu.php dans le réperoire /ZZ et que je
modifie A.php (<?php include_once './commun/SousMenu.php'; ?> devient <?php
include $root.'/ZZ/SousMenu.php'; ?>) j'ai un problème : $root et les autres
variables définies dans Data.php ne sont plus accessibles.


Juste pour savoir : pourquoi utilises-tu $root dans ce cas, au lieu
d'utiliser des chemins relatifs comme pour les autres fichiers ?

<?php include_once '../ZZ/SousMenu.php'; ?>

Merci beaucoup pour votre aide (j'espère avoir été clair ... si ce n'est pas
le cas, n'hésitez pas à me le dire !).


Si ma réponse ne te satisfait pas, c'est peut-être qu'en effet tu n'as
pas été assez clair... pourrais-tu limiter ta question à deux fichiers,
l'un incluant l'autre, ou bien le problème ne se manifeste-t-il qu'à
partir du moment où tu as des inclusions multiples ?

--?
UniversZen


Ta signature est incorrecte. Si tu es satisfait d'Outlook Express comme
nouvelleur, tu peux essayer la rustine suivante pour l'améliorer :
<http://www.aminautes.org/forums/configurer/oe/QF_doc.html>.

Avatar
UniversZen
Olivier Miakinen a écrit (news:e2932k$1gv5$) :

J'ai essayé de suivre, mais je suis un peu perdu, je l'avoue, dans ton
arborescence.


C'est bien ce qu'il me semblait, je n'ai pas été très clair ...

Alors côté arborescence, à la racine il y a 3 répertoires : w, Z et ZZ.
Le répertoire 'commun' est un sous-répertoire de w.

Le fichier A.php est dans le répertoire w.
Le fichier Data.php est dans le répertoire Z.
Le fichier Funct.php est dans le répertoire 'commun'.
Le fichier SousMenu.php est dans 'commun' lui aussi.

Côté inclusion :
- Funct.php inclu Data.php
- A.php inclu Funct.php et SousMenu.php (dans cet ordre)

$root est une variable définie dans Data.php.
Dans la situation décrite ici, pas de problème : dans SousMenu.php, j'accède
bien à $root.

Lorsque je déplace SousMenu.php du répertoire 'commun' au répertoire ZZ (en
adaptant les chemins nécessaires dans mes fichiers php), je n'accède plus à
$root ('undefined variable').

D'où vient le problème ?

Si ma réponse ne te satisfait pas, c'est peut-être qu'en effet tu n'as
pas été assez clair...


Tout à fait possible !
Merci pour tes efforts en tout cas ! ;-)

Ta signature est incorrecte. Si tu es satisfait d'Outlook Express
comme nouvelleur, tu peux essayer la rustine suivante pour
l'améliorer :
<http://www.aminautes.org/forums/configurer/oe/QF_doc.html>.


Désolé, c'est mieux là ?


Merci.

--
UniversZen

Avatar
UniversZen
UniversZen a écrit (news:444cb544$0$19718$) :

$root est une variable définie dans Data.php.
Dans la situation décrite ici, pas de problème : dans SousMenu.php,
j'accède bien à $root.

Lorsque je déplace SousMenu.php du répertoire 'commun' au répertoire
ZZ (en adaptant les chemins nécessaires dans mes fichiers php), je
n'accède plus à $root ('undefined variable').


Petite précision : j'accède bien à $root dans A.php. Le pb ne se pose qu'au
niveau de SousMenu.php
(si je rajoute 'global $root;' je n'ai bien-sût plus le 'undefined variable'
mais la valeur de la variable est nulle).

A+.


--
UniversZen

Avatar
UniversZen
UniversZen a écrit (news:444cb544$0$19718$) :

Désolé mais je vous livre le résultat de mes tests au fur et à mesure (mais
c'est la dernière fois : où vous avez une piste de solution ou je change
l'organisation de mes fichiers ... ce qui est peut-être le mieux !)


D'où vient le problème ?


Je viens de voir que le pb ne se pose que lorsque j'utilise cette inclusion
dans A.php :
include $root.'/ZZ/SousMenu.php';
avec $root='127.0.0.1/mon_site'

Si j'utilise : include '../ZZ/SousMenu.php', pas de pb ...

ZZ étant un répertoire directement sous la racine, je pensais que cela était
équivalent ...

L'usage de $root doit me permettre de ne pas avoir à modifier les inclusions
dans A.php si je l'utilise dans un autre répertoire.
(ou alors il existe une solution propre, simple et fiable de désigner la
racine d'un site ?).

Merci et a+.


--
UniversZen

Avatar
Dominique Ottello
"UniversZen" écrivait :

(ou alors il existe une solution propre, simple et fiable de désigner la
racine d'un site ?).


Je ne dis pas que c'est la meilleure solution, mais c'est celle que
j'utilise en local et chez deux hébergeurs différents.

// Recherche du "niveau" d'arborescence -
// retourne "" ou "../" * nombre de fois nécessaires
function arbre() {
return
str_repeat("../",substr_count(substr($_SERVER['SCRIPT_FILENAME'],strlen($_SERVER['DOCUMENT_ROOT'])),'/')-1);
}

Ensuite, pour par exemple revenir à la racine du site, depuis n'importe
quel niveau, sans s'occuper de calculer quoi que ce soit :

$dir=arbre();
echo "<a href='".$dir."index.php'><img
src='".$dir."images/ancient_home.gif' alt='Accueil'></a>";
--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique : http://aviatechno.free.fr

Avatar
Olivier Miakinen

Je viens de voir que le pb ne se pose que lorsque j'utilise cette inclusion
dans A.php :
include $root.'/ZZ/SousMenu.php';
avec $root='127.0.0.1/mon_site'


Il fallait le dire tout de suite !

Je pensais que tu avais initialisé $root avec un chemin correct, du
style '/mon_site' ou encore 'http://truc.example.com/mon_site'.

Tu pourrais éventuellement utiliser 'http://127.0.0.1/mon_site', mais
alors ça ne fonctionnerait que chez toi et chez personne d'autre.

Si j'utilise : include '../ZZ/SousMenu.php', pas de pb ...


Note que c'est un conseil que je t'avais donné à ma première réponse,
même sans tout comprendre...

ZZ étant un répertoire directement sous la racine, je pensais que cela était
équivalent ...


Non, si c'est directement à la racine (c'est-à-dire sans /mon_site
devant), ce sera '/ZZ/SousMenu.php' (sans les ..).

L'usage de $root doit me permettre de ne pas avoir à modifier les inclusions
dans A.php si je l'utilise dans un autre répertoire.


Mets alors tous les chemins en absolu à partir de la racine, sans
préciser d'adresse IP.

(ou alors il existe une solution propre, simple et fiable de désigner la
racine d'un site ?).


Oui : c'est '/'.

Note que tout ceci est du pur HTML et n'a strictement rien à voir avec PHP.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
UniversZen
Olivier Miakinen a écrit (news:e2inue$1ncn$) :

Je viens de voir que le pb ne se pose que lorsque j'utilise cette
inclusion dans A.php :
include $root.'/ZZ/SousMenu.php';
avec $root='127.0.0.1/mon_site'


Il fallait le dire tout de suite !


Oui, oui ... J'aurais bien aimé m'en apercevoir tout de suite ! :-)

Je pensais que tu avais initialisé $root avec un chemin correct, du
style '/mon_site' ou encore 'http://truc.example.com/mon_site'.
Tu pourrais éventuellement utiliser 'http://127.0.0.1/mon_site', mais
alors ça ne fonctionnerait que chez toi et chez personne d'autre.


Euh, j'ai oublié de le préciser mais je travaille en local pour l'instant
...
L'utilisation de $root doit justement me permettre de passer sur un serveur
assez facilement.

Si j'utilise : include '../ZZ/SousMenu.php', pas de pb ...


Note que c'est un conseil que je t'avais donné à ma première réponse,
même sans tout comprendre...


C'est vrai ! ;-)

ZZ étant un répertoire directement sous la racine, je pensais que
cela était équivalent ...


Non, si c'est directement à la racine (c'est-à-dire sans /mon_site
devant), ce sera '/ZZ/SousMenu.php' (sans les ..).


Là c'est un chemin absolu dont tu parles ; je parlais de chemin relatif
depuis A.php qui lui se trouve dans /w/. ;-)

L'usage de $root doit me permettre de ne pas avoir à modifier les
inclusions dans A.php si je l'utilise dans un autre répertoire.


Mets alors tous les chemins en absolu à partir de la racine, sans
préciser d'adresse IP.


Mon soucis est de pouvoir déplacer des fichiers sans avoir à les modifier
(une fois déplacés, ils ne sont plus forcément au même niveau de
l'arborescence donc pb si chemin absolu).

(ou alors il existe une solution propre, simple et fiable de
désigner la racine d'un site ?).


Oui : c'est '/'.

Note que tout ceci est du pur HTML et n'a strictement rien à voir
avec PHP.


Je suis au courant et j'avais commencé par là.
Le pb est que '/' ne me donne pas les mêmes résultats en local et en hébergé
donc modification des fichiers nécessaires pour passer de l'un à l'autre ...


En fait tout mon pb est là : pouvoir dans mes fichiers faire référence à la
racine, quelque soit l'endroit où se trouve mon fichier et quelque soit le
mode de fonctionnement (local ou non).

Merci pour tes réponses.

A+.


--
UniversZen


Avatar
UniversZen
Dominique Ottello a écrit (news:)
:

Je ne dis pas que c'est la meilleure solution, mais c'est celle que
j'utilise en local et chez deux hébergeurs différents.


Merci, il est fort possible que je m'oriente vers une solution de ce type.
;-)

A+.


--
UniversZen

Avatar
Dominique Ottello
"UniversZen" écrivait :

Le pb est que '/' ne me donne pas les mêmes résultats en local et en hébergé
donc modification des fichiers nécessaires pour passer de l'un à l'autre ...


Utilisant Wamp5 sous Windows XP Home en local, j'ai été confronté à ce
problème de différences entre site local et site hébergé.

Voici comment j'ai fait pour que sous Wamp5, mes différents sites soient
vus de manière similaire en local et en distant - c'est-à-dire pour que
les différentes variables, par exemple :

$_SERVER['REQUEST_URI']
$_SERVER['SCRIPT_NAME']
$_SERVER['PHP_SELF']
$_SERVER['SCRIPT_FILENAME']
$_SERVER['DOCUMENT_ROOT']
$_SERVER['SERVER_NAME']
__FILE__

soient gérées de la même manière en local et en réel, ce qui n'est pas
le cas de la configuration Wamp5 par défaut.

Je prends l'exemple de 3 de mes sites :

- Sites réels
http://aviatechno.free.fr/
http://le.pointu.free.fr/
http://phottello.free.fr/

- Sites locaux
G:Wampwwwaviatechno
G:Wampwwwle.pointu
G:Wampwwwphottello

- 1 - Modifier le fichier %windir%System32DriversetcHosts
pour qu'il comprenne les lignes suivantes dans l'ordre :

127.0.0.1 localhost
127.0.0.1 aviatechno
127.0.0.1 phottello
127.0.0.1 le.pointu

Les contenus de droite de chaque ligne étant les exactes copies des noms
des dossiers des sites locaux situés dans G:Wampwww

Nota : Il est impératif que les noms des dossiers des sites locaux
soient différents des noms des sites réels.

- 2 - Ouvrir le fichier WampApache2Confhttpd.conf
et, à partir de la ligne : # Use name-based virtual hosting.
ajouter (ou modifier) le texte suivant :

NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot G:/Wamp/www
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
DocumentRoot G:/Wamp/www/aviatechno
ServerName aviatechno
</VirtualHost>

<VirtualHost *:80>
DocumentRoot G:/Wamp/www/phottello
ServerName phottello
</VirtualHost>

<VirtualHost *:80>
DocumentRoot G:/Wamp/www/le.pointu
ServerName le.pointu
</VirtualHost>

Nota : ServerName localhost doit être en premier et l'ordre correspondre
à celui du fichier Hosts.

À partir de ces modifications, si on lance Wampserver et que dans le
navigateur on lance un site local, par exemple http://aviatechno/ (le
"/" final est obligatoire), on ouvrira bien le site local.

En revanche, si on lance Localhost du menu de Wampserver puis un des
site qui apparaissent dans la page index.php, par exemple aviatechno, on
obtiendra :
http://localhost/aviatechno/
ce qui ajoute un niveau de plus (localhost/) par rapport au site réel et
fait que les variables susmentionnées n'ont pas un contenu similaire à
celui du site réel.

Donc,
- 3 - dans le fichier Wampwwwindex.php
modifier la ligne :

echo '<a class="ditem" href="'.$file.'"><img src="dossier.gif"
alt="image dossier" /> '.$file.'</a>';

par

echo '<a class="ditem" href="http://'.$file.'/"><img src="dossier.gif"
alt="image dossier" /> '.$file.'</a>';

et le site local sera bien lancé par http://aviatechno/ au lieu de
localhost/aviatechno
--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique : http://aviatechno.free.fr

Avatar
Michael DENIS
Le 20 Apr 2006 14:48:25 GMT, "UniversZen"
écrivait:

Ma page A.php (/w/A.php) :
<?php include_once './commun/Funct.php'; ?>


Si je n'ai pas trop survolé le débat, voici une idée qui pourrait vous
être utile:

include_once($_SERVER['DOCUMENT_ROOT'] . "/commun/Funct.php");

--
Michaël DENIS


Déco? <http://www.toiles-de-mayenne.com/>

1 2