Là, normalement, vous êtes en train de vous demander : "
Mais comment je vais bien pouvoir faire pour stocker les sessions dans ma base de données ? À tous les coups, il va nous sortir un truc super compliqué...".
Rassurez-vous, les développeurs de PHP ont pensé à tout

...
Cette solution a un nom :
session_set_save_handler !
Hein ? Mais qu'est-ce que c'est que ça ?
Une fonction assez utile
Et ensuite, ce n'est pas
ça, mais une fonction PHP qui va nous être bien utile...
En effet cette fonction, comme l'auront peut-être compris certains en voyant son nom, permet de définir les fonctions à utiliser pour utiliser les sessions.
La voilà en entier :
Heu

, tu peux nous la décrire un peu ?
Mais oui, bien sûr, j'y arrive !
Alors tout d'abord, comme vous pouvez le voir, cette fonction renvoie un
bool soit... un booléen : logiquement
true si elle a réussi, ou
false si elle a échoué.
Ce qui est sans doute un peu plus mystérieux, ce sont ses paramètres. En effet, elle prend des
callbacks...
Qu'est-ce que ces
callbacks ?
Les callbacks
Je vais être obligé de faire une petite digression, pour que tout le monde comprenne. Si vous connaissez déjà les callbacks, vous pouvez passer et aller directement à la présentation des fonctions prises en paramètre.
Bon : alors ces callbacks, qu'est-ce que c'est ?
Il s'agit d'un type de paramètre de fonction. Ce sont en fait des noms de fonctions !
Pas plus clair ?
Alors on continue

