Cookie 是瀏覽器存儲在用戶端的小型文本數據。當瀏覽器請求頁面前,會先檢查該域名下是否有匹配的 Cookie,若有則隨請求發送至服務器。服務器據此識別用戶、提供個性化內容(如 Amazon 的推薦頁面)。
setcookie() 詳解必須在輸出任何 HTML 內容前調用,通常置於 <head> 區域:
<?php
setcookie("CookieID", $USERID);
?>
<html><body>...</body></html>
setcookie() 接受六個參數:
| 參數 | 說明 |
|---|---|
| 名稱 | 字符串,必填,不可含冒號、逗號、空格。僅提供此參數則刪除該 Cookie。 |
| 值 | 通常為字符串變量,可用 "" 跳過設置。 |
| 過期時間 | Unix 時間戳。省略或 0 表示會話級(瀏覽器關閉失效)。常用相對時間:time()+3600 表示 1 小時後過期。 |
| 路徑 | 匹配路徑,"/" 表示整個域名有效。注意 PHP 與 Netscape 定義順序相反。 |
| 域名 | 需以點開頭,如 ".example.com",至少包含兩個點才被接受。 |
| 安全標誌 | 1 僅 HTTPS 傳輸,0 或省略允許 HTTP。 |
PHP 自動將接收到的 Cookie 轉為同名變量(如 $CookieID),也可通過超全局數組訪問:
echo $CookieID; // 直接變量
echo $_COOKIE['CookieID']; // 推薦方式(PHP 4.1.0+)
echo $HTTP_COOKIE_VARS['CookieID']; // 老版本寫法
結合 MySQL AUTO_INCREMENT 主鍵作為唯一用戶標識:
ALTER TABLE users
ADD COLUMN uid INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT;
用戶註冊後,將生成的 uid 寫入 Cookie(有效期 3 年):
<?php
mysql_connect("localhost", "user", "pass");
mysql_select_db("mydb");
mysql_query("INSERT INTO users (username) VALUES ('$username')");
setcookie("CookieID", mysql_insert_id(), time()+94608000, "/");
?>
後續訪問時自動識別:
<?php
if (isset($_COOKIE['CookieID'])) {
$uid = $_COOKIE['CookieID'];
$res = mysql_query("SELECT username FROM users WHERE uid=$uid");
$row = mysql_fetch_assoc($res);
echo "歡迎回來,{$row['username']}!";
} else {
// 顯示登錄/註冊表單
}
?>
HttpOnly 標誌防 XSS(PHP 5.2+ 支持 setcookie 第 7 參數)。