PHP第8章會話處理_第1頁
PHP第8章會話處理_第2頁
PHP第8章會話處理_第3頁
PHP第8章會話處理_第4頁
PHP第8章會話處理_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PHP和MySQLWeb開發(fā)授課教師:職務(wù):第8章會話處理

課程描述在Web應(yīng)用程序中,會話是客戶端用戶與服務(wù)器之間交換數(shù)據(jù)的過程。通過會話可以實(shí)現(xiàn)頁面之間的參數(shù)傳遞。本章將介紹PHP會話處理中使用的Cookie、URL重寫和Session等技術(shù)。本章知識點(diǎn)8.1什么是會話處理8.2Cookie的應(yīng)用8.3Session的應(yīng)用8.1什么是會話處理8.1.1問題的提出8.1.2解決方案8.1.1問題的提出在第1章中已經(jīng)介紹過超文本傳輸協(xié)議(HTTP),它定義了通過互聯(lián)網(wǎng)傳輸數(shù)據(jù)的規(guī)則。HTTP是一種無狀態(tài)的協(xié)議,也就是每次請求都是獨(dú)立的,和之前或之后的請求無關(guān)。這就意味著如果后續(xù)處理需要前面的信息,則必須重傳數(shù)據(jù),這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。例如,在網(wǎng)上商城系統(tǒng)中,有一些頁面(比如發(fā)表評價(jià)頁面、購買商品頁面)需要用戶登錄后才能瀏覽。但在打開這些頁面時(shí)系統(tǒng)并不知道訪問者之前是否登錄過,于是就可能出現(xiàn)要求用戶重復(fù)登錄的情況。由于HTTP無狀態(tài)而造成的問題8.1.2解決方案

1.Cookie2.Session(會話)1.CookieCookie(小甜餅)有時(shí)也用其復(fù)數(shù)形式Cookies,指存儲在用戶本地上的少量數(shù)據(jù),最經(jīng)典的Cookie應(yīng)用就是記錄登錄用戶名和密碼,這樣下次訪問時(shí)就不需要輸入自己的用戶名和密碼了。也有一些高級的Cookie應(yīng)用,例如在網(wǎng)上商城查閱商品時(shí),該商城應(yīng)用程序就可以記錄用戶興趣和瀏覽記錄的Cookies。在下次訪問時(shí),網(wǎng)站根據(jù)情況對顯示的內(nèi)容進(jìn)行調(diào)整,將用戶所感興趣的內(nèi)容放在前列。Cookie存在如下缺陷Cookie的數(shù)據(jù)大小是由限制的,大多數(shù)瀏覽器只支持最大為4096字節(jié)的Cookie。有時(shí)不能滿足需求??蛻舳丝梢越没蚯蹇誄ookie,從而影響程序的功能。當(dāng)多人共用一臺計(jì)算機(jī)時(shí)使用Cookie可能會泄露用戶隱私,帶來安全問題。2.Session(會話)Session可以保持網(wǎng)站服務(wù)器和網(wǎng)站訪問者的交流,訪問者可以將數(shù)據(jù)保存在網(wǎng)站服務(wù)器中。為了區(qū)分不同的訪問者,網(wǎng)站服務(wù)器為每個(gè)網(wǎng)站訪問者都分配一個(gè)會話編號SID,一個(gè)訪問者在Session中保存的所有數(shù)據(jù)都與他的SID相關(guān)聯(lián)。在訪問者打開的所有頁面中,都可以通過SID設(shè)置和獲取Session數(shù)據(jù),因此通過Session可以實(shí)現(xiàn)個(gè)頁面間的數(shù)據(jù)共享。用戶在任意一個(gè)頁面登錄后,都可以將登錄標(biāo)記和登錄用戶名保存在Session變量中。這樣在其他頁面中就可以獲知用戶已經(jīng)登錄了,從而避免重復(fù)登錄。使用Cookie和Session技術(shù)的解決方案8.2Cookie的應(yīng)用8.2.1Cookie的工作原理8.2.2設(shè)置Cookie數(shù)據(jù)8.2.3讀取Cookie數(shù)據(jù)8.2.4刪除Cookie數(shù)據(jù)8.2.5在用戶身份驗(yàn)證時(shí)使用Cookie8.2.1Cookie的工作原理Cookie是Web服務(wù)器存放在用戶硬盤的一段文本,其中存儲著一些“鍵-值”對。每個(gè)Web站點(diǎn)都可以在用戶的機(jī)器上存放Cookie,并可以在需要時(shí)重新獲取Cookie數(shù)據(jù)。通常Web站點(diǎn)都有一個(gè)Cookie文件。Cookie的工作原理

