Variables de Session non fonctionnelles

olivioloyer
Invité n'ayant pas de compte PHPfrance

30 juin 2010, 13:51

Bonjour,

J'ai un problème avec php,

J'ai plusieurs fichiers dont ma page web de départ FR.html, Experiences.php qui contient elle même les includes ChooseCV.php,

Dans FR.html je cherche a faire passer une variable lang via $_SESSION voici le code épuré:

<?php
session_start();
$_SESSION['lang']='FR';
?>

<html........>
<body>
<table id="FlagRow">
<tr>
<td><img class="Flag" src="pics/FR_Flag.png" alt="FR" onmouseover="Traduct('FR')" onclick="$lang = 'FR';"/></td>
<td><img class="Flag" src="pics/ENG_Flag.png" alt="ENG" onmouseover="Traduct('ENG')" onclick= "$lang = 'ENG';"/></td>
<td><img class="Flag" src="pics/ESP_Flag.png" alt="ESP" onmouseover="Traduct('ESP')" onclick= "$lang = 'ESP';"/></td>
<td><img class="Flag" src="pics/BR_Flag.png" alt="BR" onmouseover="Traduct('BR')" onclick= "$lang = 'BR';"/></td>
</tr>
</table>
</body>
</html>

et par la suite je cherche a acceder a la variable de session lang, sur l'autre page Experiences.php

<html xmlns="html://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
</head>
<body>
<table>
<tr>
<td>
<div id="Content" >
<?php include("ChooseCV.php"); ?>
<!--object id="CVPart" data="../cv/CV_FR.html" type="text/html" /-->
</div>
</td>
</tr>

et enfin le fichier ChooseCV.php

<?php
session_start();
//print_r($_SESSION);
$lang = $_SESSION['lang'];

$CV_Lang['FR'] = '../cv/CV_FR.html';
$CV_Lang['ENG'] = '../cv/CV_ENG.html';
$CV_Lang['ESP'] = '../cv/CV_ESP.html';
$CV_Lang['BR'] = '../cv/CV_BR.html';

if(isset($_SESSION['lang']))
{
echo '<object id="CVPart" data=';
echo $CV_Lang;
echo '[';
echo $lang;
echo ']';
echo ' type="text/html" />';
}
?>

hors lorsque j'ecris ceci je reçois le message d'erreur suivant:

Notice: Undefined index: lang in C:\Users\oliv\Desktop\mardaoliv\Website\php\ChooseCV.php on line 8,

d'autre part le print_r($_SESSION) m'affiche un Array() vide alors que le print_r($_SERVER) fonctionne

J'ai essayé plusieurs alternatives notamment les cookies qui ne fonctionnent pas non plus, je suppose donc que mon server Wamp est mal configuré mais register_globals et a on et les includes fonctionnent.

Je me tourne donc vers vous pour quelques conseils.

Merci d'avance

Olivier

PS: MaConfig: Windows7-64bit, Wampserver2.0, Firefox 3.6.3

ViPHP
ViPHP | 2291 Messages

30 juin 2010, 16:16

Salut,

A mon avis il manque un session_start() dans le fichier Experiences.php

A+
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

olivioloyer
Invité n'ayant pas de compte PHPfrance

30 juin 2010, 16:27

Bonjour,

Et merci pour cette réponse, néanmoins, j'avais déjà éssayé et voila l'erreur que j'obtient si je met un session start au début de Experiences.php

Notice: A session had already been started - ignoring session_start() in C:\Users\oliv\Desktop\mardaoliv\Website\php\Experiences.php on line 2

Merci

Eléphant du PHP | 50 Messages

30 juin 2010, 16:36

Bonjour,

pourquoi avoir mis

Code : Tout sélectionner

<?php session_start(); $_SESSION['lang']='FR'; ?>
dans le fichier FR.html,

ca serait plutôt dans du FR.php ...

Eléphanteau du PHP | 10 Messages

30 juin 2010, 16:47

Thx a lot
c'etait ca,

tout simplement,

bon ben merci , j'aurai certainement d'autres question à vous poser très bientôt

Bonne Journée

Eléphanteau du PHP | 10 Messages

30 juin 2010, 19:12

Rebonjour,

Et oui me revoilà déjà,

Alors ca marchait parfaitement,

<td><img class="Flag" src="pics/FR_Flag.png" alt="FR" onmouseover="Traduct('FR')" onmouseover= "<?php $_SESSION['lang'] = 'FR';?>"/></td>
<td><img class="Flag" src="pics/ENG_Flag.png" alt="ENG" onmouseover="Traduct('ENG')" onmouseover= "<?php $_SESSION['lang'] = 'ENG';?>"/></td>
<td><img class="Flag" src="pics/ESP_Flag.png" alt="ESP" onmouseover="Traduct('ESP')" onmouseover= "<?php $_SESSION['lang'] = 'ESP';?>"/></td>
<td><img class="Flag" src="pics/BR_Flag.png" alt="BR" onmouseover="Traduct('BR')" onmouseover= "<?php $_SESSION['lang'] = 'BR';?>"/></td>
<td><p><?php echo $_SESSION['lang'];?></p></td>

