45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 编程代码 > 阅读资讯:php如何把Session写入数据库? php Session写入数据库的操作教程

php如何把Session写入数据库? php Session写入数据库的操作教程

2015-08-13 16:41:54 来源:www.45fan.com 【

php如何把Session写入数据库? php Session写入数据库的操作教程

使用session_set_save_handler()函数,将Session的内容写入数据库

<?php
 /*
 *@author Fahy
 *数据库为mysql,
 *数据库名为session,表名为session,
 *表中字段包括PHPSESSID,update_time,client_ip,data
 */
 class Session{
  private static $handler = null;
  private static $ip = null;
  private static $lifetime = null;
  private static $time = null;
  
  //配置静态变量
  private static function init($handler){
   self::$handler = $handler;  //获取数据库资源
   self::$ip = !empty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"]:'unkonw';  //获取客户端ip
   self::$lifetime = ini_get('session.gc_maxlifetime');  //获取session生命周期
   self::$time = time();  //获取当前时间
  }
  //调用session_set_save_handler()函数并开启session
  static function start($pdo){
   self::init($pdo);
   session_set_save_handler(
    array(__CLASS__,'open'),
    array(__CLASS__,'close'),
    array(__CLASS__,'read'),
    array(__CLASS__,'write'),
    array(__CLASS__,'destroy'),
    array(__CLASS__,'gc')
   );
   session_start();
  }
  
  public static function open($path,$name){
   return true;
  }
  public static function close(){
   return true;
  }
  
  //查询数据库中的数据
  public static function read($PHPSESSID){
   $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";
   $stmt = self::$handler->prepare($sql);
   $stmt->execute(array($PHPSESSID));
   if(!$result = $stmt->fetch(PDO::FETCH_ASSOC)){
    return '';
   }
   if(self::$ip == $result['client_ip']){
    self::destroy($PHPSESSID);
    return '';
   }
   if(($result['update_time']+self::$lifetime)<self::$time){
    self::destroy($PHPSESSID);
    return '';
   }
   return $result['data'];
  }
  /*
  *首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据
  */
  //将session写入数据库中,$data传入session中的keys和values数组
  public static function write($PHPSESSID,$data){
   $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";
   $stmt = self::$handler->prepare($sql);
   $stmt->execute(array($PHPSESSID));
   
   if($result=$stmt->fetch(PDO::FETCH_ASSOC)){    
    if($result['data'] != $data || self::$time > ($result['update_time']+30)){
     $sql = "update session set update_time=?,data=? where PHPSESSID = ?";
     $stmt = self::$handler->prepare($sql);
     $stmt->execute(array($self::$time,$data,$PHPSESSID));
    }
   }else{
    if(!empty($data)){
     try{
      $sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)";
     }catch(PDOException $e){
      echo $e->getMessage();
     }
     $sth = self::$handler->prepare($sql);
     $sth->execute(array($PHPSESSID,self::$time,self::$ip,$data));
    }
   }
   return true;
  }
  
  public static function destroy($PHPSESSID){
   $sql = "delete from session where PHPSESSID = ?";
   $stmt = self::$handler->prepare($sql);
   $stmt->execute(array($PHPSESSID));
   return true;
  }
  public static function gc($lifetime){
   $sql = "delete from session where update_time<?";
   $stmt = self::$handler->prepare($sql);
   $stmt->execute(array(self::$time-$lifetime));
   return true;
  }
 }
 //使用PDO连接数据库
 try{
  $pdo = new PDO("mysql:host=localhost;dbname=session","root","hwj193");
 }catch(PDOException $e){
  echo $e->getMessage();
 }
 //传递数据库资源
 Session::start($pdo);

以上所述就是本文的全部内容了,希望大家能够喜欢。


本文地址:http://www.45fan.com/bcdm/17658.html
Tags: PHP 写入 session
编辑:路饭网
推广内容
推荐阅读
热门推荐
推荐文章
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部