把session写到数据库中
一、将SESSION数据写入数据库中(使用PDO)
session_set_save_handler();
pdo
1. 表设计
2. 用类编写完成,写入数据库的表中session
3. 加入到实例中
类中各回调函数定义都要定义为静态方法,属性也要是静态的(静态成员使用)
定义的表字段:SESSIONID, update_time, client_ip, data
2、具体程序代码
1、定义的保存到数据库的session类:session.class.php
<?php 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"] : 'unknown'; self::$lifetime=ini_get('session.gc_maxlifetime'); self::$time=time(); } 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(); } 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::$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)){ if($result['data'] != $data || self::$time > ($result['update_time']+30)){ $sql="update 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; } 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=xsphpdb", "root", "123456"); }catch(PDOException $e){ echo $e->getMessage(); } Session::start($pdo); ?>
2、session值定义页面:one.php
<?php include "session.class.php"; $_SESSION["isLogin3"]=1; $_SESSION["username"]="admin"; $_SESSION["uid"]=333; echo session_name().'='.session_id().'<br>'; ?>
3、从另外页面取值的页面:two.php
<?php include "session.class.php"; print_r($_SESSION); echo '<br>'; echo session_name().'='.session_id().'<br>'; ?>
4、销毁页面:three.php
<?php include "session.class.php"; $_SESSION=array(); if(isset($_COOKIE[session_name()])){ setCookie(session_name(), '', time()-100, '/'); } session_destroy(); echo session_name().'='.session_id().'<br>'; ?>