• 技术文章 >后端开发 >php教程

    php结合session操作数据库的方法

    墨辰丷墨辰丷2018-06-07 17:33:43原创1145
    本篇文章主要介绍php结合session操作数据库的方法,感兴趣的朋友参考下,希望对大家有所帮助。

    具体如下:

    <?php
    /**
     * session 数据库存储类
     */
    class Session {
     private static $session_id   = 0;
     private static $session_data  = array();
     private static $is_update   = FALSE;
     private static $is_del    = FALSE;
     private static $is_gc    = FALSE;
     private static $dbo    = NULL;  //数据库连接句柄
     private static $gc_max_time  = 1440;
     private static $table   = 'sessions';
     private static $pre_key   = 'weige';//session 密钥
     //捆绑使用哈
     private static $gc_rate_de  = 100;//代表分母
     private static $gc_rate_co  = 20;//代表分子
     private static $path   = '/';//保存路径
     private static $domain   = null; //域
     private static $secure   = false;//默认
     private static $httponly  = false;//默认
     /**
      * 获取数据库句柄 私有
      */
     private static function open() 
     {
      if (!self::$dbo) 
      {
       self::$dbo = Db::factory();
      }
      return TRUE;
     }
     /**
      * 设置
      * */
     public static function set($key, $val=NULL) 
     {
      self::open();
      $data = self::read();
      if ($data === FALSE)
      {
       $data = array();
      }
      if (!$val && is_array($key))
      {
       $data = $key;
      } 
      else if ($val && is_string($key))
      {
       $data[$key] = $val;
      }
      self::write($data);
      self::close();
     }
     /**
      *获取值 
      * 
      */
     public static function get($key=NULL) {
      self::open();
      self::$session_data = self::read();
      $ret = '';
      if (!$key) {
       $ret = self::$session_data;
      } else if(is_array(self::$session_data) && isset(self::$session_data[$key])) {
       $ret = self::$session_data[$key];
      }
      self::update(); 
      self::close();
      return $ret;
     }
     /**
      * 删除或者重置
      * */
     public static function del($key)
     {
      if (!self::$is_del) 
      {
       self::open();
       $val = self::read();
       if (isset($val[$key])) 
       {
        unset($val[$key]);
       }
       $session_id  = self::$session_id;
       $session_data  = serialize($val);
       $session_expire = TIME + self::get_gc_maxtime();
       self::$dbo->query("update ".self::$table." set value='$session_data', expiry='$session_expire' where session_id='$session_id'");
       self::close();
      }
      self::$is_del = TRUE;
     }
     /**
      * 销毁
      * 
      * */
     public static function destroy() 
     {
      $session_id   = self::get_session_id();
      $_COOKIE['WBSID'] = '';
      self::open();
      self::$dbo->query("delete from ".self::$table." where session_id='$session_id'");
      self::close();
     }
     /**
      * 读取 私有
      * */
     private static function read()
     {
      $session_id = self::$session_id;
      if (!$session_id) {
       $session_id = self::get_session_id();
      }
      if (!$session_id) return array();
      $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
      $client_ip = Fun::getIp();
      $session_expire = TIME - self::get_gc_maxtime();
      $rs = self::$dbo->fetchRow("select session_id, value, agent, ip from ".self::$table."
       where session_id='$session_id' and expiry>'$session_expire'");
      if (!$rs || $rs['agent'] != $user_agent || $rs['ip'] != $client_ip) 
      {
       return FALSE;
      }
      self::$session_id = $rs['session_id'];
      return unserialize($rs['value']);
     }
     /**
      * session 写入 私有
      * */
     private static function write(array $session_data) 
     {
      $session_id = self::$session_id;
      if (!$session_id)
      {
       $session_id = self::get_session_id();
      }
      $session_expire = TIME + self::get_gc_maxtime();
      $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? md5($_SERVER['HTTP_USER_AGENT']) : '';
      $client_ip  = Fun::getIp();
      $session_data = serialize($session_data);
      if (self::$session_id && self::$session_id === $session_id) 
      {
       self::$dbo->query("update ".self::$table." set value='$session_data', expiry='$session_expire', agent='$user_agent', ip='$client_ip' where session_id='$session_id'");
      } 
      else 
      {
       self::$session_id = $session_id = self::create_session_id();
       self::$dbo->query("insert into ".self::$table."(session_id, value, expiry, agent, ip) 
        values('$session_id', '$session_data', '$session_expire', '$user_agent', '$client_ip')");
      }
      return true;
     }
     /**
      * session 更新 私有
      * */
     private static function update() 
     {
      if (!self::$is_update) 
      {
       $session_id = self::$session_id;
       $session_expire = TIME + self::get_gc_maxtime();
       self::$dbo->query("update ".self::$table." set expiry='$session_expire' where session_id='$session_id'");
      }
      self::$is_update = TRUE;
     }
     private static function close() 
     {
      if (!self::$is_gc && mt_rand(1, self::$gc_rate_de)%self::$gc_rate_co == 0) 
      {
       self::gc();
      }
      self::$is_gc = TRUE;
     }
     /**
      * 过期session 清除 随机触发
      * */
     private static function gc() 
     {
      $session_expire = TIME - self::get_gc_maxtime();
       self::$dbo->query("delete from ".self::$table." where expiry<'$session_expire'");
     }
     private static function get_session_id() 
     {
      if (isset($_COOKIE['WBSID']) && strlen($_COOKIE['WBSID'])==32) 
      {
       $sid = $_COOKIE['WBSID'];
       setcookie('WBSID', $sid, TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
       return $sid;
      }
      return null;
     }
     private static function create_session_id() 
     {
      $sid = self::get_session_id();
      if (!$sid) 
      {
       $sid = Fun::getIp() . TIME . microtime(TRUE) . mt_rand(mt_rand(0, 100), mt_rand(100000, 90000000));
       $sid = md5(self::$pre_key . $sid);
       setcookie('WBSID', substr($sid, 0, 32), TIME + self::get_gc_maxtime(), self::$path, self::$domain, self::$secure, self::$httponly);
      }
      return $sid;
     }
     public static function get_gc_maxtime()
     {
      return self::$gc_max_time;
     }
    }

    总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

    相关推荐:

    PHP实现适配器模式的方法详解

    php实现页面纯静态的方法

    ThinkPHP实现批量删除栏目的方法

    以上就是php结合session操作数据库的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php session 数据库
    上一篇:php打乱数组二维数组多维数组的代码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • PHP编译器BPC6.0已发布,聊聊有哪些新功能吧!• 汇总有关PHP多进程开发面试常见问题(附答案)• php对称加解密的5个问答小结• 验证码的使用• php 不使用js实现页面跳转_php技巧
    1/1

    PHP中文网