亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP中如何將session存入數據庫并使用(附代碼)

2020-03-22 20:08:27
字體:
來源:轉載
供稿:網友
這篇文章給大家介紹的內容是關于PHP中如何將session存入數據庫并使用(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

實例說明:

將SESSION數據變量存儲于服務器是端是一種較安全的做法,但是設想一下,像校內網這樣的日訪問量過億,擁有用戶幾千萬的大型網站,如果將所有用戶SESSION數據全部存儲于服務器端,將消耗巨大的服務器資源。所以程序員在制作大型網站時將SESSION存儲于服務器端雖然安全,但卻不是最好的選擇。如果將SESSION數據存儲于數據庫中,那么就可以減輕服務器的壓力同時數據也是比較安全的。

設計過程

首先在Mysql數據庫創建存儲SESSION的表:

表名為t_session

表結構為

說明:session_key:是用來存會話ID的

session_data:是用來存經序列化后的$_SESSION[]里的值;

session_time:是用來存時間戳的,這個時間戳指的是當前session在創建時的 time()+session的有效期。需要注意的是這 里的session_time的類型是int,這樣可以在操作數據庫時,進行大小比較!

那么什么是序列化呢?

序列化 (Serialization)就是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。

比如說

$_SESSION[“user”]=”張三”$_SESSION[“pwd”]=”zhangsan”

序列話后成為一個字符串

user|s:6: 張三 pwd|s:8: zhangsan 

其中s表示類型為string,數字表示字符串長度,這樣就可以對這個字符串操作了。

接下來就是正文部分了

session.save_handler 定義存儲和獲取與會話關聯的數據的處理器的名字。默認為 files。如果設定為files(session.save_handler = files),則采用的是php內置機制,如果想自定義存儲方式(比如存儲到數據庫中),則使用session_set_save_handler()進行自定義設置,我們這里說的則是第二種。

所以我們得修改php.ini文件里session_set_save_handler的值,將其修改為user,如圖:

bool session_set_save_handler ( callable open , callable $close , callable read , callable write , callable destroy , callable gc [, callable $create_sid [, callable validate_sid [, callable update_timestamp ]]] )

如果不修改,那你在使用session的時候可以不用理他,但當你修改 了,你不得不面對他。這是一個很特殊的函數,因為一般的函數的參數都是變量,但是該函數的參數為6個函數(后面的三個參數為可選參數,可忽略)不用怕,一個一個來:

第一個參數: open(save_path,session_name),這里面的兩個參數是php自動傳遞的。save_path 在session.save_handler = files的情況下它就是session.save_path,session_name則是服務器用來識別客戶端的會話ID,但是如果用戶自定的話,這個兩個參數都用不上,只在其中連接數據庫,open 回調函數類似于類的html' target='_blank'>構造函數,在會話打開的時候會被調用。 這是自動開始會話或者通過調用 session_start() 手動開始會話之后第一個被調用的回調函數。 此回調函數操作成功返回 TRUE,反之返回 FALSE。

第二個參數: close(),這個函數不需要參數,用來關閉數據庫。close 回調函數類似于類的析構函數。 在 write 回調函數調用之后調用。 當調用 session_write_close() 函數之后,也會調用 close 回調函數。 此回調函數操作成功返回 TRUE,反之返回 FALSE。

第三個參數: read($key),這里面的參數是會話ID,php自動傳遞的,傳遞的前提是有會話ID,若無,則這個參數返回空字符串。注意,若數據庫中無對應的數據一定要返回空字符串,否則報錯!如果會話中有數據,read 回調函數必須返回將會話數據編碼(序列化)后的字符串(在此處就是從表t_session里取出的session_data)。在自動開始會話或者通過調用 session_start()函數手動開始會話之后,PHP 內部調用 read 回調函數來獲取會話數據。 在調用 read 之前,PHP 會調用 open 回調函數。read 回調返回的序列化之后的字符串格式必須與 write 回調函數保存數據 時的格式完全一致。 PHP 會自動反序列化返回的字符串并填充 $_SESSION 超級全局變量。

第四個參數: write($key,$data), 這兩個參數也是php自動傳遞給這個函數的,$key對應會話ID,$data對應當前(因為write函數一般是在腳本執行結束后才被調用的)腳本被序列化處理器處理的session變量(如上文提到的$_SESSION[“user”]=”張三”$_SESSION[“pwd”]=”zhangsan”),序列化會話數據的過程由 PHP 根據 session.serialize_handler 設定值來完成。序列化后的數據將和會話 ID 關聯在一起進行保存。 當調用 read 回調函數獲取數據時,所返回的數據必須要和 傳入 write 回調函數的數據完全保持一致。PHP 會在腳本執行完畢或調用 session_write_close() 函數之后調用此回調 函數。注意,在調用完此回調函數之后,PHP 內部會調用 close 回調函數。

NOTE:PHP 會在輸出流寫入完畢并且關閉之后 才調用 write 回調函數, 所以在 write 回調函數中的調試信息不會輸出到瀏覽器中。 如果需要在 write 回調函數中使用調試輸出, 建議將調試輸出寫入到文件。

第五個參數: destroy($key),當調用 session_destroy() 函數, 或者調用 session_regenerate_id() 函數并且設置 destroy 參數為 TRUE 時, 會調用此回調函數。用來注銷session對應的SESSION鍵值,此回調函數操作成功返回 TRUE,反之返回 FALSE。它就是人們常常在點擊注銷登錄的時候用到的函數。后面會有這個小細節。

第六個參數: gc(expire_time),這個函數的參數在默認機制下就是session.gc_maxlifetime設置的session有效時間。但是,user機制下session的過期時間在就是表里session_time,所以這里不需要傳遞參數的。為了清理會話中的舊數據,PHP 會不時的調用垃圾收集回調函數。 調用周期由 session.gc_probability 和 session.gc_pisor 參數控制。此回調函數操作成功返回 TRUE,反之返回 FALSE。

至此六個函數已經介紹完了,但是其中有許多需要說明的:

1、在open函數中本來是要傳遞save__path,目的是用來在這個路徑下找到與session_name相對應的文件,然后通過read()函數來讀取其中的數據,然后通過反序列化處理器將取到的字符串反序列化,在通過php自動填充各個$_session超全局變量?;蛘遷rite函數來將序列化的數據存入這個路徑下的文件。那么這里面的路徑在非默認機制下難道就不需要嗎,答案是肯定的*_*。當在非默認機制下,調試輸出session_save_path,其結果為空值;而且如果未設置存儲的路徑,那被填充的$_session變量也只能在當前頁面使用,而不能在別的頁面使用,可以這樣測試:在另一個頁面利用session_start()函數打開會話,然后輸出session_id和var_dump($_session),得到的是上一次瀏覽時服務器給客戶端的session_id,但是$_session輸出的是空數組(當然我這里只是大概的說一下我在驗證時的過程)。其實我想說的就是我們在自定義會話存儲機制的時候,是不需要自定義路徑的,不然為什么還要存入數據庫呢?

那么怎么在其他頁面也能讀取到$_session[]里面的值呢?

引入這個函數,即將六個 回調函數和session_set_save_handler放入一個文件里,然后在session_start()前用include()引入!

2、那他們的執行順序是怎樣呢?有點暈吧,來總結一下:首先session_start()函數打開session操作句柄,然后read函數讀取數據,當腳本執行結束的時候執行write函數然后是close函數若有session_destroy()則執行完。

3、上面我提到過PHP 會在輸出流寫入完畢并且關閉之后才調用 write 回調函數,這個可把我玩壞啦,小編在上面可繞了不久呀,不然我也不會在write函數里調試那么久了!不過我也因此了解了register_shutdown_function這個函數,下面附上這個函數的特點吧:register_shutdown_function()是指在執行完所有PHP語句后再調用函數,不要理解成客戶端關閉流瀏覽器頁面時調用函數。

可以這樣理解調用條件:
1、當頁面被用戶強制停止時
2、當程序代碼運行超時時
3、當PHP代碼執行完成時,代碼執行存在異常和錯誤、警告

好了以上該說的都說完了,附上代碼吧:

index.php用戶登錄界面

 ?php
session_destroy();//這里就是上文提到的 小細節了,當有session_destroy的時候,它是先于read回調函數執行的
if(isset($_SESSION[ user ])){//判斷此值是否有定義,若有定義則說明 存入的session還未到期,則直接轉到主內容
$_SESSION[ pwd ]=$_POST[ pwd //這里自定義的會話管理機制將會調用回調函數write,將已由序列化處理器處理好的(由$_session[]變量形成)字符串寫入數據庫
$sql= select session_data from t_session where session_key= $key and session_time $time
$over_time=time()+60;//注意time()為時間戳,在mysql中的數據類型不可用用date,datetime,timestamp來存儲
//若$result為false,即結果 為空,說明數據庫中未存有相應的session_id,那么就插入,如果不為空,那即使還有未過期的session_id,這是應更新
$sql= insert into t_session(session_key,session_data,session_time ) values( $key , $data ,$over_time) //字符串的時候要加單引號,數字的時候是不用加的
$sql= update t_session set session_key= $key ,session_data= $data ,session_time=$over_time where session_key= $key
function overdue($expire_time){//這個參數是自動傳進去的,就是session.gc_maxlifetime最大有效時間,例如1440s;
獨孤九賤(5)_ThinkPHP5視頻教程

ThinkPHP是國內最流行的中文PHP開發框架,也是您Web項目的最佳選擇?!禫eVb.com獨孤九賤(5)-ThinkPHP5視頻教程》課程以ThinkPHP5最新版本為例,從最基本的框架常識開始,將...

Peter-Zhu 2017-05-16 12:03:57


獨孤九賤(4)_PHP視頻教程

江湖傳言:PHP是世界上最好的編程語言。真的是這樣嗎?這個梗究竟是從哪來的?學會本課程,你就會明白了。PHP 出品的PHP入門系統教學視頻,完全從初學者的角度出發,絕不玩虛的,一切以實用、有用...

Peter-Zhu 2017-03-20 22:47:17


獨孤九賤(1)_HTML5視頻教程

《VeVb.com原創html5視頻教程》課程特色:php 原創幽默段子系列課程,以惡搞,段子為主題風格的php視頻教程!輕松的教學風格,簡短的教學模式,讓同學們在不知不覺中,學會了HTML知識。...

Peter-Zhu 2017-03-13 10:15:11


ThinkPHP5實戰之[教學管理系統]

本套教程,以一個真實的學校教學管理系統為案例,手把手教會您如何在一張白紙上,從零開始,一步一步的用ThinkPHP5框架快速開發出一個商業項目。

Peter-Zhu 2017-07-24 16:48:56


PHP入門視頻教程之一周學會PHP

所有計算機語言的學習都要從基礎開始,《PHP入門視頻教程之一周學會PHP》不僅是PHP的基礎部分更主要的是PHP語言的核心技術,是學習PHP必須掌握的內容,任何PHP項目的實現都離不開這部分的內容,通...

PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩精品久久亚洲区| 最近2019中文字幕mv免费看| 色伦专区97中文字幕| 国产欧美欧洲在线观看| 成人av电影天堂| 色综合久久精品亚洲国产| 日韩av资源在线播放| 成人天堂噜噜噜| 国产成人亚洲综合| 一本色道久久综合狠狠躁篇怎么玩| 成人国产精品久久久| 日日狠狠久久偷偷四色综合免费| 欧美麻豆久久久久久中文| 九九热r在线视频精品| 日韩精品在线观看一区二区| 日韩女优人人人人射在线视频| 久久久噜噜噜久噜久久| 久久天天躁夜夜躁狠狠躁2022| 国产精品女视频| 在线看福利67194| 亚洲男人的天堂网站| 国产精品中文久久久久久久| 日韩大胆人体377p| 亚洲视频日韩精品| 揄拍成人国产精品视频| 亚洲国产黄色片| 91精品中国老女人| 欧美大尺度激情区在线播放| 欧美巨猛xxxx猛交黑人97人| 亚洲天堂av在线免费观看| 国产做受高潮69| 激情懂色av一区av二区av| 欧美日韩在线免费观看| 国产成人精品在线观看| 欧美精品免费播放| 性欧美亚洲xxxx乳在线观看| 亚洲免费高清视频| 亚洲欧美在线一区二区| 国内揄拍国内精品| 国产精品激情av电影在线观看| 中文国产成人精品| 欧美性猛交99久久久久99按摩| 欧美电影在线播放| 狠狠躁夜夜躁久久躁别揉| 精品欧美一区二区三区| 日韩精品欧美激情| 国产在线精品一区免费香蕉| 奇门遁甲1982国语版免费观看高清| 日韩美女在线看| 日韩欧美中文字幕在线播放| 欧美二区在线播放| 91免费在线视频网站| 一区二区在线免费视频| 成人免费高清完整版在线观看| 亚洲精品日韩欧美| 91免费看片网站| 成人久久18免费网站图片| 日韩中文字幕在线免费观看| 欧美一级淫片aaaaaaa视频| 国产精品国模在线| 亚洲美女久久久| 日韩av电影在线网| 成人久久久久久久| 国产成人鲁鲁免费视频a| 国产精品久久久久久久电影| 国产精品极品在线| 国产色婷婷国产综合在线理论片a| 亚洲欧美日韩一区在线| 久久av红桃一区二区小说| 欧美成人精品激情在线观看| 人人爽久久涩噜噜噜网站| 欧美精品精品精品精品免费| 亚洲一区av在线播放| 中日韩午夜理伦电影免费| 亚洲欧美国产精品va在线观看| 欧美肥老太性生活视频| 亚洲精品一区二区三区不| 欧美老女人bb| 欧美在线视频一区二区| 日韩人在线观看| 国产一区二区激情| 日韩久久午夜影院| 精品成人久久av| 国产一区二区三区网站| 日韩在线免费av| 5278欧美一区二区三区| 91在线视频一区| 亚洲精品福利免费在线观看| 奇门遁甲1982国语版免费观看高清| 国产精品国产自产拍高清av水多| 久久久久久久网站| 国产成人黄色av| 日韩专区在线观看| 日韩亚洲欧美中文高清在线| 国产精品久久久久久av福利| 日韩人体视频一二区| 亚洲欧美三级伦理| 亚洲精品国精品久久99热一| 欧美一级淫片播放口| 国产精品高精视频免费| 国产日韩欧美综合| 国产成人亚洲综合91精品| 欧美在线观看网址综合| 国产精品视频男人的天堂| 深夜福利亚洲导航| 毛片精品免费在线观看| 亚洲日本中文字幕| 精品久久在线播放| 综合激情国产一区| 亚洲免费精彩视频| 欧美在线性爱视频| 国产精品第100页| 亚洲免费电影在线观看| 亚洲第一页中文字幕| 91探花福利精品国产自产在线| 欧美最顶级的aⅴ艳星| 69久久夜色精品国产69乱青草| 欧美精品一区三区| 国产91ⅴ在线精品免费观看| 91久久久久久久久久久久久| 久久艳片www.17c.com| 欧美肥婆姓交大片| 日本高清久久天堂| 性欧美xxxx视频在线观看| 国产亚洲成精品久久| 91九色国产在线| 91超碰caoporn97人人| 日韩电影免费在线观看中文字幕| 欧美极品少妇xxxxⅹ裸体艺术| 国产精国产精品| 国产精品吴梦梦| 国产玖玖精品视频| 亚洲一区第一页| 国产成人精品视频在线观看| 日韩精品高清在线观看| 久久精品亚洲94久久精品| 日韩精品视频免费在线观看| 国产香蕉一区二区三区在线视频| 亚洲精品久久久久中文字幕二区| 国产视频自拍一区| 国产午夜精品全部视频播放| 一区二区成人精品| 日韩精品免费在线观看| 亚洲男人天堂网站| 日本中文字幕不卡免费| 欧美老女人www| 亚洲一区二区三区sesese| 欧美日韩免费网站| 国产精品久久久久久久久粉嫩av| 亚洲精品久久在线| 亚洲激情在线观看| 欧美在线观看网站| 久久久久久网址| 亚洲精品短视频| 日韩专区在线播放| 中文字幕综合一区| 久久视频在线看| 亚洲日韩中文字幕在线播放| 中文字幕精品网| 国内精久久久久久久久久人| 欧美激情xxxxx| 亚洲精品影视在线观看| 国产一区二区三区视频| 亚洲自拍偷拍视频|