et ma variable changeait au passage de la souris sur l'image, mais pour je ne sais quelle raison, la valeur de $_SESSION['lang'] ne peut maintenant plus être modifié, et l'affichage de print_r($_SESSION) me donne Array([lang]=>BR) seulement je ne peut plus modifier cette valeur

Je ne sais pas ce qu'il s'est passé entre temps.

MERCI

Eléphanteau du PHP | 10 Messages

30 juin 2010, 21:07

Bien,

Après quelques googlages je réponds moi même a ma question, et vous me direz si je me trompe mais apparement je ne peux faire :

<td><img class="Flag" src="pics/FR_Flag.png" alt="FR" onmouseover="Traduct('FR')" onclick = "<?php $_SESSION['lang'] = 'FR';?>"/></td>
<td><img class="Flag" src="pics/ENG_Flag.png" alt="ENG" onmouseover="Traduct('ENG')" onclick = "<?php $_SESSION['lang'] = 'ENG';?>"/></td>
<td><img class="Flag" src="pics/ESP_Flag.png" alt="ESP" onmouseover="Traduct('ESP')" onclick = "<?php $_SESSION['lang'] = 'ESP';?>"/></td>
<td><img class="Flag" src="pics/BR_Flag.png" alt="BR" onmouseover="Traduct('BR')" onclick = "<?php $_SESSION['lang'] = 'BR';?>"/></td>

car php remplace le code coté serveur par la valeur de la variable et ce avant le chargement de la page coté client donc, il est normal que je me retrouve toujours avec BR comme valeur,

Comment peut on palier simplement a ce probleme?
merci

ViPHP
AB
ViPHP | 5818 Messages

30 juin 2010, 21:31

Bien,

Après quelques googlages je réponds moi même a ma question, et vous me direz si je me trompe mais apparement je ne peux faire :

<td><img class="Flag" src="pics/FR_Flag.png" alt="FR" onmouseover="Traduct('FR')" onclick = "<?php $_SESSION['lang'] = 'FR';?>"/></td>
<td><img class="Flag" src="pics/ENG_Flag.png" alt="ENG" onmouseover="Traduct('ENG')" onclick = "<?php $_SESSION['lang'] = 'ENG';?>"/></td>
<td><img class="Flag" src="pics/ESP_Flag.png" alt="ESP" onmouseover="Traduct('ESP')" onclick = "<?php $_SESSION['lang'] = 'ESP';?>"/></td>
<td><img class="Flag" src="pics/BR_Flag.png" alt="BR" onmouseover="Traduct('BR')" onclick = "<?php $_SESSION['lang'] = 'BR';?>"/></td>

car php remplace le code coté serveur par la valeur de la variable et ce avant le chargement de la page coté client donc, il est normal que je me retrouve toujours avec BR comme valeur,

Comment peut on palier simplement a ce probleme?
merci
Bah tu fait un lien standard avec une variable $_GET que tu pourras toujours enregistrer dans une variable de session si tu veux

code html
<td><a href="<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?lang=FR'?>"><img class="Flag" src="pics/FR_Flag.png" alt="FR" onmouseover="Traduct('FR')" /></a></td>
//etc.
et dans ton code php
$_SESSION['lang'] = isset ($_SESSION['lang']) ? $_SESSION['lang'] : 'FR'; // ici FR est la langue par défaut
$_SESSION['lang'] = isset($_GET['lang'])? $_GET['lang'] : $_SESSION['lang'] ;

Eléphanteau du PHP | 10 Messages

01 juil. 2010, 13:12

Bonjour et merci,

Mais si je puis me permettre, j'eusse esperé quelque chose de plus "simple" (tout est relatif, mais je suis débutant....héhé)
je vais essayer de décortiquer ton code, corrigez moi si je me trompe:

<td><a href="<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?lang=FR'?>"><img class="Flag" src="pics/FR_Flag.png" alt="FR" onmouseover="Traduct('FR')" /></a></td>
//etc.


<a href="< //un lien sur l'image
<?php echo htmlspecialchars //traduit les caracteres speciaux pour le html
($_SERVER['PHP_SELF']) //recupere le chemin du script php en cours
.'?lang=FR'?>"> //valeur pour lang par défaut?? ( a quoi sert le premier "?")


$_SESSION['lang'] = isset ($_SESSION['lang']) ? $_SESSION['lang'] : 'FR'; // ici FR est la langue par défaut
$_SESSION['lang'] = isset($_GET['lang'])? $_GET['lang'] : $_SESSION['lang'] ;