8.2.2設(shè)置Cookie數(shù)據(jù)可以使用setcookie()函數(shù)設(shè)置Cookie數(shù)據(jù),語法如下:bool

setcookie

(

string

$name

[,

string

$value

[,

int

$expire

=0

[,

string

$path

[,

string

$domain

[,

bool

$secure

=false

[,

bool

$httponly

=false

]]]]]])參數(shù)說明如下:

name,Cookie的名字。

value,Cookie的值。

expire,Cookie的有效期,單位為秒。

path

,Cookie的服務(wù)器路徑,此目錄下的網(wǎng)頁都能訪問該cookie。

domain,Cookie的域名,此域名下的網(wǎng)頁都能訪問該cookie。

secure,規(guī)定是否通過安全的HTTPS連接來傳輸cookie。

httponly,如果設(shè)置為TRUE,則只能通過HTTP訪問Cookie,不能使用腳本語言(例如JavaScript訪問Cookie)。如果設(shè)置為FALSE,則沒有此限制。如果設(shè)置Cookie數(shù)據(jù)成功,則函數(shù)返回true,否則返回false。提示Setcookie()函數(shù)會發(fā)送網(wǎng)頁頭信息給客戶端瀏覽器,瀏覽器會根據(jù)這些信息設(shè)置本地cookie,而<html>標(biāo)簽是網(wǎng)頁正文,因此必須在頭信息發(fā)送完之后才能發(fā)送,也就是說setcookie()函數(shù)必須在<html>之前才能正常工作?!纠?-1】setcookie()函數(shù)的示例。<?php$value="mycookievalue";//發(fā)送一個(gè)簡單的cookiesetcookie("TestCookie",$value,time()+60*60*24*30);?><html><body>...</body></html>8.2.3讀取Cookie數(shù)據(jù)在PHP中,可以使用$_COOKIE數(shù)組讀取Cookie數(shù)據(jù),方法如下:Cookie值=$_COOKIE[Cookie名]也可以直接使用print_r()函數(shù)打印$_COOKIE數(shù)組的內(nèi)容。改進(jìn)【例8-1】,打印$_COOKIE數(shù)組的內(nèi)容,代碼如下:<?php$value="mycookievalue";//發(fā)送一個(gè)簡單的cookiesetcookie("TestCookie",$value,time()+60*60*24*30);?><html><body><?phpif(isset($_COOKIE["TestCookie"]))echo($_COOKIE["TestCookie"]."<BR>");print_r($_COOKIE);?></body></html>【例8-2】【例8-2】的運(yùn)行結(jié)果

