Interaction des sessions et des formulaires

Lorsqu'on valide un formulaire, il peut être évidemment très intéressant de stocker les variables des champs du forumulaire dans une session. Une utilisation fréquente des formulaires consiste à renvoyer le contenu du formulaire à la même page que celle dont il est issu. Dans cet exemple, nous avins un fichier index.php qui se renvoie à lui-même à des fins de vérifications des champs :

<?
  echo $EDINom;
?>

<html>
  <head></head>
  <body>
    <form action="index.php">
      <input type="text" name="EDINom">
      <input type="submit">
    </form>
  </body>
</html>

Lors du premier affichage de la page il est évident que $EDINom reste vide. Dès qu'on clique sur le bouton submit, on verra la valeur de à EDINom entrée dans le formulaire.

Il s'agit maintenant de stocker cette variable dans la session. J'aurais pensé que le code suivant aurait fonctionné :

<?
  session_start();
  session_register("EDINom");
  echo $EDINom;
?>
<html>
  <head></head>
  <body>
    <form action="index.php">
      <input type="text" name="EDINom">
      <input type="submit">
    </form>
  </body>
</html>

Mais en fait, ça ne marche pas du tout : pour une raison que j'ignore, le session_register("EDINom")ne stocke pas le contenu en provenance du formulaire, mais une nouvelle variable vide. En fait, il s'agit d'attribuer une nouvelle variable à EDINom, comme ceci :

<?
  session_start();
  session_register("NouvelleVariable");
  $NouvelleVariable=$EDINom;
  echo $NouvelleVariable;

?>
<html>
  <head></head>
  <body>
    <form action="index.php">
      <input type="text" name="EDINom">
      <input type="submit">
    </form>
  </body>
</html>

Cette solution marche presque, mais pas encore, simplement parce que lors du premier affichage du formulaire, $EDINom ne contient rien, et à partir de ce moment-là, il ne contiendra jamais plus rien... Ce qui me parait étrange puisqu'au 2ème appel, il devrait contenir le contenu de àEDINom, mais bon, c'est comme ça...

Pour pallier à cet inconvénient, il s'agit de déterminer s'il s'agit d'un premier chargement de la page ou pas. Un champ de type Hidden va nous y aider :

<?
  session_start();
  session_register("NouvelleVariable");
  if($DejaVu=='Oui') $NouvelleVariable=$EDINom;
  echo $NouvelleVariable;
?>
<html>
  <head></head>
  <body>
    <form action="index.php">
      <input type="hidden" name="DejaVu" value="Oui">
      <input type="text" name="EDINom">
      <input type="submit">
    </form>
  </body>
</html>

Et voilà ! Nous allons conclure avec un exemple concret et complet. Je rappelle que l'utilisation des sessions est principalement destiné à pouvoir conserver une variable et à la passer de page en page SANS que l'URL contienne ces variables en paramètres.

Exemple concret : Login et Mot de passe

Tout en bas de cette page, vous trouverez un lien pour tester réellement cet exemple.

En bref : Cet exemple se compose de 3 pages : la première contient un formulaire d'identificatin, la 2ème contient la preuve que les variables ont été correctement passées, et la 3ème est une preuve supplémentaire comme quoi les variables suivent indéfiniment dans les sessions.

Plus en détail : La première page, sessionformulaireetape1.php, contient un formulaire qui demande à l'utilisateur son nom et son mot de passe. Le formulaire se renvoie sur lui-même afin de pouvoir faire des vérifications telles que le nom est il rempli, et le mot de passe est-il correct. Dans le cas ou ces infos sont correctes, une redirection automatique vers la page suivante sessionformulaireetape2.php est effectuée, et cette nouvelle page sessionformulaireetape2.php contiendra le contenu des variables sans qu'elles soient visibles dans l'URL. Un lien sera proposé sur cette page qui renverra vers encore une autre page sessionformulaireetape3.php afin de démontrer que les sessions renvoient bien correctement les variables de manière masquées :

Fichier 1 : sessionformulaireetape1.php

Ce fichier contient le formulaire d'identification demandant le login et le mot de passe, la session est startée dès le début du fichier, et dans la partie <HEAD>, nous ausons l'enregistrement des variables, ainsi qu'une double vérification : le formulaire est-il bien rechargé (champ hidden DejaVu), et le mot de passe est-il correct (en l'occurrence, est il égal à janvier ?). Le session_start doit être placé avant la section <HEAD>, sinon une erreur est générée, mais la vérification du mot de passe et la redirection <META HTTP-EQUIV... est de préférence placée DANS la section <HEAD>. Ainsi, le fichier sessionformulaireetape1.php est indéfiniment rechargé tant que le mot de passe n'est pas janvier. Comme nous avons besoin de 2 variables distinctes à chaque fois pour la gestion de la session, j'ai utilisé EDINom et EDIMotDePasse comme variables de formulaire (EDI = 3 premières lettres de EDItion, comme zone d'édition), et la session va conserver simplement Nom et MotDePasse.

<?
  session_start();
?>
<html>
  <head>
    <?
      session_register("Nom");
      session_register("MotDePasse");
      if(($DejaVu=='Oui') && ($EDIMotDePasse == 'janvier'))
        {
        $Nom=$EDINom;
        $MotDePasse = $EDIMotDePasse;
        echo "<META HTTP-EQUIV=Refresh CONTENT='0; URL=sessionformulaireetape2.php'>";
        }

    ?>
  </head>
  <body>
    <form action="sessionformulaireetape1.php">
      <input type="hidden" name="DejaVu" value="Oui">
      Votre Login : <input type="text" name="EDINom"> <br>
      Votre mot de passe : <input type="text" name="EDIMotDePasse">
      <input type="submit" value="OK">
    </form>
  </body>
</html>

Fichier 2: sessionformulaireetape2.php

session_start est toujours bien présent en tête du fichier, les variables sont spontanément récupérées dans la session, et le lien vers la 3ème page ne contient pas du tout de paramètres

<?
  session_start();
?>
<html>
  <head> </head>
  <body>
    <?
      echo "Votre login est : ".$Nom."<BR>";
      echo "Votre mot de asse est : ".$MotDePasse."<BR>";
      echo "Constatez que dans l'URL, vous ne pouvez pas voir les variables !";
    ?>
    <a href="sessionformulaireetape3.php">Continuer sur la 3eme page</a>
  </body>
</html>

Fichier 3 : sessionformulaireetape3.php

Comme c'est simple : il suffit d'à nouveau placer le session_start, et les variables sont encore et toujours là. Si par contre vous copiez l'adresse de l'URL (http://info-3000.com/phpmysql/sessionformulaireetape3.php), que vous quittez votre navigateur internet, que vous le relancez et que vous collez la même adresse URL, vous constaterez que les variables sont vides : la session à été tuée.

<?
  session_start();
?>
<html>
  <head> </head>
  <body>
    <?
    echo "Nous sommes sur la 3ème page, et <BR>";
    echo "Votre login est toujours bien : ".$Nom."<BR>";
    echo "Votre mot de passe est toujours bien: ".$MotDePasse."<BR>";
    echo "Constatez que dans l'URL, vous ne pouvez toujours pas voir les variables !";
    ?>
  </body>
</html>

Cliquez ici pour voir concrètement comment ça marche. Je vous rappelle que le mot de passe est janvier