php session 写入数据库中,php实现将Session写入数据库

使用session_set_save_handler()函数,将Session的内容写入数据库

/*

[email protected] Fahy

*数据库为mysql,

*数据库名为session,表名为session,

*表中字段包括PHPSESSID,update_time,client_ip,data

*/

class Session{

private static $handler = null;

private static $ip = null;

private static $lifetime = null;

private static $time = null;

//配置静态变量

private static function init($handler){

self::$handler = $handler; //获取数据库资源

self::$ip = !empty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"]:‘unkonw‘; //获取客户端ip

self::$lifetime = ini_get(‘session.gc_maxlifetime‘); //获取session生命周期

self::$time = time(); //获取当前时间

}

//调用session_set_save_handler()函数并开启session

static function start($pdo){

self::init($pdo);

session_set_save_handler(

array(__CLASS__,‘open‘),

array(__CLASS__,‘close‘),

array(__CLASS__,‘read‘),

array(__CLASS__,‘write‘),

array(__CLASS__,‘destroy‘),

array(__CLASS__,‘gc‘)

);

session_start();

}

public static function open($path,$name){

return true;

}

public static function close(){

return true;

}

//查询数据库中的数据

public static function read($PHPSESSID){

$sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";

$stmt = self::$handler->prepare($sql);

$stmt->execute(array($PHPSESSID));

if(!$result = $stmt->fetch(PDO::FETCH_ASSOC)){

return ‘‘;

}

if(self::$ip == $result[‘client_ip‘]){

self::destroy($PHPSESSID);

return ‘‘;

}

if(($result[‘update_time‘]+self::$lifetime)<:>

self::destroy($PHPSESSID);

return ‘‘;

}

return $result[‘data‘];

}

/*

*首先查询该session是否存在数据,如果存在,则更新数据,如果不存在,则插入数据

*/

//将session写入数据库中,$data传入session中的keys和values数组

public static function write($PHPSESSID,$data){

$sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";

$stmt = self::$handler->prepare($sql);

$stmt->execute(array($PHPSESSID));

if($result=$stmt->fetch(PDO::FETCH_ASSOC)){

if($result[‘data‘] != $data || self::$time > ($result[‘update_time‘]+30)){

$sql = "update session set update_time=?,data=? where PHPSESSID = ?";

$stmt = self::$handler->prepare($sql);

$stmt->execute(array($self::$time,$data,$PHPSESSID));

}

}else{

if(!empty($data)){

try{

$sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)";

}catch(PDOException $e){

echo $e->getMessage();

}

$sth = self::$handler->prepare($sql);

$sth->execute(array($PHPSESSID,self::$time,self::$ip,$data));

}

}

return true;

}

public static function destroy($PHPSESSID){

$sql = "delete from session where PHPSESSID = ?";

$stmt = self::$handler->prepare($sql);

$stmt->execute(array($PHPSESSID));

return true;

}

public static function gc($lifetime){

$sql = "delete from session where update_time";

$stmt = self::$handler->prepare($sql);

$stmt->execute(array(self::$time-$lifetime));

return true;

}

}

//使用PDO连接数据库

try{

$pdo = new PDO("mysql:host=localhost;dbname=session","root","hwj193");

}catch(PDOException $e){

echo $e->getMessage();

}

//传递数据库资源

Session::start($pdo);

以上所述就是本文的全部内容了,希望大家能够喜欢。

原文:http://www.jb51.net/article/70034.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP ,我们可以使用 $_SESSION 变量来存储会话数据。默认情况下,会话数据是存储在服务器上的文件系统。但是,我们也可以将会话数据存储在数据库,以便更好地管理它们。 下面是一个简单的示例,演示如何在 PHP 将会话数据存储在数据库: 1. 创建一个名为 `sessions` 的数据库表,该表包含以下字段: - `id` - 会话 ID - `data` - 存储会话数据的字段 - `timestamp` - 记录会话创建时间的字段 ```sql CREATE TABLE `sessions` ( `id` varchar(32) NOT NULL, `data` text NOT NULL, `timestamp` int(11) NOT NULL, PRIMARY KEY (`id`) ); ``` 2. 在 PHP 设置会话存储处理程序,并在会话开始时调用它。以下是示例代码: ```php <?php // 设置会话存储处理程序为自定义函数 session_set_save_handler( 'session_open', 'session_close', 'session_read', 'session_write', 'session_destroy', 'session_gc' ); // 启动会话 session_start(); // 自定义函数 - 打开会话存储 function session_open($save_path, $session_name) { // 连接数据库 $db = new mysqli('localhost', 'username', 'password', 'database'); // 返回 true 表示成功 return $db ? true : false; } // 自定义函数 - 关闭会话存储 function session_close() { // 关闭数据库连接 $db->close(); // 返回 true 表示成功 return true; } // 自定义函数 - 读取会话数据 function session_read($id) { // 查询数据库获取会话数据 $result = $db->query("SELECT data FROM sessions WHERE id = '$id'"); // 如果查询成功,则返回会话数据 if ($result) { $row = $result->fetch_assoc(); return $row['data']; } // 否则返回空字符串 return ''; } // 自定义函数 - 写入会话数据 function session_write($id, $data) { // 将会话数据插入数据库 $timestamp = time(); $result = $db->query("REPLACE INTO sessions (id, data, timestamp) VALUES ('$id', '$data', '$timestamp')"); // 返回写入结果 return $result ? true : false; } // 自定义函数 - 销毁会话 function session_destroy($id) { // 从数据库删除会话数据 $result = $db->query("DELETE FROM sessions WHERE id = '$id'"); // 返回销毁结果 return $result ? true : false; } // 自定义函数 - 垃圾回收 function session_gc($max_lifetime) { // 删除过期的会话数据 $expired = time() - $max_lifetime; $result = $db->query("DELETE FROM sessions WHERE timestamp < '$expired'"); // 返回清理结果 return $result ? true : false; } ?> ``` 在上面的代码,我们使用了 `session_set_save_handler()` 函数来设置自定义的会话存储处理程序。然后,我们定义了 6 个自定义函数来处理会话的打开、关闭、读取、写入、销毁和垃圾回收操作。这些函数将会话数据存储在名为 `sessions` 的数据库。 最后,我们调用 `session_start()` 函数来启动会话,并开始使用 `$_SESSION` 变量存储会话数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值