Répertoire de codes source

Classe pour gérer les sessions avec une base de données
déposé par scramatte
le 14/08/2007
nombre de visites : 8373

Cette classe permet de stocker vos sessions dans une base de données...

---- session.sql ----
 
CREATE TABLE `sessions` (
  `id` varchar(32) collate latin1_general_ci NOT NULL,
  `access` int(10) default NULL,
  `data` text collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
 
 
---- bootstrap (index.php) ----
...
 
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Session');
Zend_Loader::loadClass('Concentre_Session_SaveHandler_Db');
 
$params = array() /* paramètres de connexion a la base de données */
$db = Zend_Db::factory('PDO_MYSQL', $params );
 
Zend_Session::setSaveHandler(new Concentre_Session_SaveHandler_Db($db));
 
...
 
---- library/Concentre/Session/SaveHandler/Db.php ----
 
<?php
 
class Concentre_Session_SaveHandler_Db implements Zend_Session_SaveHandler_Interface {
 
	private $_session;
	public $maxTime;
	private $db;
 
	public function __construct($database) {
		$this->db = $database;
		$this->maxTime['access'] = time();
		$this->maxTime['gc'] = get_cfg_var('session.gc_maxlifetime');
 
		/*
		session_set_save_handler(array($this, '_open'),
			array($this, 'close'),
			array($this, 'read'),
			array($this, 'write'),
			array($this, 'destroy'),
			array($this, 'gc')
		);*/
 
		register_shutdown_function('session_write_close'); 
	}
 
	public function open($save_path, $name)
	{
		$this->gc( $this->maxTime['gc'] ); 
		return true;
	}
 
	public function close()
	{
		$this->gc($this->maxTime['gc']);
		return true;
	}
 
	public function read($id)
	{
		$allData = $this->db->fetchRow("SELECT `data` FROM `sessions` WHERE `id` =  :id",array('id' => $id));
		$hasData = (bool) $allData != null;
 
		return $hasData ? $allData['data'] : '';
	}
 
	public function write($id, $data)
	{
		$set = array(
			'id' => $id,
			'access' => $this->maxTime['access'],
			'data' => $data
 
		);
 
		$where = $this->db->quoteInto("`id` = ?", $id);
		$rows_affected = $this->db->update('sessions', $set, $where);
 
		if ($rows_affected != 1) {
			$rows_affected =  $this->db->insert('sessions', $set);
		}
 
		return $rows_affected;
	}
 
	public function destroy($id)
	{
		$where = $this->db->quoteInto("`id` = ?", $id);	
		return $this->db->delete('sessions', $where);
	}
 
 
	public function gc($max)
	{
		$old = ($this->maxTime['access'] - $max);
 
		$where = $this->db->quoteInto("`access` < ?", $old);	
		return $this->db->delete('sessions', $where);
 
	}
 
}
 
?>
Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages