php實(shí)現(xiàn)將Session寫(xiě)入數(shù)據(jù)庫(kù)
使用session_set_save_handler()函數(shù),將Session的內(nèi)容寫(xiě)入數(shù)據(jù)庫(kù)
<?php /* *@author Fahy *數(shù)據(jù)庫(kù)為mysql, *數(shù)據(jù)庫(kù)名為session,表名為session, *表中字段包括PHPSESSID,update_time,client_ip,data */ class Session{ private static $handler = null; private static $ip = null; private static $lifetime = null; private static $time = null; //配置靜態(tài)變量 private static function init($handler){ self::$handler = $handler; //獲取數(shù)據(jù)庫(kù)資源 self::$ip = !empty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"]:'unkonw'; //獲取客戶端ip self::$lifetime = ini_get('session.gc_maxlifetime'); //獲取session生命周期 self::$time = time(); //獲取當(dāng)前時(shí)間 } //調(diào)用session_set_save_handler()函數(shù)并開(kāi)啟session static function start($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; } //查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù) 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']; } /* *首先查詢?cè)搒ession是否存在數(shù)據(jù),如果存在,則更新數(shù)據(jù),如果不存在,則插入數(shù)據(jù) */ //將session寫(xiě)入數(shù)據(jù)庫(kù)中,$data傳入session中的keys和values數(shù)組 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 = ?"; $stmt = self::$handler->prepare($sql); $stmt->execute(array($self::$time,$data,$PHPSESSID)); } }else{ if(!empty($data)){ try{ $sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)"; }catch(PDOException $e){ echo $e->getMessage(); } $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; } public static function gc($lifetime){ $sql = "delete from session where update_time<?"; $stmt = self::$handler->prepare($sql); $stmt->execute(array(self::$time-$lifetime)); return true; } } //使用PDO連接數(shù)據(jù)庫(kù) try{ $pdo = new PDO("mysql:host=localhost;dbname=session","root","hwj193"); }catch(PDOException $e){ echo $e->getMessage(); } //傳遞數(shù)據(jù)庫(kù)資源 Session::start($pdo);
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- 將PHP的session數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中的代碼實(shí)例
- php session 寫(xiě)入數(shù)據(jù)庫(kù)
- php基于session實(shí)現(xiàn)數(shù)據(jù)庫(kù)交互的類實(shí)例
- PHP將session信息存儲(chǔ)到數(shù)據(jù)庫(kù)的類實(shí)例
- php中使用session_set_save_handler()函數(shù)把session保存到MySQL數(shù)據(jù)庫(kù)實(shí)例
- PHP獨(dú)立Session數(shù)據(jù)庫(kù)存儲(chǔ)操作類分享
- php把session寫(xiě)入數(shù)據(jù)庫(kù)示例
- Session保存到數(shù)據(jù)庫(kù)的php類分享
- PHP用mysql數(shù)據(jù)庫(kù)存儲(chǔ)session的代碼
- PHP封裝的數(shù)據(jù)庫(kù)保存session功能類
相關(guān)文章
PHP時(shí)間類完整實(shí)例(非常實(shí)用)
這篇文章主要介紹了PHP時(shí)間類完整實(shí)例,涉及PHP針對(duì)日期、時(shí)間、星期等的獲取與比較等操作技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法
這篇文章主要介紹了php5.4以下版本json不支持不轉(zhuǎn)義內(nèi)容中文的解決方法,通過(guò)一個(gè)自定義php方法實(shí)現(xiàn)模擬joson中文不轉(zhuǎn)義,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01php使用date和strtotime函數(shù)輸出指定日期的方法
這篇文章主要介紹了php使用date和strtotime函數(shù)輸出指定日期的方法,實(shí)例匯總了生成各種日期格式的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11關(guān)于訪問(wèn)控制的一首PHP面試題(對(duì)屬性或方法的訪問(wèn)控制)
對(duì)屬性或方法的訪問(wèn)控制,是通過(guò)在前面添加關(guān)鍵字 public、protected 或 private 來(lái)實(shí)現(xiàn)的2012-09-09解析phpstorm + xdebug 遠(yuǎn)程斷點(diǎn)調(diào)試
本篇文章是對(duì)phpstorm + xdebug 遠(yuǎn)程斷點(diǎn)調(diào)試進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php啟動(dòng)時(shí)候提示PHP startup的解決方法
配置好php環(huán)境后,每次開(kāi)機(jī)都有警告提示說(shuō) PHP startup,解決這個(gè)問(wèn)題很簡(jiǎn)單只需要在php.ini 文件中修改 extension_dir配置就行2013-05-05php驗(yàn)證碼的制作思路和實(shí)現(xiàn)方法
這篇文章主要介紹了php驗(yàn)證碼的制作思路和實(shí)現(xiàn)方法,我們不能盲目的去實(shí)現(xiàn)php生成驗(yàn)證碼,更應(yīng)該了解php驗(yàn)證碼的基本原理,真正的掌握php驗(yàn)證碼的實(shí)現(xiàn)方法,需要的朋友可以參考下2015-11-11