您的位置:首页 > 数据库

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

2017-11-14 10:11 197 查看
<?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);    

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  session应用
相关文章推荐