PHP Conference Japan 2024

$_COOKIE

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_COOKIEHTTP Cookies

說明

一個關聯式 陣列,包含透過 HTTP Cookies 傳遞到目前腳本的變數。

範例

範例 #1 $_COOKIE 範例

<?php
echo 'Hello ' . htmlspecialchars($_COOKIE["name"]) . '!';
?>

假設 "name" cookie 已事先設定。

上述範例將輸出類似以下的內容:

Hello Hannes!

注意事項

備註:

這是一個「超全域」變數,或稱為自動全域變數。這表示它在腳本的所有作用域中皆可用。無需使用 global $variable; 即可在函式或方法中存取它。

新增註解

使用者貢獻的註解 4 則註解

kiril (at) atern (dot) us
8 年前
澄清先前發佈的註解

Cookie 名稱中的點 (.) 和空格 ( ) 會被底線 (_) 取代。
k dot andris at gmail dot com
9 年前
注意,Cookie 名稱中的點 (.) 會被底線 (_) 取代。
rc at opelgt dot org
1 年前
$_COOKIE 的值通常與 $_SERVER["HTTP_COOKIE"] 中的值不同!

在 phpinfo() 中,$_SERVER["HTTP_COOKIE"] 顯示瀏覽器以 7 位元格式儲存在 Cookie 中的實際值。
$_COOKIE 中的值是經過 7 位元轉換為 8 位元後的結果。

當 $_SERVER["HTTP_COOKIE"] 中的所有字元都是 ASCII = 7 位元時,$_COOKIE 會顯示在 phpinfo() 中。當單個字元不是 ASCII 時,phpinfo() 則不會顯示任何值!

儘管 $_COOKIE 中仍然是 $_SERVER["HTTP_COOKIE"] 經過 8 位元轉換後的結果!
原因:僅僅進行 8 位元轉換不足以說明其代表的字元。
為此,需要使用字元集。

phpinfo() 不知道字元集,因此最好什麼都不顯示。

在 PHP 生成的網頁中使用 $_COOKIE 時,環境具有所用字元集的資訊,因此可以顯示預期的字元。

三個說明範例
===========================
使用 HTML 表單獲取要儲存在名為 "test" 的 Cookie 中的內容。

在 "test" 欄位中輸入的字串:door
$_SERVER["HTTP_COOKIE"]: test=door
$_COOKIE["test"]
在 phpinfo() 中顯示:door
在任何 HTML 頁面中顯示:door

在 "test" 欄位中輸入的字串(表單中使用 ISO-8859-1):Tür
$_SERVER["HTTP_COOKIE"]: test=T%FCr
$_COOKIE["test"]
在 phpinfo() 中顯示:""
在 ISO-8859-1 HTML 頁面中顯示:Tür
(在 UTF-8 HTML 頁面中顯示:T�r)

在 "test" 欄位中輸入的字串(表單中使用 UTF-8):Tür
$_SERVER["HTTP_COOKIE"]: test=T%C3%BCr
$_COOKIE["test"]
在 phpinfo() 中顯示:""
在 UTF-8 HTML 頁面中顯示:Tür
(在 ISO-8859-1 HTML 頁面中顯示:Tür)
user at NOSPAM dot example dot com
1 年前
PHP 會將點 (.) 替換成底線 (_)。要查找所有原始 Cookie 名稱(和值),您可以使用 $_SERVER['HTTP_COOKIE']。

例如,要擷取使用 <?php setcookie('testing.dots', 'value'); ?> 設定的 Cookie,您可以使用
<?php
$cookies
= explode('; ', $_SERVER['HTTP_COOKIE']);
$allCookies = [];

foreach(
$cookies as $cookie) {
$keyAndValue = explode('=', $cookie);
$allCookies[$keyAndValue[0]] = $keyAndValue[1];
}

var_dump($allCookies);
/*
array(1) {
["testing.dots"]=>
string(5) "value"
}
*/

echo $allCookies['testing.dots'];
?>
To Top