Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2010, 00h41   #1
Invité de passage
 
Inscription : octobre 2009
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 6
Points : 2
Points : 2
Par défaut unset à effet rétroactif

Bonjour à tous.

Je vais aller droit au but, voici un morceau de code qui déconne :

Code :
1
2
3
4
 
var_dump($_SESSION);
unset($_SESSION['error']);
var_dump($_SESSION);
Normalement, le premier var_dump m'affiche les deux objets que j'ai stocké en session : mon user et mon message d'erreur.
Ensuite, je supprime le message d'erreur des sessions avec un simple unset.
J'affiche à nouveau, et là il est censé m'avoir viré le truc error de la session.
PHP ne l'entend pas de cette oreille
Deux cas de figure :
- si le unset est présent, le premier var_dump m'affiche directement qu'un seul objet (juste le user, le error a disparu), pareil pour le deuxieme
- si je vire le unset, les deux var_dump fonctionnent normalement et m'affichent les deux objets

Je suis en PHP objet, et ce probleme est juste incompréhensible
Comment le unset peut faire en sorte d'agir avant le premier var_dump ??

J'espère que vous pourrez m'aider, merci d'avance pour vos réponses
JbWillGetYou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 07h38   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 702
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 702
Points : 3 271
Points : 3 271
Salut

Faudrait voir au moins dans les grandes lignes comment cet élément "error" et l'Objet dont il est question est implémenté, car ça dépend.

Mais de mon coté, et pour ce qui est de la gestion des messages de retours à l'utilisateur je fais comme ceci :
Code :
1
2
 
$_SESSION['message'] = array();
Donc je ne détruit pas cet élément, je le vide uniquement.

En faite, il faudrait voir s'il est vraiment utile, voir même souhaitable, de le détruire ou juste détruire ce qu'il contient.
Disons que l'Objet Error (son instance) et l'élément (error) de la session sont théoriquement une même référence, le détruire peu causer problème.
Enfin, faut voir.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 10h54   #3
Invité de passage
 
Inscription : octobre 2009
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 6
Points : 2
Points : 2
En fait le plus étonnant, c'est que ce n'est pas spécifique au unset mais si je fais un $_SESSION['error'] = "lol" entre les deux var_dump, les deux var_dump retourneront la même valeur

Par contre, je me suis mal exprimé : $_SESSION['error'] ne contient pas un objet mais juste une chaine de caractères, alors que l'autre ($_SESSION['user']) contient bien l'instance de l'objet User.

L'erreur peut-elle venir du fait que juste après l'affectation de mon $_SESSION['error'] je fais une redirection avec un header(Location:...) ?
JbWillGetYou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 14h59   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 702
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 702
Points : 3 271
Points : 3 271
Citation:
L'erreur peut-elle venir du fait que juste après l'affectation de mon $_SESSION['error'] je fais une redirection avec un header(Location:...) ?
Oui et non.
Disons qu'il est normal de voir (page suivante) la valeur affectée à la page précédente, donc après la redirection.


Lorsque tu fais du débug comme ça, je te conseil de mettre un point d'arrêt, sinon, les header() ça peu être piégeant effectivement.

De plus, quand il s'agit de données en session, il faut vérifier en 1er les données dès le démarrage de la session (session_star()), car on ne sait jamais s'il y a un code par là qui les modifieraient en cours de route.
Après, on peu toujours "pister" une données tout au long de son script pour voir si ça évolue comme prévu.
Bref ... du débug quoi

Exemple :
Code :
1
2
3
4
5
6
7
8
9
 
session_start();
 
var_dump($_SESSION);
unset($_SESSION['error']); // Ou -> $_SESSION['error'] = array();
var_dump($_SESSION);
 
// Avant le header
exit(); // Point d'arrêt (le script s'arrêtera à cette ligne)
Sans plus d'explications et code ne serait ce que les principes, on ne pourra pas te dire si c'est correcte ou pas, et encore d'où viendrait l'erreur.

Ces 2 données en session "user" et "error" ont très certainement une gestion différente :
- Pour le user, théoriquement le seul moment où il doit être détruit c'est si tu as une page de déconnexion (comme là haut sur ce forum).

- Pour le error, il devrait être tout le temps ré-initialisé ou détruit à chaque page, tout ça pour éviter que le message persiste de page en page.


C'est ça qu'il faut voir non ?
Bref, comment as tu prévu de gérer ça.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 15h16   #5
Invité de passage
 
Inscription : octobre 2009
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 6
Points : 2
Points : 2
C'est exactement ca oui, d'ailleurs je viens de trouver un élément de réponse.
En fait, le problème survient lorsque j'effectue le unset dans ma classe Page (qui a pour but d'afficher le header du site, le menu, et le footer).
Je mets ce traitement dans mon instance de page car je souhaite qu'à chaque chargement de la page, il vérifie s'il y a une erreur, auquel cas il va m'afficher un message d'erreur, puis supprimer l'erreur (comme tu l'as dit, pour qu'elle ne s'affiche plus sur les pages suivantes).

Je vais essayer de débugger ca dans mon coin, et si je ne trouve pas le probleme, je posterai le code de ma classe page.

Ce comportement est tout de même assez étonnant.

PS : avec le point d'arret, même fonctionnement : sans unset, error est logiquement présent dans les 2, avec point d'arret, error n'existe plus les 2
JbWillGetYou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 15h48   #6
Invité de passage
 
Inscription : octobre 2009
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 6
Points : 2
Points : 2
Bon, après quasi 24h de recherches, j'ai enfin résolu ce problème
Le problème était, comme prévu, tout con : après mon header(Location ...) je n'avais pas mis de exit();
Eh oui, du coup le reste de la page a du etre parcouru avant de faire la redirection, ce qui implique le unset du error, c'est pourquoi une fois arrivé sur ma page de destination, le unset avait déjà été fait.

Ahhhh... le programmation et ses vices
JbWillGetYou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h58.


 
 
 
 
Partenaires

Hébergement Web