Variable de session non réaffectée

Eléphanteau du PHP | 24 Messages

21 avr. 2011, 10:10

Bonjour,

Dans un premier formulaire Php, nommé "types.inc", j'ai une date automatiquement initialisée avec la date contenue dans l'objet passé en variable de session :
$dateEve = $_SESSION['objet']->getDateEve();
J'ai la possibilité de modifier cette date dans le formulaire.

Si je la modifie et que je j'enregistre directement le formulaire, pas de problème, la date est modifiée. Par contre, si je modifie la date dans le formulaire "types.inc" et que je clique sur un hyperlien pour me rendre dans un autre formulaire en enregistrant préalablement les données du formulaire, c'est la date initiale qui est reprise au lieu de la date modifiée, alors que je mets bien ma variable de session à jour :

Dans mon script "types.inc", voici l'hyperlien :

Code : Tout sélectionner

onclick=\"enregiTypesRey(); window.location.href='../interfaces/interface.php?fichier=../fichiersInclusion/rey/zones.inc&titre=Figure de Rey&popup=1';\">Zones</a>
Dans ma fonction Ajax "enregiTypesRey()" :

Code : Tout sélectionner

xhrEnregiTypesRey.open("POST",'../transferts/rey/enregiTypesRey.php',true); ... jour = document.getElementById('jour'); jourEve = jour.options[jour.selectedIndex].value; mois = document.getElementById('mois') ; moisEve = mois.options[mois.selectedIndex].value; annee = document.getElementById('annee'); anneeEve = annee.options[annee.selectedIndex].value; ... xhrEnregiTypesRey.send("id=" + id + "&idPrinc=" + idPrinc + "&jourEve=" + jourEve + "&moisEve=" + moisEve + "&anneeEve=" + anneeEve ...
Dans mon fichier "enregiTypesRey.php" :

$obj = unserialize($_SESSION['eve']);
...
$tab['dateEve'] = $_POST['anneeEve'] . "-" . $_POST['moisEve'] . "-" . $_POST['jourEve'];
 
$obj->setDateEve($tab['dateEve']); //Pour éviter les problèmes de date avec l'interface zones
...
unset($_SESSION['eve']);//Car problème de mise à jour de la date dans la session
 
$_SESSION['eve'] = serialize($obj);  //Pour éviter les problèmes de date avec l'interface zones
Dans ma méthode "setDateEve" :
public function setDateEve($dateEve)
   {
    $this->dateEve = $dateEve;
    //Ajouté 4 lignes suivantes car problème d'enregistrement de la date dans le test Figure de Rey
    $tab['dateEve'] = $dateEve;
    $tab['idObj'] = $this->id;
    
    $transaction = CtransactionsBdd::GetInstance("MYSQL", "neuropsy");
    $resuReq = $transaction->update("MYSQL_enregDateObj", $tab);
   }
Pour terminer, dans mon formulaire "zones.inc" :

Code : Tout sélectionner

if(!empty($_SESSION['eve'])) { $eve = unserialize($_SESSION['eve']); ... list($jourEve, $moisEve, $anneeEve) = explode('/', $eve->getDateEve());


Et là, c'est l'ancienne date qui apparaît au lieu de la nouvelle.

Quelqu'un aurait une idée?

Merci d'avance.

Eléphant du PHP | 92 Messages

21 avr. 2011, 11:37

Hello,

As tu vérifier :
1. Que tu passes bien dans toute la mécanique ?
2. Que tu n'as pas d'erreur JS à un moment ou un autre qui pourrait arrête l'exécution de tes fonctions ?
3. Que tu n'as pas d'erreur PHP ?
4. Lorsque dans ton script PHP tu reset la variable de session regarde juste après ce qu'il y a dedans pour être sûr que la mise à jour se fait bien.

Pour finir dans la construction de ton lien, plutôt que de faire ton appel de fonction et de derrière faire ton windows.href.location, essaye de tout mettre dans une seule fonction JS (c'est de l'esthétique...)
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphanteau du PHP | 24 Messages

21 avr. 2011, 11:49

Bonjour et merci beaucoup de l'intérêt que tu portes à mon problème...

J'ai de fait effectué toutes les vérifications que tu m'as indiquées (sauf, dans mon lien, l'appel d'une seule fonction exécutant toutes les instructions) et je n'ai rien remarqué d'anormal. J'ai même fait un var_dump de $_SESSION['eve'] après la réaffectation
unset($_SESSION['eve']);//Car problème de mise à jour de la date dans la session

$_SESSION['eve'] = serialize($obj);  //Pour éviter les problèmes de date avec l'interface zones

var_dump($_SESSION['eve']);

et ma variable de date contenait bien la bonne valeur. Par contre, dans mon formulaire finale, ce n'était plus la bonne.

Eléphanteau du PHP | 24 Messages

21 avr. 2011, 12:30

Je viens de remarquer que le problème de date n'est pas systématique. De temps à autre, je modifie la date dans le premier formulaire, je me rends dans le second via le lien, je reviens dans le premier et la date est la date initiale et non la modifiée. Je refais alors la manoeuvre en re-modifiant la date et là, miracle, c'est OK. Donc, le problème est aléatoire, ce qui rend la chose encore plus complexe.

Eléphant du PHP | 92 Messages

21 avr. 2011, 14:21

A ce niveau d'utilisation y rarement (pour ne pas dire jamais...) de bug aléatoire...

Ca prouve juste qu'on a pas identifier l'origine du problème et que visiblement ton script ne fait pas la même chose dans les 2 cas.
Maintenant faut trouver pourquoi...

En général quand on a ce genre de problème c'est que le premier coup, la variable n'est pas définie alors il plante et quand tu refais la manip, la variable est maintenant bien définie (ben oui parce que la 1ere fois tu as certes planté mais PHP a bien initialisé la variable) et ça marche.

T'as bien des session_start() au bon endroit partout ?

Est ce que tu pourrais mettre tout le code de la page du zone.inc ?
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphanteau du PHP | 24 Messages

21 avr. 2011, 14:33

Encore merci pour ton aide, car je patauge grave...

J'ai bien un session_start() en début de chaque script, là où c'est nécessaire.

Voici, comme demandé, le code du fichier zones.inc :
<?php
@session_start();

if(is_string ($_SESSION['patient']))
 $pat = unserialize($_SESSION['patient']);
else
 $pat = $_SESSION['patient'];

list($jourNaiss, $moisNaiss, $anneeNaiss) = explode('/', $pat->getDdn());

$idEve = "";
$dateEve = "";
$richesseCopie = "";
$compRichesseCopie = "";
$tpsCop = "";
$percentile = "";
$richesseMemoire = "";
$compRichesseMemoire = "";
$tabDonneesTest = "";

if(!empty($_SESSION['eve']))
 {
  $eve = unserialize($_SESSION['eve']);
  $idPat = $eve->getIdPat();

  $tabDonneesTest = $eve->affEve();

  $idEve = $tabDonneesTest['id'];
  list($jourEve, $moisEve, $anneeEve) = explode('/', $eve->getDateEve());
  
  //var_dump($eve->getDateEve()) ;
  
  $richesseCopie = $tabDonneesTest['richesseCopie'];
  $compRichesseCopie = $tabDonneesTest['compRichesseCopie'];
  $tpsCop = $tabDonneesTest['tpsCop'];
  $percentile = $tabDonneesTest['percentile'];
  $richesseMemoire = $tabDonneesTest['richesseMemoire'];
  $compRichesseMemoire = $tabDonneesTest['compRichesseMemoire'];
 }


echo "\n   <div id='divAnneeAge' style='visibility : hidden;'>";

$pat->calcAge($jourEve, $moisEve, $anneeEve, 'A');

echo     "</div>
   <form name='enregZonesRey' method='post' action='javascript:enregiZonesRey();'>
    <center><a href='#' onclick=\"enregiZonesRey(); window.location.href='../interfaces/interface.php?fichier=../fichiersInclusion/rey/types.inc&titre=Figure de Rey&popup=1';\">Types</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href='#' onclick=\"enregiZonesRey(); window.location.href='../interfaces/interface.php?fichier=../fichiersInclusion/rey/zones.inc&titre=Figure de Rey&popup=1';\">Zones</a></center><br><br>
    <table id='tcontenu' border='1'>
	 <tr>
		<td id='tdcontenu' width='11%'>
		 <input type='hidden' name='idObj' id='idObj' value='$idEve'><input type='hidden' name='idPrinc' id='idPrinc' value='$idPrinc'>
		 ZONE
		</td>
		<td id='tdcontenu' width='11%'>COPIE</td>
		<td id='tdcontenu' width='11%'>MEMOIRE</td>
		<td id='tdcontenu' width='11%'>ZONE</td>
		<td id='tdcontenu' width='11%'>COPIE</td>
		<td id='tdcontenu' width='11%'>MEMOIRE</td>
		<td id='tdcontenu' width='11%'>ZONE</td>
		<td id='tdcontenu' width='11%'>COPIE</td>
		<td id='tdcontenu' width='11%'>MEMOIRE</td>
	 </tr>";
affZonesRey($tabDonneesTest);
echo"<tr>
		<td id='tdcontenu' colspan='2' align='left' style='border:0px;'>Richesse et exactitude à la copie :</td>
		<td id='tdcontenu' colspan='2' align='left' style='border:0px;'>
		 <div id='divExactCopie'>
		  <input type='texte' name='richesseCopie' id='richesseCopie' size='4' value='$richesseCopie' readonly onChange='majCompZones(this.value)'>
		 </div>
		</td>
		<td id='tdcontenu' style='border:0px;'>&nbsp;</td>
		<td id='tdcontenu' align='left' style='border:0px;'>Comparatif à la norme :</td>
		<td id='tdcontenu' colspan='3' align='left' style='border:0px;'>
		 <div id='divCompExactCopie'>
		  <input type='texte' name='compRichesseCopie' id='compRichesseCopie' size='35' value='$compRichesseCopie' readonly>
		 </div>
		</td>
	 </tr>
	 <tr>
		<td id='tdcontenu' colspan='2' align='left' style='border:0px;'>Temps à la copie :</td>
		<td id='tdcontenu' colspan='2' align='left' style='border:0px;'>
		 <input type='texte' name='tpsCop' id='tpsCop' size='4' value='$tpsCop' onChange='majPercTps();'>
		</td>
		<td id='tdcontenu' style='border:0px;'>&nbsp;</td>
		<td id='tdcontenu' align='left' style='border:0px;'>Percentile :</td>
		<td id='tdcontenu' colspan='3' align='left' style='border:0px;'>
		 <div id='divPercTempsCopie'>
		  <input type='texte' name='percentile' id='percentile' size='35' value='$percentile' readonly>
		 </div>
		</td>
	 </tr>
	 <tr>
		<td id='tdcontenu' colspan='2' align='left' style='border:0px;'>Richesse et exact. à la repr. de mémoire :</td>
		<td id='tdcontenu' colspan='2' align='left' style='border:0px;'>
		 <div id='divExactMem'>
		   <input type='texte' name='richesseMemoire' id='richesseMemoire' size='4' value='$richesseMemoire' readonly>
		 </div>
		</td>
		<td id='tdcontenu' style='border:0px;'>&nbsp;</td>
		<td id='tdcontenu' align='left' style='border:0px;'>Comparatif à la norme :</td>
		<td id='tdcontenu' colspan='3' align='left' style='border:0px;'>
		 <div id='divCompExactMem'>
		  <input type='texte' name='compRichesseMemoire' id='compRichesseMemoire' size='35' value='$compRichesseMemoire' readonly>
		 </div>
		</td>
	 </tr>
	 <tr>
		<td id='tdcontenu' colspan='9' style='border:0px;'>
		 <br><br><input type='submit' tabindex='16' value='Enregistrer'>
		</td>
	 </tr>
    </table>
   </form>
   <div id='erreur' align='center'>
   </div>";
?>

Eléphant du PHP | 92 Messages

21 avr. 2011, 14:48

Alors,

Je te passes les if() sans accolades ;) (mais c'est vraiment pas une bonne pratique)
Mais le @ devant le session_start()... il faut que tu l'enlèves au moins pendant le debuggage parce que sinon on est pas près de voir les erreurs d'init de session qui pourraient bien être à l'origine de ton problème.
Si tu veux éviter les warning sur les session_start() successif tu peux faire ça proprement avec :
if(strlen(session_id()) == 0){
  session_start();
}
Donc enlève tes @ devant les session_start(), refait tes tests et vérifie que tu n'as pas d'erreur.
Mais en tout cas dans ce fichier tu ne fais rien de farfelu qui pourrait causer le problème.

Est ce que tu pourrais poster le "enregiTypesRey.php" ?
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphant du PHP | 92 Messages

21 avr. 2011, 15:04

Alors on va essayer un truc :
Dans ton fichier "enregiTypesRey.php", juste après l'assignation de la variable de session, tu mets :
session_write_close();

Et regarde si ça corrige le problème...
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphanteau du PHP | 24 Messages

21 avr. 2011, 15:07

Re,

Concernant les accolades, c'est une habitude que j'ai prise pour me rendre immédiatement compte que je n'ai qu'une instruction dans mon bloc.

Par contre, de fait, j'ai bien eu des warnings dûs à des session_start() successifs, mais la solution que tu me proposes me semble plus propre. Je vais l'adopter.

Comme demandé, voici le code du fichier "enregiTypesRey.php" :
<?php

@session_start();
include_once("../../fichiersInclusion/classes.php");

$obj = unserialize($_SESSION['eve']);

foreach($_POST as $key=>$value)
 {
  if(trim($value) == '')
   $_POST[$key] = NULL;
 }

$tab['id'] = $_POST['id'];
$tab['idObj'] = $_POST['idPrinc'];
$tab['dateEve'] = $_POST['anneeEve'] . "-" . $_POST['moisEve'] . "-" . $_POST['jourEve'];

$obj->setDateEve($tab['dateEve']); //Pour éviter les problèmes de date avec l'interface zones

if(!empty($_POST['typeCopie']))
 $tab['typeCopie'] = $_POST['typeCopie'];
else
 $tab['typeCopie'] = null; 
 
if(!empty($_POST['percCopie']))
 $tab['percCopie'] = $_POST['percCopie'];
else
 $tab['percCopie'] = " "; 

if(!empty($_POST['typeRepr']))
 $tab['typeRepr'] = $_POST['typeRepr'];
else
 $tab['typeRepr'] = null; 
 
if(!empty($_POST['percRepr']))
 $tab['percRepr'] = $_POST['percRepr'];
else
 $tab['percRepr'] = " "; 

echo $obj->enregEve($tab, 'types');

unset($_SESSION['eve']);//Car problème de mise à jour de la date dans la session

$_SESSION['eve'] = serialize($obj);  //Pour éviter les problèmes de date avec l'interface zones
?>
Je vais maintenant supprimer mes @ et tester.

Eléphant du PHP | 92 Messages

21 avr. 2011, 15:15

T'as pas vu mon édit ^^

Après l'assignation (donc après $_SESSION['eve'] = serialize($obj); //Pour éviter les problèmes de date avec l'interface zones)
Rajoute session_write_close();
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphanteau du PHP | 24 Messages

21 avr. 2011, 15:20

Je viens d'ajouter l'instruction que tu m'as transmise (je ne la connaissais pas) :
unset($_SESSION['eve']);//Car problème de mise à jour de la date dans la session

$_SESSION['eve'] = serialize($obj);  //Pour éviter les problèmes de date avec l'interface zones  

session_write_close();
J'ai supprimé les @ devant mes session_start() et j'ai testé. A part les warnings
"Notice: A session had already been started - ignoring session_start() in C:\wamp\www\sites hors drupal\psy\fichiersInclusion\rey\types.inc on line 2" et
"Notice: A session had already been started - ignoring session_start() in C:\wamp\www\sites hors drupal\psy\fichiersInclusion\rey\zones.inc on line 2"
rien de neuf. Cette fois-ci, j'ai même dû m'y reprendre à trois ou quatre fois (aller-retour d'une page à l'autre avec modification de la date à chaque fois) pour que la date soit modifiée.

Eléphant du PHP | 92 Messages

21 avr. 2011, 15:41

Ok,

Met la protection contre les warnings.
Et refait un test comme ça.
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphanteau du PHP | 24 Messages

21 avr. 2011, 15:45

Re,

J'ai appliqué la méthode que tu m'avais proposée en remplaçant les @session_start() par
if(strlen(session_id()) == 0)
 session_start();
mais ça ne m'a rien changé.

Eléphant du PHP | 92 Messages

21 avr. 2011, 15:55

Ok,

J'ai vu qu'il y avait un include dans le fichier, y a quoi là-dedans ?
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphant du PHP | 92 Messages

21 avr. 2011, 15:59

Juste une question,

Comment est ce que tu fais pour vérifier que la date dans le formulaire est toujours l'ancienne ?
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...