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($_SESSION['foo']) est effectué en dehors de son scope! [PHP 5.5]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Unset($_SESSION['foo']) est effectué en dehors de son scope!
    Bonjour,

    Je n'arrive pas a comprendre pourquoi le unset($_SESSION['flash']) détruit ma variable $_SESSION['flash'] avant même d'avoir appelé la fonction getFlashes() .
    merci pour votre aide

    Voici mon header.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    code de base du starter template dans les exemples bootstrap
    .....
     
    <div class="container">
     
     
    <?php 
    $session_instance = Session::getInstance();
        echo "<pre>";
          var_dump($_SESSION);
          echo "</pre>";
    if($session_instance->hasFlashes()){ // si il y a une variable de $_SESSION['flash'] d'enregistrer alors 
        foreach( $session_instance->getFlashes() as $type=>$message){ // il récupère les infos 
            echo "<div class='alert alert-$type'>$message</div>"; // et les affiche dans une div
        }
      } 
    ?>
    Sur ma page register.php

    il y a bien sur le formulaire et des des appel aux fonctions de vérification puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if($validator->isValid()){ ///une fois que tous les champs sont validé
     
                App::getAuth()->register($db, $_POST['username'], $_POST['password'], $_POST['email'] ); //enregistre dans la DB
                Session::getInstance()->setFlash('success', "Votre compte a été créé. Un email de confirmation vous a été envoyé pour valider votre compte"); //ajoute à la variable session un truc du style : $_SESSION['flash']['success'] ='......message.....";
                Redirect::pages('login'); // redirige sur la page login
     
    }else{
                $errors = $validator->getErrors(); // si tous les champs ne sont pas valide, il affiche les erreurs
    }
    Pour finir ma Session :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <?php 
    namespace Core;
     
    class Session{
        static $_instance;
     
        public static function getInstance(){ 
            if(!self::$_instance){ //si elle n'existe pas elle la créer
                self::$_instance = new Session; 
            }
            return self::$_instance;  // renvois l' instance de Session
        }
        public function __construct(){
            session_start();
        }
        public function setFlash($statut, $message){ 
            $_SESSION['flash'][$statut] = $message;
        }
        public function hasFlashes(){
            return isset($_SESSION['flash']);
        }
        public function getFlashes(){
            $flash = $this->read('flash');
            unset($_SESSION['flash']); // Mon problème se trouve là , unset() efface  les infos dans 'flash' avant même que getFlashes() ne soit appelé donc avant même:calim2: que le unset() ne soit appelé!!!
            return $flash;
        }
        public function read($key){
            return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
        }
        public function write($key, $value){
            $_SESSION[$key] = $value;
        }
        public function delete($key){
            unset($_SESSION[$key]);
        }
    }
    Nom : Screenshot - 30052016 - 15:25:27.png
