php把session写入数据库示例

  

复制代码 代码如下:

  <?php

  class session_handler {

  protected $maxlifetime = null;

  protected $dbHandle = null;

  public $config = null;

  public static function init($args) {

  return new self($args);

  }

  public function __construct($args) {

  $this->config = $args;

  $this->maxlifetime = 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"));

  }

  public function open() {

  $this->link = mysqli_connect(

  $this->config['host'],

  $this->config['user'],

  $this->config['password'],

  $this->config['database']);

  mysqli_set_charset($this->link, "utf8");

  $sql = 'CREATE TABLE IF NOT EXISTS `%s` (

  `session_id` varchar(255) NOT NULL,

  `session_data` text,

  `session_expires` char(10) NOT NULL,

  PRIMARY KEY (`session_id`)

  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;';

  $sql = sprintf($sql, $this->config['table']);

  mysqli_query($this->link, $sql);

  return true;

  }

  public function close() {

  return true;

  }

  public function read($session_id) {

  if(empty($session_id)) return null;

  $sql = 'SELECT `session_data` AS `data` FROM `%s` WHERE `session_id` = "%s" AND `session_expires` > "%u"';

  $sql = sprintf($sql,

  mysqli_real_escape_string($this->link, $this->config['table']),

  mysqli_real_escape_string($this->link, $session_id),

  time());

  $result = mysqli_query($this->link, $sql);

  $row = mysqli_fetch_assoc($result);

  return $row['data'];

  }

  public function write($session_id, $session_data) {

  if(empty($session_id)) return null;

  $newExpires = time() + $this->maxlifetime;

  $sql = 'REPLACE INTO `%s` SET `session_id` = "%s", `session_data` = "%s", `session_expires` = "%u"';

  $sql = sprintf($sql,

  mysqli_real_escape_string($this->link, $this->config['table']),

  mysqli_real_escape_string($this->link, $session_id),

  mysqli_real_escape_string($this->link, $session_data),

  $newExpires);

  $result = mysqli_query($this->link, $sql);

  return mysqli_affected_rows($this->link);

  }

  public function destroy($session_id) {

  $sql = 'DELETE FROM `%s` WHERE `session_id` = "%s"';

  $sql = sprintf($sql,

  mysqli_real_escape_string($this->link, $this->config['table']),

  mysqli_real_escape_string($this->link, $session_id));

  $result = mysqli_query($this->link, $sql);

  return mysqli_affected_rows($this->link);

  }

  public function gc() {

  $sql = 'DELETE FROM `%s` WHERE `session_expires` < "%u"';

  $sql = sprintf($sql,

  mysqli_real_escape_string($this->link, $this->config['table']),

  time());

  $result = mysqli_query($this->link, $sql);

  return mysqli_affected_rows($this->link);

  }

  }

  class session {

  public static $collection = null;

  public static function open($clean = false, $token = false) {

  if($clean) ob_end_clean();

  if($token) session_id($token);

  session_start();

  self::$collection = $_SESSION;

  }

  public static function id() {

  $num_args = func_num_args();

  if($num_args) {

  $args = func_get_arg(0);

  return session_id($args);

  }else{

  return session_id();

  }

  }

  public static function get($name) {

  return isset($_SESSION[$name]) ? $_SESSION[$name] : null;

  }

  public static function set($name, $value) {

  $_SESSION[$name] = $value;

  return true;

  }

  public static function delete($name) {

  if(!isset($_SESSION[$name])) return null;

  unset($_SESSION[$name]);

  return true;

  }

  public static function destroy() {

  session_destroy();

  }

  }

  $config = array(

  "host"=> "127.0.0.1",

  "user"=> "root",

  "password"=> "123456",

  "database"=> "test",

  "charset"=> "utf8",

  "table"=> "user_session");

  session_handler::init($config);

  session::open();

  session::set("profile", array("id"=> 1, "user"=> "haowei", "vip-level"=> 6));