1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| abstract class SessionManager
{
public $session_name;
public $lifeTime = 3600;
public $id;
public $db;
abstract public function open($savePath, $sessName);
abstract public function close();
abstract public function read($sessID);
abstract public function write($sessID,$sessData);
abstract public function destroy($sessID);
abstract public function gc($sessMaxLifeTime);
public function __construct($mysqli)
{
$this->db = $mysqli;
if (!session_set_save_handler( array(&$this,'open'),
array(&$this,'close'),
array(&$this,'read'),
array(&$this,'write'),
array(&$this,'destroy'),
array(&$this,'gc') ) )
{
throw new Exception('Erreur lors de l\'init des sessions !');
}
session_start();
}
}
class SQLSessionManager extends SessionManager
{
public function __destruct()
{
session_write_close();
}
public function open($savePath, $sessName)
{
return true;
}
public function close()
{
$this->gc(ini_get('session.gc_maxlifetime'));
unset($this->db);
}
public function read($sessID)
{
$this->id = $sessID;
$res = $this->db->query("SELECT data FROM session WHERE id = '".$sessID."' AND expires > '".time()."'");
return ( ( $row = $res->fetch_row() ) !== FALSE ) ? $row[0] : ' ';
}
public function write($sessID,$sessData)
{
$this->id = $sessID;
$newExp = time() + $this->lifeTime;
$res = $this->db->query("INSERT INTO session (id, data, expires) VALUES ('".$sessID."', '".$sessData."', '".$newExp."') ON DUPLICATE KEY UPDATE data = '".$sessData."', expires = '".$newExp."'");
return TRUE;
}
public function destroy($sessID)
{
$res = $this->db->query("DELETE FROM session WHERE id = '".$sessID."'");
return ( $this->db->affected_rows === 1 ) ? TRUE : FALSE;
}
public function gc($sessMaxLifeTime)
{
$res = $this->db->query("DELETE FROM session WHERE ( UNIX_TIMESTAMP(expires) - UNIX_TIMESTAMP(NOW()) ) > '".$sessMaxLifeTime."' ");
return $this->db->affected_rows;
}
}
$session = new SQLSessionManager($link); |
Partager