problème avec une variable de session

problème avec une variable de session - PHP - Programmation

Marsh Posté le 12-02-2008 à 11:06:52    

Salut à tous ! Je développe un site (dans le cadre d'un projet fictif) de vente en ligne de meubles de salon d'intérieur. Sur ce site, j'ai un formulaire de connexion où l'utilisateur doit saisir son email et son mot de passe pour se connecter. Je récupère l'email dans une variable de session, mais le problème c'est que, chaque fois que je recharge la page index.php, ça détruit ma variable de session sans que je sache pourquoi ... Et quand je mets en commentaires tout le fichier de déconnexion, il garde ma variable de session ...
 
Voici le code de mon fichier de connexion (le session_start se trouve dans index.php)
 

Code :
  1. <?php
  2.    class plugin_connexion implements IPlugin {
  3.                        
  4.    function render (&$html, $args){
  5.       //$buffer = "";
  6.       if(!isset($_SESSION['session_mail']) || empty($_SESSION['session_mail'])){
  7.          $buffer = "<form name='connexion' method='post' >" .
  8.          "<br><br>" .
  9.          "adresse email : <input type='text' name='mail'><br><br>" .
  10.          "mot de passe : <input type='password' name='passwd'><br><br>" .
  11.          "<input type='submit' value='Connexion client'/><br />" .
  12.          "<br><br>" .
  13.          "<b>Administrateur</b>" .
  14.          "<input type='password' name='tpassadmin'><br><br>" .
  15.          "<input type='submit' value='Connexion admin'><br />" .
  16.          "</form>";
  17.                        
  18.                
  19.          if(isset($_POST['mail']) && (isset($_POST['passwd']))){  //les informations ont été envoyées
  20.              //echo "Les informations ont été envoyées";
  21.              $mail = $_POST['mail']; //parsing du mail
  22.              $passwd = $_POST['passwd']; //parsing du mot de passe
  23.                                
  24.              $_SESSION['session_mail'] = $mail;
  25.              $_SESSION['password'] = $passwd;
  26.                                        
  27.              if((strlen($mail) != 0) && (strlen($passwd) != 0)){
  28.                  $sql = "SELECT * FROM client WHERE MailClient = '".$mail."' and PasswordClient =                      '".$passwd."'";
  29.                  $req = $GLOBALS['dbal']->query($sql);
  30.                  if($GLOBALS['dbal']->num_rows($req)) { //s'il existe des résultats à la requête
  31.                       //session_start();
  32.                       $email = $_SESSION['session_mail'];
  33.                       $password = $_SESSION['password'];
  34.                                                
  35.                       //On récupère le numéro du client au cas où celui-ci effectuerait une commande
  36.                       $sql2 = "SELECT NoClient FROM client WHERE MailClient = '".$email."' and PasswordClient = '".$password."'";
  37.                       $req2 = $GLOBALS['dbal']->query($sql2);
  38.                       if($req2) {
  39.                            //echo "je rentre dans le if";
  40.                            $ligne = $GLOBALS['dbal']->fetch_assoc($req2);
  41.                            //echo "$ligne";
  42.                            $num_client = $ligne['NoClient'];
  43.                            //echo "$num_client";
  44.                            $_SESSION['noclient'] = $num_client;
  45.                            $nocli = $_SESSION['noclient'];
  46.                            //echo "$nocli";
  47.                        }
  48.                                                
  49.                        $buffer = "<br /><br /><br />Vous êtes correctement identifié.<br /><br />" .
  50.                        "<a href=index.php?id=6&mail='$email'>Cliquez ici pour modifier vos données.</a><br /><br />" .
  51.                        "<a href=index.php?id=13>Consultez l'historique de vos commandes</a><br><br>" .
  52.                        "<a href=index.php?id=8>Déconnexion</a><br /><br />";
  53.                  }
  54.                  else {
  55.                      $buffer = "Vous n'êtes pas encore inscrit<br /><br />";
  56.                      $buffer .= '<a href=index.php?page=0>Retour</a><be /><br />';
  57.                  }     
  58.             }
  59.             else {
  60.                $buffer = "Vous n'avez pas saisi votre mot de passe ou votre email.<br /><br />";
  61.               }
  62.           }
  63.        }
  64.        else {
  65.            $mail = $_SESSION['session_mail'];
  66.            $passwd = $_SESSION['password'];
  67.            $buffer = "<br /><br /><a href=index.php?id=6&mail='$mail'>Cliquez ici pour modifier vos données.</a><br /><br />";
  68.            $buffer .= "<a href=index.php?id=13>Consultez l'historique de vos commandes</a><br><br>";
  69.            $buffer .= "<a href=index.php?id=8>Déconnexion</a><br /><br />";
  70.         }
  71.                         return $buffer;
  72.      }         
  73.                                
  74.   }
  75. ?>


 
 
 
 
Et voici celui de la déconnexion :
 
 

Code :
  1. <?php
  2.         class plugin_deconnexion implements IPlugin{
  3.        
  4.                 function render(&$html, $args){
  5.                
  6.                         //session_unset();
  7.                         unset($_SESSION['password']);
  8.                         $buffer = "Vous vous êtes déconnectés avec succès <br /><br />" .
  9.                         "<a href=index.php?id=0>Retour à l'accueil</a><br /><br />";
  10.                         header("location index.php" );
  11.                                
  12.                         return $buffer;
  13.                        
  14.                 }
  15.         }
  16. ?>

Reply

Marsh Posté le 12-02-2008 à 11:06:52   

Reply

Marsh Posté le 12-02-2008 à 11:41:14    

Faut regarder plutôt du côté d'index.php si y'a pas quelque chose qui écrase.
 
La déconnexion est incomplète, il faut détruire la session avec session_destroy, et supprimer le cookie

Reply

Marsh Posté le 12-02-2008 à 14:12:28    

Voilà la partie de mon code "index.php" qui concerne les sessions :
 

Code :
  1. // On démarre une session (ou on reprend la session existante, s'il y en a une)
  2.   // Le session_start() doit s'effectuer _après_ l'inclusion de toutes les classes
  3.   // d'objets (donc après loadPlugins())
  4.   session_start();
  5.   if (!isset($_SESSION['thecart']))
  6.  $_SESSION['thecart'] = new plugin_cart();
  7.   if(!isset($_SESSION['theconnection']))
  8. $_SESSION['theconnection'] = new plugin_connexion();
  9.  
  10.   if(!isset($_SESSION['recherche']))
  11. $_SESSION['recherche'] = new plugin_recherche();


 
Sinon, quelle fonction doit-on utiliser pour supprimer un cookie ?

Reply

Marsh Posté le 12-02-2008 à 15:05:48    

Ca peut être un problème de cookies aussi. S'ils sont mal initialisés, ça peut foirer

Reply

Marsh Posté le 12-02-2008 à 15:07:41    

Dans mon code, je ne parle pas du tout de cookies ;)

Reply

Marsh Posté le 12-02-2008 à 15:09:00    

Ben si, si t'as des sessions [:dawa] L'identifiant est transmis par cookies

Reply

Marsh Posté le 12-02-2008 à 15:17:15    

Ah bah oui :) Comment faire dans ce cas pour voir si les cookies sont mal initialisés ?

Reply

Marsh Posté le 12-02-2008 à 15:19:44    

Snif le trafic HTTP, et regarde ce qu'il se passe au niveau des entêtes Set-Cookie et Cookie

Reply

Marsh Posté le 12-02-2008 à 15:26:48    

Euh ... désolé mais là, tu me parles en chinois lol

Reply

Marsh Posté le 12-02-2008 à 17:13:42    

Peut-être est-ce dû à mes variables de session ... Car si on regarde bien, dans ma page "index.php", il y en a une qui s'appelle "theconnection" et que je remplace dans plugin_connexion par "session_mail". Le truc, c'est que quand je remplace "theconnection" par "session_mail" dans la page index.php, il me met l'erreur suivante :  
 
Catchable fatal error: Object of class plugin_connexion could not be converted to string in C:\wamp\www\projet_MS2006\plugins\connexion\plugin_connexion.php on line 70
 
Pensez-vous que ça ait un rapport ?

Reply

Marsh Posté le 12-02-2008 à 17:13:42   

Reply

Marsh Posté le 13-02-2008 à 11:21:05    

Un petit coup de main svp :)

Reply

Marsh Posté le 14-02-2008 à 14:40:02    

Toujours personne ?

Reply

Marsh Posté le 19-02-2008 à 11:31:17    

J'ai toujours le souci ...

Reply

Marsh Posté le 19-02-2008 à 11:50:24    

est-ce que la fonction "session_start()" est appellée au début du fichier "index.php"?

Reply

Marsh Posté le 19-02-2008 à 12:52:30    

