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 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
我的php学习笔记(毕业设计)
Feb 21 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
php生成excel列序号代码实例
Dec 24 PHP
PHP获取中英混合字符串长度的方法
Jun 07 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
Yii2中DropDownList简单用法示例
Jul 18 PHP
PHP封装的完整分页类示例
Aug 21 PHP
php+lottery.js实现九宫格抽奖功能
Jul 21 PHP
php+laravel依赖注入知识点总结
Nov 04 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
解放web程序员的输入验证
2006/10/06 Javascript
JavaScript 密码强度判断代码
2009/09/05 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
编程语言Python的发展史
2014/09/26 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python的range和linspace使用详解
2019/11/27 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
美国在线宠物商店:Chewy
2019/01/12 全球购物
Hammitt官网:设计师手袋
2020/05/23 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
元旦联欢会感言
2014/03/04 职场文书
继承公证书
2014/04/09 职场文书
综治维稳工作汇报
2014/10/27 职场文书
邀请书格式范文
2015/02/02 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android