PHP - Cookie



全球資訊網由 HTTP 協議提供支援,HTTP 協議是一種無狀態協議。Cookie 的機制幫助伺服器維護先前請求的資訊。PHP 透明地支援 HTTP Cookie。

  • 當客戶端第一次傳送請求時,伺服器會在其響應中包含一小段資料作為 Cookie。PHP 提供了 **setcookie()** 方法來在響應中注入 Cookie。

  • 此 Cookie 資料作為文字檔案儲存在客戶端的機器中。在相同客戶端的後續訪問中,這些 Cookie 將作為 **請求** 標頭的部分內容包含在內。

  • 伺服器使用 PHP 超全域性變數“$_COOKIE”填充客戶端請求中存在的全部 Cookie。

本章將教你如何設定 Cookie、如何訪問它們以及如何刪除它們。

Cookie 的結構

Cookie 通常在 HTTP 標頭中設定(儘管 JavaScript 也可以直接在瀏覽器上設定 Cookie)。設定 Cookie 的 PHP 指令碼可能會發送如下所示的標頭:

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; 
                 path=/; domain=tutorialspoint.com
Connection: close
Content-Type: text/html

如您所見,Set-Cookie 標頭包含一個名稱值對、一個 GMT 日期、一個路徑和一個域名。名稱和值將進行 URL 編碼。expires 欄位是指示瀏覽器在給定的時間和日期後“忘記”Cookie 的指令。

如果瀏覽器配置為儲存 Cookie,它將保留此資訊,直到過期日期。如果使用者將瀏覽器指向與 Cookie 的路徑和域匹配的任何頁面,它將把 Cookie 重新發送到伺服器。瀏覽器的標頭可能如下所示:

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

然後,PHP 指令碼將能夠在環境變數 $_COOKIE 或 $HTTP_COOKIE_VARS[] 中訪問 Cookie,該變數儲存所有 Cookie 的名稱和值。上面的 Cookie 可以使用 $HTTP_COOKIE_VARS["name"] 訪問。

如何在 PHP 中設定 Cookie?

PHP 包含 **setcookie** 函式來建立 Cookie 物件,以便與 HTTP 響應一起傳送到客戶端。

setcookie(name, value, expire, path, domain, security);

引數

以下是所有引數的詳細資訊:

  • **名稱** - 設定 Cookie 的名稱,並存儲在名為 HTTP_COOKIE_VARS 的環境變數中。此變數用於訪問 Cookie。

  • **值** - 設定命名變數的值,它是您實際要儲存的內容。

  • **過期時間** - 指定自 1970 年 1 月 1 日 00:00:00 GMT 以來以秒為單位的未來時間。在此時間之後,Cookie 將變得不可訪問。如果未設定此引數,則 Cookie 將在 Web 瀏覽器關閉時自動過期。

  • **路徑** - 指定 Cookie 有效的目錄。單個正斜槓字元允許 Cookie 對所有目錄有效。

  • **域** - 可用於在非常大的域中指定域名,並且必須包含至少兩個句點才能有效。所有 Cookie 只對建立它們的宿主和域有效。

  • **安全** - 可以設定為 1 以指定 Cookie 應僅透過使用 HTTPS 的安全傳輸傳送,否則設定為 0,這意味著 Cookie 可以透過常規 HTTP 傳送。

示例

下面給出的 PHP 指令碼檢查名為 **username** 的 Cookie 是否已設定,如果已設定,則檢索其值。否則,將設定一個新的 Cookie **username**。

<?php
   if (isset($_COOKIE['username'])) {
      echo "<h2>Cookie username already set:" . $_COOKIE['username'] . "</h2>";
   } else {
      setcookie("username", "MohanKumar");
      echo "<h2>Cookie username is now set</h2>";
   }
?>

從 Apache 伺服器的文件根目錄執行此指令碼。您應該看到以下訊息:

Cookie username is now set

如果重新執行此指令碼,則 Cookie 現在已設定。

Cookie username already set: MohanKumar

瀏覽器的開發者工具是一個非常有用的工具。您可以使用它來設定、檢索和刪除 Cookie。上述程式設定的 Cookie 可以在瀏覽器開發者工具的“應用程式”選項卡下檢視。

PHP Cookies

如下所示的 **foreach** 迴圈檢索所有 Cookie:

<?php
   $arr=$_COOKIE;
   foreach ($arr as $key=>$val);
   echo "<h2>$key=>$val </h2>";
?>

以下指令碼包含一個 HTML 表單。它將表單資料傳送到 setcookie.php 指令碼,該指令碼使用從 **$_POST** 陣列檢索的資料設定 Cookie。

以下程式碼呈現 HTML 表單:

<form action="setcookie.php" method="POST">
   <input type="text" name="name">
   <input type="text" name="age">
   <input type="submit" name="Submit">
</form>

**SetCookie.php** 讀取表單資料並設定 Cookie。

if (isset($_POST["submit"]) {
   setcookie("name", $_POST["name"]);
   setcookie("age", $_POST["age"]);
}

使用另一個 getcookie.php 程式碼,我們可以檢索設定的 Cookie。

if (isset($_COOKIE["name"])
echo "Cookie: name => " . $_COOKIE["name"]. "<br>";
if (isset($_COOKIE["age"])
echo "Cookie: age => " . $_COOKIE["age"]. "<br>";

使用 PHP 訪問 Cookie

PHP 提供了許多訪問 Cookie 的方法。最簡單的方法是使用 $_COOKIE 或 $HTTP_COOKIE_VARS 變數。以下示例將訪問上述示例中設定的所有 Cookie。

<?php
   echo $_COOKIE["name"]. "<br />";

   /* is equivalent to */
   echo $HTTP_COOKIE_VARS["name"]. "<br />";

   echo $_COOKIE["age"] . "<br />";

   /* is equivalent to */
   echo $HTTP_COOKIE_VARS["age"] . "<br />";
?>    

您可以使用 **isset()** 函式來檢查 Cookie 是否已設定。

<?php
   if( isset($_COOKIE["name"]))
      echo "Welcome " . $_COOKIE["name"] . "<br />";

   else
      echo "Sorry... Not recognized" . "<br />";
?>

刪除 Cookie

要刪除 Cookie,請使用已過期的日期設定 Cookie,以便瀏覽器觸發 Cookie 刪除機制。

示例

請檢視以下示例:

<?php
   setcookie("username", "", time() - 3600);
   echo "<h2>Cookie username is now removed</h2>";
?>

瀏覽器顯示以下響應:

Cookie username is now removed

您也可以透過在 Cookie 名稱中使用陣列表示法來設定陣列 Cookie。

setcookie("user[three]", "Guest");
setcookie("user[two]", "user");
setcookie("user[one]", "admin");

如果 Cookie 名稱包含點 (.),PHP 會將它們替換為下劃線 (_)。

儘管 Cookie 概念背後的主要目的是幫助 Web 開發人員提供更個性化和便捷的使用者體驗,但它可能會對您的隱私和個人資訊構成風險。

在某些情況下,應用程式可能會拒絕您完全訪問許可權,除非您接受其 Cookie。在這種情況下,建議定期清除瀏覽器快取中與 Cookie 相關的資料。

廣告