<?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';

?>