首页建站经验 php实现将Session写入数据库

php实现将Session写入数据库

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

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

<?php

/*

*@author 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);

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

本文来自网络,不代表1号站长-站长学院|资讯交流平台立场。转载请注明出处: https://www.1cn.cc/jianzhan/jingyan/18218.html
上一篇PHP限制HTML内容中图片必须是本站的方法
下一篇 ThinkPHP控制器详解
admin

作者: admin

这里可以再内容模板定义一些文字和说明,也可以调用对应作者的简介!或者做一些网站的描述之类的文字或者HTML!

为您推荐

评论列表()

    联系我们

    联系我们

    0898-88888888

    在线咨询: QQ交谈

    邮箱: email@wangzhan.com

    工作时间:周一至周五,9:00-17:30,节假日休息

    关注微信
    微信扫一扫关注我们

    微信扫一扫关注我们

    关注微博
    返回顶部