本文實例講述了php使用Cookie實現和用戶會話的方法。分享給大家供大家參考。具體分析如下:
PHP 包含了很多的函數,可以用來管理和記錄用戶信息,包括簡單的 cookie 和全方位的用戶會話。會話使用 PHP 語言內建的技術,使得保存狀態就像是引用超全局變量那樣簡單。
1.Cookie 簡介
我們可以和 PHP 腳本一起使用 cookie 來存儲一些關於用戶的較小的信息。 Cookie 是由用戶浏覽器存儲的少量數據,它和一個來自服務器或腳本的請求一致。通過一個用戶的浏覽器,一個單個的主機可以請求保存 20 個 cookie 。每個 cookie 包含一個名字、值和過期日期,以及主機和路徑信息。一個單個的 cookie 的大小限制是 4KB 。
在設置了 cookie 之後,只有發出請求的主機能夠讀取數據,這就保證了用戶隱私得到尊重。另外,用戶可以配置自己的浏覽器通過他接受或是拒絕所有 cookie 的請求。因此, cookie 應該適度地使用,並且在沒有設計實現警告用戶的一個環境中,不應該作為一個基本元素而依賴。
如果 Web 浏覽器配置為存儲 cookie ,它將保持基於 cookie 的信息直到過期日期。如果用戶使用浏覽器浏覽符合 cookie 的路徑和域的任何頁面,它將會把 cookie 重新發送給服務器。隨後,一個 PHP 腳本能夠訪問 cookie , cookie 在環境變量 HTTP_COOKIE 中或者作為 $COOKIE 超全局變量的一部分,我們可以用 3 種方式來訪問它們:
復制代碼 代碼如下:echo $_SERVER["HTTP_COOKIE"];
echo getenv("HTTP_COOKIE");
echo $_COOKIE["vegetable"];
2.使用 PHP 設置一個 cookie
我們可以用兩種方法在一個 PHP 腳本中設置一個 cookie 。首先,用 header() 函數來設置 SetCookie 標頭。 Header() 函數需要一個字符串,該字符串隨後將包含到服務器響應的標頭部分。由於標頭會為你自動發送, header() 必須在發送給浏覽器的熱河輸出之前調用。
復制代碼 代碼如下:head("Set Cookie:vegetable=artichoke; expires=Tue,07-Mar-06 14:39:58 GMT;path=/;domain=yourmain.com");
盡管沒什麼困難,這種設置 cookie 的方法還是需要我們編寫一個函數來構建標頭字符串。像這個例子那樣格式化日期並對名 / 值對進行 URL 編碼並不是特別艱難的任務,但它還是一項重復性的工作,因為 PHP 提供了一個函數來做到這些,這就是 setcookie() 。
Setcookie() 函數所做的事情就像它的名字所顯示的那樣,它輸出一個 Set-Cookie 標頭。因此,它應該在任何其他內容發送給浏覽器之前調用。這個函數接受 cookie 名字、 cookie 值、 UNIX 時間戳格式的過期日期、路徑、域,以及一個整數,如果 cookie 僅通過一個安全的連接發送的話,這個整數的值設置為 1. 除了第一個參數以外,這個函數的所有參數都是可選的。
復制代碼 代碼如下:<?php
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>" ;
}
?>
即便我們在腳本第一次運行的時候設置 cookie , $_COOKIE["vegetable"] 變量也不會在這時候創建。由於只有當浏覽器將一個 cookie 發送到服務器的時候,才會讀取它,因此,直到用戶重新訪問這個域內的一個頁面的時候,我們才能夠讀取它。
正式地講,要刪除一個 cookie ,只需要調用帶有 cookie 名字參數的 setcookies():
setcookie("vegetable");
然而,這種方法並不總是奏效,並且不能依賴這種方法。相反,要刪除一個 cookie ,使用一個確定已經過期的時間來設置 cookie ,這種方法是最安全的:
Setcookie("vegetable", "", time()-60, "/", "yourdomain.com", 0);
還要確保傳遞給 setcookie() 與最初設置 cookie 時候所使用的是相同的路徑、域和安全參數。
3.會話函數概覽
當一個訪客訪問一個支持會話的頁面,要麼分配一個新的標識符,要麼這個用戶和之前的訪問已經建立的一個標識符重新關聯。任何已經和會話相關聯的變量,都通過 $_SESSION 超全局變量可供你的代碼使用。
會話狀態通常存儲在一個臨時文件中,盡管你可以使用一個名為 session_set_save_handler() 的函數實現數據庫存儲。
4.開始一個會話
復制代碼 代碼如下:<?php
session_start ();
echo "<p>Your session ID is " . session_id (). "</p>" ;
?>
5.使用會話變量
在每一個 PHP 文檔中訪問一個唯一的會話標識符只是會話功能的開始。當一個會話啟動後,我們可以在超全局變量 $_SESSION 中存儲任意多個變量,然後在任何支持會話的頁面上訪問它們。
下面程序向超全局變量 $_SESSION 添加了兩個變量:
復制代碼 代碼如下:<?php
session_start ();
$_SESSION [ "product1" ] = "Sonic Screwdriver" ;
$_SESSION [ "product2" ] = "HAL 2000" ;
echo "The products have been registered." ;
?>
在用戶移動到一個新的頁面之前,上面程序的神奇之處不會體現出來。下面的程序創建了一個單獨的 PHP 腳本,這個腳本訪問存儲在超全局變量 $_SESSION 中的變量。
復制代碼 代碼如下:<?php
session_start ();
echo "Your chosen products are:" ;
echo "<ul>" ;
echo "<li>" . $_SESSION [ "product1" ]. "</li>" ;
echo "<li>" . $_SESSION [ "product2" ]. "</li>" ;
echo "</ul>" ;
?>
下列程序清單創建一個表單,它允許一個用戶來選擇多個產品。我們可以使用會話變量來創建一個基本的購物車。
arraysession.php:
復制代碼 代碼如下:<?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:
復制代碼 代碼如下:<?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.在查詢字符串中傳遞會話 ID
7.銷毀會話和重置變量
8.在一個帶有注冊用戶的環境中使用會話
希望本文所述對大家的php程序設計有所幫助。