<?php /** *session.php *danutz0501 *@copyright 2013 **/ //defined('BASE_PATH')||(header("HTTP/1.1 403 Forbidden")&die('403 - Acces direct interzis.')); class session{ private $db, $table_name = 'session_data', $session_name = 'PDOSESSID', $session_litetime = 1440; private static $instance = null; public static function init(PDO $pdo, $table_name = null, $session_name = null, $session_lifetime = null){ if(self::$instance == null) self::$instance = new self($pdo, $table_name, $session_name, $session_lifetime); return self::$instance; } private function __construct($pdo, $table_name, $session_name, $session_lifetime){ $this->db = $pdo; $this->table_name = (is_null($table_name)) ? $this->table_name : $table_name; $this->session_name = (is_null($session_name)) ? $this->session_name : $session_name; $this->session_litetime = (is_null($session_lifetime)) ? $this->session_litetime : $session_lifetime; session_set_save_handler( [$this, 'open'], [$this, 'close'], [$this, 'read'], [$this, 'write'], [$this, 'destroy'], [$this, 'gc'] ); register_shutdown_function('session_write_close'); ini_set('session_auto_start', 0); ini_set('session.cookie_httponly',1); ini_set('session.use_only_cookies',1); ini_set('session.gc_probability', 25); ini_set('session.gc_divisor', 100); ini_set('session.gc_maxlifetime', $this->session_litetime); session_name($this->session_name); session_start(); $this->regenerate_id(); } private function __clone(){} public function open($save_path, $session_name){ return true; } public function close(){ $this->gc($this->session_litetime); return true; } public function read($session_id){ $session = $this->fetch_session($session_id); return ($session === false) ? false : $session['data']; } public function write($session_id, $session_data){ $session = $this->fetch_session($session_id); if($session === false) $stmp = $this->db->prepare('INSERT INTO '.$this->get_table().' (id, data, unixtime) VALUES (:id, :data, :time)'); else $stmp = $this->db->prepare('UPDATE '.$this->get_table().' SET data = :data, unixtime = :time WHERE id = :id'); $stmp->execute([':id' => $session_id, ':data' => $session_data, ':time' => time()]); } public function destroy($session_id){ $stmp = $this->db->prepare('DELETE FROM '.$this->get_table().' WHERE id = :id'); $stmp->execute([':id' => $session_id]); } public function gc($session_lifetime){ $stmp = $this->db->prepare('DELETE FROM '.$this->get_table().' WHERE unixtime < :time'); $stmp->execute([':time' => (time() - (int) $session_lifetime)]); } private function get_table(){ $table = $this->db->quote($this->table_name); return ($table) ? $table : $this->table_name; } private function regenerate_id(){ $old_session = session_id(); session_regenerate_id(); $new_session = session_id(); $stmp = $this->db->prepare('UPDATE '.$this->get_table().' SET id = :new_id WHERE id = :old_id'); $stmp->execute([':new_id' => $new_session, ':old_id' => $old_session]); } private function fetch_session($session_id){ $smtp = $this->db->prepare("SELECT id, data FROM ".$this->get_table()." WHERE id = :id AND unixtime > :unixtime"); $smtp->execute(['id' => $session_id, 'unixtime' => (time() - (int) $this->session_litetime)]); $session = $smtp->fetchAll(); return empty($session) ? false : $session[0]; } public static function set($key, $value){ if(!self::check_dot($key)) $_SESSION[$key] = $value; else self::set_dot($_SESSION, $key, $value); } public static function get($key){ if(!self::check_dot($key)) return (isset($_SESSION[$key])) ? $_SESSION[$key] : false; else return self::get_dot($_SESSION, $key); } private static function set_dot(&$root, $key, $value){ $keys = explode('.', $key); while(count($keys) > 1) { $key1 = array_shift($keys); if(!isset($root[$key1])) { $root[$key1] = []; } $root = &$root[$key1]; } $key1 = reset($keys); $root[$key1] = $value; } private static function get_dot(&$root, $key){ foreach(explode('.', $key) as $key1){ if(!is_array($root) || !array_key_exists($key1, $root)) return false; $root = &$root[$key1]; } return $root; } public static function delete(){ $_SESSION = []; if(isset($_COOKIE[session_name()])){ $params = session_get_cookie_params(); setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], $params['httponly']); } session_destroy(); } private static function check_dot($val){ return (bool) (strpos($val, '.')) ? true : false; } public static function check_data($key, $val){ foreach($key as $k){ if(!array_key_exists($k, $_SESSION) || $_SESSION[$k] != array_shift($val)) return false; } return true; } } i just want some opinions about my session class. How bad is it? What can i improve and what's wrong about my class. I am trying to use a dot syntax for writing multi dimensional arrays. PS: gtranslate, sorry for my grammar errors.