PHP (PHP Hypertext Preprocessor)

Auteur: Mohamed CHINY Durée necessaire pour le cours de PHP (PHP Hypertext Preprocessor) Niveau recommandé pour le cours de PHP (PHP Hypertext Preprocessor) Supports vidéo non disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz disponible pour ce cours

Page 14: Les sessions

Toutes les pages

Principe des sessions

Les sessions constituent un moyen de stocker les données sur le serveur. En plus, ces données sont propres à chaque utilisateur qui se connecte à celui-ci et sont associées à un identifiant de session unique. Ils sont très utiles car ils permettent de faire persister des informations aussi longtemps que le client est connecté voir même après qu'il ait quitté le site Web. Ces informations sont accessibles par toutes les pages visitées par le client (d'où le nom de session).

Quand une session est créée sur le serveur, ce dernier envoie son identifiant (unique) au client sous forme d'un cookie.

Qu'est ce qu'un cookie

Un cookie est un terme très fréquent sur le Web. Il s'agit en réalité d'un fichier texte stocké chez le client (sur son disque dur). Il est généré par le site Web visité et lui permet d'enregistrer des informations en local chez le client pour qu'il les récupère après. Les cookies servent généralement à enregistrer les préférences de l'utilisateur ou à stocker des données spéciales comme les identifiants de sessions.

Les cookies font partie des spécifications du protocole HTTP. En effet, l'entête d'une requête ou d'une réponse HTTP prend en compte la lecture et l'écriture des cookies.

Pour mieux comprendre l'utilité des cookies, supposons qu'un site Web peut être présenté en trois thèmes différents: bleu, vert ou orange. Si le client visite le site pour la première fois alors celui ci est affiché avec le thème bleu. Cependant, une option permet au visiteur de choisir le thème avec lequel il souhaite désormais poursuivre la navigation. Si le client choisi le thème vert, alors le design du site bascule aussitôt au thème sélectionné. S'il quitte le site et qu'il revient le visiter une prochaine fois (en utilisant le même navigateur) le thème vert est automatiquement chargé.

En fait, au moment ou le client a sélectionné le thème vert, cette option est ajoutée au cookie déposée sur son système par le site. La prochaine fois où il vient visiter ce dernier, le contenu du cookie sera lu pour savoir quel thème charger. Mais si le client décide d'effacer les cookies alors aucune trace du thème choisi ne sera trouvée et le site se chargera la prochaine fois avec le thème par défaut qui est bleu.

Utilisation des sessions

Variable de session $_SESSION

Une variable de session est une variable superglobale du nom de $_SESSION. Il s'agit d'un tableau associatif qui contient les valeurs stockées dans les sessions et qui est accessible quelque soit le contexte. Elle est reconnue sur tout le site Web et sa valeur peut être récupérée de n'importe quelle page.

Exemple:
<?php
   $_SESSION["theme"]="vert";
?>
Dans ce cas nous avons créé une variable de session $_SESSION dont la clé est "theme" et la valeur est "vert". La valeur de cette variable peut être récupérée dans une page différente du même site Web. Cependant, un tel code ne marchera pas si nous ne démarrons pas la session avec la fonction session_start().

Démarrer ou reprendre une session: session_start()

La fonction session_start() permet de démarrer une nouvelle session ou reprendre une session déjà existante. Quand cette fonction est exécutée, le serveur vérifie si la session qui a le même identifiant envoyé existe. Si oui, c'est cette session qui est reprise sinon une nouvelle session est créée et son identifiant est envoyé au client sous forme de cookie.

Dans le cas général, à chaque fois qu'on manipule les variables de session dans une page, il faut commencer par déclarer session_start() dans celle-ci.

Retenez bien qu'il faut placer la fonction session_start() avant d'envoyer quoi que ce soit au navigateur. En fait, il s'agit d'une fonction entête (qui envoie des entêtes HTTP au navigateur).

Logiquement, les entêtes doivent être envoyées en premier, avant d'envoyer aucun contenu au navigateur, alors il faut avoir l'habitude de déclarer session_start() avant la balise <html> ou même le Doctype et avant d'afficher aucun texte (avec echo par exemple) comme ceci:
<?php
   session_start();
?>
<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
   </head>
   <body>
   
   </body>
</html>
Supposons que nous avons déclaré session_start() après avoir envoyé du contenu au navigateur:
<!DOCTYPE html>
<?php
   session_start();
?>
<html>
   <head>
      <meta charset="UTF-8" />
   </head>
   <body>
   
   </body>
</html>
On obtient sur le navigateur quelque chose comme ceci:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at index.php:2) in index.php on line 3

Détruire une sessions: session_destroy()

La fonction session_destroy détruit toutes les données de la session déjà établie. Cette fonction détruit la session sur le serveur mais garde toujours le cookie qui lui est associé sur le client. Pour supprimer aussi le cookie (cas échéant) on fait appel à la fonction setcookie() qu'on aura l'occasion de voir plus loin.

Notez que parfois, il est plus pratique de supprimer une donnée particulière d'une session plutôt que de détruire la session elle même et supprimer par conséquent toutes ses données.

Exemple

Code de "page1.php":
<?php
   session_start();
   $_SESSION["theme"]="vert";
?>
Code de "page2.php":
<?php
   session_start();
   echo $_SESSION["theme"];
?>
Code de "page3.php":
<?php
   session_start();
   session_destroy();
?>
On commence par exécuter "page1.php". Celle -ci démarre une session à l'aide de session_start() et crée la variable de session $_SESSION["theme"] en lui affectant la valeur "vert".

Si maintenant on exécute "page2.php" on aura sur le navigateur le message "vert". En effet, Cette page restaure la session déjà ouverte avec session_start() puis affiche la valeur de la variable de session $_SESSION["theme"]. Cette valeur est reconnue partout dans le domaine.

Si maintenant on exécute "page3.php", la session est restaurée par session_start() puis détruite par session_destroy(). Ainsi toutes les valeurs de la variable de session seront supprimées. Alors, si maintenant on réexécute "page2.php" aucun message ne sera affiché car la variable est détruite.