JeuWeb - Crée ton jeu par navigateur
[PHP] Stocker les sessions dans la base de donnée - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [PHP] Stocker les sessions dans la base de donnée (/showthread.php?tid=2808)



[PHP] Stocker les sessions dans la base de donnée - OncleJames - 27-07-2008

Stocker les sessions dans la base de donnée


Je laisserai le soin à chacun de se faire une idée sur le système, c'est une méthode comme une autre que j'ai adopté sur mon projet, et dont j'en suis plutôt content (Simple, efficace et sécurisé).

Avant de réaliser tout ça, j'ai lu pas mal de fichiers la dessus, certaines parties de code sont issu d'autres programmeurs et ont été modifiées pour la réalisation de ce système.
Il n'est pas encore optimiser au maximum ( il ne le sera jamais d'ailleurs Big Grin)
Il permet entre autre de vérifier si une personne est connecté et si oui de récupérer toutes les informations de son compte (non pas bancaireRolleyes).


La base de donnée :

La table sessions :
Elle va contenir toutes les informations sur les sessions

Code PHP :
<?php 
CREATE TABLE
`sessions` (
`
sid` varchar(26) NOT NULL,
`
uid` int(10) unsigned NOT NULL,
`
ipaddress` varchar(40) default NULL,
`
time` bigint(30) default NULL,
`
useragent` varchar(100) default NULL,
`
login` int(1) unsigned default '1',
`
failed_login` int(2) unsigned default '0',
PRIMARY KEY (`sid`)
)
ENGINE=MyISAM DEFAULT CHARSET=latin1;

sid => Identifiant de la session (26 caractères)
Forme du sid : 9bk95rkq9k43drro0q28v2cb83
uid => Id du membre quand il sera connecté
ipaddress => Adresse ip
time => Dernière visite
useragent => Navigateur utilisé
login => Connecté ou invité 0: invité & 1:connecté
failed_login => Tentative de connexion


Les fichiers :

La classe session :

Code PHP :
<?php 
class session {

var
$session_time = (120*60);// 2 heures
var $sid = ""; // Id de la session transmis à son ouverture

function __construct() {
$this->gc();//on appelle la fonction gc nettoyage des sessions
}

Dans un premier temps on définit les variables de la classe.
session_time : Durée de la session en secondes
sid : Identifiant de la session qui sera transmis à son ouverture

Dans le constructeur, on note l'appel de la fonction gc qui correspond au nettoyage des sessions dépassées, comme ça on ne travail que sur des sessions valides.

La première fonction : start($sid)

C'est elle qui va définir la procédure de fonctionnement des sessions
1) Récupération du sid
2) Écriture de la session (Création ou mise à jour)
3) Lecture de la session (Récupération des informations)
Code PHP :
<?php 
function start($sid) {
$this->sid = $sid;
$this->write();
$this->read();
}

La seconde fonction : write()

Cette fonction à un but essentiel, c'est elle qui va mettre à jour la session du client selon cette procédure.
1) Récupération du sid
2) Recherche d'une session existante pour ce client

2.1) Aucune session
2.1.2) On crée la session
login = 0, le client n'est forcément pas connecté
failed_login = 0, le client vient d'arriver

2.2) Une session existe déjà
2.2.2) On met à jour les informations de celle ci

Code PHP :
<?php 
function write ()//écriture
{
$sid = $this->sid;

$ipaddress = getip();
$useragent = getagent();
$sql = "SELECT COUNT(*) AS total
FROM sessions
WHERE sid = '
$sid' ";

$query = mysql_query($sql);
$return = mysql_fetch_assoc($query);
if(
$return['total'] == 0) //si la session n'existe pas encore
{
mysql_query("INSERT INTO sessions VALUES('$this->sid','0','$ipaddress','".time()."','$useragent','0','0')");

}
else
//sinon on met à jour
{
mysql_query("UPDATE sessions SET ipaddress='$idaddress', time='".time()."', useragent='$useragent' WHERE sid='$sid'");
}

}


La troisième fonction : read()

Dans cette fonction on va récupérer les informations sur la session mais aussi sur l'utilisateur.
1) Récupération du sid
2) Lecture de la session dans la base de donnée
3) Récupération des informations sur le compte de l'utilisateur

Les variables :
session : Sert a stocker les informations sur la session
user : Sert à stocker les informations sur le compte du client

Code PHP :
<?php 
function read ()//lecture
{
$sid = $this->sid;
$sql = "SELECT uid,login FROM sessions
WHERE sid = '
$sid' ";

$query = mysql_query($sql);
$data = mysql_fetch_assoc($query);

if(empty(
$data)) return FALSE;
else {
$session['uid'] = $data['uid']; //on retourne uid
$session['login'] = $data['login']; // Invité ou connecté
$sql = mysql_query("SELECT * FROM users WHERE uid='".$session['uid']."'");
$user = $mysql_fetch_assoc($sql);
}
}


La quatrième fonction : destroy()

Le but de cette fonction est très simple, détruire ou supprimer une session.
Le code parle de lui même
Code PHP :
<?php 
function destroy ()//destruction
{
$sql = "DELETE FROM sessions
WHERE sid = '"
.$this->sid."' ";//on supprime la session de la bdd
mysql_query($sql);

}

La cinquième fonction : gc()

Une des fonctions les plus importantes, c'est elle qui va faire du nettoyage dans la base de donnée, enlevé toutes les sessions dépassées.
Le code est simple.
Code PHP :
<?php 
function gc ()//nettoyage
{
$sql = "DELETE FROM sessions
WHERE time + "
.$this->session_time." < ".time(); //on supprime les vieilles sessions

mysql_query($sql);
}


Voila toute la classe session expliqué, je vous laisse l'assembler car le but n'est pas de copier coller simplement mais bien de comprendre le mécanisme que je trouve très intéressant.

Pour le fichier php avec l'appel de la fonction rien de plus simple :

Code PHP :
<?php
session_start
();

require_once
'include/class.session.php';
$session = new Session();
$session->start(session_id()); // On transmet l'id de la session

?>


======================================================================================================


:!: Il y a ici la base du concept, libre à chacun de l'améliorer :!:


Si certains l'ont vu, il est très simple avec ce système de savoir qui est en ligne, combien de personnes connectés, combien d'invités.

Combien de personnes connectés :
Code PHP :
<?php 
$sql
= "SELECT COUNT(uid) AS total
FROM sessions WHERE login=1"
;

$query = mysql_query($sql);
$return = mysql_fetch_assoc($query);
$user_online = $return['total'];



En espérant que ce tutoriel vous aidera Smile


Discussion autour de ce tutoriel


OncleJames