使用Cookies記錄用戶訪問網(wǎng)頁的次數(shù)使用Cookies記錄用戶訪問網(wǎng)頁的次數(shù)8.2.4刪除Cookie數(shù)據(jù)每個(gè)Cookie都有有效期,刪除Cookie實(shí)際上就是將其有效期設(shè)置為過去的時(shí)間。【例8-4】刪除TestCookie,代碼如下:setcookie("TestCookie","",time()-3600);也就是將其有效期設(shè)置為1小時(shí)之前。8.2.5在用戶身份驗(yàn)證時(shí)使用Cookie5.3.1小節(jié)介紹了使用表單提交用戶身份認(rèn)證信息的例子,本節(jié)對該例進(jìn)行完善。用戶可以選擇在登錄成功后,將用戶身份認(rèn)證信息保存在Cookie里,以便下次打開登錄頁面時(shí)自動帶入用戶名和密碼。首先將5.3.1小節(jié)中的login.html改名為login.php,因?yàn)橐谄渲刑砑覲HP程序。在login.php的表單中添加一個(gè)復(fù)選框checkboxCookie,其定義代碼如下:<inputname="checkboxCookie"type="checkbox"checked>

用戶名文本框在用戶名文本框的定義代碼中增加從Cookie中讀取用戶名信息的功能,具體如下:<inputtype="text"name="txtUserName"value="<?PHPecho($_COOKIE["username"]);?>"size="20">$_COOKIE["username"]中保存上次成功登錄的用戶名,保存方法將在稍后介紹。密碼文本框在密碼文本框的定義代碼中增加從Cookie中讀取密碼信息的功能,具體如下:<inputtype="password"name="txtPwd"value="<?PHPecho($_COOKIE["password"]);?>"size="20">$_COOKIE["password"]中保存上次成功登錄的密碼,保存方法將在稍后介紹。check.php處理提交的用戶身份認(rèn)證信息的腳本為check.php。在check.php中,判斷是否選中了復(fù)選框checkboxCookie,如果選中且登錄成功,則將用戶信息保存在Cookie中,代碼如下:<?PHP//取輸入的用戶名和密碼

$UID=$_POST['txtUserName'];$PWD=$_POST['txtPwd'];//驗(yàn)證用戶名和密碼

if($UID=="admin"and$PWD=="pass"){echo("您已經(jīng)登錄成功,歡迎光臨。");if($_POST['checkboxCookie']=="on"){ setcookie("username",$UID,time()+60*60*24*365); setcookie("password",$PWD,time()+60*60*24*365);}}elseecho("登錄失敗,請返回重新登錄。");?>在登錄頁面中自動加載用戶名和密碼在瀏覽器中訪問login.php,登錄成功,關(guān)閉瀏覽器。然后再次在瀏覽器中訪問login.php,確認(rèn)可以自動加載用戶名和密碼

8.3Session的應(yīng)用8.3.1Session的工作原理8.3.2開始會話

8.3.3全局?jǐn)?shù)組$_SESSION8.3.4刪除會話變量8.3.5銷毀會話8.3.6配置Session8.3.1Session的工作原理Session可以實(shí)現(xiàn)客戶端和Web服務(wù)器的會話,Session數(shù)據(jù)也以“鍵-值”對的形式存儲在文件中。與Cookie不同,Session數(shù)據(jù)保存在服務(wù)器上。在會話存續(xù)期間,Web服務(wù)器上的各頁面都可以獲取Session數(shù)據(jù),從而了解與客戶端溝通的歷史記錄。從而避免用戶在瀏覽不同頁面時(shí)重復(fù)輸入數(shù)據(jù)(例如重復(fù)登錄)。每個(gè)Web站點(diǎn)都同時(shí)與多個(gè)用戶進(jìn)行會話,那么,Web站點(diǎn)又是如何區(qū)分與它會話的用戶呢?它會給每個(gè)訪問者分配一個(gè)會話ID(SID,session_id)。用戶第1次訪問Web站點(diǎn)時(shí)會得到Web服務(wù)器分配的會話ID,以后每次瀏覽器提交請求都會帶上這個(gè)會話ID,所有Session數(shù)據(jù)都與會話ID相關(guān)聯(lián)。Session的工作原理8.3.2開始會話在PHP腳本中,可以使用session_start()函數(shù)開始會話,語法如下:boolsession_start(void)如果成功開始了會話,則函數(shù)返回True;否則返回False。session_start()函數(shù)會為該會話隨機(jī)生成一個(gè)SessionID??梢允褂胹ession_id()函數(shù)獲取或設(shè)置SessionID,語法如下:stringsession_id([string$id])如果使用參數(shù)$id,則將其設(shè)置為SessionID;否則直接返回當(dāng)前的SessionID。SessionID用于標(biāo)識一個(gè)Session。除了SessionID,Session還有一個(gè)名字??梢允褂胹ession_name()函數(shù)獲取或設(shè)置Session的名字,語法如下:stringsession_name([string$name])如果使用參數(shù)$name,則將其設(shè)置為Session的名字;否則直接返回當(dāng)前的Session名?!纠?-5】開始會話并輸出SessionID和Session的名字,代碼如下:<?phpsession_start();echo("session_id()=".session_id());echo("<br>");echo("session_name()=".session_name());?>

