<?php
// ------------------------------------------------------------------------- //
// Un exemple complet de gestion des sessions via une base de données. //
// ------------------------------------------------------------------------- //
// Auteur: Frédéric Bouchery //
// Email: frederic.bouchery@consultant.com //
// Web: http://www.cybergroupe.net/ //
// ------------------------------------------------------------------------- //
?>
<?php
// --------------------------------------------------------------------------
// exemple.php3
// --------------------------------------------------------------------------
require 'database.class.php3';
require 'session.class.php3';
require 'config.inc.php3'; // Là où vous avez les paramètres de connexion
ConnectToDataBase($mysqlserveur,$mysqlloggin,$mysqlpassword,$mysqlmaindb);
$session = new session($sid);
if($toto = $session->Get('toto')) echo "la valeur de toto est : $toto";
else
{
$session->Set('toto','fred');
$session->SaveSession();
echo '<a href="exemple.php3?sid='.$sid.'">tester</a>';
}
/*
il est possible d'avoir toute les variables de sessions avec
extract($session->session); ->session étant le tableau des variables de session.
si session = array('toto'=>'fred','membre'=>'1','login'=>'george', 'pass'=>'mémé');
on aurra :
$toto = 'fred';
$membre = 1;
$login = 'george';
$pass = 'mémé';
*/
?>
<?php
// --------------------------------------------------------------------------
// database.class.php3
// --------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
// Script développé par F. Bouchery [frederic.bouchery@consultant.com] //
// Ce script est entièrement libre de droits, mais je vous demanderai de //
// laisser ce commentaire. Si vous voulez apporter des modifs intéressantes, //
// mailer moi le résultat. Merci. //
///////////////////////////////////////////////////////////////////////////////
define('DATABASE_CLASS_INCLUDED',1);
// Fonction de connexion à la base. Il faut l'appeler au tout début !
// Si vous avez déjà défini une fonction Erreur_mySQL, elle sera utilisé si
// nécessaire.
function ConnectToDataBase($mysqlserveur,$mysqlloggin,$mysqlpassword,$mysqlmaindb)
{
if(!@mysql_connect($mysqlserveur,$mysqlloggin,$mysqlpassword) ||
!@mysql_select_db($mysqlmaindb)):
if(function_exists('Erreur_mySQL'))
Erreur_mySQL('Pendand la connexion à la base');
else echo 'Erreur de connexion à la base';
exit;
endif;
}
// Classe utilisée pour effectuer des requêtes à une base de données mySQL
// Si vous utilisez une autre base, il faut modifier cette classe
class query
{
var $result = 0;
var $row = array();
// Effectue une requête
function query($query = '')
{
if($query && (!$this->result = mysql_query($query))):
if(function_exists( 'Erreur_mySQL'))
Erreur_mySQL( "Erreur pendant la requête : $query");
else echo "Erreur pendant la requête : $query";
exit;
endif;
}
// donne le nombre d'enregistrement généré par la requête
function count()
{
return @mysql_num_rows($this->result);
}
// Replace le pointeur d'enregistrement au début (pas très utilisé !)
function reset()
{
@mysql_data_seek($this->result,0);
}
// Récupère l'enregistrement suivant dans la base sous forme de tableau quand
// il n'y a pas de paramètre. Sinon, c'est la valeur du champ lui même.
// si l'appel n'a jamais été fait, c'est le premier enregistrement
function fetch($champ = '')
{
$this->row = @mysql_fetch_array($this->result);
return $champ?$this->row[$champ]:$this->row;
}
// Donne la valeur du champ.
// ATTENTION: Le pointeur d'enregistrement n'est pas incrémenté
// si vous n'avez pas encore fait de fetch(), cette
// fonction ne renvoie rien !
function Get($champ)
{
return $this->row[$champ];
}
// Donne la valeur du dernier champ autoincrémenté
// Si une requête dans un autre objet a été faite avant
// cette fonction retourne la valeur de cet objet
function Get_Auto()
{
return mysql_insert_id();
}
}
?>
<?
// --------------------------------------------------------------------------
// session.class.php3
// --------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
// Script développé par F. Bouchery [frederic.bouchery@consultant.com] //
// Ce script est entièrement libre de droits, mais je vous demanderai de //
// laisser ce commentaire. Si vous voulez apporter des modifs intéressantes, //
// mailer moi le résultat. Merci. //
///////////////////////////////////////////////////////////////////////////////
define( 'SESSION_CLASS_INCLUDED',1);
// Structure de la table des sessions
/*
CREATE TABLE sessions (
sid varchar(32) NOT NULL,
expire int(11),
session text NOT NULL,
PRIMARY KEY (sid));
*/
// On utilise la classe "query". Si elle n'est pas déjà inclue, c'est que la
// base de données n'est pas connecté.
if(!defined( 'DATABASE_CLASS_INCLUDED'))
die( 'Vous avez oubliez de vous connecter à la base de données');
class session
{
var $duree_session = 3600; // Durée de vie d'une session en seconde
var $session = array(); // Tableau de variables de session
var $sid; // Numéro de session (chaîne de 32 caractères)
var $nouveau_sid = false; // Cette variable est à vrai si il a fallu générer
// un nouveau sid
// Constructeur de la classe
function session(&$sid)
{
// Suppression des "vieilles" sessions
$query = new query( 'DELETE FROM sessions WHERE expire < UNIX_TIMESTAMP()');
if($sid):
// il y a un numéro de sid, il faut vérifier si il existe dans la base
$query->query( "SELECT * FROM sessions WHERE sid = '$sid'");
if($query->count()):
// le sid existe dans la base, il faut maintenant récupérer les données
// de session
if($session = $query->fetch( 'session'))
$this->session = unserialize($session);
else $this->session = array();
// Enfin, il faut repousser la date d'expiration
$sql = "UPDATE sessions SET expire = UNIX_TIMESTAMP()+ $this->duree_session";
$sql .= "WHERE sid='$sid'";
$query->query( $sql );
else:
// le sid n'existe pas dans la base
$sid = '';
endif;
endif;
if(!$sid):
$this->session = array();
$this->nouveau_sid = true;
// Comme on n'a pas de sid, il faut en générer un autre
// Il faut vérifier que le n° de session n'existe pas, même si
// statistiquement c'est difficile !
// Ne jamais faire confiance aux statistiques ;)
do
{
// génération du n° de session (sid)
$sid = md5(uniqid(rand()));
// recherche dans la base ce n°
$query->query( "SELECT * FROM sessions WHERE sid = '$sid'");
} while($query->count());
// insertion dans la base du n° de session avec une date d'expiration.
$sql = "INSERT INTO sessions (sid,expire) ";
$sql .= "VALUES ('$sid',UNIX_TIMESTAMP() + $this->duree_session)";
$query->query( $sql );
endif;
$this->sid = $sid;
}
// Sauvegarde des variables de session dans la base
function SaveSession()
{
// si il n'y a rien dans le tableau, il est inutile de sérialiser, on perd
// de la place
if($this->session) $data = addslashes(serialize($this->session));
else $data = '';
// Enregistrement dans la base des données "sérialisées"
$sql = "UPDATE sessions SET session = '$data' WHERE sid='$this->sid'";
$query = new query( );
}
// Ecrire ou modifier une donnée de session
function Set($key, $value)
{
$this->session[$key] = $value;
}
// récupérer une donnée de session
function Get($key)
{
return $this->session[$key];
}
// Suppression d'une donnée de session
function delete($key)
{
unset $this->session[$key];
}
// Suppression de toutes les données de session
function Clear()
{
$this->session = array();
}
}
?>
<?php
// --------------------------------------------------------------------------
// config.inc.php3
// --------------------------------------------------------------------------
$mysqlserveur = 'le_serveur';
$mysqlloggin = 'login';
$mysqlpassword = 'pass';
$mysqlmaindb = 'la_base';
?>