Les sessions en PHP permettent de sauvegarder des variables de page en page pendant une certaine duree predefinie par PHP (et modifiable bien entendu). L'avantage des sessions sur les variables de type $_GET et $_POST est double : outre l'absence de formulaires (et meme de tout code HTML) pour gerer les sessions, ce systeme va vous permettre de transmettre des variables sur toutes les pages de votre site d'une maniere transparente pour vous (en PHP) ainsi que pour l'utilisateur. Vous imaginez si un membre devait cliquer a chaque fois sur les pages qu'il visite sur un bouton de formulaire indiquant qu'il est connecte ? ca ne serait pas vraiment viable comme systeme. Les variables de session vont pouvoir memoriser tout ce que vous souhaitez pendant la duree de connexion d'un visiteur. Sur ce site par exemple, lorsque vous etes connecte, j'utilise le systeme de sessions pour savoir que vous etes toujours la sans que vous ayez besoin de retaper votre mot de passe ou votre nom d'utilisateur a chaque page consultee.
La technique est simple : chaque utilisateur ayant besoin des sessions se voit attribuer un identifiant unique appele ID de session. Cet identifiant est stocke sur le poste de l'internaute sous forme d'un cookie ou transite via l'URL si l'option session.use_trans_sid est a 1 (ou On) dans le fichier php.ini. Utiliser la methode du cookie est plus que recommandee : un identifiant de session dans l'URL empeche de retenir l'adresse d'une page simplement par le visiteur neophyte, cela rallonge donc l'adresse de votre page. Cela nuit egalement au referencement de votre page. En effet, l'identifiant etant unique, lorsque le robot du moteur de recherche scanne votre site, il ne retombera jamais sur la meme URL plusieurs fois de suite. Vous pouvez donc dire adieu a votre referencement en procedant comme ca.
Il est important de toujours avoir a l'idee qu'un identifiant de session peut etre derobe par un pirate. evitez donc autant que possible le transit par l'url des informations de session (qui peuvent generalement se retrouver dans des copier-collers de liens dans un forum par exemple).
Avant d'utiliser les sessions sur une page, on doit toujours utiliser la fonction session_start() placee avant tout envoi de code HTML, et donc generalement tout en haut de votre page PHP :
<?php
session_start(); //doit etre place avant tout echo ou autre code html
//Vous pouvez commencer a utiliser les sessions apres le session_start();
?>
Pourquoi session_start() doit-elle etre placee de la sorte ? et bien parce que si PHP utilise les cookies pour reperer quel est l'id de session utilise par l'internaute, il va ecrire cet id de session dans un cookie. Or, le protocole HTTP fonctionne de telle sorte que les en-tetes (qui permettent de dire a votre navigateur "cree un cookie ayant tel nom et telle valeur") sont envoyes avant le premier caractere HTML transmis. Cela veut dire que des que vous transmettrez un caractere HTML, les en-tetes seront envoyes et vous ne pourrez plus les modifier, vous ne pourrez donc plus ecrire le cookie de session. En general, si vous faites une maladresse de ce style, vous vous retrouverez avec une erreur de headers already sent.
Les variables de session fonctionnent comme les variables classiques. Voici un exemple pour attribuer une valeur a une variable de session nommee login :
<?php
session_start(); //doit etre appelee avant toute utilisation des sessions
$_SESSION['login']='valeur';
?>
Pour recuperer la valeur d'une variable de session (sur la meme page ou sur une autre page, apres un session_start()), il s'agit de la meme procedure que pour une variable classique hormis l'ajout du session_start() tout en haut de la page :
<?php
session_start();
if(isset($_SESSION['login']))
{
echo $_SESSION['login']; //affiche la valeur de $_SESSION['login'] qui a pu etre attribue dans une autre page php
}
?>
Pour savoir si une variable de session existe, on procede de la meme facon que pour les autres variables a savoir qu'on utilise la fonction isset().
Vous souhaiterez peut-etre effacer une ou plusieurs variables de session, au meme titre qu'une autre variable en PHP, il faut utiliser pour ca la fonction unset().
Voici un petit exemple simple pour effacer la variable de session login que nous avons creee tout a l'heure (le membre ne pourra donc plus etre considere comme identifie) :
<?php
session_start();
if(isset($_SESSION['login']))
{
unset($_SESSION['login']);
}
?>
Si vous souhaitez effacer toute la session d'un coup, vous pouvez utiliser la fonction session_destroy() pour detruire toutes les variables de session d'un visiteur. Cette fonction doit quand meme avoir ete initialisee par un session_start(), comme vous le feriez sur toutes vos pages.
Pour une plus grande securite, vous aurez peut-etre envie de connaitre l'id de session du visiteur, pour pouvoir effectuer divers traitements dessus ou encore pour l'enregistrer quelque part pour en garder une trace. PHP dispose d'une fonction destinee a cet usage, il s'agit de la fonction session_id().
<?php
session_start();
echo session_id(); //Retourne l'identifiant de session
?>
Vous pouvez egalement modifier l'id de session courant en specifiant une valeur dans la fonction session_id(), mais par contre il faudra cette fois-ci que vous le fassiez avant le session_start() sinon ca ne fonctionnera pas.
<?php
session_id(md5(mt_rand()));
session_start();
echo session_id(); //Retourne l'identifiant de session
?>
Voila, ce que vous venez de voir suffit amplement pour gerer un systeme de sessions sur votre site, pour realiser un espace membres ou encore un panier en ligne. Comme quoi, des notions simples permettent souvent de faire des choses concretes en PHP.