session高级应用将用户信息写入到数据库中

首先建立数据库表

在实验数据库sqldb中建立session表,用于存储数据

在根文件夹下建立须要用到的文件(重点是session,class.php这个类文件。包括列一些方法)

在session.class.php中主要用到的是session_set_save_handler()这种方法。借助PDO进行数据操作。用类编写写入数据库表中,

类中定义了一些静态方法,其属性也要为静态的,这样session的数据就直接写入数据库中,而不是保存在本地目录中

首先建立一个Session类。类中首先定义一些私有静态的属性。定义了ip。生存时间和时间

<?php
//定义session类
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; //代表PDO的链接
//ip先推断不为空
self::$ip=!empty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"] : 'unkown';
//从配置文件取出生存时间
self::$lifetime=ini_get('session.gc_maxlifetime');
self::$time=time();
}

接下来就是定义开启session的方法

//定义开启session的方法
static function start(PDO $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();
}

在开启session中有open, close, read, write, destory, gc 的方法。以下主要是定义出这些方法

open() 和 close()  方法

public static function open($path, $name){
return true;
}
public static function close(){
return true;
}

在定义这些方法时,最重要的是write() 和 read() 方法,由于这是直接从数据库读出或写入,採用PDO数据库预处理方式

read():先进行PDO预处理。然后在获取的一条记录中,要推断ip是否为数据库中的ip,取出的数据是否已经过期,都不是就成功读出

    public static function read($PHPSESSID){
$sql="select PHPSESSID,update_time,client_ip,data from session where PHPSESSID= ?"; //用?參数
//PDO预处理
$stmt=self::$handler->prepare($sql);
$stmt->execute(array($PHPSESSID));
//获取一条记录
if(!$result=$stmt->fetch(PDO::FETCH_ASSOC)){
return '';
}
//推断当前訪问ip是否为数据库存在的ip
if(self::$ip != $result["client_ip"]){
self::destroy($PHPSESSID); //销毁用户
return '';
}
//推断是不是过期的
if(($result["update_time"] + self::$lifetime) < self::$time){
self::destroy($PHPSESSID);
return '';
}
return $result['data']; //成功读出
}

write():相同写入的方法也比較重要,须要推断传进来的数据是否为空,假设为空就不进行插入

    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)){
//延迟30更新
if($result['data'] != $data || self::$time > ($result['update_time']+30)){
//更新数据语句
$sql="uptate session set update_time=?, data=? where PHPSESSID=?";
$stm=self::$handler->prepare($sql);
$stm->execute(array(self::$time, $data, $PHPSESSID));
}
}else{
//推断传进来的数据是否为空。空时不插入
if(!empty($data)){
$sql="insert into session(PHPSESSID,update_time,client_ip,data) values(? ,?,?,? )"; //插入值用? 參数
$sth=self::$handler->prepare($sql);
$sth->execute(array($PHPSESSID,self::$time,self::$ip,$data)); //必须用数组
}
}
return true;
}

接下来就是数据的销毁

相同  destory()  和  gc()

destory():数据删除

gc():垃圾回收

    public static function destroy($PHPSESSID){
$sql="delete from session where PHPSESSID=? "; $stmt=self::$handler->prepare($sql);
$stmt->execute(array($PHPSESSID));
return true;
}
private static function gc($lifetime){
$sql="delete from session where update_time < ? ";
$stmt=self::$handler->prepare($sql);
$stmt->execute(array(self::$time-$lifetime));
return true;
} }

最后就抛出一个异常并调用session类

    try{
$pdo=new PDO("mysql:host=localhost;dbname=sqldb","root","heyifeng19930924");
}catch(PDOException $e){
echo $e->getMessage();
} //调用session类
Session::start($pdo);

在測试文件里。写法和session高级使用方法(即上一篇博客的測试文件)一样

仅仅是在包括文件里包括这个类文件

即:include"session.class.php";

測试结果,假设插入数据成功,查询表格信息,在数据库中显示:

即传递列PHPSESSID的值

删除撤销后。查询表格显示

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHlmOTM5MjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

即撤销了PHPSESSID的值

