首页 > 开发 > PHP > 正文

php实现将Session写入数据库

2024-05-04 22:35:45
字体:
来源:转载
供稿:网友

使用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);            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表