使用数据库的方式来自定义存储用户session信息

<?php        
    //用户自定义session类,使用数据库数据表的方式来存储session信息
    
class DBSession{
    private static $pdo;            //全局的pdo对象
    private static $utime;            //当前时间    
    private static $maxlifetime;    //文件最大存在时间
    private static $sip;            //用户的ip地址
    private static $uagent;            //用户使用的浏览器
    
    //自定义用户开启session的方式
    public static function start(PDO $pdo){
        self::$pdo=$pdo;
        self::$utime=time();
        self::$maxlifetime=ini_get('session.gc_maxlifetime');
        self::$sip='192.168.1.100';
        self::$uagent='IE';
        
    //将用户自定义session生命周期的方法注册到web服务器中
    session_set_save_handler(
                            array(__CLASS__,'open'),
                            array(__CLASS__,'close'),
                            array(__CLASS__,'read'),
                            array(__CLASS__,'write'),
                            array(__CLASS__,'destroy'),
                            array(__CLASS__,'gc')    
                            );
        session_start();
    }
    //用户自定义session生命周期的方法如下:
    public static function open($path,$name){
        
        return true;
    }
    
    public static function read($sid){
        $sql="select * from session where sid=?";
        $stmt=self::$pdo->prepare($sql);
        $stmt->execute(array($sid));
        $result=$stmt->fetch(PDO::FETCH_ASSOC);
        //如果查询结果为空,则返回空字符串;
        if(!$result){
            return '';
        }
        //如果查询结果为过期,则删除此条session结果
        if($result['utime']<self::$utime-self::$maxlifetime){
            self::destroy($sid);
            return '';
        }
        //如果用户换了ip或换了浏览器
        if($result['sip'] != self::$sip || $result['uagent'] != self::$uagent) {
            self::destroy($sid);
            return '';
        }        
            
    }
    
    
    public static function write($sid,$data){
    //查询数据表中是否已经存在同样id名的数据
        $sql='select * from session where sid=?';
        $stmt=self::$pdo->prepare($sql);
        $stmt->execute(array($sid));
        $result=$stmt->fetch(PDO::FETCH_ASSOC);
    if($result){
        //如果查询出来的数据和之前一样没更改则不执行以下操作,或者在指定时间10秒之后更新
        if(($result['sdata']!=$data)||($result['utime']+10<self::$utime)){
                //如果查询有同样的结果,则更新session表而不重新插入session内容
                $sql="update session set utime=?,sdata=? where sid=? ";
                $stmt=self::$pdo->prepare($sql);
                $stmt->execute(array(self::$utime,$data,$sid));
            }    
        }else{
            
    //插入数据到已经创建好的session数据表中
            //如果用户有更新session内容

            if(!empty($data)){
                $sql="insert into session(sid,utime,sdata,sip,uagent)values(?,?,?,?,?)";
    
                $stmt=self::$pdo->prepare($sql);
    
                $stmt->execute(array($sid,self::$utime,$data,self::$sip,self::$uagent));
            }
    }
}
    
    public static function destroy($sid){
        $sql='delete from session where sid=?';
        $stmt=self::$pdo->prepare($sql);
        return $stmt->execute(array($sid));
    }

    public static function close(){
        return true;        
    }
    
    public static function gc($maxlifetime){
    //如果文件已经过期则删除该条session记录    
        $sql='delete from session where utime<?';
        $stmt=self::$pdo->prepare($sql);
        return $stmt->execute(array(self::$utime-self::$maxlifetime));    
    }

}
    //start方法参数中传入一个已经连接上数据库的PDO对象
    DBSession::start($pdo);    
?>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值