$_SESSION['lang'] = isset ($_SESSION['lang']) ? $_SESSION['lang'] : 'FR'; //opérateur ternaire, si Session lang à une valeur il vaut session lang sinon il prend FR par défaut


$_SESSION['lang'] = isset($_GET['lang'])? $_GET['lang'] : $_SESSION['lang']
//opérateur ternaire , si get lang a une valuer alors session lang prends la valeur de get lang sinon c'est get lang qui prend la valeur de session lang


Bon je comprends a peu près la démarche, mais la variable ne va-t-elle pas passer par l'URL dans ce cas la? et du coup il n'y a pas d'intérêt d'utiliser une variable de session non? j'aurai pu le faire directement en variable get,

Merci

Olivier

Eléphanteau du PHP | 10 Messages

01 juil. 2010, 15:26

Rebonjour,

je me corrige
($_SERVER['PHP_SELF']) 
//recupere le chemin du script php en cours
.'?lang=FR'?>"> 
//valeur lang affectée a FR

j'ai donc rajouté les lignes suivantes:
<td><a href="<?php  echo htmlspecialchars($_SERVER['PHP_SELF']).'?lang=ENG'?>"><img class="Flag" src="pics/ENG_Flag.png" alt="ENG" onmouseover="Traduct('ENG')" /></a></td>
<td><a href="<?php  echo htmlspecialchars($_SERVER['PHP_SELF']).'?lang=ESP'?>"><img class="Flag" src="pics/ESP_Flag.png" alt="ESP" onmouseover="Traduct('ESP')" /></a></td>
<td><a href="<?php  echo htmlspecialchars($_SERVER['PHP_SELF']).'?lang=BR'?>"><img class="Flag" src="pics/BR_Flag.png" alt="BR" onmouseover="Traduct('BR')" /></a></td>
mais j'ai toujours pas compris ( a quoi sert le premier "?")

et pour:
$_SESSION['lang'] = isset($_GET['lang'])? $_GET['lang'] : $_SESSION['lang']  
//opérateur ternaire , si get lang a une valeur alors session lang prends la valeur de get lang sinon elle prends la valeur de session lang



bon par contre, j'ai pas l'impression que ca marche j'ai peut-être fait quelque chose de travers?

Bon je comprends a peu près la démarche mouais enfin comme si comme ca quand même une petite clarification me ferai pas de mal


Merci

Eléphanteau du PHP | 10 Messages

01 juil. 2010, 15:40

Je tiens d'ailleurs a féliciter les développeur, pour le forum, je le trouve extrêmement ergonomique, il manque juste, sauf erreur de ma part(il se peut que je n'ai pas compris ou ca se trouvai) un moyen pour replier les messages sur une ligne par exemple, à la gmail..., afin de limiter la taille de la page quand des novices écrivent des messages a rallonge...,

ViPHP
AB
ViPHP | 5818 Messages

01 juil. 2010, 16:57

Bon je comprends a peu près la démarche, mais la variable ne va-t-elle pas passer par l'URL dans ce cas la? et du coup il n'y a pas d'intérêt d'utiliser une variable de session non? j'aurai pu le faire directement en variable get,

Merci

Olivier
Effectivement, il n'y a pas nécessairement d'intérêt. Une variable de session permet de garder sa valeur de pages en pages; mais si toutes tes pages ont une variable get pour indiquer la langue en cour, la variable de session n'est pas nécessaire dans ce cas.

D'ailleurs il y a tout intérêt d'avoir une variable get dans l'URL (adresse de la page) pour différencier les langues. Sinon pour google et autres moteurs de recherche il n'existerait qu'une même adresse pour des contenus différents (traduits en français ou anglais ou ...), ce qui n'est pas bon pour le référencement.

Donc effectivement tu peux te passer d'une variable de session et utiliser une variable $_GET. Il faut juste penser à faire passer la langue en cour par l'intermédiaire de cette variable dans l'url (l'adresse) de toutes tes pages.

Et donc le ? juste derrière l'adresse de la page est précisément fait pour délimiter le query_string, c'est à dire les variables $_GET contenues dans l'adresse de la page. Ainsi si je mets ceci dans un lien
<a href="toto.php?il=elle">lien</a>
le navigateur tentera d'afficher la page toto.php et affectera la valeur "elle" à la variable $_GET['il'];

En phase de développement mets le code suivant en haut de ta page php pour voir le résultat
echo '<pre>';
print_r($_GET);
echo '</pre>';

Fait des tests dans une page séparée pour visualiser le résultat.

Et si tu veux passer plusieurs couples (variable $_GET = valeur) tu les sépare par & dans le code html
<a href="toto.php?il=elle&lui=fou">lien</a>
Commences par bien comprendre ce truc ensuite je te donnerai un peu plus de code pour passer les langues, les enregistrer dans un cookie, récupérer la langue préférée du visiteur pour l'afficher par défaut dès l'affichage de la première page etc.