輸出結(jié)果如下:session_id()=kofmo9l06ka2kuv5jpjth95797session_name()=PHPSESSID8.3.3全局?jǐn)?shù)組$_SESSION可以使用全局?jǐn)?shù)組$_SESSION設(shè)置和獲取Session數(shù)據(jù),它的用法與普通數(shù)組相同,只是數(shù)組$_SESSION由系統(tǒng)定義,可以在程序的任何位置訪問它。在訪問數(shù)組$_SESSION之前,應(yīng)該調(diào)用session_start()函數(shù)開始會話【例8-6】使用全局?jǐn)?shù)組$_SESSION存取Session數(shù)據(jù)的例子。<?phpdate_default_timezone_set('Asia/Chongqing');//系統(tǒng)時(shí)間差8小時(shí)問題

//開始會話

session_start();if($_SESSION["last_visit"]){echo"您上次訪問的時(shí)間為:";echodate("Y-m-d,H:i:s",$_SESSION["last_visit"]);echo"<br>";echo"訪問次數(shù):".$_SESSION["num_visits"];}elseecho"這是您的第1次訪問。";$_SESSION["last_visit"]=time();$_SESSION["num_visits"]++;?>【例8-6】分析程序中定義了2個(gè)Session變量,$_SESSION["last_visit"]用于保存上次訪問網(wǎng)頁的時(shí)間,$_SESSION["num_visits"]用于保存訪問網(wǎng)頁的次數(shù)。程序中調(diào)用time()函數(shù)獲取當(dāng)前的系統(tǒng)時(shí)間戳,并保存為$_SESSION["last_visit"]。在獲取時(shí)間戳之前需要調(diào)用date_default_timezone_set()函數(shù)設(shè)置時(shí)區(qū)為“Asia/Chongqing”,否則獲取的時(shí)間與實(shí)際時(shí)間會相差8小時(shí)。date()函數(shù)用于格式化一個(gè)本地時(shí)間,即按指定格式返回時(shí)間字符串,其語法如下:stringdate(string$format[,int$timestamp])函數(shù)會根據(jù)時(shí)間戳$timestamp返回時(shí)間字符串。date()函數(shù)參數(shù)$format中常用的格式字符format字符具體描述返回值例子d月份中的第幾天,有前導(dǎo)零的2位數(shù)字01~31D星期中的第幾天,文本表示,3個(gè)字母Mon~Sunj月份中的第幾天,沒有前導(dǎo)零1~31l(“L”的小寫字母)星期幾,完整的文本格式Sunday~SaturdayNISO-8601格式數(shù)字表示的星期中的第幾天1(表示星期一)~7(表示星期天)S每月天數(shù)后面的英文后綴,2個(gè)字符st,nd,rd或者th??梢院蚸一起用w星期中的第幾天,數(shù)字表示0(表示星期天)~6(表示星期六)F月份,完整的文本格式January~Decemberm數(shù)字表示的月份,有前導(dǎo)零01~12M三個(gè)字母縮寫表示的月份Jan~Decn數(shù)字表示的月份,沒有前導(dǎo)零1~12t給定月份所應(yīng)有的天數(shù)28~31L是否為閏年如果是閏年為1,否則為0Y4位數(shù)字完整表示的年份例如:1999或2012y2位數(shù)字表示的年份例如:99或12a小寫的上午和下午值am或pmA大寫的上午和下午值A(chǔ)M