Non, ce n'est pas au début.

Reply

Marsh Posté le 19-02-2008 à 13:15:18    

Voici mon code d'index.php
 

Code :
  1. <?php
  2. //session_start();
  3. // Intégrer le fichier de configuration
  4. // et la gestion des plugins
  5. include_once 'conf/config.php';
  6. include_once 'lib/plugins.php';
  7. include_once "lib/dbal.php";
  8. include_once "lib/util.php";
  9. //session_start();
  10.  
  11. $dbal = new dbal();
  12. // Equivalent à : $GLOBALS['dbal'] = new dbal();
  13.  
  14. // Récupérer le chemin des templates
  15. $chemin = $site['templateDir'];
  16.  
  17. // Lire le fichier HTML de maquette
  18. $html = file_get_contents($chemin . 'index.html');
  19.  
  20. // Remplacer le marqueur ###TEMPLATE_PATH### par le chemin du template par défaut
  21. $html = str_replace('###TEMPLATE_PATH###', $chemin, $html);
  22.  
  23. // Charger et exécuter les plugins
  24. loadPlugins();
  25.  
  26. // On démarre une session (ou on reprend la session existante, s'il y en a une)
  27. // Le session_start() doit s'effectuer _après_ l'inclusion de toutes les classes
  28. // d'objets (donc après loadPlugins())
  29. session_start();
  30. if (!isset($_SESSION['thecart']))
  31.  $_SESSION['thecart'] = new plugin_cart();
  32. if(!isset($_SESSION['theconnection']))
  33.  $_SESSION['theconnection'] = new plugin_connexion();
  34.  
  35. if(!isset($_SESSION['session_recherche']))
  36.  $_SESSION['session_recherche'] = new plugin_recherche();
  37. if(!isset($_SESSION['nom']))
  38.  $_SESSION['nom'] = new plugin_inscription();
  39. // Exécuter les actions relatives à la page
  40. // (traitements de GET ou POST notamment)
  41. execActions();
  42.  
  43. // Le plugin plugin_cart s'implante directement dans la page ici,
  44. // contrairement aux autres plugins qui sont générés automatiquement par
  45. // renderPlugins(), plus loin.
  46. // Sinon, renderPlugins() générerait un nouvel objet plugin_cart, vide par défaut,
  47. // au lieu de reprendre le panier plugin_cart de la session.
  48. $html = str_replace("###CART###", $_SESSION['thecart']->render($html, array()), $html);
  49.  
  50. // Déclencher le "rendu" des plugins de la page
  51. echo renderPlugins($html);
  52.  
  53. //session_destroy();
  54.  
  55. /**
  56. *  Traitements de la page
  57. **/ 
  58. function execActions() {
  59.  if (!isset($_GET['action']))
  60.   return;
  61.        
  62.  // Traiter l'action
  63.  switch($_GET['action']) {
  64.   case 'add':
  65.    if (isset($_GET['ref'])) {
  66.     // Retraiter la référence
  67.     $ref = addslashes(strtoupper($_GET['ref']));           
  68.     $_SESSION['thecart']->add($ref, 1);
  69.    }
  70.   break;
  71.      
  72.   case 'del':
  73.    if (isset($_GET['ref'])) {     
  74.     // Retraiter la référence
  75.     $ref = addslashes(strtoupper($_GET['ref']));         
  76.     $_SESSION['thecart']->remove($ref, 1);
  77.    }
  78.   break;
  79.        
  80.   case 'clear':
  81.    $_SESSION['thecart']->clear();
  82.  }
  83. }
  84. ?>

Reply

Marsh Posté le 19-02-2008 à 14:15:09    

forzayalta a écrit :

est-ce que la fonction "session_start()" est appellée au début du fichier "index.php"?


Il aurait déjà vu une erreur "headers already sent" le cas échéant.
 
Moi quand j'avais ce genre de problèmes, c'était souvent les paramètres de cookies qui étaient pas bon. C'est pour ça qu'il faudrait sniffer le traffic HTTP pour voir ce qui est envoyé dans le header Set-Cookie. Suffit que le chemin ou le domaine soit pas bon, et ça foire tout

Reply

Marsh Posté le 20-02-2008 à 18:22:59    

FlorentG a écrit :


Il aurait déjà vu une erreur "headers already sent" le cas échéant.


 
Pas forcément, tout dépend de la configuration du serveur, du niveau d'alerte de error_reporting().

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed