[php5] classe de session

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 737 fois - Téléchargée 30 fois


Contenu du snippet

Voila, je voulais voir comment ca faisait de se substituer à session_start(), eh bien c'est chose faite !
Cette petite classe qui utilise MySQL au passage permet de garder certaines variables lors de la session de votre membre.
Ici, pour l'exemple, je n'ai enregistré que la variable utilisateur (qui contient le login, le niveau d'accès, l'email etc...).
On peut facilement changer 2-3 trucs pour que cette classe sauvegarde autre chose.

L'ID de session peut soit passer par cookies, soit par l'url (GET ou POST).

Bref, c'est tout simple, j'ai pas voulu faire trop compliqué, et il se peut que j'ai pu faire quelques erreurs !

Source / Exemple :


<?php
class session {

 private $db;               // Classe de connection à la DB	(La lecture y est facile)
 private $_option;	        // Tableau de configuration des sessions.
 
 public $sid;			    // ID de session
 public $vars;				// Variable de session.
 public $ip = '127.0.0.1';	// IP (optionnel)
 
 
// Initialise la connection à la base de donnée.
// Intialise le tableau de configuration des sessions.
// Initialise le buffer de sortie en fonction de l'utilité des cookies. 
 public function __construct() {
  
  $this->db = new db;
  $this->_option = array();
  
  $this->_option['timeout'] = time() - 3600;
  $this->_option['cookie_time'] = time() + 3600;
  $this->_option['sid_size'] = 26;
  $this->_option['use_cookie'] = true;
  
  $this->sid = $this->search_sid();
  
   if ( $this->sid === NULL || !this->check_session() ) {
        $this->sid = $this->generate_sid(); 
		$this->new_session();
   }	
   
   if ( !$this->_option['use_cookie'] ) {
         ob_start( array (  & $this , 'callback' ) );
   } else {
         ob_start();
   }
   
 }

// Récupère l'ID de session via COOKIE, GET, ou POST.
// Le cas échéant, ne rien retourner.
 private function search_sid() {
 
   if ( isset($_COOKIE['session']) && strlen($_COOKIE['session']) === $this->_option['sid_size'] ) {
		$this->_option['method'] = 'COOKIE';
		$this->_option['use_cookie'] = true;
        return $_COOKIE['session'];
   } elseif ( isset($_GET['sid']) && strlen($_GET['sid']) === $this->_option['sid_size'] ) {
        $this->_option['method'] = 'GET';
        return $_GET['sid'];
   } elseif ( isset($_POST['sid']) && strlen($_POST['sid']) === $this->_option['sid_size'] ) {
        $this->_option['method'] = 'POST';
        return $_POST['sid'];
   } else {
        $this->_option['method'] = 'NEW';
        return NULL;
   }
 
 }

// Génère un indentifiant de session.
 private function generate_sid() {
  
  srand ((float) microtime() * 10000000);
  return substr( md5( rand(0,9999999) ), 0, $this->_option['sid_size'] );
  
 }

// Vérifie la présence d'une session existante dans la base de donnée.
 private function check_session() {
  
  $sql = "SELECT array FROM maj_session WHERE sid = '".$this->sid."' ";
  $query = $this->db->query($sql);
   if ( $this->db->num_rows($query) === 1 ) {
        $data = $this->db->fetch_row($query);
		 if ( $data[0] !== NULL ) { 
 		      $this->vars = unserialize($data[0]);
		 } 
		return true;
   } else {
        return false;
   }
   
 }

// Créer une nouvelle session dans la base de donnée.
 private function new_session() {
 
  $this->_option['method'] = 'NEW';

  $sql = "INSERT INTO maj_session (sid, ip, last_access)
          VALUES ('".$this->sid."', '".$this->ip."', '".time()."') "; 
  $this->db->query($sql);
  
  setCookie( 'session', $this->sid, $this->_option['cookie_time'] );
   if ( isset($_COOKIE['session']) ) {
        $this->_option['use_cookie'] = true;
   }

 }

// Supprime les anciennes sessions avec un timeout trop important.
 private function flush_sessions() {

  $sql = "DELETE FROM maj_session WHERE last_access < '".$this->_option['timeout']."' ";
  $this->db->query($sql);
		
 } 
 
// Update la session en cours.
// Vide le buffer. 
 public function __destruct() {
 
  $sql = "UPDATE maj_session SET last_access = '".time()."' ";
   if ( isset($this->vars) ) {
        $sql .= ", array = '".serialize($this->vars)."' ";
   }
  $sql .=" WHERE sid = '".$this->sid."' ";
  $this->db->query($sql);
  
  $this->flush_sessions();
  ob_end_flush();
  
 }

// Affiche les informations de session. 
 public function __ToString() {
 
  $var = 'ID session : '.$this->sid.'<br/>';
  $var .='Type : '.$this->_option['method'].'<br/>';
   foreach ( $this->vars as $key=>$val ) {
        $var .= 'Key : '.$key.' - Val : '.$val.' <br/><br/>';
   }
  return $var;
  
 }

// Fonction de callback pour parser les <a></a>
// Fonction incomplète. 
 public static function callback($buffer) {
  return $buffer;
 }

}
?>
<?php
// Page index.php par exemple

$session = new session;
// Tout se fait sans aucun appèl de méthode.
$session->vars['youpi'] = 'yes';
?>
<?php
// Page 2.php par exemple
$session = new session;
// Récupère la session toute seule :)
echo $session->vars['youpi'];
// affiche 'yes'
?>

Conclusion :


Si y'a d'autres questions, ne pas hésiter !

Update : Il me manque le parsing des balises <a></a>. J'ai un peu de mal avec les expressions régulières, et je n'ai plus trop le temps pour chercher en ce moment. Je m'en occuperai quand j'aurais un peu plus de temps. Si quelqu'un trouve, qu'il n'hésite pas à me contacter.

A voir également

Ajouter un commentaire Commentaires
yogam
Messages postés
1
Date d'inscription
vendredi 31 décembre 2004
Statut
Membre
Dernière intervention
4 mai 2009

4 mai 2009 à 19:05
FHX pourrais tu m'envoyer ta classe DB stp, je débute et je suis un peu perdu.
Merciiiiii
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

25 déc. 2005 à 21:31
je travaille sur la fonction callback... j'ais quasiement finit pour les liens après j'attaque les form... mais comme j'ais plusieurs choses sur le feu je ne peux te dire quand j'aurais finit... je te tiendrais au courant FhX... .. . ;o)

@ tchaOo°
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
17 nov. 2005 à 17:57
Jl'ai updaté sur http://www.codes-php.net/source-13--php5-classe-de-sessions.php
Etant donné que ca rame comme pas possible sur PHPCS. En attendant un moment de la journée un peu plus calme :)
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
13 nov. 2005 à 19:57
Oups, j'ai oublié un truc :

Pour ajouter un truc en session :
$session->vars['Variable'] = 'valeur';

Ca marche comme $_SESSION[], sauf que la, c'est :
$(nom_de_la_classe)->vars[].

Voila voila :) Ca évite principalement les accès aux disques via fichiers au niveau serveur.
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
9 nov. 2005 à 21:54
Ou je suis con, ou je suis vraiment à la rue :p
C'est incroyable comme c'est plus complexe que ce à quoi je m'attendais :/

Simplement pour récupérer 'http://www.google.com' de :
Google

Bah c'est pas gagné :o
Afficher les 23 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.