Session保存到数据库的php类分享


Posted in PHP onOctober 24, 2011
<?php 
class SessionToDB 
{ 
private $_path = null; 
private $_name = null; 
private $_pdo = null; 
private $_ip = null; 
private $_maxLifeTime = 0; public function __construct(PDO $pdo) 
{ 
session_set_save_handler( 
array(&$this, 'open'), 
array(&$this, 'close'), 
array(&$this, 'read'), 
array(&$this, 'write'), 
array(&$this, 'destroy'), 
array(&$this, 'gc') 
); 
$this->_pdo = $pdo; 
$this->_ip = !empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null; 
$this->_maxLifeTime = ini_get('session.gc_maxlifetime'); 
} 
public function open($path,$name) 
{ 
return true; 
} 
public function close() 
{ 
return true; 
} 
public function read($id) 
{ 
$sql = 'SELECT * FROM session where PHPSESSID = ?'; 
$stmt = $this->_pdo->prepare($sql); 
$stmt->execute(array($id)); 
if (!$result = $stmt->fetch(PDO::FETCH_ASSOC)) { 
return null; 
} elseif ($this->_ip != $result['client_ip']) { 
return null; 
} elseif ($result['update_time']+$this->_maxLifeTime < time()){ 
$this->destroy($id); 
return null; 
} else { 
return $result['data']; 
} 
} 
public function write($id,$data) 
{ 
$sql = 'SELECT * FROM session where PHPSESSID = ?'; 
$stmt = $this->_pdo->prepare($sql); 
$stmt->execute(array($id)); 
if ($result = $stmt->fetch(PDO::FETCH_ASSOC)) { 
if ($result['data'] != $data) { 
$sql = 'UPDATE session SET update_time =? , date = ? WHERE PHPSESSID = ?'; 
$stmt = $this->_pdo->prepare($sql); 
$stmt->execute(array(time(), $data, $id)); 
} 
} else { 
if (!empty($data)) { 
$sql = 'INSERT INTO session (PHPSESSID, update_time, client_ip, data) VALUES (?,?,?,?)'; 
$stmt = $this->_pdo->prepare($sql); 
$stmt->execute(array($id, time(), $this->_ip, $data)); 
} 
} 
return true; 
} 
public function destroy($id) 
{ 
$sql = 'DELETE FROM session WHERE PHPSESSID = ?'; 
$stmt = $this->_pdo->prepare($sql); 
$stmt->execute(array($id)); 
return true; 
} 
public function gc($maxLifeTime) 
{ 
$sql = 'DELETE FROM session WHERE update_time < ?'; 
$stmt = $this->_pdo->prepare($sql); 
$stmt->execute(array(time() - $maxLifeTime)); 
return true; 
} 
} 
try{ 
$pdo = new PDO('mysql:host=localhost;dbname=rphp4zf', 'root','rickyfeng'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
new SessionToDB($pdo); 
} catch(PDOException $e) { 
echo 'Error: '.$e->getMessage(); 
}
PHP 相关文章推荐
php预定义常量
Dec 25 PHP
php 分库分表hash算法
Nov 12 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
php获取当前网址url并替换参数或网址的方法
Jun 06 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
Jul 04 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
PHP 断点续传实例详解
Nov 11 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
Aug 03 PHP
php中批量修改文件后缀名的函数代码
Oct 23 #PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 #PHP
php中经典方法实现判断多维数组是否为空
Oct 23 #PHP
PHP禁止页面缓存的代码
Oct 23 #PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
Oct 23 #PHP
供参考的 php 学习提高路线分享
Oct 23 #PHP
PHP中的strtr函数使用介绍(str_replace)
Oct 20 #PHP
You might like
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
nodejs微信开发之授权登录+获取用户信息
2019/03/17 NodeJs
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
flask session组件的使用示例
2018/12/25 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
python3.4中清屏的处理方法
2020/07/06 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
服务行业个人求职的自我评价
2013/12/12 职场文书
软环境建设心得体会
2014/09/09 职场文书
党员个人总结自评
2015/02/14 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
PHP命令行与定时任务
2021/04/01 PHP
如何用python绘制雷达图
2021/04/24 Python
MySQL系列之四 SQL语法
2021/07/02 MySQL