.
Pour faire simple, on va donner à notre fonction en paramètre le nom d'une autre fonction (ou méthode de classe) sous forme d'une chaîne de caractères pour une fonction. Chaîne de caractères ayant pour valeur le nom de la fonction à appeler.
Pour les méthodes, on donne un array (l'élément 0 correspond à l'objet instancié, et l'élément 1 au nom de la méthode).
Bon, je vous donne un petit exemple, ça sera peut-être plus clair :
Code : PHP1
2
3
4
5
6 | <?php
call_user_func('mafonction');//dans le cas d'un fonction
$object = new Ma_class();//une class diverse
call_user_func(array($object, 'maméthode'));//dans le cas d'une méthode de class
?>
|
Je crois que cela mérite quelques explications, non ?
Tout d'abord
call_user_func est une fonction prenant comme paramètre un callback. J'ai utilisé cette fonction car elle est relativement simple et prend un seul paramètre : le nom de la fonction à appeler.
Bon, pour le reste je pense que cela a dû vous aider à comprendre le fonctionnement des callbacks.
En effet
$object correspond donc à un objet de la classe
Ma_class, et
maméthode est une méthode de cette class, peu importe ce qu'elle fait.
Le callback pour cette méthode est donc le tableau :
array($object, 'maméthode').
Il ne faut surtout pas fournir les paramètres de la fonction. Vous donnez juste son nom !
Ok, maintenant que la question des callbacks est réglée, on peut revenir à notre sujet initial.
Présentation des fonctions prises en argument
Je vous remets la fonction :
Cette fonction prend 6 paramètres : les 6 fonctions d'opération sur les sessions.
Étudions si vous le voulez bien d'un peu plus près ces fonctions.
Open
Cette fonction prend normalement en paramètre le nom du fichier à ouvrir et le chemin d'accès ; mais nous, on va se contenter d'ouvrir la connexion à la base de données.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
function open()
{
global $host,$user,$pass,$db,$connect;//toutes les constantes de connexion
$connect = mysql_connect($host, $user, $pass,1);//on se connecte à la bdd
$bdd = mysql_select_db($db,$connect);//on sélectionne la base de données
return $bdd;
}
?>
|
Je pense que vous avez tous compris ce code, cependant le "1" en quatrième paramètre de
mysql_connect vous est sans doute plus obscur.
Il est préférable de le mettre car il permet d'avoir plusieurs connexions ouvertes sur la même page. Je vous renvoie
là pour ceux qui voudraient plus de précisions.
Close
Elle est à peu près aussi explicite : elle ne prend aucun paramètre et se contente de fermer le fichier ou la connexion. Nous allons fermer la connexion à la base de données.
Code : PHP1
2
3
4
5
6
7
8 | <?php
function close()
{
global $connect;
$bdd = mysql_close($connect);//on ferme la bdd
return $bdd;//retourne true ou false selon si la déconnexion a échoué ou réussi
}
?>
|
On ferme la connexion enregistrée dans
$connect lors de la connexion.
Read
Cette fonction prend un seul paramètre : l'identifiant de session. Et elle retourne les données.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | <?php
function read ($sid)
{
global $connect;
$sid = mysql_real_escape_string($sid,$connect);
$sql = "SELECT sess_datas FROM sess_table
WHERE sess_id = '$sid' ";
$query = mysql_query($sql,$connect) or die (mysql_error());
$data = mysql_fetch_array($query);
if(empty($data)) return FALSE;
else return $data['sess_datas'];//on retourne la valeur de sess_datas, soit le contenu de la session
}
?>
|
On sélectionne les données correspondant à l'id de la session et on les retourne.
Write
Écrit dans la session, elle prend deux paramètres : l'identifiant de session et les données à écrire.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | <?php
function write ($sid, $data)
{
global $connect;
$expire = intval(time() + 7200);//calcul de l'expiration de la session (ici par exemple, deux heures).
$data = mysql_real_escape_string($data,$connect);//si on veut stocker du code SQL
$sql = "SELECT COUNT(sess_id) AS total
FROM ".SESS_TABLE."
WHERE sess_id = '$sid' ";
$query = mysql_query($sql,$connect) or exit(mysql_error());
$return = mysql_fetch_array($query);
if($return['total'] == 0)//si la session n'existe pas encore
{
$sql = "INSERT INTO ".SESS_TABLE."
VALUES('$sid','$data','$expire')";//alors on la crée
}
else//sinon
{
$sql = "UPDATE ".SESS_TABLE."
SET sess_datas = '$data',
sess_expire = '$expire'
WHERE sess_id = '$sid' ";//on la modifie
}
$query = mysql_query($sql,$connect) or exit(mysql_error());
return $query;
}
?>
|
On fait d'abord une première requête, pour savoir si la session existe déjà. Si c'est le cas, alors on la modifie simplement, sinon bah... on la crée

.
Vous remarquerez que l'on protège les données à insérer grâce à mysql_real_escape_string : d'abord, pour éviter les injections SQL, mais surtout pour vous permettre de stocker des requêtes SQL dans vos sessions.
Destroy
Alors, que va faire cette fonction ?
Elle va tout simplement supprimer la session lorsque vous appelez
session_destroy(). Elle prend en paramètre l'identifiant de session à détruire.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
function destroy ($sid)//destruction
{
global $connect;
$sql = "DELETE FROM ".SESS_TABLE."
WHERE sess_id = '$sid' ";//on supprime la session de la bdd
$query = mysql_query($sql,$connect) or exit(mysql_error());
return $query;
}
?>
|
Gc
Ah
Gc ! Mais qu'est-ce donc que cette fonction ?
Il s'agit en fait de la fonction de "nettoyage" : elle va éliminer les sessions trop vieilles et qui ont dépassé leur date d'expiration.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <?php
function gc ()
{
global $connect;
$sql = "DELETE FROM ".SESS_TABLE."
WHERE sess_expire < ".time(); //on supprime les vieilles sessions
$query = mysql_query($sql,$connect) or exit(mysql_error());
return $query;
}
?>
|
J'ai choisi de supprimer les sessions inférieures au timestamp actuel, car lors de la modification de la session, je rajoute la durée de vie de la session au timestamp actuel.
Cependant vous pouvez faire autrement, comme stocker le timestamp actuel lors de la modification et supprimer les sessions inférieures au timestamp actuel
moins la durée de vie des sessions...
Bon, maintenant je pense que vous avez compris le principe des différentes fonctions que nous devons utiliser pour stocker les sessions dans la base de données.