Les sessions

Voir également : interaction des sessions et des formulaires

Qu'est-ce qu'une session, et à quoi sert-elle ?

Lorsqu'il s'agit de passer des paramètres de page en page, on peut utiliser des champs texte ou Hidden provenant d'un formulaire. Le principal inconvénient de cette manière de faire est que dans la barre d'adresse, les paramètres sont visibles à tout le monde, comme ceci :

http://www.nimportequoi.com/unepagequelconque?MotDePasse=PolluX007

Lorsqu'il s'agit ensuite de naviguer de page en page en gardant en mémoire les paramètres, il faut à nouveau utiliser le même système, ce qui évidemment empêche la confidentialité !

L'autre manière de conserver des données est l'utiliusation de cookies, qui permettent carrément le stockage directement sur le PC du visiteur. Certaines personnes désactivent les cookies sur leur ordinateur, ce qui empêche une utilisation sûre.

Le meilleur compromis est donc la session.

La session va nous permettre de passer des variables de page en page sans que jamais on voit dans la barre d'adresse de quelle variable il s'agit, ni son contenu.

Exemple

Imaginons une page : index.php, qui possède un lien vers suite.php, en lui passant discrètement une variable $login qui contient Julien, et de MotDePasse qui contient PolluX19 :

Contenu de index.php:

<?
  session_start();
?>

<HTML>
  <HEAD>
  </HEAD>
  <BODY>
    <a href="suite.php">Suite</a>
    <?
      $login = "Julien";
      $MotDePasse = "PolluX19";
      session_register ("login");
      session_register ("MotDePasse");
    ?>
  </BODY>
</HTML>

Le session_start(); doit impérativement se placer en tout début de page, sinon, une erreur PHP est générée.La suite est facile à comprendre : les variables qu'on désire conserver et donc passer à d'autres pages sont stockées dans la session avec session_register. Constatez que même si le lien hypertexte se trouve physiquement avant les session_register, elles se passent quand même normalement.

Lorsqu'on clique sur "Suite", on ne voit absolument pas le contenu des variables ainsi passées, quoique certaines fois, je vois dans la barre d'adresse
http://www.trucmachin.com/fin.php?PHPSESSID=fcd28fb74ab870744ce2d0ca84c48a1c

Contenu de suite.php:

<?
  session_start();
?>
<html>
  <head></head>
  <body>
    <a href="fin.php">Fin</a>
    <?
      echo $login."<BR>"; // Julien
      echo $MotDePasse; // PolluX19

    ?>
  </body>
</html>

J'ai rajouté encore un lien dans suite.php qui pointe vers fin.php, pour illustrer le fait qu'il n'est pas nécessaire de rafraîchir les variables avec une nouvelle session_register.

Contenu de fin.php:

<?
  session_start();
?>
<html>
  <head>
  </head>
  <body>
    <?
      echo $login."<BR>";// Julien
      echo $MotDePasse;// PolluX19

    ?>
  </body>
</html>

Evidemment, si on essae d'ouvrir une nouvelle fois le navigateur et qu'on tape directement dans la barre d'adresse d'adresse de la page fin.php, les variables sont perdues. Par contre, dans index.php, si on fait SHIFT-CLIC sur le lien qui pointe vers suite.php (dans le but de l'ouvrir dans une nouvelle fenêtre, les variables sont conservées).

Appel à une même page

Il est très possible d'appeler la page sur laquelle on se trouve. L'exemple suivant incrémente la variable $Compteur à chaque recharcgement de la page (exactement comme si la page comportait un lien hypertexte qui pointe vers elle-même) :

<? session_start(); ?>
<html>
<head></head>
<body>
<?
  $Compteur ++;
  session_register ("Compteur");

  echo $Compteur;

?>
</body>
</html>

Exemple pratique

Imaginons une page sur laquelle il y a de la musique en fond, avec cette instruction (pouvant se trouver n'importe où entre les balises <BODY> et </BODY>) :

<embed height=0 src=fondsonore.mid width=0 loop='true' autostart='true'></embed>

Le but est d'avoir sur cette page un lien hypertexte "Arrêter la musique" qui pointe sur la même page, mais qui met une variable $Musique à "OFF". En fait, le but complet est d'avoir une première fois la musique en fond et un lien qui pointe vers la même page avec comme libellé "Arrêter la musique" :

<a href="cettepage.php">Arrêter la musique</a>
<embed height=0 src=fondsonore.mid width=0 loop='true' autostart='true'></embed>

et quand on clique sur ce lien, à la place des ces deux lignes, seule la ligne suivante est affichée :

<a href="cettepage.php">Démarrer la musique</a>

Il va donc s'agir, lors du premier chargement de la page, de constater que la variable $Musique n'est pas encore définie (l'instruction isset va nous y aider), et dans ce cas, installer la ligne "musicale" et le lien "Arrêter la musique". En fait, plus précisément, il faut vérifier si $Musique est soit non définie, soit égale à "OFF".

Donc :

  1. Si $Musique pas définie ou $Musique = ON, alors indiquer le lien "Arrêter la musique", et installer la ligne "Musicale"
  2. Sinon, c'est à dire si musique = OFF, alors indiquer le lien "Démarrer la musique", et enlever la ligne "Musicale"

Comme ceci :

<? session_start(); ?>
<html>
<head> </head>
<body>
<?
if (!isset($Musique) || $Musique == "ON")
  {
  $Musique = "OFF";
  echo "<a href='sessionmusique.php'>Arreter la musique</a>";
  echo "<embed height=0 src=sessionmusique.mid width=0 loop='true' autostart='true'></embed>";
  }
else
  {
  $Musique = "ON";
  echo "<a href='sessionmusique.php'>Demarrer la musique</a>";
  }
session_register ("Musique");
?>
</body>
</html>

Il est possible qu'a première vue ce code semble faux ou étrange. Pour vous assurer qu'il fonctionne correctement, cliquez ici pour voir le résultat, vous verrez la page php qui contient très exactement le code précédent.

Destruction des sessions

Afin d'éviter de laisser une quelconque trace des variables, il est nécessaire de détruire les variables et la session, à l'aide de :

// On détruit les variables de notre session
session_unset ();
// On détruit notre session
session_destroy ();

Les fonctions liées aux sessions

session_start - Démarre une session
session_register - Enregistre une variable de session
session_unregister - Efface une variable de session
session_is_registered - Vérifie si une variable est déclarée pour la session en cours
session_id - Retourne l'id de la session en cours
session_name - Retourne le nom de la session en cours
session_unset - Detruit toutes les variables de la session en cours
session_destroy - Destruit la session en cours

---