Php problème entre les pages...

Résolu
salut à tous
eh bien voula j'ai un problème qui peut paraitre simple mais je n'arrive pas à trouver une bonne solution qui fonctionne si quelqu'un voudrais bien m'aider...
C'est une page d'accueil qui contient un formulaire d'identification.Jusque là, pas de problème, on se logue normalement et la session est ouverte. En ouvrant une session ça ouvre une autre page, ne s'appellant plus accueil.php mais accueilmembre.php. Quand on clique sur un lien dans "accueilmembre.php", ça renvoie sur la bonne page mais la session se coupe automatiquement. Donc j'aimerais savoir si il existe un moyen pour arranger ce problème.
Le but étant de faire profiter les gens du site, mais de pouvoir s'inscrire en ayant acces à des sections seulement valables pour les inscrits.
voila.

en esperant que quelqu'un m'aide
merci

23 réponses

Résumé de la discussion

Problème central : une page d'accueil avec formulaire d'identification ouvre une session puis redirige vers accueilmembre.php, et les liens subséquents cassent la session empêchant l'accès aux sections réservées aux inscrits. Des mesures visent à améliorer la gestion des sessions: détruire proprement les variables avec $_SESSION = array(); plutôt que session_unset, éviter inclusions qui perturbent l'état, et privilégier un affichage conditionnel des menus selon la connexion. En pratique, certaines propositions préconisent d'afficher le menu selon l'état de connexion et d'éviter des redirections qui réinitialisent l'état, tout en s'assurant que session_start() est invoqué au début.

