Une session est en fait un fichier conservé sur le serveur et accessible à vos scripts en fonction d'un identifiant généré à la création. Chaque fois qu'un de vos visiteurs génère une session, un identifiant lui est attribué. Tout ce qui est dans cette session est accessible de partout à vos scripts. On comprend dès lors très vite tout l'intérêt de la chose. En effet, si chaque session est propre à un visiteur, on peut personnaliser nos scripts en fonction du visiteur, ou encore alléger nos requêtes : plutôt que d'aller chercher un pseudonyme dans la base de donnée sur chaque page, vous le rapatriez à l'arrivée du visiteur sur le site, vous le stockez en session et c'est de là que vous y accéderez par la suite.
La session est finalement l'équivalent d'un cookie en plus sécurisé. En effet, étant stocké sur le serveur et non chez le client, elle est plus difficile d'accès aux éventuels pirates. Mais un risque demeure, prenez donc l'habitude de ne pas y stocker des informations trop sensibles. N'oubliez pas également que la session, à la différence du cookie, n'est valable qu'un temps limité (aux alentours des 30 minutes, mais cela dépend de la configuration de votre serveur), et est automatiquement détruite à la fermeture du navigateur du visiteur.
Vous pouvez enregistrer en session tout type de variable : du simple numérique au tableau en passant par la chaîne de caractères.
Il existe plusieurs fonctions liées aux sessions, mais deux seulement sont essentielles à leur fonctionnement, ainsi qu'un tableau :
Code : Tout sélectionner
session_start();
Code : Tout sélectionner
session_destroy();
Code : Tout sélectionner
$_SESSION
Utilisation du tableau global $_SESSION
Code : Tout sélectionner
// Nous allons créer une variable de session appellée "nombre" et qui contient "1234" :
$_SESSION['nombre'] = 1234;
// Nous pouvons maintenant afficher la variable "nombre"
echo $_SESSION['nombre']; // Ceci va afficher 1234
Nous allons maintenant étudier un cas concret à savoir une procédure de login. En effet c'est une cas répandu d'utilisation des sessions. Nous allons donc créer un formulaire qui permet au visiteur de se loguer, puis une page de vérification qui va consulter la base de données et vérifier que les informations de connexion sont correctes. Et enfin mettre les données utiles sur l'utilisateur en session afin de pouvoir les réutiliser sur d'autres pages du site.
Le code HTML de la page de connexion
Code : Tout sélectionner
<html>
<head>
<title>Connexion au site</title>
</head>
<body>
<form method="post" action="verifLogin.php">
<table border="0" width="400" align="center">
<tr>
<td width="200"><b>Vôtre login</b></td>
<td width="200">
<input type="text" name="login">
</td>
</tr>
<tr>
<td width="200"><b>Vôtre mot de passe<b></td>
<td width="200">
<input type="password" name="password">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="submit" value="login">
</td>
</tr>
</table>
</form>
</body>
</html>
Code de la page verifLogin.php
Code : Tout sélectionner
<?php
// On démarre la session
session_start();
$loginOK = false; // cf Astuce
// On n'effectue les traitement qu'à la condition que
// les informations aient été effectivement postées
if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) ) {
extract($_POST); // je vous renvoie à la doc de cette fonction
// On va chercher le mot de passe afférent à ce login
$sql = "SELECT pseudo, age, sexe, ville, mdp FROM user WHERE login = '".addslashes($login)."'";
$req = mysql_query($sql) or die('Erreur SQL : <br />'.$sql);
// On vérifie que l'utilisateur existe bien
if (mysql_num_rows($req) > 0) {
$data = mysql_fetch_assoc($req);
// On vérifie que son mot de passe est correct
if ($password == $data['mdp']) {
$loginOK = true;
}
}
}
// Si le login a été validé on met les données en sessions
if ($loginOK) {
$_SESSION['pseudo'] = $data['pseudo'];
$_SESSION['age'] = $data['age'];
$_SESSION['sexe'] = $data['sexe'];
$_SESSION['ville'] = $data['ville'];
}
else {
echo 'Une erreur est survenue, veuillez réessayer !';
}
?>
Astuce : la petite astuce que j'ai utilisée est en fait l'inverse du principe d'optimisme. Ce dernier veut qu'on part d'un constat qui dit que tout va bien et en cas de problème on gère l'erreur. Ici c'est le contraire. On part de l'idée que le login ne fonctionne pas en initialisant une variable à false. Et c'est seulement lorsque le login est confirmé qu'on modifie cette variable à true. Il suffit ensuite de tester cette variable pour loguer l'utilisateur ou pas. Cela nous économise des else inutiles à chaque étape de test.
Note : Remarquez que je n'ai effectué que les tests minimums sur le login avant de lancer la requête. Il conviendrait d'effectuer plus de tests afin d'éviter d'éventuels tentatives d'intrusions dans votre application. Mais ce n'est pas le sujet étudié ici. De même que pour la base de données, je vous épargne la création de la table, il s'agit d'une bête table à 5 colonnes...
Imaginons maintenant que nous voulions afficher ces informations plus tard, sur une autre page. Sans les sessions nous aurions dû faire une requête qui retournerait chercher le tout, tandis que là, il nous suffit de faire ça :
Code de la page affichInfo.php
Code : Tout sélectionner
<?php
// On appelle la session
session_start();
// On affiche une phrase résumant les infos sur l'utilisateur courant
echo 'Pseudo : ',$_SESSION['pseudo'],'<br />
Age : ',$_SESSION['age'],'<br />
Sexe : ',$_SESSION['sexe'],'<br />
Ville : ',$_SESSION['ville'],'<br />';
?>
Bien entendu ce script n'a qu'une utilté réduite, à vous de voir quelles pourraient être les multiples façons de profiter des sessions.
3 . Déconnexion
Il s'agit là d'un point important. En effet une session reste ouverte tant que le visiteur ne ferme pas son navigateur. Vous devez lui offrir la possibilité de se déloguer d'une autre manière. Il vous suffit en fait de faire un lien appelé par exemple "déconnexion" qui pointe sur un script contenant ceci :
Code de la page logout.php
Code : Tout sélectionner
<?php
// On appelle la session
session_start();
// On écrase le tableau de session
$_SESSION = array();
// On détruit la session
session_destroy();
?>