使用Cookie和使用者會話
Cookie
Cookie,儲存一些關於使用者的較小的資訊。它和一個來自伺服器或腳本的請求相符。透過一個使用者的瀏覽器,一個主機可以請求保存20個cookie.每個coopkie包含一個名字,值和過期日期,以及主機和路徑資訊。一個單一的cookie的大小限制是4kb。在設定了cookie之後,只有發出請求的主機能夠讀取數據,這就保證了用戶隱私得到尊重。另外,使用者可以設定自己的瀏覽器通知他接受或是拒絕所有的cookie的請求。
設定了一個cookie的PHP腳本發送的標頭的Set-Cookie項目可能如下:
Set-Cookie:vegetable=artichoke;path=/;domain=yourdomain.com
Set-Cookie標頭包含:
標頭包含:一個名/值對(vegetable=artichoke),一個路徑(path=/)和一個域(domain=yourdomain.com)。 如果設定了expiration字段,它會提供瀏覽器在哪個日期「忘記」cookie的值。如果沒有設定過期日期,當使用者會話過期的時候,也就是當使用者關掉瀏覽器的時候,cookie就過期了。 path欄位和domain欄位協同工作,因為path是找到domain的一個目錄,cookie應該會送回給伺服器的這個目錄下面。如果路徑是“/”,這是很常見的值,表示cookie可以由文檔根目錄下的任何檔案讀取。 如果路徑是「/products」,這個cookie只能夠被web網站的/products目錄下的檔案讀取。 隨後,一個PHP腳本將能夠存取cookie,cookie在環境變數HTTP_COOKIE中或作為$_COOKIE超全域變數的一部分,可以用三種方式存取它們:
echo $_SERVER["HTTP_COOKIE"]; echo getenv("HTTP_COOKIE"); echo $_COOKIE["vegetable"];設定Cookie
<?php /** *setcookie()函数输出一个Set-Cookie标头。它应该在任何其他内容发送给浏览器之前调用。 *参数:cookie名字、cookie值、过期日期、路径、域、一个整数 *如果cookie仅通过一个安全的连接发送的话,这个整数的值设为1。0表示在一个非安全的环境中发送。 */ setcookie("vegetable","artichoke",time()+3600,"/","localhost",0); if (isset($_COOKIE["vegetable"])){ echo "<p>Hello again,you hava chosen:".$_COOKIE["vegetable"].".</p>"; }else { echo "<p>Hello you.This may be your first visit.</p>"; } ?>安全刪除cookie的方法同樣呼叫setcookie()函數,只需使用一個確定已經過期的時間,如:time()-60。 用戶會話會話函數為使用者提供了一個唯一的標識符,隨後可以用來儲存和獲取連接到該標識符的資訊。當一個訪客訪問一個支援會話的頁面,要么分配一個新的標識符,要么這個使用者和先前的訪問已經建立的一個標識符重新關聯。任何已經和會話相關聯的變量,都透過$_SESSION超全域變數變得可供你的程式碼使用。會話狀態通常儲存在一個暫存檔案中,儘管你可以使用一個名為session_set_save_handler()的函數實作資料庫儲存。 開始一個會話,返回ID,並儲存變量,保存為session1.php。
<?php session_start(); echo "<p>Your session ID is ".session_id().".</p>"; $_SESSION["product1"] = "Sonic Screwdriver"; $_SESSION["product2"] = "HAL 2000"; echo "The products have been registered."; ?>存取儲存的會話變量,使用session_save_path()函數查看暫存檔案儲存在系統的哪個地方,並儲存為sesson2.php。
<?php session_start(); echo "Your chosen products are:"; echo "<ul>"; echo "<li>".$_SESSION["product1"]."</li>"; echo "<li>".$_SESSION["product2"]."</li>"; echo "</ul>"; echo session_save_path(); ?>
再訪問伺服器下的session2.php,結果如下:
在該路徑下找到sess_curdcq4agn1到已註冊的變數是如何保存的。