problème d'include et de chemin

Répondre
croco
le 20/05/2007 à 23:49
croco
Bonjour,
Voilà mon problème :
J'avais un index.html automatiquement sur la vraie page structurant le site:
répertoire /site/squelette/site.php

site.php mettant en place les div nécessaire et incluant 5 contenus : le sommet, le sommaire à gauche, une marge droite, le pied de page et la corps de page, ceci par des 'include', constitués par des fichiers php situés eux aussi dans /site/squelette/.
Par exemple, pour la partie haute, cela donnait dans site.php le code suivant :
<?php 

if (!isset($_GET['page'])) {$page= 'introFR';} else {$page= $_GET['page'];}
// cette variable servant à appeler les contenus dynamiques pour le corps de page, le titre, le header...
.........

echo "<div id=\"haut\">\n";
include "ongletFR.php";
echo "</div>\n";

.........
?>


Et dans ongletFR.php se trouvait le code suivant (entre autres éléments qui ne posent pas problème et que je ne copie pas):

<?php 

include "../titres/FR/".$page."_titre.php";

?>


Tout cela fonctionnait mais je veux me débarrasser du renvoie de page et donc je déplace le fichier site.php à la racine, en le renommant index.php. Ceci implique bien sûr de faire les modifications nécessaires dans tous les fichiers liés, sans oublier ce qui est en include.
C'est aussi l'occasion de reprendre le code en systématisant les chemins définis sur la base de $_SERVER['DOCUMENT_ROOT'];

Le code devient, pour les mêmes éléments :
<?php 
$chemin_racine=$_SERVER['DOCUMENT_ROOT'];
.............
if (!isset($_GET['page'])) {$page= 'introFR';} else {$page= $_GET['page'];}
// cette variable servant à appeler les contenus dynamiques pour le corps de page, le titre, le header...
.........

echo "<div id=\"haut\">\n";
include $chemin_racine."/site/squelette/ongletFR.php";
echo "</div>\n";

.........
?>


et pour onglet.php
<?php 
include "".$chemin_racine."site/titres/FR/".$page."_titre.php";
?>


Or ceci renvoie l'erreur suivante :
Warning: main(): Unable to access /home/ischyrochampsa/www/site/titres/FR/_titre.php in /home/ischyrochampsa/www/site/squelette/ongletFR.php on line 29
C'est '_titre.php' qui est cherché au lieu de 'introFR_titre.php' : j'en déduis que onglet.php est interprété avant d'être inclus, donc il renvoie un chemin sans que la variable $page ait été intégrée au nom du fichier.
=> pourquoi ce changement de comportement par rapport au chemin relatif d'origine (quand site.php incluant onglet.php était dans le même répertoire) ?

En faisant passer la variable par un GET ça rentre dans l'ordre, mais j'aimerais savoir pourquoi le code devient interprété (donc que ça comporte comme si j'avais mis comme chemin www.mondomaine.fr/blabla....).

J'aurais d'autres questions mais je préfère revoir celles-ci à tête reposée.
LA GLOBULE
le 21/05/2007 à 08:06
LA GLOBULE
Alors, pour débuguer ce genre de chose, c'est plutôt facile, il faut faire des echo un peu partout :)
En effet, il suffit de chercher où est ce que $page perd sa valeur.

Donc, je serais toi, je ferais un echo de $page dans le div haut, et donc juste avant d'inclure ongletFR.php.
Et dans ongletFR.php, je referais des echo de $page (au début du fichier) et juste avant d'inclure $page."_titre.php".
(Voir mieux, tu peux aussi carrément faire des echos des chemins des fichiers que tu include)

A mon avis, tu dois modifier la valeur de $page en cours de route, car a priori la valeur est initialisée pour toutes les pages du site.

PS : j'espère que tu listes bien les fichiers auquels tu peux accéder avant de les include, sinon ton site comporte une faille de sécurité : la faille include.
croco
le 21/05/2007 à 09:08
croco
je vais tester avec quelques "echos" mais je n'ai rien modifié à la valeur de $page, les seules modifications du code concerne les chemins.

Y a-t-il en théorie une différence de traitement entre un include "toto.php"; et un include $_SERVER['DOCUMENT_ROOT']."/chemin/toto.php"; ?

Est-ce $_SERVER['DOCUMENT_ROOT'] constitue un chemin ou une URL ?
croco
le 21/05/2007 à 09:30
croco
résultat du test : juste avant le include (je parle de la nouvelle version) $page renvoie sa valeur, juste après le include (début du fichier inglet.php) $page ne renvoie rien si elle n'est pas passée par un GET.
la seule chose ayant changé, c'est de fournir le chemin par $_SERVER['DOCUMENT_ROOT'] puisque l'incluant et l'inclus ne sont plus dans le même répertoire.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours