IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

unset à effet rétroactif [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut unset à effet rétroactif
    Bonjour à tous.

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    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:...) ?

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    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

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Flux RSS : effet rétroactif ?
    Par jibileg dans le forum SharePoint
    Réponses: 3
    Dernier message: 17/03/2009, 10h57
  2. Non distribution participation en entreprise - effet rétroactif
    Par argan dans le forum Droit du travail
    Réponses: 10
    Dernier message: 25/09/2006, 14h37
  3. Sans effet: StringGrid1->Cells[1][1][2] = c ?
    Par Xavier dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/11/2002, 10h32
  4. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  5. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo