Cookie 是伺服器儲存在用戶瀏覽器端的小型資料片段,常用於記錄登入狀態、偏好設定、購物車內容等。PHP 透過 setcookie() 函數發送 Cookie,瀏覽器會在後續請求中自動攜帶,伺服器端可透過 $_COOKIE 超全域變數讀取。
// 語法:setcookie(名稱, 值, 過期時間, 路徑, 網域, 安全, HttpOnly)
$cookieName = "user_pref";
$cookieValue = "dark_mode";
$expireTime = time() + (3600 * 24 * 30); // 30 天後過期
setcookie($cookieName, $cookieValue, $expireTime, "/"); // 路徑設為根目錄,全站可用
關鍵參數說明:
"/",否則僅在設定路徑及其子目錄生效。if (isset($_COOKIE["user_pref"])) {
echo "目前偏好:" . htmlspecialchars($_COOKIE["user_pref"]);
} else {
echo "尚未設定偏好 Cookie";
}
務必使用 isset() 檢查是否存在,並配合 htmlspecialchars() 防止 XSS 攻擊。
刪除的本質是將過期時間設為過去:
setcookie("user_pref", "", time() - 3600, "/"); // 1 小時前過期,瀏覽器將刪除
或直接呼叫不帶值的 setcookie("user_pref");(部分 PHP 版本支援)。
header("Set-Cookie: user_pref=dark_mode; expires=" . gmdate("D, d-M-Y H:i:s T", $expireTime) . "; path=/; HttpOnly");
此方式較底層,需自行組合符合 RFC 6265 的標頭字串,除非特殊需求,建議優先使用 setcookie()。
setcookie() 必須在任何 HTML 輸出、echo、空白字元之前呼叫,否則會觸發「Headers already sent」警告並失效。['samesite' => 'Lax'] 陣列,強化 CSRF 防護。Cookie 是 HTTP 無狀態特性下維持狀態的基礎機制。掌握 setcookie() 參數細節、讀取時的安全過濾、刪除的正確姿勢,並遵循「最小權限、最小範圍、最短壽命」原則,即能安全有效地在 PHP 專案中應用 Cookie。