Session advanced application writes user information into the database
First create a database table
Create a session table in the experimental database sqldb to store data
Create the files you need to use in the root directory (the focus is on the session, class.php class file, including some methods)
The main method used in session.class.php is session_set_save_handler(), which uses PDO to perform data operations and writes classes into database tables.
Some static methods are defined in the class, and their attributes must also be static, so that the session data is written directly into the database instead of being saved in the local folder
First create a Session class. First define some private static attributes in the class, including IP, survival time and time
<!--?php //定义session类 class Session{ private static $handler=null; private static $ip=null; private static $lifetime=null; private static $time=null; </pre-->
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的方法 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(); }
There are open, close, read, write, destroy, and gc methods in opening a session. These methods are mainly defined below.
open() and close() methods
public static function open($path, $name){ return true; } public static function close(){ return true; }
read(): First perform PDO preprocessing, and then in the obtained record, determine whether the IP is the IP in the database and whether the retrieved data has expired. If not, it will be read successfully
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']; //成功读出 }
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; }
Same as destroy() and gc()
destroy(): Data deletion
gc(): Garbage collection
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; } }
try{ $pdo=new PDO("mysql:host=localhost;dbname=sqldb","root","heyifeng19930924"); }catch(PDOException $e){ echo $e->getMessage(); } //调用session类 Session::start($pdo);
In the test file, the writing method is the same as the advanced usage of session (i.e. the test file of the previous blog)
Just include this class file in the include file
That is: include "session.class.php";
Test results, if the data is inserted successfully, query the table information and display it in the database:
That is, pass the value of column PHPSESSID
After deletion and revocation, the query form displays
The value of PHPSESSID is revoked