PHP将session信息存储到数据库的类实例


Posted in PHP onMarch 04, 2015

本文实例讲述了PHP将session信息存储到数据库的类。分享给大家供大家参考。具体分析如下:

SessionHandlerInterface接口是PHP内置的接口,直接实现就行了
具体可以看php手册关于session_set_save_handler函数的解释!

PHP代码如下:

/**

* session信息存储到数据库的类

* 表结构:

* CREATE TABLE IF NOT EXISTS `sessioninfo` (

*  `sid` varchar(255) NOT NULL,

*  `value` text NOT NULL,

*  `expiration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

*  PRIMARY KEY (`sid`)

* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

*/

class MySessionHandler implements SessionHandlerInterface {

    /**

    * @access private

    * @var object 数据库连接

    */

    private $_dbLink;

    /**

    * @access private

    * @var string 保存session的表名

    */

    Private $_sessionTable;

    /**

    * @access private

    * @var string session名

    */

    private $_sessionName;

    /**

    * @const 过期时间

    */

    const SESSION_EXPIRE = 10;

    public function __construct($dbLink, $sessionTable) {

        if(!is_object($dbLink)) {

            return false;

        }

        $this->_dbLink = $dbLink;

        $this->_sessionTable = $sessionTable;

    }

    /**

    * 打开

    * @access public

    * @param string $session_save_path 保存session的路径

    * @param string $session_name session名

    * @return integer

    */

    public function open($session_save_path, $session_name) {

        $this->_sessionName = $session_name;

        return 0;

    }

    /**

    * 关闭

    * @access public

    * @return integer

    */

    public function close() {

        return 0;

    }

    /**

    * 关闭session

    * @access public

    * @param string $session_id session ID

    * @return string

    */

    public function read($session_id) {

        $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = {$session_id} AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";

        $result = $this->_dbLink->query($query);

        if(!isset($value) || empty($value)) {

            $value = "";

            return $value;

        }

        $this->_dbLink->query("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = {$session_id}");

        $value = $result->fetch_array();

        $result->free();

        return $value['value'];

    }

    /**

    * 写入session

    * @access public

    * @param string $session_id session ID

    * @param string $session_data session data

    * @return integer

    */

    public function write($session_id, $session_data) {

        $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";

        $result = $this->_dbLink->query($query);

        $result = $result->fetch_array();

        if(!empty($result)) {

            $result = $this->_dbLink->query("UPDATE {$this->_sessionTable} SET value = {$session_data} WHERE sid = {$session_id}");

        }

        else{

            $result = $this->_dbLink->query("INSERT INTO {$this->_sessionTable} (sid, value) VALUES ('{$session_id}', '{$session_data}')");

        }

        if($result){

            return 0;

        }

        else{

            return 1;

        }       

    }

    /**

    * 销魂session

    * @access public

    * @param string $session_id session ID

    * @return integer

    */

    public function destroy($session_id) {

        $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE sid = '{$session_id}'");

        if($result){

            return 0;

        }

        else{

            return 1;

        }

    }

    /**

    * 垃圾回收

    * @access public

    * @param string $maxlifetime session 最长生存时间

    * @return integer

    */

    public function gc($maxlifetime) {

        $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE UNIX_TIMESTAMP(expiration) < UNIX_TIMESTAMP(NOW()) - " . self::SESSION_EXPIRE);

        if($result){

            return 0;

        }

        else{

            return 1;

        }

    }

}

$dbLink = new mysqli("localhost", "root", "root", "test");

$sessionTable = "sessioninfo";

$handler = new MySessionHandler($dbLink, $sessionTable);

session_set_save_handler($handler);

session_start();

$_SESSION['name'] = "test";

echo $_SESSION["name"];

//session_destroy();

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
无数据库的详细域名查询程序PHP版(3)
Oct 09 PHP
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
php使用curl获取header检测开启GZip压缩的方法
Aug 15 PHP
PHP获取对象属性的三种方法实例分析
Jan 03 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
php中try catch捕获异常实例详解
Aug 06 PHP
PHP哈希表实现算法原理解析
Dec 11 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 17 PHP
php微信支付之APP支付方法
Mar 04 #PHP
php支付宝手机网页支付类实例
Mar 04 #PHP
php银联网页支付实现方法
Mar 04 #PHP
php随机抽奖实例分析
Mar 04 #PHP
php二维数组合并及去重复的方法
Mar 04 #PHP
php中get_cfg_var()和ini_get()的用法及区别
Mar 04 #PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 #PHP
You might like
如何给phpadmin一个保护
2006/10/09 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
2007/01/02 PHP
php递归列出所有文件和目录的代码
2008/09/10 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
php去掉文件前几行的方法
2015/07/29 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
微信小程序绘制半圆(弧形)进度条
2020/11/18 Javascript
python实现DES加密解密方法实例详解
2015/06/30 Python
Python实现选择排序
2017/06/04 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
关于python写入文件自动换行的问题
2018/06/23 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
酒吧创业计划书
2014/01/18 职场文书
2014年医务科工作总结
2014/12/18 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript