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. 1-1restful简介及资源介绍

  2. LeetCode.2-两个数字相加(Add Two Numbers)

    这是悦乐书的第340次更新,第364篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第1题(顺位题号是2).给定两个非空链表,表示两个非负整数. 数字以相反的顺序存储, ...

  3. 使用C语言扩展Python3

    使用C语言扩展Python3.在Python3中正确调用C函数. 1. 文件demo.c #include <Python.h> // c function static PyObject ...

  4. shopping car 2.0

    #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/5/13 0013 10:20# @Author : Anthony.Waa# @ ...

  5. swiper套路

    swiper插件 quick start 基本结构 <div class="swiper-container"> <div class="swiper- ...

  6. App Store兼容性问题

    app下载出现兼容性问题  项目支持9.0以上的系统 但是10.3的iphone5下载的一直是老版本app  下载时提示不兼容 导致无法正常使用 解决办法: 修改Build-Settings-> ...

  7. 关于如何成为高级java程序员

    今日,对如何进一步提升java.成为一个高级的程序员有了兴趣,在网上看到一篇回答,感觉不错,记下来 总结了以下六点:一.JAVA基础 要想成为高级Java程序员,Java是一定要学习的.要成为高级程序 ...

  8. Swift - 关键字(typealias、associatedtype)

    Typealias typealias 是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰.使用的语法也很简单,使用typealias 关键字像使用普通的赋值语句一样,可以将某个已 ...

  9. TF基础5

    卷积神经网络CNN 卷积神经网络的权值共享的网络结构显著降低了模型的复杂度,减少了权值的数量. 神经网络的基本组成包括输入层.隐藏层和输出层. 卷积神经网络的特点在于隐藏层分为卷积层和池化层. pad ...

  10. layer弹出框的用法

    页面中引入  layer.js 就行了 1.弹出一个提示信息: layer.msg("我是哦提示信息"); 2.弹出一个带选择的按钮的框 layer.open({ title: ' ...