PMg小時(shí),12小時(shí)格式,沒有前導(dǎo)零1~12G小時(shí),24小時(shí)格式,沒有前導(dǎo)零0~23h小時(shí),12小時(shí)格式,有前導(dǎo)零01~12H小時(shí),24小時(shí)格式,有前導(dǎo)零00~23i有前導(dǎo)零的分鐘數(shù)00~59s秒數(shù),有前導(dǎo)零00~59【例8-11】使用sp_tables存儲過程返回所有用戶表,可以使用如下命令:USEHrSystemGOEXECsp_tables@table_type="'TABLE'"GO結(jié)果如圖8-7所示。第1次訪問【例8-6】網(wǎng)頁時(shí)的界面第2次訪及以后訪問【例8-6】網(wǎng)頁時(shí)的界面8.3.4刪除會話變量對于不需要保留的輝會話變量,可以調(diào)用unset()函數(shù)將其刪除,釋放占用的內(nèi)存空間。unset()函數(shù)的語法如下:voidunset(mixed$var[,mixed$var[,$...]])可以看到,unset()函數(shù)可以同時(shí)釋放多個(gè)變量。unset()函數(shù)不僅可以釋放會話變量,也可以用來釋放普通變量?!纠?-7】使用unset()函數(shù)釋放普通變量的例子。<?php$str="歡迎使用PHP!";$a=10;unset($str,$a);var_dump($str);var_dump($a);?>以腳本運(yùn)行的結(jié)果如下:PHPNotice:Undefinedvariable:strinC:\workspace\test\hello.phponline6PHPStacktrace:PHP1.{main}()C:\workspace\test\hello.php:0PHPNotice:Undefinedvariable:ainC:\workspace\test\hello.phponline7PHPStacktrace:PHP1.{main}()C:\workspace\test\hello.php:0NULLNULL結(jié)果中提示程序中使用了未定義變量(實(shí)際是已經(jīng)釋放),最后輸出了2個(gè)NULL?!纠?-8】使用unset()函數(shù)釋放會話變量的例子。<?php//開始會話

session_start();$_SESSION["num_visits"]++;unset($_SESSION["num_visits"]);echo($_SESSION["num_visits"]);?>以腳本運(yùn)行的結(jié)果如下:PHPNotice:Undefinedindex:num_visitsinC:\workspace\test\hello.phponline7PHPStacktrace:PHP1.{main}()C:\workspace\test\hello.php:08.3.5銷毀會話盡管超過有效期的Session數(shù)據(jù)會被自動銷毀,但也可以使用PHP提供的系統(tǒng)函數(shù)手動銷毀會話。1.session_unset()函數(shù)session_unset()函數(shù)的功能是釋放所有的Session變量,但不刪除session文件以及不釋放對應(yīng)的sessionID,其語法如下:voidsession_unset(void)【例8-9】使用session_unset()函數(shù)銷毀會話的例子。<?php//開始會話

session_start();$_SESSION['user']='admin';session_unset();echo($_SESSION['user']);$_SESSION['user']='admin';?>程序的運(yùn)行結(jié)果如下:用戶名:session_id:7u2pv7m6jijlhi4smdte09q2f5可見,調(diào)用session_unset()函數(shù)后Session變量$_SESSION['user']被釋放,但sessionID并沒有被釋放。2.session_destroy()函數(shù)session_destroy()函數(shù)的功能是刪除當(dāng)前用戶對應(yīng)的session文件以及釋放sessionid,內(nèi)存中的$_SESSION變量內(nèi)容依然保留,其語法如下:boolsession_destroy(void)【例8-10】使用session_un

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論