Bobot (l’IA à votre service)
  1. je ne comprends pas bien ce qui se passe ici, mais il me semble que tes codes ne sont pas exactes
    1. sinon, si le truc que j'ai posté juste au dessus est juste, le prob vient pt du formulaire dans menu.php:
      <div class="element_menu">
      
      <h3>Membre</h3>
      
      <ul>
      <?php
      // on teste si le visiteur a soumis le formulaire de connexion
      if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
          if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {
      
              $base = mysql_connect ('localhost', 'root', ''); 
              mysql_select_db ('test', $base);
              
              // on teste si une entrée de la base contient ce couple login / pass
              $sql = 'SELECT count(*) FROM membre WHERE login="'.addslashes($_POST['login']).'" AND pass_md5="'.md5(addslashes($_POST['pass'])).'"';
              $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
              $data = mysql_fetch_array($req);
              
              mysql_free_result($req);
              mysql_close();
              
              // si on obtient une réponse, alors l'utilisateur est un membre
              if ($data[0] == 1) {
                  session_start();
                  $_SESSION['login'] = $_POST['login'];
                  include('menumembre.php');
                  exit();
              }
              // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
              elseif ($data[0] == 0) {
                  $erreur = 'Compte non reconnu.';
              }
              // sinon, alors la, il y a un gros problème
              else {
                  $erreur = 'Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
              }
          }
          else {
              $erreur = 'Au moins un des champs est vide.';
          }
      }
      ?>
      <form action="accueil.php" method="post">
      <font color="#cccccc">Login :</font> <input type="text" name="login" value="<?php if (isset($_POST['login'])) echo stripslashes(htmlentities(trim($_POST['login']))); ?>" size="5"><br />
      <font color="#cccccc">Password :</font> <input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo stripslashes(htmlentities(trim($_POST['pass']))); ?>" size="5"></p>
      <input type="submit" name="connexion" value="Connect">
      </form>
      <center><a href="inscription.php">T'inscrire</a></center>
      <?php
      if (isset($erreur)) echo '<br /><br />',$erreur;
      ?>                 				   
      </ul>
           
      </div>
      1. <?php
        session_start();
        isset($_SESSION['login'])
        
        ?>

        c ce que j'ai mit au dessus de la page, mais easyphp foire en ce moment chez moi donc j'aimerais savoir si tu penses que c juste....
        1. Modérateur
          isset ce n'est qu'une fonction renvoie une valeur.
          Elle n'installe ni ne restaure aucune variable.
          Elle ne fait que renvoyer 1 si la variable existe et 0 pour la cas contraire.
          Donc ici tu ne fais qu'un test dont la valeur est renvoyée dans le vide...
      2. je ne sais pas si include fonctionne car maintenant j'ai un autre problème.
        Je ne sais pas ou je dois mettre quoi pour que ça soit valable regarde ce que j'ai mit, mais ily a des erreurs:( c la page accueil.php)

        <?php
        session_start();
        if (!isset($_SESSION['login'])) {
            header ('Location: accueil.php');
            exit();
        }
        ?>
        <?php include("haut.php"); ?>
        
        <?php
        if (isset($_SESSION['login']) )
        {
        include('Location: menumembre.php');
        }
        else
        {
        include('Location: menu.php');
        }
        ?>
               <div id="corps">
        </div>
        <?php include('bas.php'); ?>
        


        il y a quelque chose qui cloche, mais je ne sais pas quoi...
        1. Modérateur
          Ben oui, tu test deux fois cette condition:
          !isset($_SESSION['login'])


          La première fois que tu testes : tu rediriges, donc forcément la deuxième fois n'arrive jamais.,
        2. @kilianqu'est-ce que je devrais mettre alors????(et où?)
        3. Modérateur
          @kilianIl faut enlever cette partie (si cette partie est executée, la suite ne l'est pas):
          if (!isset($_SESSION['login'])) {
              header ('Location: accueil.php');
              exit();
          }
        4. @kilianalors ici aucun menu ne s'affiche...
          mais alors si j'enlève
          if (!isset($_SESSION['login'])) {
              header ('Location: accueil.php');
              exit();
          }

          (en supposant que mes menus s'affichent) comment faire passer les variables session?
        5. Modérateur
          @kilianJe comprend pas trop ce que tu veux dire.
          C'est session_start() qui fait passer les variables session.
      3. ok je vois +/- la synthaxe.
        tu connaitrait pas le mot pour afficher une page si la variable existe:
        <?php
        if (isset($_SESSION['login']) )
        {
        header('Location: menumembre.php');
        }
        else
        {
        header('Location: menu.php');
        }
        ?>


        je crois que c'est ça apart qu'il faut autre chose à la place de header...
        1. Modérateur
          Et alors le soucis c'est qu'un non-loggé accède à des pages résrvées à un loggé?
          Ou alors le soucis c'est qu'un loggé se retrouve déconnecté lorsqu'il clique sur certains liens?
          1. en gros c'est un peu ça. car je ne peux pas mettre 2 include de 2 menu's différents sur la même page (un qui affiche le formulaire d'identification et l'autre qui affiche la variable $_SESSION)et c'est bien là le problème pour les pages qui devraient pouvoir être visités ET par des membres ET par des personnes de passage
          2. Modérateur
            Alors en ce cas tu affiche soit un menu pour les membres connecté, soit un menu pour les non connectés (en fonction de la variable session, tu inclues telle partie ou l'autre).
          3. @kilianje crois aussi mais comment faire?
          4. Modérateur
            @kilianEn testant si la variable $_SESSION['login'] existe par exemple.
          5. @kiliantester si la variable existe comment je dois faire?
        2. ok mais ça changera quoi?
          tu comprends le problème que j'ai ou pas???
          1. Modérateur
            Au lieu de prendre session_unset(), prend plutôt

            $_SESSION=array();
            1. je vais essayer de t'exposer en plus clair le prob.
              y a un menu pour ceux qui veulnt se logger.
              et en se loguant ils ouvrent une autre page......avec un autre menu.
              1. Modérateur
                Non, comprend pas où est le problème dans le code...
                Es-tu sûr q'une personne non loggée est vraiment non-loggée (et non pas anciennement loggée mais pas correctement déloggée)?

                Comment tu détruis tes sessions?
                1. avec cette page - ci (deconnection.php):
                  <?php
                  session_start();
                  session_unset();
                  session_destroy();
                  header('Location: accueil.php');
                  exit();
                  ?>
              2. bon voila ce qui se trouve en haut de ma page accueil.php :
                <?php
                // on teste si le visiteur a soumis le formulaire de connexion
                if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connect') {
                    if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {
                
                        $base = mysql_connect ('localhost', 'root', ''); 
                        mysql_select_db ('test', $base);
                        
                        // on teste si une entrée de la base contient ce couple login / pass
                        $sql = 'SELECT count(*) FROM membre WHERE login="'.addslashes($_POST['login']).'" AND pass_md5="'.md5(addslashes($_POST['pass'])).'" AND etat="'.md5(addslashes($_POST[1])).'"';
                        $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
                        $data = mysql_fetch_array($req);
                        
                        mysql_free_result($req);
                        mysql_close();
                        
                        // si on obtient une réponse, alors l'utilisateur est un membre
                        if ($data[0] == 1) {
                            session_start();
                            $_SESSION['login'] = $_POST['login'];
                            header('Location: accueilmembre.php');
                            exit();
                        }
                        // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
                        elseif ($data[0] == 0) {
                            $erreur = 'Compte non reconnu.';
                        }
                        // sinon, alors la, il y a un gros problème :)
                        else {
                            $erreur = 'Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
                        }
                    }
                    else {
                        $erreur = 'Au moins un des champs est vide.';
                    }
                }
                ?>

                et voilà ce que je mets sur les autres pages du site
                <?php
                session_start();
                if (!isset($_SESSION['login'])) {
                    header ('Location: accueil.php');
                    exit();
                }
                ?>

                voilà
                1. ce que j'ai fait:
                  <?php
                  session_start();
                  if (!isset($_SESSION['login'])) {
                      header ('Location: accueil.php');
                      exit();
                  }
                  ?>

                  le hic est donc que quand on se connecte, on accède à une page différente car il y a des endroits du site ou seuls les membres peuvent aller.
                  bon je t'explique un peu la structure du site:
                  intro javascript => accueil.php ( il y a une partie du menu servant à la connection|lorsque qq se connecte, il ouvre accueilmembre.php qui comprend un menu avec plus de liens )
                  jusque là sur la page accueilmembre.php tout va jusqu'à ce que je clique sur un lien=> la ça me redirige vers la bonne page, mais déconnecte l'utilisateur par la même occasion
                  et je ne sais pas pq mais quelques pages semblent être accesibles par un non-logué......
                  1. Modérateur
                    Salut,

                    Pour savoir si quelqu'un est connecté, tu peux vérifier l'existence d'une variable session par exemple...
                    • 1
                    • 2