Affichages : 273
Taille : 31,7 Ko

    comme vous pouvez le voir je fais un var_dump avant l'appel de getFlashes() et pourtant $_SESSION['flash'] n'apparait pas et si je commente le unset() dans le fichier Session.php tout se passe bien le message s'affiche MAIS le message reste, vu qu'il n'est plus détruit

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il est possible que ta page soit appelée deux fois : une fois en aveugle dans laquelle la variable est affichée puis détruite, puis une fois visible dans laquelle la variable a donc déjà été détruite.

    Cela arrive par exemple quand une URL est mal écrite dans un CSS.
    Contrôle tes logs Apache.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    je viens de regarder et à priori il n’appel le fichier register.php qu'une seule fois
    mais je n'ai pas les appels aux fichiers de class comment je peux avoir le log de ces appels?
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    192.168.1.91 - - [30/May/2016:17:07:20 +0200] "POST /POO_mariage/index.php?p=register HTTP/1.1" 302 1666 "http://192.168.1.92/POO_mariage/index.php?p=register" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:24 +0200] "GET /POO_mariage/index.php?p=login HTTP/1.1" 200 1498 "http://192.168.1.92/POO_mariage/index.php?p=register" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /POO_mariage/vendor/css/bootstrap.min.css HTTP/1.1" 304 - "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /POO_mariage/css/styles.css HTTP/1.1" 304 - "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/bootstrap.min.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /POO_mariage/vendor/css/ie10-viewport-bug-workaround.css HTTP/1.1" 304 - "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/jquery.min.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/holder.min.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/ie10-viewport-bug-workaround.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/jquery.min.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/bootstrap.min.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/holder.min.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
    192.168.1.91 - - [30/May/2016:17:07:25 +0200] "GET /vendor/js/ie10-viewport-bug-workaround.js HTTP/1.1" 404 299 "http://192.168.1.92/POO_mariage/index.php?p=login" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que si tu utilises uniquement le code que tu nous as donné tu arrives à reproduire le problème ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    en faisant le ménage des classes pas forcement utiles pour cette partie et donc en ayant juste la class Session (Session.php), la page d'inscription (index.php) et la page de redirection (login.php), il se passe exactement la même chose

    Session.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?php 
     
    class Session{
        static $_instance;
     
        public static function getInstance(){
            if(!self::$_instance){
                self::$_instance = new Session;
            }
            return self::$_instance;
        }
        public function __construct(){
            session_start();
        }
        public function setFlash($statut, $message){
            $_SESSION['flash'][$statut] = $message;
        }
        public function hasFlashes(){
            return isset($_SESSION['flash']);
        }
        public function getFlashes(){
     
     
            $flash = $this->read('flash');
         //unset($_SESSION['flash']);
            return $flash;
        }
        public function read($key){
            return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
        }
        public function write($key, $value){
            $_SESSION[$key] = $value;
        }
        public function delete($key){
            unset($_SESSION[$key]);
        }
    }
    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    <?php 
     
        require 'Session.php';
     
     
     
     
        if(isset($_POST) && !empty($_POST)){
     
                Session::getInstance()->setFlash('success', "Votre compte a été créé. Un email de confirmation vous a été envoyé pour valider votre compte");
                header("Location: login.php");
    }
     
    ?>
    <!DOCTYPE html>
    <html lang="fr">
        <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
            <meta name="description" content="">
            <meta name="author" content="">
            <link rel="icon" href="../../favicon.ico">
     
            <title>Laure & Mickaël 2017</title>
     
            <!-- Bootstrap core CSS -->
            <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"  rel="stylesheet">
     
        </head>
        <body>
    <!-- NAVBAR================================ -->
    <div class="navbar-wrapper">
          <div class="container">
            <nav class="navbar navbar-inverse navbar-static-top">
              <div class="container">
                <div class="navbar-header">
                  <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                  </button>
                  <a class="navbar-brand" href="#">Laure & Mickaël 2017</a>
                </div>
                <div id="navbar" class="navbar-collapse collapse">
                  <ul class="nav navbar-nav pull-right">
                    <li class="active"><a href="index.php?p=home">Home</a></li>
                    <li><a href="index.php?p=register">S'inscrire</a></li>
                    <li><a href="index.php?p=login">Se connecter</a></li>
                    <li><a href="index.php?p=contact">Nous contacter</a></li>
                </ul>
                </div>
              </div>
            </nav>
     
          </div>
        </div>
     
    <div class="container">
     
     
    <?php 
    $session_instance = Session::getInstance();
    if($session_instance->hasFlashes()){
        foreach( $session_instance->getFlashes() as $type=>$message){
            echo "<div class='alert alert-$type'>$message</div>";
        }
      } 
    ?>
     
    <?php if(!empty($errors)) : ?>
        <div class="alert alert-danger">
            <p>Vous n'avez pas rempli le formulaire correctement</p>
            <ul>
                <?php foreach ($errors as $error): ?>
                    <li><?= $error ;?></li>
                <?php endforeach;?>
            </ul>
        </div>
    <?php endif; ?>
     
    <form action="" method="POST">
    <input type="text" name="username" placeholder = "username">
    <input type="text" name="email" placeholder = "email">
    <input type="text" name="password" placeholder = "password">
    <input type="text" name="confirm_password" placeholder = "confirm_password">
    <button type="submit">Envoyer</button>
     
     
    </form>
     
     
     
     
     
    </div><!-- /.container -->
       <!-- FOOTER -->
          <footer class="footer"> 
     
          </footer>
     
     
      </body>
    </html>
    login.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="description" content="">
        <meta name="author" content="">
        <title>Document</title>
       <!-- Bootstrap core CSS -->
            <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"  rel="stylesheet">
    </head>
    <body>
    <?php 
    require 'Session.php';
    $session_instance = Session::getInstance();
    if($session_instance->hasFlashes()){
        foreach( $session_instance->getFlashes() as $type=>$message){
            echo "<div class='alert alert-$type'>$message</div>";
        }
      } 
     
    var_dump($_SESSION);
    ?>
     
    hello login
     
    </body>
    </html>

  6. #6
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    J'ai commenté la ligne unset($_SESSION['flash']) dans la fonction getFlashes() et donc si tu reviens sur index.php le message est toujours affiché.
    Mais quand on la décommente cette ligne ca marche pas.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Mets toujours un arrêt après tes redirections :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    header("Location: login.php");
    exit();
    Le code écrit après la redirection est exécuté dans ta page index, y compris le getFlashes() de la ligne 68 qui supprime la variable de session.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Futur Membre du Club
    Homme Profil pro
    autre
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Sabotage, un énorme MERCI.

    Et pourtant je le savais mais comme souvent une erreur bête qui fait perdre énormément de temps!
    Je n'ai et n'aurais certainement pas regardé à cet endroit du code!

    Encore un grand merci pour ton aide!

    Problème résolu!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/02/2013, 10h39
  2. [PDO] Savoir si un update est effectué
    Par sliderman dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/05/2008, 11h59
  3. Réponses: 4
    Dernier message: 08/04/2007, 15h57
  4. Réponses: 5
    Dernier message: 06/04/2007, 12h28
  5. [FORMS] quel traitement est effectué
    Par Nounoursonne dans le forum Forms
    Réponses: 11
    Dernier message: 22/09/2006, 17h39

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