php之将用户信息写入数据库
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之将用户信息写入数据库的更多相关文章
- Log4j(一):Log4j将日志信息写入数据库
前言 为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中. 正文 第一步: 首先是jar包,由于我使用的是springboot,所以,在springboot- ...
- Log4j写入数据库详解
log4j是一个优秀的开源日志记录项目,我们不仅可以对输出的日志的格式自定义,还可以自己定义日志输出的目的地,比如:屏幕,文本文件,数据库,甚至能通过socket输出.本节主要讲述如何将日志信息输入到 ...
- 怎样借助log4j把日志写入数据库中
log4j是一个优秀的开源日志记录项目.我们不仅能够对输出的日志的格式自定义,还能够自定义日志输出的目的地,比方:屏幕.文本文件,数据 库,甚至能通过socket输出.本节使用MySQ ...
- 微信网页授权,获取微信code,获取access_tocken,获取用户信息
微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权! 1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 ...
- 基于webmagic的爬虫小应用--爬取知乎用户信息
听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...
- 玩玩微信公众号Java版之五:获取关注用户信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...
- aud$定位错误用户密码登陆数据库的具体信息
环境:Oracle 11.2.0.3 客户端使用错误的用户密码登陆数据库 查询最近1天由于密码错误登陆失败的信息 查询当前审计中有哪些returncode值 1. 客户端使用错误的用户密码登陆数据库 ...
- SharePoint 2013 数据库中手动更新用户信息
在SharePoint的使用过程中,尤其是Windows认证的情况下,而且没有配置用户配置文件服务,经常会出现如果更新AD中的用户信息(包括名字.显示名.邮件等),SharePoint这边站点并不会更 ...
- 显示当前用户所拥有的表&当前用户可以访问的所有表&数据库中的所有表&当前用户信息&当前用户所能管理的用户&数据库中所拥有的用户
1)显示当前用户名称:show user或者show user; 2)显示当前用户信息(包括用户名之外还有其他信息):select * from user_users; 3)显示数据库中所含有的所有用 ...
随机推荐
- 922. 按奇偶排序数组 II
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数. 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数:当 A[i] 为偶数时, i 也是偶数. 你可以返回任何满足上述条件的数组 ...
- 在ubuntu中安装Markdown神器Typora
title: 在ubuntu中安装Markdown神器Typora toc: false date: 2018-09-01 17:48:15 categories: methods tags: ubu ...
- .NET微服务架构及API网关
一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...
- BZOJ 2288 贪心 +链表
思路: 放个题解好吧. http://www.cnblogs.com/zyfzyf/p/4114774.html //By SiriusRen #include <queue> #incl ...
- TopN问题(分别使用Hadoop和Spark实现)
简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在map阶 ...
- HBase编程 API入门系列之delete(管理端而言)(9)
大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门之delete(客户端而言) 就知道,在这篇博文里,我是在客户端里删除HBase表的. 这里,我带领大家,学习更高级的,因为,在开发中 ...
- Oracle---显式游标
一 游标的分类 在Oracle中提供了两种类型的游标:静态游标和动态游标. 1.静态游标是在编译时知道其SELECT语句的游标.静态游标又分为两种类型,即隐式游标和显式游标. 2.当用户需要为游标使 ...
- 找不到dll原因
1.没有生成成功: A.代码有错误 B.引用dll有问题(dll生成失败|dll版本不对) C.源文件损坏 2.dll生成路径不对 3.对dll的引用丢失
- vue中子组件需调用父组件通过异步获取的数据
原因:子组件需要调用父组件传过来的数据,如果这个数据是异步从接口里取的,那这个组件在任何生命周期里都取不到,而应该在接口调取后取到. 需要在msg拿到值后才调用组件,然后你在生命周期created里面 ...
- OpenCV中GPU模块使用
CUDA IT168的文章系列: Cuda的初始化:http://tech.it168.com/a2011/0715/1218/000001218458.shtml OpenCV: OpenCV中GP ...