zoukankan      html  css  js  c++  java
  • 用session_set_save_handler函数实现将session保存在数据库中后session不能跨页面了

    <?php
    /*============================文件说明========================================
    @filename:     session.class.php
    @description:  数据库保存在线用户session,实现在线用户功能!
    @notice:       session过期时间一个小时,因为我们的站点是使用cookie(有效时间是1小时)登录。
    
                   因此我们只记录用户登录的时间,而不是刷新一次更新一次
    
                   删除数据库中session记录的动作发生在用户超时后执行这个文件或正常退出(session_destory)
    
    @database:     database:sessions  field:sessionid(char32),uid(int10),last_visit(int10)
    
    =============================================================================*/
    class session { 
        private $db; 
    	private $lasttime=3600;//超时时间:一个小时
    
        function session(&$db) { 
            $this->db = &$db;
            session_module_name('user'); //session文件保存方式,这个是必须的!除非在Php.ini文件中设置了
            session_set_save_handler( 
                array(&$this, 'open'), //在运行session_start()时执行
    
                array(&$this, 'close'), //在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行
    
                array(&$this, 'read'), //在运行session_start()时执行,因为在session_start时,会去read当前session数据
                array(&$this, 'write'), //此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
    
                array(&$this, 'destroy'), //在运行session_destroy()时执行
    
                array(&$this, 'gc') //执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc
            ); 
            session_start(); //这也是必须的,打开session,必须在session_set_save_handler后面执行
        } 
      
        function unserializes($data_value) { 
            $vars = preg_split( 
                '/([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)|/', 
                $data_value, -1, PREG_SPLIT_NO_EMPTY | 
                PREG_SPLIT_DELIM_CAPTURE 
            ); 
            for ($i = 0; isset($vars[$i]); $i++) { 
                $result[$vars[$i++]] = unserialize($vars[$i]); 
            } 
            return $result; 
        } 
    
        function open($path, $name) { 
            return true; 
        } 
        function close() { 
    	    $this->gc($this->lasttime);
            return true; 
        } 
       function read($SessionKey){
    	    $sql = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1"; 
    		$query =$this->db->query($sql);
    		if($row=$this->db->fetch_array($query)){
    		  return $row['uid'];
    		}else{
                return ""; 
    		}
    		 
       } 
        function write($SessionKey,$VArray) { 
    
    	   require_once(MRoot.DIR_WS_CLASSES .'db_mysql_class.php');
    	   $db1=new DbCom();
    	  // make a connection to the database... now
    	   $db1->connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);
    	   $db1->query("set names utf8");
    	   $this->db=$db1;
           $SessionArray = addslashes($VArray);
    		$data=$this->unserializes($VArray);	  
    	    	 
    		$sql0 = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1"; 
    		$query0 =$this->db->query($sql0);
    		if($this->db->num_rows($query0)<=0){
    			if (isset($data['webid']) && !empty($data['webid'])) { 
    			   $this->db->query("insert into `sessions` set `session_id` = '$SessionKey',uid='".$data['webid']."',last_visit='".time()."'");
    			} 		  
    			return true;
    		}else{
    			/*$sql = "update `sessions` set "; 
    			if(isset($data['webid'])){
    			$sql .= "uid = '".$data['webid']."', " ;
    			}
    			$sql.="`last_visit` = null " 
    				  . "where `session_id` = '$SessionKey'"; 
    				 
    			$this->db->query($sql); */
    			return true; 
    		}	
        } 
      function destroy($SessionKey) { 
         $this->db->query("delete from `sessions` where `session_id` = '$SessionKey'"); 
         return true; 
       } 
       function gc($lifetime) {
           $this->db->query("delete from `sessions` where unix_timestamp(now()) -`last_visit` > '".$this->lasttime."'");
           return true;
       } 
    
      
    } 
    ?>
    每天学习一点,日积月累最终会汇成大海!
  • 相关阅读:
    基于python的socket网络编程
    Python3报错:ModuleNotFoundError: No module named '_bz2'
    机器学习博客网站
    《Linux内核设计与实现》 读书笔记(4)--进程的调度
    k8s 简单入门
    docker 简单入门
    python3 教程
    .toml 文件简介
    编码规范
    python3 基本用法
  • 原文地址:https://www.cnblogs.com/viczhang/p/4339585.html
Copyright © 2011-2022 走看看