Code php "SESSION UTILISATEUR" ne fonctionne pas

Résolu
Bonjour, j'ai un problème avec mon code php qui ne fonctionne pas.

<?php

    try
    {
        $db = new PDO('mysql:host=localhost; dbname=web','root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }

    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }

    if(isset($_POST['login']) && isset($_POST['password']))
    {
        $name;
        $query = $db->prepare('SELECT * FROM admin WHERE login = :login AND password = :password');
        $query->execute(array(
            'login' => $_POST['login'],
            'password' => $_POST['password']));

        $return = $query->fetch();

        if ($_POST['password'] == $return['password'])
        {
            session_start();

            $_SESSION['id'] = $return['id'];
            $_SESSION['login'] = $return['login'];
            $_SESSION['name'] = $return['name'];
        }

        else {
            echo 'mot d passe incorrect';
        }
    }
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width" />
        <link rel="stylesheet" type="text/css" href="style/style.css" />
        <title>Portfolio Avner</title>
     <script src="js/jquery.min.js"></script>
        <script src="js/jquery.sticky.js"></script>
        <script>
            $(window).load(function(){
              $("nav").sticky({ topSpacing: 0 });
            });
        </script>
    </head>
    <body>
        <?php include ('block/header.php'); ?>
        <!-- CONTENU DYNAMIQUE DE LA PAGE -->
        <div id="contenu">
            <?php include ('block/login.php'); ?>
            <div id="corps">
            <?php include ('block/articles.php'); ?>
            </div>
        <!-- FIN DU CONTENU DYNAMIQUE DE LA PAGE -->
        </div>
        <!-- FOOTER -->
        <div class="space"></div>
        <?php include ('block/footer.php'); ?>
    </body>
</html>


<aside>
    <form method="post" action="">
        <fieldset>
            <legend> Interface Admin </legend>
<?php

if (isset($_SESSION['id']) AND !isset($_SESSION['name']))
{
    echo '<p>Bienvenue <span style="color: rgb(0, 117, 255);">' . $_SESSION['name'] . '</span> !</p>
    <p>-> <a href="index.php?logout=0" style="color: rgb(255, 99, 0);">Déconnexion</a> <-</p>';
}

else
{
?>

    <label for="login">Identifiant</label> : <input type="text" name="login" id="login" placeholder="Identifiant" required />
    <br /><br />
    <label for="pass">Mot de Passe</label> : <input type="password" name="password" id="pass" placeholder="Password" required /><br /><br />
    <input type="submit" value="Connexion" id="submit" />

<?php
}
?>
        </fieldset>
    </form>
</aside>


Merci d'avance.

2 réponses

  1. Modérateur
    Bonjour
    Tu as bien mis un
    session_start(); dans chaque fichier ?
    1. Modérateur
      Et ton if me paraît bizarre...
      if(isset($_SESSION['id']) AND !isset($_SESSION['name']))  


      NOT isset name ? Tu es sûr... ?
    2. J'ai corrigé un peu le code j'ai essayé ça mais j'ai un problème de mot de passe non reconnu.

      else
      {
          $login = $_POST['login'];
          $pass = $_POST['password'];
          $query = $db->prepare('SELECT * FROM admin WHERE login = :login AND password = :password');
          $query->execute(array(
              'login' => $login,
              'password' => $pass));
          $return = $query->fetch();
      
          $isPasswordCorrect = password_verify($pass, $return['password']);
      
          if (!$return)
          {
              echo 'Pas de résultat !';
          }
      
          else
          {
              if ($isPasswordCorrect == TRUE)
              {
                  session_start();
                  $_SESSION['id'] = $return['id'];
                  $_SESSION['name'] = $return['name'];
                  $_SESSION['login'] = $_POST['login'];
                  echo 'Vous êtes connecté !';
              }
      
              else
              {
                  echo 'Mot de passe incorrect !';
              }
          }
      }
      
    3. Modérateur
      Dans ton where tu ne dois pas avoir le password vu que tu le fais en password_verify ensuite
    4. J'ai encore bien modifié et arrangé mon code.
      La session fonctionne mais le nom d'utilisateur ne s'affiche pas.


      <?php

      if (!isset($_POST['login']) && !isset($_POST['password']))
      {
      if (isset($_SESSION['name']) AND isset($_SESSION['login']))
      {
      ?>
      <aside>
      <form method="get" action="">
      <fieldset>
      <legend> Interface Admin </legend>

      <p>Bienvenue <span style="color: rgb(0, 117, 255);"> <?php $_SESSION['name']; ?> </span>!</p>
      <p>-> <a href="?logout" name="logout" style="color: rgb(255, 99, 0);">Déconnexion</a> <-</p>
      <?php
      }

      else
      {
      ?>
      <aside>
      <form method="post" action="">
      <fieldset>
      <legend> Interface Admin </legend>

      <label for="login">Identifiant</label> : <input type="text" name="login" id="login" placeholder="Identifiant" required />
      <br /><br />
      <label for="pass">Mot de Passe</label> : <input type="password" name="password" id="pass" placeholder="Password" required /><br /><br />
      <input type="submit" value="Connexion" id="submit" />
      <?php
      }
      }

      else
      {
      $login = $_POST['login'];
      $pass = $_POST['password'];
      $query = $db->query('SELECT * FROM admin');

      while($return = $query->fetch())
      {
      if ($login == $return['login'] AND $_POST['password'] == $return['password'])
      {
      session_start();
      $_SESSION['name'] = $return['name'];
      $_SESSION['login'] = $_POST['login'];
      ?>
      <aside>
      <form method="get" action="">
      <fieldset>
      <legend> Interface Admin </legend>

      <p>Bienvenue <span style="color: rgb(0, 117, 255);"> <?php $_SESSION['name']; ?> </span>!</p>
      <p>-> <a href="?logout" name="logout" style="color: rgb(255, 99, 0);">Déconnexion</a> <-</p>
      <?php
      }

      else
      {
      ?>
      <aside>
      <form method="get" action="">
      <fieldset>
      <legend> Interface Admin </legend>
      <span style="color: rgb(0, 117, 255);">Mot de passe incorrect !</span>
      <?php
      }
      }
      }
      ?>
      </fieldset>
      </form>
      </aside>
    5. Modérateur
      session_start ?
  2. Modérateur
    Ton code est sacrément bordelique... :-)
    Tu répètes plusieurs fois les mêmes bouts de code...
    On ne sait plus où on se trouve ni à quoi ils servent...

    Je te propose un truc du genre :
      <?php
      //démarrage des sessions
      session_start();
    
      //Affichage des erreurs PHP
      error_reporting(E_ALL);
      ini_set('display_errors', TRUE);
      ini_set('display_startup_errors', TRUE);
    
      //récupération PROPRE des variables AVANT de les utiliser !
      $name = !empty($_SESSION['name']) ? $_SESSION['name'] : NULL;
      $login = !empty($_POST['login']) ? $_POST['login'] : NULL;
      $password = !empty($_POST['password']) ? $_POST['password'] : NULL;
      $logout = !empty($_GET['logout']) && $_GET['logout']==true ? $_GET['logout'] : NULL;
      
      //je te laisse compléter le traitement du logout si nécéssaire...
      if($logout){
        session_destroy();
        //...
      }
    
      //---------------------------//
      //début du traitement
      //---------------------------//
    
       if($name){
         //si utilisateur déjà logué.. include de la page welcome and logout
         ?>
         <aside>
          <fieldset>
            <legend> Interface Admin </legend>
            <p>Bienvenue <span style="color: rgb(0, 117, 255);"> <?php echo $name; ?> </span>!</p>
            <p>-> <a href="?logout=true" name="logout" style="color: rgb(255, 99, 0);">Déconnexion</a> <-</p>
          </fieldset>
     
        <?php 
       }else{
         //sinon.. affichage gestion de la connexion si un login et un password sont envoyés en POST...
         if($login && $password){
           //on prépare les données de la requête
           $datas = array('login' => $login);
           $sql = 'SELECT * FROM admin WHERE login = :login';
           //on place CHAQUE requête dans un bloc TRY/CATCH pour trapper les éventuelles erreurs !
           try{
             $query = $db->prepare($sql);
             $query->execute($datas);
             $return = $query->fetch();
           }catch(Exception $e){
             echo "Erreur dans la requête " . $sql . " <br> Erreur : ". $e->getMessage();
           }
           $userExist = !empty($return) ? true : false;  
           if($userExist){
            $isPasswordCorrect = password_verify($password, $return['password']);
            if($isPasswordCorrect){
              //utilisateur authentifié.. on rempli les variables de session
              $_SESSION['name'] = !empty($return['name']) ? $return['name'] : NULL;
              $_SESSION['id'] = !empty($return['id']) ? $return['id'] : NULL;
              $_SESSION['login'] = !empty($return['login']) ? $return['login'] : NULL;
              
            }else{
              //Mauvais password !
              // tu peux mettre un message si tu le souhaites
              //...
              echo "<span style="color: rgb(0, 117, 255);">Mot de passe incorrect !</span>";
            }
           }else{
            //user inconnu !
            // tu peux mettre un message si tu le souhaites
            //...
            echo "<span style="color: rgb(0, 117, 255);">Utilisateur inconnu !</span>";
           }
         }
        ?>
        <!-- Connexion admin -->
         <form method="post" action="">
            <fieldset>
              <legend> Interface Admin </legend>
              <label for="login">Identifiant</label> : <input type="text" name="login" id="login" placeholder="Identifiant" required />
              <br /><br />
              <label for="pass">Mot de Passe</label> : <input type="password" name="password" id="pass" placeholder="Password" required /><br /><br />
              <input type="submit" value="Connexion" id="submit" name="submit" />
            </fieldset>
         </form>
      <?php
      }
      ?>
            
      </aside>
    


    NB: Tu noteras que je te mets le code avec la coloration syntaxique... (la couleur...)
    C'est quand même plus lisible....
    Il serait temps que tu le fasses aussi !
    Infos ici: https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

    Il serait bien aussi que tu lises (et appliques ) le contenu des deux liens suivants :
    https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
    https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
    1. Merci pour l'aide. Ton code par contre me renvoie une erreur au niveau des guillemets.

            }else{
              //Mauvais password !
              // tu peux mettre un message si tu le souhaites
              //...
              echo "<span style="color: rgb(0, 117, 255);">Mot de passe incorrect !</span>";
            }
           }else{
            //user inconnu !
            // tu peux mettre un message si tu le souhaites
            //...
            echo "<span style="color: rgb(0, 117, 255);">Utilisateur inconnu !</span>";
           }
      


      J'ai donc arrangé:

            }else{
              //Mauvais password !
              // tu peux mettre un message si tu le souhaites
              //...
              echo '<span style="color: rgb(0, 117, 255);">Mot de passe incorrect !</span>';
            }
           }else{
            //user inconnu !
            // tu peux mettre un message si tu le souhaites
            //...
            echo '<span style="color: rgb(0, 117, 255);">Utilisateur inconnu !</span>';
           }
      


      Il reste tout de même l'erreur:
      Notice: Undefined index: name in /Applications/MAMP/htdocs/test.php on line 43
      .

          <fieldset>
            <legend> Interface Admin </legend>
            <p>Bienvenue <span style="color: rgb(0, 117, 255);"> <?php echo $_SESSION['name']; ?> </span>!</p>
            <p>-> <a href="?logout=true" name="logout" style="color: rgb(255, 99, 0);">Déconnexion</a> <-</p>
          </fieldset>
    2. Modérateur
      Ça n'est pas dans le code que je t'ai donné...
      Et si tu as lu les liens... Récupère proprement les variables AVANT de les utiliser
    3. Le seul problème est le mot de passe considéré comme incorrect.

      C'est à dire je rentre les bonnes coordonnées mais la session ne s'ouvre pas.
      J'ai une réponse: mot de passe incorrect.

      <?php
      
      try
      {
          $db = new PDO('mysql:host=localhost; dbname=web','root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
      }
      
      catch(Exception $e)
      {
          die('Erreur : '.$e->getMessage());
      }
      
      //démarrage des sessions
      session_start();
      
      //Affichage des erreurs PHP
      error_reporting(E_ALL);
      ini_set('display_errors', TRUE);
      ini_set('display_startup_errors', TRUE);
      
      //récupération PROPRE des variables AVANT de les utiliser !
      $name = !empty($_SESSION['name']) ? $_SESSION['name'] : NULL;
      $login = !empty($_POST['login']) ? $_POST['login'] : NULL;
      $password = !empty($_POST['password']) ? $_POST['password'] : NULL;
      $logout = !empty($_GET['logout']) && $_GET['logout']==true ? $_GET['logout'] : NULL;
      
      //je te laisse compléter le traitement du logout si nécéssaire...
      if($logout){
        session_destroy();
        //...
      }
      
      //---------------------------//
      //début du traitement
      //---------------------------//
      
       if($name){
         //si utilisateur déjà logué.. include de la page welcome and logout
         ?>
         <aside>
          <fieldset>
            <legend> Interface Admin </legend>
            <p>Bienvenue <span style="color: rgb(0, 117, 255);"> <?php echo $name; ?> </span>!</p>
            <p>-> <a href="?logout=true" style="color: rgb(255, 99, 0);">Déconnexion</a> <-</p>
          </fieldset>
      
        <?php
       }else{
         //sinon.. affichage gestion de la connexion si un login et un password sont envoyés en POST...
         if($login && $password){
           //on prépare les données de la requête
           $datas = array('login' => $login);
           $sql = 'SELECT * FROM admin WHERE login = :login';
           //on place CHAQUE requête dans un bloc TRY/CATCH pour trapper les éventuelles erreurs !
           try{
             $query = $db->prepare($sql);
             $query->execute($datas);
             $return = $query->fetch();
           }catch(Exception $e){
             echo "Erreur dans la requête " . $sql . " <br> Erreur : ". $e->getMessage();
           }
           $userExist = !empty($return) ? true : false;
           if($userExist){
            $isPasswordCorrect = password_verify($password, $return['password']);
            if($isPasswordCorrect){
              //utilisateur authentifié.. on rempli les variables de session
              $_SESSION['name'] = !empty($return['name']) ? $return['name'] : NULL;
              $_SESSION['id'] = !empty($return['id']) ? $return['id'] : NULL;
              $_SESSION['login'] = !empty($return['login']) ? $return['login'] : NULL;
      
            }else{
              //Mauvais password !
              // tu peux mettre un message si tu le souhaites
              //...
              echo '<span style="color: rgb(0, 117, 255);">Mot de passe incorrect !</span>';
            }
           }else{
            //user inconnu !
            // tu peux mettre un message si tu le souhaites
            //...
            echo '<span style="color: rgb(0, 117, 255);">Utilisateur inconnu !</span>';
           }
         }
        ?>
        <!-- Connexion admin -->
         <form method="post" action="">
            <fieldset>
              <legend> Interface Admin </legend>
              <label for="login">Identifiant</label> : <input type="text" name="login" id="login" placeholder="Identifiant" required />
              <br /><br />
              <label for="pass">Mot de Passe</label> : <input type="password" name="password" id="pass" placeholder="Password" required /><br /><br />
              <input type="submit" value="Connexion" id="submit" name="submit" />
            </fieldset>
         </form>
      <?php
      }
      ?>
      
      </aside>
      
    4. Modérateur

      Le seul problème est le mot de passe considéré comme incorrect.

      Comment as tu stocké le password en bdd ?

      Fais nous un print_r de ta variable $return et montre nous le résultat...