当前位置:首页 > PHP教程 > php会话 > 列表

php实现将Session写入数据库

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-14 11:17:35 浏览: 评论:0 

这篇文章主要介绍了php实现将Session写入数据库的相关资料,需要的朋友可以参考下,使用session_set_save_handler()函数,将Session的内容写入数据库。

  1. <?php 
  2.   /* 
  3.   *@author  Fahy 
  4.   *数据库为mysql, 
  5.   *数据库名为session,表名为session, 
  6.   *表中字段包括PHPSESSID,update_time,client_ip,data 
  7.   */ 
  8.   class Session{ 
  9.     private static $handler = null; 
  10.     private static $ip = null; 
  11.     private static $lifetime = null; 
  12.     private static $time = null; 
  13.       
  14.     //配置静态变量 
  15.     private static function init($handler){ 
  16.       self::$handler = $handler;    //获取数据库资源 
  17.       self::$ip = !emptyempty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"]:'unkonw';    //获取客户端ip 
  18.       self::$lifetime = ini_get('session.gc_maxlifetime');    //获取session生命周期 
  19.       self::$time = time();    //获取当前时间 
  20.     } 
  21.     //调用session_set_save_handler()函数并开启session 
  22.     static function start($pdo){ 
  23.       self::init($pdo); 
  24.       session_set_save_handler( 
  25.         array(__CLASS__,'open'), 
  26.         array(__CLASS__,'close'), 
  27.         array(__CLASS__,'read'), 
  28.         array(__CLASS__,'write'), 
  29.         array(__CLASS__,'destroy'), 
  30.         array(__CLASS__,'gc'
  31.       ); 
  32.       session_start(); 
  33.     } 
  34.       
  35.     public static function open($path,$name){ 
  36.       return true; 
  37.     } 
  38.     public static function close(){ 
  39.       return true; 
  40.     } 
  41.       
  42.     //查询数据库中的数据 
  43.     public static function read($PHPSESSID){ 
  44.       $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"
  45.       $stmt = self::$handler->prepare($sql); 
  46.       $stmt->execute(array($PHPSESSID)); 
  47.       if(!$result = $stmt->fetch(PDO::FETCH_ASSOC)){ 
  48.         return ''
  49.       } 
  50.       if(self::$ip == $result['client_ip']){ 
  51.         self::destroy($PHPSESSID); 
  52.         return ''
  53.       } 
  54.       if(($result['update_time']+self::$lifetime)<self::$time){ 
  55.         self::destroy($PHPSESSID); 
  56.         return ''
  57.       } 
  58.       return $result['data']; 
  59.     } 
  60.     /* 
  61.     *首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据 
  62.     */ 
  63.     //将session写入数据库中,$data传入session中的keys和values数组 
  64.     public static function write($PHPSESSID,$data){ 
  65.       $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"
  66.       $stmt = self::$handler->prepare($sql); 
  67.       $stmt->execute(array($PHPSESSID)); 
  68.         
  69.       if($result=$stmt->fetch(PDO::FETCH_ASSOC)){         
  70.         if($result['data'] != $data || self::$time > ($result['update_time']+30)){ 
  71.           $sql = "update session set update_time=?,data=? where PHPSESSID = ?"
  72.           $stmt = self::$handler->prepare($sql); 
  73.           $stmt->execute(array($self::$time,$data,$PHPSESSID)); 
  74.         } 
  75.       }else
  76.         if(!emptyempty($data)){ 
  77.           try{ 
  78.             $sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)"
  79.           }catch(PDOException $e){ 
  80.             echo $e->getMessage(); 
  81.           } 
  82.           $sth = self::$handler->prepare($sql); 
  83.           $sth->execute(array($PHPSESSID,self::$time,self::$ip,$data)); 
  84.         } 
  85.       } 
  86.       return true; 
  87.     } 
  88.       
  89.     public static function destroy($PHPSESSID){ 
  90.       $sql = "delete from session where PHPSESSID = ?"
  91.       $stmt = self::$handler->prepare($sql); 
  92.       $stmt->execute(array($PHPSESSID)); 
  93.       return true; 
  94.     } 
  95.     public static function gc($lifetime){ 
  96.       $sql = "delete from session where update_time<?"
  97.       $stmt = self::$handler->prepare($sql); 
  98.       $stmt->execute(array(self::$time-$lifetime)); 
  99.       return true; 
  100.     } 
  101.   } 
  102.   //使用PDO连接数据库 
  103.   try{ 
  104.     $pdo = new PDO("mysql:host=localhost;dbname=session","root","hwj193"); 
  105.   }catch(PDOException $e){ 
  106.     echo $e->getMessage(); 
  107.   } 
  108.   //传递数据库资源 
  109.   Session::start($pdo); 

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

Tags: Session

分享到: