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.
|