使用数据库的方式来自定义存储用户session信息
2017-11-14 10:11
197 查看
<?php
//用户自定义session类,使用数据库数据表的方式来存储session信息
class DBSession{
private static $pdo; //全局的pdo对象
private static $utime; //当前时间
private static $maxlifetime; //文件最大存在时间
private static $sip; //用户的ip地址
private static $uagent; //用户使用的浏览器
//自定义用户开启session的方式
public static function start(PDO $pdo){
self::$pdo=$pdo;
self::$utime=time();
self::$maxlifetime=ini_get('session.gc_maxlifetime');
self::$sip='192.168.1.100';
self::$uagent='IE';
//将用户自定义session生命周期的方法注册到web服务器中
session_set_save_handler(
array(__CLASS__,'open'),
array(__CLASS__,'close'),
array(__CLASS__,'read'),
array(__CLASS__,'write'),
array(__CLASS__,'destroy'),
array(__CLASS__,'gc')
);
session_start();
}
//用户自定义session生命周期的方法如下:
public static function open($path,$name){
return true;
}
public static function read($sid){
$sql="select * from session where sid=?";
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid));
$result=$stmt->fetch(PDO::FETCH_ASSOC);
//如果查询结果为空,则返回空字符串;
if(!$result){
return '';
}
//如果查询结果为过期,则删除此条session结果
if($result['utime']<self::$utime-self::$maxlifetime){
self::destroy($sid);
return '';
}
//如果用户换了ip或换了浏览器
if($result['sip'] != self::$sip || $result['uagent'] != self::$uagent) {
self::destroy($sid);
return '';
}
}
public static function write($sid,$data){
//查询数据表中是否已经存在同样id名的数据
$sql='select * from session where sid=?';
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid));
$result=$stmt->fetch(PDO::FETCH_ASSOC);
if($result){
//如果查询出来的数据和之前一样没更改则不执行以下操作,或者在指定时间10秒之后更新
if(($result['sdata']!=$data)||($result['utime']+10<self::$utime)){
//如果查询有同样的结果,则更新session表而不重新插入session内容
$sql="update session set utime=?,sdata=? where sid=? ";
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array(self::$utime,$data,$sid));
}
}else{
//插入数据到已经创建好的session数据表中
//如果用户有更新session内容
if(!empty($data)){
$sql="insert into session(sid,utime,sdata,sip,uagent)values(?,?,?,?,?)";
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid,self::$utime,$data,self::$sip,self::$uagent));
}
}
}
public static function destroy($sid){
$sql='delete from session where sid=?';
$stmt=self::$pdo->prepare($sql);
return $stmt->execute(array($sid));
}
public static function close(){
return true;
}
public static function gc($maxlifetime){
//如果文件已经过期则删除该条session记录
$sql='delete from session where utime<?';
$stmt=self::$pdo->prepare($sql);
return $stmt->execute(array(self::$utime-self::$maxlifetime));
}
}
//start方法参数中传入一个已经连接上数据库的PDO对象
DBSession::start($pdo);
?>
//用户自定义session类,使用数据库数据表的方式来存储session信息
class DBSession{
private static $pdo; //全局的pdo对象
private static $utime; //当前时间
private static $maxlifetime; //文件最大存在时间
private static $sip; //用户的ip地址
private static $uagent; //用户使用的浏览器
//自定义用户开启session的方式
public static function start(PDO $pdo){
self::$pdo=$pdo;
self::$utime=time();
self::$maxlifetime=ini_get('session.gc_maxlifetime');
self::$sip='192.168.1.100';
self::$uagent='IE';
//将用户自定义session生命周期的方法注册到web服务器中
session_set_save_handler(
array(__CLASS__,'open'),
array(__CLASS__,'close'),
array(__CLASS__,'read'),
array(__CLASS__,'write'),
array(__CLASS__,'destroy'),
array(__CLASS__,'gc')
);
session_start();
}
//用户自定义session生命周期的方法如下:
public static function open($path,$name){
return true;
}
public static function read($sid){
$sql="select * from session where sid=?";
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid));
$result=$stmt->fetch(PDO::FETCH_ASSOC);
//如果查询结果为空,则返回空字符串;
if(!$result){
return '';
}
//如果查询结果为过期,则删除此条session结果
if($result['utime']<self::$utime-self::$maxlifetime){
self::destroy($sid);
return '';
}
//如果用户换了ip或换了浏览器
if($result['sip'] != self::$sip || $result['uagent'] != self::$uagent) {
self::destroy($sid);
return '';
}
}
public static function write($sid,$data){
//查询数据表中是否已经存在同样id名的数据
$sql='select * from session where sid=?';
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid));
$result=$stmt->fetch(PDO::FETCH_ASSOC);
if($result){
//如果查询出来的数据和之前一样没更改则不执行以下操作,或者在指定时间10秒之后更新
if(($result['sdata']!=$data)||($result['utime']+10<self::$utime)){
//如果查询有同样的结果,则更新session表而不重新插入session内容
$sql="update session set utime=?,sdata=? where sid=? ";
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array(self::$utime,$data,$sid));
}
}else{
//插入数据到已经创建好的session数据表中
//如果用户有更新session内容
if(!empty($data)){
$sql="insert into session(sid,utime,sdata,sip,uagent)values(?,?,?,?,?)";
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid,self::$utime,$data,self::$sip,self::$uagent));
}
}
}
public static function destroy($sid){
$sql='delete from session where sid=?';
$stmt=self::$pdo->prepare($sql);
return $stmt->execute(array($sid));
}
public static function close(){
return true;
}
public static function gc($maxlifetime){
//如果文件已经过期则删除该条session记录
$sql='delete from session where utime<?';
$stmt=self::$pdo->prepare($sql);
return $stmt->execute(array(self::$utime-self::$maxlifetime));
}
}
//start方法参数中传入一个已经连接上数据库的PDO对象
DBSession::start($pdo);
?>
相关文章推荐
- SQL 用户定义表类型,在存储过程里使用表类型,表参数作参数
- 还原Wss3.0内容数据库时遇到:"ComputerName\Microsoft##SSEE 上的 WSS_Content 包含用户定义的架构。数据库在能够使用之前必须为空。请删除所有表、存储过程以及其他对象,或使用其他数据库。 " 的提示,无法加载内容数据库
- N个状态在数据库中的简便使用定义方式
- java使用url和tns两种方式连接数据库执行存储过程
- MySql中游标及存储过程的定义与使用方式
- 恢复数据库时,提示有用户正在使用的处理方式
- application 和 session区别以及使用application存储在线用户的session信息
- 创建表空间以及用户,授予权限,查看表空间名称及大小,物理文件的名称及大小,数据库的创建日期和归档方式,数据库的版本,数据库库对象,表空间的使用情况,表空间读写
- 地磅称量系统之(37~39) 直接向数据库的数据表WtBill添加测试数据以及绑定用户控件和使用编码的方式控制dataGridView控件的每列属性和添加数据数据库的表中不存在的字段(非绑定列)
- SQL 用户定义表类型,在存储过程里使用数据类型作參数
- SQL SERVER 使用存储过程创建、删除用户定义数据类型
- Hive简介、什么是Hive、为什么使用Hive、Hive的特点、Hive架构图、Hive基本组成、Hive与Hadoop的关系、Hive与传统数据库对比、Hive数据存储(来自学习资料)
- SQL 用户定义表类型,在存储过程里使用数据类型作参数
- HTML5 IndexDB 用户本地化存储离线数据库的使用
- 如何使用VS.NET调试数据库存储过程
- 使用ASP.NET 2.0 Profile存储用户信息[翻译] Level 200
- 怎样查看存储过程当前正在被哪些用户使用
- 另外一种WebService的用户验证方式---使用验证票
- 使用ASP.NET 2.0 Profile存储用户信息
- Castle ActiveRecord 使用 Web.config 配置数据库连接方式