Eléphanteau du PHP | 10 Messages

02 juil. 2010, 15:29

Bonjour,

Et encore merci pour ces informations,
effectivement cela fonctionne avec un $_GET assez simplement néanmoins cela oblige a recharger la page et, en conséquence ne permet pas à ma fonction traduct de s'effectuer normalement puisque la page étant rechargée elle revient automatiquement en Français, enfin ce n'est pas très grave puisque je comptai par la suite m'affranchir de cette fonction traduct en JS pour la remplacer par un acces a MySQL pour lequel je suis encore en phase d'apprentissage sur un tuto(lesiteduzero).

par contre j'ai un autre probleme, dans ma deuxieme page experiences.php, j'integre un objet html en l'occurence mon CV chargé en fonction de la langue choisit sur FR.php,

sur la gauche je conserve le menu de la page precedente par une inclusion, et j'aimerai déplacer le scrollbar de l'objet html inseré dans la page, a une ancre de celui-ci en fonction d'un evenement (click on onmouseover) sur le menu de gauche.

je n'arrive pas a trouver la methode pour déplacer vers une ancre dans un objet html et ce via un lien ou objet du document parent.


Experiences.php
			<tr>
				<td>
					<span>
						<div>
							<?php include("LeftSideMenu.php"); ?>
						</div>
					</span>
				</td>
				<td>							
					<div id="Content" >
						<?php include("ChooseCV.php"); ?>
					</div>
				</td>
			</tr>
LeftSideMenu.php
<div id="LeftSideMenu">
	<div Class="SideElement">
		<p>
			<h1 class="FR"><a id="Experiences" href="" onmouseover= "	window.location.href = document.getElementById("CVpart").getElementById('SagemCom')">Experiences</a></h1>
		</p>
			<h2><a id="SagemCom" >SagemCom</a></h2>
			<h2><a id="Thales" >ThalesAvionics</a></h2>
			<h2><a id="Schlumberger" >Schlumberger<a/></h2>
			<h2><a id="RATP" >RATP</a></h2>
			<h2><a id="AirCanada" >AirCanada</a></h2>
	</div>
	<div Class="SideElement">
		<p>
			<h1 class="FR"><a id="Competences">Competences</a></h1></p>
		<h2>
			<ul>
				<li class="FR"><a id="Test">Test</a></li>
				<li class="FR"><a id="Informatique">Informatique</a></li>
				<li class="FR"><a id="Electronique">Electronique</a></li>
				<li class="FR"><a id="Automatique">Automatique</a></li>
			</ul>
		</h2>
	</div>
</div>
ChosseCV.php
<?php 
	
	$_SESSION['lang'] = isset  ($_SESSION['lang']) ? $_SESSION['lang'] : 'FR'; // ici FR est la langue par défaut
	$_SESSION['lang'] = isset($_GET['lang'])? $_GET['lang'] : $_SESSION['lang'] ;
	
	$lang = $_SESSION['lang'];

	//print_r($_SESSION);
	
	$CV_Lang['FR'] = '../cv/CV_FR.html';
	$CV_Lang['ENG'] = '../cv/CV_ENG.html';
	$CV_Lang['ESP'] = '../cv/CV_ESP.html';
	$CV_Lang['BR'] = '../cv/CV_BR.html';
	
	if(isset($_SESSION['lang']))
	{
		echo '<object id="CVPart" data=';
		echo $CV_Lang[$lang];
		echo ' type="text/html" />';
	}
	else
	{
		echo '<div id="Content"><object id="CVPart" data="../cv/CV_FR.html" type="text/html"/></div>';
	}
?>
je suppose que la methode window.location.href = document.getElementById("CVpart").getElementById('SagemCom') n'est pas la bonne mais dans ce cas la par exemple je cherche a déplacer le scroll de l'objet html inserer dans le conteneur central de la page a l'ancre SagemCom et ce au passage de la souris sur le lien Experiences dans leftsidemenu.

Merci

ViPHP
AB
ViPHP | 5818 Messages

02 juil. 2010, 17:20

IL suffit que ta cible ait un id. Ensuite c'est le caractère '#" qui indique que l'on vise une ancre
<a  href='#cible'>Aller vers l'ancre ayant l'id nommé cible</a>

<div id = "cible">...</div>

ViPHP
AB
ViPHP | 5818 Messages

02 juil. 2010, 17:28

Ah oui et donc en javascript c'est le même principe :

onmouseover="document.location.href = '#cible'"

Mais bon normalement on le fait avec une balise <a > comme dans le message précédent car il est déroutant pour le visiteur de voir déplacer sa page sur un onmouseover et donc normalement pas besoin de javascript