php之将用户信息写入数据库的更多相关文章

  1. Log4j(一):Log4j将日志信息写入数据库

    前言 为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中. 正文 第一步: 首先是jar包,由于我使用的是springboot,所以,在springboot- ...

  2. Log4j写入数据库详解

    log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出.本节主要讲述如何将日志信息输入到 ...

  3. 怎样借助log4j把日志写入数据库中

            log4j是一个优秀的开源日志记录项目.我们不仅能够对输出的日志的格式自定义,还能够自定义日志输出的目的地,比方:屏幕.文本文件,数据 库,甚至能通过socket输出.本节使用MySQ ...

  4. 微信网页授权,获取微信code,获取access_tocken,获取用户信息

    微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权!   1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 ...

  5. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  6. 玩玩微信公众号Java版之五:获取关注用户信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...

  7. aud$定位错误用户密码登陆数据库的具体信息

    环境:Oracle 11.2.0.3 客户端使用错误的用户密码登陆数据库 查询最近1天由于密码错误登陆失败的信息 查询当前审计中有哪些returncode值 1. 客户端使用错误的用户密码登陆数据库 ...

  8. SharePoint 2013 数据库中手动更新用户信息

    在SharePoint的使用过程中,尤其是Windows认证的情况下,而且没有配置用户配置文件服务,经常会出现如果更新AD中的用户信息(包括名字.显示名.邮件等),SharePoint这边站点并不会更 ...

  9. 显示当前用户所拥有的表&当前用户可以访问的所有表&数据库中的所有表&当前用户信息&当前用户所能管理的用户&数据库中所拥有的用户

    1)显示当前用户名称:show user或者show user; 2)显示当前用户信息(包括用户名之外还有其他信息):select * from user_users; 3)显示数据库中所含有的所有用 ...

随机推荐

  1. Java-Zipkin:Zipkin 介绍

    ylbtech-Java-Zipkin:Zipkin 介绍 1.返回顶部 1. 介绍 Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 ...

  2. Unsupported major.minor version 52.0 (unable to load class XXX

    java项目构建从高版本JDK改为低版本JDK报错.这是再次编译时使用的JDK版本比你原来编译的版本低所导致的. 转自:http://blog.csdn.net/zixiao217 maven项目在服 ...

  3. 根据日期获取,x岁x月x天

    c#: DateTime startDate = new DateTime(); DateTime endDate = new DateTime(); ; ; ; if (endDate.Month& ...

  4. LinkedHashMap做缓存

    项目上需要写一个缓存,这样就不需要频繁地访问数据库,我使用的是 //缓存 private final Map<String, JSONArray> schemaCache = new Li ...

  5. Webpack 中的 Tree Shaking

    Tree Shaking Tree shaking 用于描述移除JavaScript上下文中的未引用代码(dead-code). 为了更方便地理解tree shaking,我们可以将应用程序想象成一棵 ...

  6. Arduino-IIC-Wire.h

    前言:Wire.h是Arduino的IIC库. 一.Wire库函数 Wire.begin() Wire.requestFrom() Wire.beginTransmission() Wire.endT ...

  7. Devexpress PdfViewer预览pdf,禁止下载,打印,复制

    PDFviewer控件: 参数设置: 1.屏蔽书签栏和右键菜单 2.加载文档支持路径以及流stream加载的方式 pdfViewer.MenuManager.DisposeManager(); pdf ...

  8. 二.Windows I/O模型之异步选择(WSAAsyncSelect)模型

    1.基于windows消息为基础的网络事件io模型.因此我们必须要在窗口程序中使用该模型.该模型中的核心是调用WSAAsyncSelect函数实现异步I/O. 2.WSAAsyncSelect函数:注 ...

  9. Verilog之openMSP430(1)

    openMSP430_IO interrupt Verilog file: omsp_gpio.v //================================================ ...

  10. IE 11 浏览器兼容性视图设置

    1.打开IE 浏览器. 2.选择“工具”---“兼容性视图设置”.3.在“在兼容性视图中显示所有网站”前面勾选住. 点击关闭就可以了. 开发人员工具 1.找到“工具”----“F12开发人员工具”.2 ...