TUTORIELS 
La gestion des sessions en PHP3
Contrairement à son successeur le php4, le php3 ne supporte pas en natif la gestion des sessions. Voici néanmoins une méthode basée sur le SGBD permettant de pallier à ce manque.  (9 octobre 2001)
 

Suite à notre article "les sessions en PHP4", voici comme promis un moyen (parmi d'autres !) de gérer des sessions en PHP3, alors même que ce langage ne dispose pas de fonctions dédiées pour cette mission.
Cette méthode, personnelle, représente un cas pratique d'implémentation d'un système de sessions pour un site utilisant PHP3. Si vous avez la possibilité de faire fonctionner votre site sous PHP4 il est néanmoins recommandé (car plus simple) d'utiliser le système de sessions propre à cette version de PHP.
La méthode présentée ici se base sur la transmission des informations de l'internaute par URL et par formulaire. Les cookies ne sont pas utilisés (ils ne sont pas forcément acceptés par le navigateur).

Le principe de cette méthode

Lorsque cette méthode est installée, à chaque chargement d'une page par l'internaute, de multiples tests sont effectués :
- Vérification qu'un SID existe pour cet internaute (cf "les sessions en php4");
- Génération d'un SID si besoin, réactualisation de la durée de vie de la session;
- Transport du SID de pages en pages afin de récupérer le contexte (les variables);
- Suppression éventuelle des sessions périmées.

Rappelons que le but d'une session est de transporter des informations (un contexte) liées à la navigation d'un internaute sur un site web.
Une session se définit avant toute chose par un identifiant unique, afin de la distinguer des autres sessions liées à d'autres utilisateurs du même site, mais aussi par sa durée de vie, par la personne qu'elle concerne et enfin par les variables qu'elle transporte.

Ces caractéristiques vont alors se retrouver dans la table "sessions" que nous allons devoir créer pour y stocker les informations liées aux sessions de chacun des utilisateurs du site. Voici un exemple de fichier de création d'une telle table (avec phpMyAdmin).

L'implémentation

Notre table étant créee, nous pouvons maintenant concevoir un petit système de librairie, bien utile pour éviter de grands "copier/coller" sur chacune des pages concernées de votre site (celles où vous souhaitez que l'internaute soit "loggé" pour y accéder).
Pour ce faire, créons par exemple un répertoire "lib" à la racine du site afin d'y placer nos librairies (fichiers de connexion, fichiers de sessions). Ce répertoire contient des informations sensibles, protégez-le !
Sous Unix, créez à la racine de ce répertoire un fichier ".htaccess" contenant simplement : "deny from all".

Le premier fichier que nous allons placer dans ce répertoire (ou dans celui de votre librairie peut-être déjà existante) s'appellera par exemple "system.inc.php3". Ce fichier possède l'extension ".php3" afin qu'il soit interprété par le navigateur et non soumis au téléchargement. Il va nous permettre de stocker des informations générales liées aux sessions, comme leur durée de vie par exemple, mais aussi toutes autres informations susceptibles d'être communes à d'autres pages du site.

("system.inc.php3")
$duree_session = 15;
$titre = "Ici c'est le titre du site par exemple....";
$location = "http://www.monsite.com/index.php3?mess";

Nous définissons ici la durée de vie d'une session, 15 minutes. En d'autres termes, si l'internaute (déjà "loggé"), reste plus de 15 minutes sans cliquer sur une autre page du site, sa déconnexion lui sera notifiée au prochain clic, et il devra se réidentifier.
Ici "$titre" est une variable exemple, utilisée dans toutes les pages du site, elle sert à afficher dynamiquement le titre du site dans le navigateur. Le fichier "system.inc.php3" étant appelé par toutes les pages, cette variable permet de changer le libellé du titre du site une seule fois (dans ce fichier) et cela se répercute sur tout le site.
La variable "$location" nous servira plus tard à adapter un message, sur la page d'accueil du site, aux actions de l'internaute : déconnexion volontaire ou non, mot de passe erroné... (cf plus bas, code source de "sessions_membres.inc.php3").

Ce type de librairie est ensuite inclu dans chacune des pages nécessaires. Sur la page d'accueil du site, ouverte à tous, il suffit d'insérer notre fichier "system.inc.php3" et rien de plus. Ce qui donne par exemple pour le début du fichier :

("index.php3")
<?
include('lib/system.inc.php3');
include('lib/connect_database.inc.php3');
?>

Ces "includes" sont semblables à de bêtes "copier/coller", mais on gagne ici en clarté.
Pour information, sous MySQL, le fichier "connect_database" peut ressembler à ceci.

Au coeur du système de session

Nous avons maintenant besoin de concevoir des librairies qui sont appelées par les pages où l'internaute doit être "loggé" pour accéder à leur contenu. Voyons tout de suite ce que cela peut donner, les commentaires sont à suivre :

("sessions_suppr.inc.php3")
<?
$date_tab = getdate();
$now = mktime($date_tab[hours], $date_tab[minutes], $date_tab[seconds], $date_tab[mon], $date_tab[day], $date_tab[year]);

//echo("now : $now<br>");

// Suppression des sid perimes.
$req="delete from sessions where expire <= $now";
$idreq=mysql_query($req,$idconnect);
if ($idreq == 0)
{
print "Erreur delete session.<br>";
echo("$messerreur<br>");
mysql_close($idconnect);
exit;
}
?>

Ce fichier a pour but de supprimer toutes les sessions périmées (afin de ne pas alourdir indéfiniment notre table "sessions" précédemment créee). On efface de la table toutes les sessions dont le champ "expire" est strictement inférieur ou égal à l'heure courante.
Toutes les fonctions PHP utilisées dans nos exemples ne peuvent être détaillées ici, pour obtenir plus d'informations sur chacune d'elles, consulter la documentation du langage.

Maintenant que la table des sessions est purgée, la librairie principale peut être invoquée. Nous l'appelerons "sessions_membres.inc.php3". Trop longue pour être reproduite ici, voici néanmoins son code source commenté.
Cette librairie suppose qu'un internaute se connecte à votre site en rentrant l'équivalent d'un "login / password".
Pour résumer, ce fichier vérifie si un SID valide est définit pour l'internaute, si c'est le cas la durée de vie de sa session est augmentée de "$duree_session" (définie plus haut dans system.inc.php3).
Si aucune session n'existe, peut-être l'internaute vient-il tout juste de rentrer son "login / password" ? Auquel cas, ce couple est vérifié par rapport aux valeurs contenues dans la table "internautes". Si tout se passe bien, un SID est alors généré.
A ce moment, l'internaute est enregistré dans la table "sessions". Grâce à elle, on dispose maintenant d'un lien, le SID, à partir duquel nous pourrons récupérer les informations contenues dans la table "sessions" (ici le prénom, le mot de passe par exemple) à partir d'une simple requête de la forme :

<?
$req="select internaute_id, prenom from sessions where sid = '$sid'";
$idreq=mysql_query($req,$idconnect);
if ($idreq == 0)
{
print "Erreur infos session";
echo("$messerreur<br>");
mysql_close($idconnect);
exit;
}

while($row=mysql_fetch_array($idreq))
{
$internaute_id = $row[internaute_id];
$prenom = $row[prenom];
}
?>

Selon l'architecture de votre site, il est inutile d'avoir recours plusieurs fois à la librairie "sessions_membres.inc.php3". Elle comprend en effet une partie de gestion de "login / password" utile lorsque c'est la première fois qu'un internaute se connecte, mais superflu par la suite. Il convient alors de dupliquer et de renommer cette librairie en supprimant simplement les lignes de code concernant la comparaison du couple login / password rentré par l'internaute et celui contenu par la base de données.

Enfin, afin que les SID soient correctement transmis, s'ils existent, à travers votre site, pensez à toujours inclure dans vos liens internes ou formulaires le SID :

<a href="monlien.php3?sid=<?echo("$sid")?>">rubrique suivante...</a>

ou

<form name="monform" action="pagesuivante.php3" method="post">
     <input type="hidden" name="sid" value="<?echo("$sid")?>">
</form>

On le voit ici, implémenter un système de gestion de sessions en PHP3 avec cette méthode est plus lourd que profiter des fonctions fournies en standard avec PHP4. Les principes utilisés par cette méthode permettent néanmoins de comprendre les bases d'un petit système de session pour un site au traffic modeste.

Si vous souhaitez découvrir un autre moyen d'implémenter un tel système en PHP3 (notamment), vous pouvez vous orienter vers la PHPLib, un célèbre ensemble de classes qui fournit, entre autres, une classe dédiée aux sessions.

 
[ Arnaud GadalJDNet
 
Accueil | Haut de page