php使用Cookie實(shí)現(xiàn)和用戶會(huì)話的方法
本文實(shí)例講述了php使用Cookie實(shí)現(xiàn)和用戶會(huì)話的方法。分享給大家供大家參考。具體分析如下:
PHP 包含了很多的函數(shù),可以用來(lái)管理和記錄用戶信息,包括簡(jiǎn)單的 cookie 和全方位的用戶會(huì)話。會(huì)話使用 PHP 語(yǔ)言內(nèi)建的技術(shù),使得保存狀態(tài)就像是引用超全局變量那樣簡(jiǎn)單。
1.Cookie 簡(jiǎn)介
我們可以和 PHP 腳本一起使用 cookie 來(lái)存儲(chǔ)一些關(guān)于用戶的較小的信息。 Cookie 是由用戶瀏覽器存儲(chǔ)的少量數(shù)據(jù),它和一個(gè)來(lái)自服務(wù)器或腳本的請(qǐng)求一致。通過(guò)一個(gè)用戶的瀏覽器,一個(gè)單個(gè)的主機(jī)可以請(qǐng)求保存 20 個(gè) cookie 。每個(gè) cookie 包含一個(gè)名字、值和過(guò)期日期,以及主機(jī)和路徑信息。一個(gè)單個(gè)的 cookie 的大小限制是 4KB 。
在設(shè)置了 cookie 之后,只有發(fā)出請(qǐng)求的主機(jī)能夠讀取數(shù)據(jù),這就保證了用戶隱私得到尊重。另外,用戶可以配置自己的瀏覽器通過(guò)他接受或是拒絕所有 cookie 的請(qǐng)求。因此, cookie 應(yīng)該適度地使用,并且在沒(méi)有設(shè)計(jì)實(shí)現(xiàn)警告用戶的一個(gè)環(huán)境中,不應(yīng)該作為一個(gè)基本元素而依賴。
如果 Web 瀏覽器配置為存儲(chǔ) cookie ,它將保持基于 cookie 的信息直到過(guò)期日期。如果用戶使用瀏覽器瀏覽符合 cookie 的路徑和域的任何頁(yè)面,它將會(huì)把 cookie 重新發(fā)送給服務(wù)器。隨后,一個(gè) PHP 腳本能夠訪問(wèn) cookie , cookie 在環(huán)境變量 HTTP_COOKIE 中或者作為 $COOKIE 超全局變量的一部分,我們可以用 3 種方式來(lái)訪問(wèn)它們:
echo getenv("HTTP_COOKIE");
echo $_COOKIE["vegetable"];
2.使用 PHP 設(shè)置一個(gè) cookie
我們可以用兩種方法在一個(gè) PHP 腳本中設(shè)置一個(gè) cookie 。首先,用 header() 函數(shù)來(lái)設(shè)置 SetCookie 標(biāo)頭。 Header() 函數(shù)需要一個(gè)字符串,該字符串隨后將包含到服務(wù)器響應(yīng)的標(biāo)頭部分。由于標(biāo)頭會(huì)為你自動(dòng)發(fā)送, header() 必須在發(fā)送給瀏覽器的熱河輸出之前調(diào)用。
盡管沒(méi)什么困難,這種設(shè)置 cookie 的方法還是需要我們編寫一個(gè)函數(shù)來(lái)構(gòu)建標(biāo)頭字符串。像這個(gè)例子那樣格式化日期并對(duì)名 / 值對(duì)進(jìn)行 URL 編碼并不是特別艱難的任務(wù),但它還是一項(xiàng)重復(fù)性的工作,因?yàn)?PHP 提供了一個(gè)函數(shù)來(lái)做到這些,這就是 setcookie() 。
Setcookie() 函數(shù)所做的事情就像它的名字所顯示的那樣,它輸出一個(gè) Set-Cookie 標(biāo)頭。因此,它應(yīng)該在任何其他內(nèi)容發(fā)送給瀏覽器之前調(diào)用。這個(gè)函數(shù)接受 cookie 名字、 cookie 值、 UNIX 時(shí)間戳格式的過(guò)期日期、路徑、域,以及一個(gè)整數(shù),如果 cookie 僅通過(guò)一個(gè)安全的連接發(fā)送的話,這個(gè)整數(shù)的值設(shè)置為 1. 除了第一個(gè)參數(shù)以外,這個(gè)函數(shù)的所有參數(shù)都是可選的。
setcookie ( "vegetable" , "artichoke" , time ()+3600, "/" , ".yourdomain.com" , 0);
if ( isset ( $_COOKIE [ "vegetable" ])){
echo "<p>Hello again, you have chosen: " . $_COOKIE [ "vegetable" ]. ".</p>" ;
}
else {
echo "<p>Hello you. This may be your first visit.</p>" ;
}
?>
即便我們?cè)谀_本第一次運(yùn)行的時(shí)候設(shè)置 cookie , $_COOKIE["vegetable"] 變量也不會(huì)在這時(shí)候創(chuàng)建。由于只有當(dāng)瀏覽器將一個(gè) cookie 發(fā)送到服務(wù)器的時(shí)候,才會(huì)讀取它,因此,直到用戶重新訪問(wèn)這個(gè)域內(nèi)的一個(gè)頁(yè)面的時(shí)候,我們才能夠讀取它。
正式地講,要?jiǎng)h除一個(gè) cookie ,只需要調(diào)用帶有 cookie 名字參數(shù)的 setcookies():
setcookie("vegetable");
然而,這種方法并不總是奏效,并且不能依賴這種方法。相反,要?jiǎng)h除一個(gè) cookie ,使用一個(gè)確定已經(jīng)過(guò)期的時(shí)間來(lái)設(shè)置 cookie ,這種方法是最安全的:
Setcookie("vegetable", "", time()-60, "/", "yourdomain.com", 0);
還要確保傳遞給 setcookie() 與最初設(shè)置 cookie 時(shí)候所使用的是相同的路徑、域和安全參數(shù)。
3.會(huì)話函數(shù)概覽
當(dāng)一個(gè)訪客訪問(wèn)一個(gè)支持會(huì)話的頁(yè)面,要么分配一個(gè)新的標(biāo)識(shí)符,要么這個(gè)用戶和之前的訪問(wèn)已經(jīng)建立的一個(gè)標(biāo)識(shí)符重新關(guān)聯(lián)。任何已經(jīng)和會(huì)話相關(guān)聯(lián)的變量,都通過(guò) $_SESSION 超全局變量可供你的代碼使用。
會(huì)話狀態(tài)通常存儲(chǔ)在一個(gè)臨時(shí)文件中,盡管你可以使用一個(gè)名為 session_set_save_handler() 的函數(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)存儲(chǔ)。
4.開始一個(gè)會(huì)話
session_start ();
echo "<p>Your session ID is " . session_id (). "</p>" ;
?>
5.使用會(huì)話變量
在每一個(gè) PHP 文檔中訪問(wèn)一個(gè)唯一的會(huì)話標(biāo)識(shí)符只是會(huì)話功能的開始。當(dāng)一個(gè)會(huì)話啟動(dòng)后,我們可以在超全局變量 $_SESSION 中存儲(chǔ)任意多個(gè)變量,然后在任何支持會(huì)話的頁(yè)面上訪問(wèn)它們。
下面程序向超全局變量 $_SESSION 添加了兩個(gè)變量:
session_start ();
$_SESSION [ "product1" ] = "Sonic Screwdriver" ;
$_SESSION [ "product2" ] = "HAL 2000" ;
echo "The products have been registered." ;
?>
在用戶移動(dòng)到一個(gè)新的頁(yè)面之前,上面程序的神奇之處不會(huì)體現(xiàn)出來(lái)。下面的程序創(chuàng)建了一個(gè)單獨(dú)的 PHP 腳本,這個(gè)腳本訪問(wèn)存儲(chǔ)在超全局變量 $_SESSION 中的變量。
session_start ();
echo "Your chosen products are:" ;
echo "<ul>" ;
echo "<li>" . $_SESSION [ "product1" ]. "</li>" ;
echo "<li>" . $_SESSION [ "product2" ]. "</li>" ;
echo "</ul>" ;
?>
下列程序清單創(chuàng)建一個(gè)表單,它允許一個(gè)用戶來(lái)選擇多個(gè)產(chǎn)品。我們可以使用會(huì)話變量來(lái)創(chuàng)建一個(gè)基本的購(gòu)物車。
arraysession.php:
session_start ();
?>
<html>
<head>
<title> Storing an array with a session </title>
</head>
<body>
<h1> Product Choice Page </h1>
<?php
if ( isset ( $_POST [ "form_products" ])){
if (! empty ( $_SESSION [ "products" ])){
$products = array_unique (
array_merge ( unserialize ( $_SESSION [ "products" ]),
$_POST [ "form_produces" ]));
}
else
{
$_SESSION [ "products" ] = serialize ( $_POST [ "form_products" ]);
}
echo "<p>Your products have been registered!</p>" ;
}
?>
<form method = "POST" action = " <?php echo $_SERVER [ "PHP_SELF" ]; ?> " >
<p><strong> Select some products: </strong><br>
<select name = "form_product[]" multiple = "multiple" size = "3" >
<option value = "Sonic Screwdriver" > Sonic Screwdriver </option>
<option value = "Hal 2000" > Hal 2000 </option>
<option value = "Tardis" > Tardis </option>
<option value = "ORAC" > ORAC </option>
<option value = "Transporter bracelet" > Transporter bracelet </option>
</select>
<p><input type = "submit" value = "choose" /></p>
</form>
<p><a href = "session1.php" > go to content page </a></p>
</body>
</html>
session1.php:
/*
* Created on 2011-1-19
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
session_start ();
?>
<html>
<head>
<title> Accessing session variables </title>
</head>
<body>
<h1> Content Page </h1>
<?php
if ( isset ( $_SESSION [ "products" ])){
echo "<strong>Your cart:</strong><ol>" ;
foreach ( unserialize ( $_SESSION [ "products" ]) as $p ){
echo "<li>" . $p . "</li>" ;
}
echo "</ol>" ;
}
?>
<p><a href = "arraysession.php" > return to product choice page </a></p>
</body>
</html>
6.在查詢字符串中傳遞會(huì)話 ID
7.銷毀會(huì)話和重置變量
8.在一個(gè)帶有注冊(cè)用戶的環(huán)境中使用會(huì)話
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
- php通過(guò)會(huì)話控制實(shí)現(xiàn)身份驗(yàn)證實(shí)例
- PHP入門教程之會(huì)話控制技巧(cookie與session)
- PHP會(huì)話控制:Session與Cookie詳解
- php中session_id()函數(shù)詳細(xì)介紹,會(huì)話id生成過(guò)程及session id長(zhǎng)度
- PHP session會(huì)話的安全性分析
- 比較全的PHP 會(huì)話(session 時(shí)間設(shè)定)使用入門代碼
- 使用PHP會(huì)話(Session)實(shí)現(xiàn)用戶登陸功能
- php簡(jiǎn)單的會(huì)話類代碼
- php實(shí)現(xiàn)session自定義會(huì)話處理器的方法
- PHP會(huì)話控制實(shí)例分析
相關(guān)文章
PHP中使用mktime獲取時(shí)間戳的一個(gè)黑色幽默分析
mktime(hour,minute,second,month,day,year,is_dst)這是mktime的語(yǔ)法說(shuō)明,一目了然應(yīng)該不難寫出一個(gè)時(shí)間戳的代碼來(lái)2012-05-05php生成隨機(jī)字符串可指定純數(shù)字、純字母或者混合的
這篇文章主要介紹了php生成隨機(jī)字符串的實(shí)現(xiàn)可指定純數(shù)字、純字母或者混合的2014-04-04淺談PHP中類和對(duì)象的相關(guān)函數(shù)
下面小編就為大家?guī)?lái)一篇淺談PHP中類和對(duì)象的相關(guān)函數(shù)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04PHP實(shí)現(xiàn)將MySQL重復(fù)ID二維數(shù)組重組為三維數(shù)組的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)將MySQL重復(fù)ID二維數(shù)組重組為三維數(shù)組的方法,涉及php針對(duì)數(shù)組的遍歷與轉(zhuǎn)換操作相關(guān)技巧,需要的朋友可以參考下2016-08-08