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 相关文章推荐
PHP4.04简明安装
Oct 09 PHP
php array_slice函数的使用以及参数详解
Aug 30 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
php通过正则表达式记取数据来读取xml的方法
Mar 09 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
Mar 21 PHP
php 输入输出流详解及示例代码
Aug 25 PHP
PHP isset()与empty()的使用区别详解
Feb 10 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
May 23 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
php实现可逆加密的方法
2015/08/11 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
jQuery 表格工具集
2010/04/25 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
Python psutil模块简单使用实例
2015/04/28 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
浅析Python 序列化与反序列化
2020/08/05 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
加拿大最大的书店:Indigo
2017/01/01 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
安全生产月标语
2014/10/07 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
通报表扬范文
2015/01/17 职场文书
质量负责人岗位职责
2015/02/15 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书