Page 1 sur 2

Fonction include de variables

Posté : 10 janv. 2008, 11:57
par agité
Bonjour,

Pour faire en sorte de faire toujours les même liens direct sur mes pages j'utilise les variables de session de la facon suivante :
$_SESSION['Base_url_menu'] = "http://xxx/menu.php/";
ensuite dans mes fonction j'utilise my_include :
function my_include($string)
{
	include($string);
}
Pour pouvoir utiliser mes variables (au cas ou register globals n'est pas on)

ensuite dans ma page je fais :
<? my_include($_SESSION['Base_url_menu']); ?>
Le menu est bien inclus !

Par contre il n'affichage pas les elements comprennant des variables de session a l'interieur de l'include :
<img src="<? echo $_SESSION['Base_url']; ?>medias/img/header_login.png" />
Il ne reconnais plus le $_SESSION['Base_url'];

tandis qu'en mettant :
<? include("menu.php"); ?>
la il retrouve bien les variables.

je ne vois d'ou peux venir l'erreur ?

Posté : 10 janv. 2008, 12:20
par Ryle
Lorsque tu utilises le système de fichier avec ta fonction include() (c'est à dire des chemins sur le disque) le code php est inséré à l'endroit souhaité puis exécuté.
Si tu utilises une url (commençant par un protocol http ou autre), php ouvre l'url demandée comme n'importe quel navigateur. Le code de la page est donc exécuté indépendament sur le serveur et c'est le résultat renvoyé à l'écran qui est récupéré par php et inclu dans ton script (résultat qui n'est donc pas exécuté puisqu'il ne s'agit que de html)

A partir de là, il te faut voir dans quel cas tu travailles sur le système de fichier ou via des url (la racine "/" n'est pas la même dans les deux cas) et utiliser les chemins adéquats :)

Ps : euh.... elle sert à quoi la fonction my_include() à part ajouter 3 caractères de plus pour faire un include ? :)
Pps : préfère les balises "<?php" plutôt que les short open tags "<?"

Posté : 10 janv. 2008, 12:29
par agité
Lorsque tu utilises le système de fichier avec ta fonction include() (c'est à dire des chemins sur le disque) le code php est inséré à l'endroit souhaité puis exécuté.
Si tu utilises une url (commençant par un protocol http ou autre), php ouvre l'url demandée comme n'importe quel navigateur. Le code de la page est donc exécuté indépendament sur le serveur et c'est le résultat renvoyé à l'écran qui est récupéré par php et inclu dans ton script (résultat qui n'est donc pas exécuté puisqu'il ne s'agit que de html)

A partir de là, il te faut voir dans quel cas tu travailles sur le système de fichier ou via des url (la racine "/" n'est pas la même dans les deux cas) et utiliser les chemins adéquats :)

Ps : euh.... elle sert à quoi la fonction my_include() à part ajouter 3 caractères de plus pour faire un include ? :)
Pps : préfère les balises "<?php" plutôt que les short open tags "<?"
Merci pour ta reponse Ryle

En fait je creer une session apres le login qui me donne 3 variables :

$_SESSION['Base_url'] = "http://xxx/";
				
$_SESSION['Base_url_menu'] = $_SESSION['Base_url']."menu.php";
				
$_SESSION['Base_url_header'] = $_SESSION['Base_url']."header.php";
Ensuite je veux utiliser ces variables en include (car les page ne se situent pas toutes au même endroit.

Pour ca je fais un appel ensuite dans ma page :
<table border="0" cellspacing="0" cellpadding="0" class="gab" align="center">
<!-- Header -->
<tr>
<td colspan="3"><? include($_SESSION['Base_url_header']); ?></td>
</tr>
<!-- Menu -->
<tr>
<td valign="top"><? include($_SESSION['Base_url_menu']); ?></td>
Dans ce cas la il m'inclus bien les 2 fichier header.php et menu.php

Sauf que : dans le fichier header.php ben ya plus les variables de session de l'utilisateur type :
$_SESSION['login']
par contre le reste s'affiche correctement, bon la déjà j'ai du mal a comprendre.

Ensuite lorsque je l'appel depuis une page dans un dossier, il ne me retrouve les 2 fichiers mais plus aucune variables de session sur mes liens ne marche type :
<img src="<? echo $_SESSION['Base_url']; ?>_medias/img/menu_dispo.gif" />
par contre le reste du code marche.

J'ai l'impression qu'avec ma methode je perds mes variables de sessions, pourtant elle ne sont pas écrasées, sont statique et definies dans un fichier de login.

Pour les short tag je préfère les utiliser en fait il n'y a absolument aucune difference entre short et long tag donc je préfère ceux la, a vrai dire je crois que c'est plus une question de beauté pour le code.

Pour la fonction my_include je pensais l'utiliser car les variables ne passaient pas directement en include mais apparement si.

Une idée ?

Posté : 10 janv. 2008, 12:42
par Nagol
clairement le problème vient de ton http://xxx dans ta variable de session

sinon effectivement à moins que ta fonction include comporte plus de code que tu n'en as posté ici elle ne sert à rien.

d'autre part je ne crois pas qu'il soit utile d'utiliser les sessions dans ton cas, préfères y une méthode pour définir l'adresse racine absolue de tes fichiers

par exemple, défini un fichier config.php à la racine de ton site web qui contiendra
<?php

define('ROOT_DIR', dirname(__FILE__) . '/');

?>
puis inclues config.php dans toutes tes pages (opération ennuyante mais ça simplifie la vie ensuite)
<?php

include $_SERVER['DOCUMENT_ROOT'] . '/config.php';

?>
Note: document root étant issu de la configuration d'apache il te faudra tester sa valeur un peu puisqu'il me semble qu'elle peut contenir ou non le / final.

pour finir tous tes autres inclusions se feront de manière absolue en utilisant la constante ROOT_DIR.
<?php
include ROOT_DIR . 'menu/menu.php';
?>
Alors je suis sur que comme ça tu ne vois pas l'avantage mais quand on évolue avec des structures de répertoires complexe on peut réellement simplifier de beaucoup le codage et réduire les erreurs et le temps de debuggage.

Posté : 10 janv. 2008, 12:48
par agité
Merci pour cette reponse mais :

$_SERVER['DOCUMENT_ROOT']

ne me retourne que la racine, hors je ne veux pas de cette racine je veux definir moi même l'emplacement (en cas de changement d'hebergement) ce quie pourrait paraitre fastidieux a changer sur toute les pages.

De plus je perds toujours mes variables de sessions.

Je trouvais la methode du $_SESSION['Base_url'] très pratique car c'est une ligne de plus a la connection pour definir la document de base en "http://machin/bidule" c'est quand même beaucoup plus pratique.

Posté : 10 janv. 2008, 12:54
par Nagol
$_SERVER['DOCUMENT_ROOT'] sera la tout prêt à t'attendre je ne comprend pas bien ta volonté de vouloir gérer les choses sans utiliser les ressources universelle à ta disposition :)

Posté : 10 janv. 2008, 12:56
par agité
$_SERVER['DOCUMENT_ROOT'] sera la tout prêt à t'attendre je ne comprend pas bien ta volonté de vouloir gérer les choses sans utiliser les ressources universelle à ta disposition :)
En fait le $_SERVER['DOCUMENT_ROOT'] ne me retourne pas l'endroit que je souhaite.

Il est donc impossible d'avoir a definir sur chaque page $_SERVER['DOCUMENT_ROOT']/mondossier/

je voudrais une methode de lien qui soit definie de base et directement utilisable.

hors document_root ne me retourne pas le dossier que je souhaite.

Posté : 10 janv. 2008, 13:00
par Nagol
et bien tu peux aussi inclure config.php de façon relative
include '../config.php';
ce qui te permet d'être indépendant du répertoire dont tu parles.

Posté : 10 janv. 2008, 13:01
par Ryle
Lorsque tu inclus un fichier en spécifiant une url comme c'est le cas ici, c'est comme si quelqu'un ouvrait son navigateur, se connectait à n'importe quel site, prenait le code html généré et l'insérait à l'endroit souhaité... donc nécessairement, aucune des variables que tu pourrais avoir en session n'y est présente.

Donc quand tu fais un include() pour intégrer un fichier php que tu souhaites exécuter, il est indispensable de spécifier un chemin local (relatif par rapport au script qui l'inclut, ou global par rapport à la racine du serveur)

Code : Tout sélectionner

include("../../dossier/fichier_a_include.inc.php"); // relatif include("/www/dossier/fichier_a_include.inc.php"); // global par rapport à la racine du disque include("C:\\www\\dossier\\fichier_a_include.inc.php"); // global
Maintenant, lorsque tu veux spécifier le chemin d'une image, c'est au navigateur que tu l'indiques. La encore, c'est un chemin relatif ou global qu'il te faut utiliser, le chemin global se faisant par rapport au nom de domaine

Code : Tout sélectionner

<img src="../../dossier/image.jpg"> // relatif <img src="/dossier/image.jpg"> // global par rapport à la racine du domaine <img src="http://domaine.com/dossier/image.jpg"> // global
Maintenant il ne te reste plus qu'à t'adapter au contexte, choisir la façon dont tu souhaites procéder et suivre les conseils de Nagol sur les variables existantes qui peuvent te servir :)

Posté : 10 janv. 2008, 13:02
par agité
et bien tu peux aussi inclure config.php de façon relative
include '../config.php';
ce qui te permet d'être indépendant du répertoire dont tu parles.
justement je veux eviter a tout prix les chemis relatif, c'est ce pourquoi j'utilise les variables de session.

Je veux que depuis n'importe qui hebergement ou changement de page j'ai juste a changer ce lient $_SESSION['Base_url']

Ce qui serait le plus simple, mais apparement il me perds les variables de session entre temps.

Ta methode me permet d'utiliser le document root mais ce n'est pas ce que je cherche a faire car en appelant ce fichier de config il faut modifier le lien sur toute les pages qui ne sont pas dans le même repertoire.

Posté : 10 janv. 2008, 13:11
par Nagol
Non.

avec les chemins relatifs vers config.php et ce que j'ai expliqué plus haut tu n'auras strictement aucun include à corriger après migration.

D'autre part il faut que tu réalises que ta méthode ne fonctionne tout simplement pas, puisqu'il suffit d'avoir un sous répertoire pour que ca ne fonctionne plus (eh oui ta variable de session ne fonctionnera que pour les scripts à la racine) c'est tout simplement une erreur que de prendre ce chemin la.

Enfin, je n'ai aucun interêt à te mentir ou à t'emmener dans une mauvaise direction ce que je t'explique je le met en pratique depuis bientôt 10 ans (depuis php2/début de php3 quand même) et ca fonctionne à merveille.

Posté : 10 janv. 2008, 13:14
par agité
Non.

avec les chemins relatifs vers config.php et ce que j'ai expliqué plus haut tu n'auras strictement aucun include à corriger après migration.
EDIT :

Après reflection je dis un peu n'importe qui puisque document root suivis du chemin ne changera pas ...

en fait ta methode est vraiment bien je viens de tester :

- les liens marchent
- les images marchent
- les variables de sessions marchent

donc c'est la fête merci bien pour votre aide je met la balise résolu.

Mais je vais me renseigner au pourquoi du comment de l'explication de Ryle quand a la perte des données lors d'un appel depuis un lien de session.

merci encore !


RE EDIT : firefox m'indique qu'il ne peux pas charger un lien depuis un local c: :roll:

Posté : 10 janv. 2008, 13:26
par Nagol
dis toi que le seul lien relatif de chacun de tes scripts est le lien vers config.php justement et que c'est la qu'est l'avantage. puisqu'après tu disposes d'une constante pour exprimer un chemin absolu.

ce que tu veux c'est précisément ça, crois moi :)

Les sessions sont faites pour des données temporaires (préférences du site options comme la langue, le login si tu gères une authentification. tes données d'accès au fichier sont des données que tu doit considérer comme étant statique. Le fait d'exprimer les chemins en relatif est naturel voire même obligatoire, une fois que tu as correctement mis le système en place il est totalement indépendant du répertoire racine (celui contenant ton site web) et par extension tu pourras aisément "porter" ton application vers un nouveau serveur sans effectuer un quelconque recodage.

Dis moi si je me trompe mais il me semble qu'on est exactement dans ce que tu demandes non? :)

Posté : 10 janv. 2008, 13:29
par agité
dis toi que le seul lien relatif de chacun de tes scripts est le lien vers config.php justement et que c'est la qu'est l'avantage. puisqu'après tu disposes d'une constante pour exprimer un chemin absolu.

ce que tu veux c'est précisément ça, crois moi :)

Les sessions sont faites pour des données temporaires (préférences du site options comme la langue, le login si tu gères une authentification. tes données d'accès au fichier sont des données que tu doit considérer comme étant statique. Le fait d'exprimer les chemins en relatif est naturel voire même obligatoire, une fois que tu as correctement mis le système en place il est totalement indépendant du répertoire racine (celui contenant ton site web) et par extension tu pourras aisément "porter" ton application vers un nouveau serveur sans effectuer un quelconque recodage.

Dis moi si je me trompe mais il me semble qu'on est exactement dans ce que tu demandes non? :)
Oui on est bien dans ce que je demande :)

Par contre je suis obliger de faire un lien sur chaque page type
<?php include $_SERVER['DOCUMENT_ROOT'] . 'dossiercomplet/config.php'; ?>
hors si je change d'hebergeur bim c'est toute les pages vers ce lien que je dois retaper :/

et ca c'est assez genant

après quelque test firefox me retourne une erreur lorsque j'utilise :

<? echo $_ROOT_DIR; ?> il ya bien un lien mais il ne fonctionne pas

avec
<? echo ROOT_DIR; ?> il ne marche plus.


EDIT : <? $_ROOT_DIR; ?> fonctionne correctement mais lorsque je change de page les images et liens ne fonctionnent plus.

Posté : 10 janv. 2008, 13:42
par Nagol
hmm tu devrais oublier ma première proposition avec le DOCUMENT_ROOT il vaut mieux dans ton cas utiliser des chemins relatifs

//si config.php se trouve dans le même dossier que ton script
include_once 'config.php';

//si config.php se trouve un niveau au dessus
include_once '../config.php';

//si config.php se trouve deux niveaux au dessus
include_once '../../config.php';

n'oublies de placer cet include tout à fait au début de chaque script

ensuite normalement tu peux inclure avec la constante

//exemple se trouve dans le même répertoire que config
include_once ROOT_DIR . 'exemple.php';

//exemple se trouve dans le sous répertoire menu
include_once ROOT_DIR . 'menu/exemple.php';