在 PHP 中操作 Cookie 是一項基礎且實用的技能。雖然我們不盲目推崇 Cookie,但它確實是解決特定問題(如跨頁面狀態保持)的關鍵工具。本文將系統介紹如何使用 setcookie() 函數建立、修改、刪除 Cookie,並說明其參數細節與常見陷阱。
最簡單的設定方式只需提供名稱與值:
<?php
setcookie('name', 'bret');
?>
此 Cookie 為「Session Cookie」,生命週期隨瀏覽器關閉而結束。在用戶會話期間,所有同域頁面皆可透過 $_COOKIE['name'] 讀取其值。
若需在瀏覽器關閉後保留 Cookie,必須傳入第三個參數——過期時間戳(Unix Timestamp,即從 1970-01-01 起的秒數)。PHP 提供 mktime() 協助轉換:
<?php
$expire = mktime(0, 0, 0, 1, 1, 2000); // 2000-01-01 00:00:00
setcookie('name', 'bret', $expire);
?>
此 Cookie 將在 2000 年到期。注意:時間戳必須為整數秒數。
更新 Cookie 只需再次呼叫 setcookie() 覆蓋舊值:
<?php
$expire = mktime(0, 0, 0, 1, 1, 2000);
setcookie('name', 'jeff', $expire);
?>
重要:此時目前頁面的 $name 變數不會自動更新,因為 Cookie 值在頁面載入時已確定。若需同步,請先設定變數再寫入 Cookie:
<?php
$name = 'jeff';
$expire = mktime(0, 0, 0, 1, 1, 2000);
setcookie('name', $name, $expire);
?>
預設僅允許設定 Cookie 的伺服器同域、同目錄下的頁面讀取。若需跨子域或特定目錄存取,可指定路徑與域名:
<?php
$expire = mktime(0, 0, 0, 1, 1, 2000);
setcookie('name', 'jeff', $expire, '~/myhome', '.domain.com');
?>
/ 表示全站). 開頭可包含所有子域)將第 6 參數設為 1(或 true),Cookie 僅會在 HTTPS 連線下傳送,增強安全性:
setcookie('name', 'value', $expire, '/', '.domain.com', 1);
只需傳入名稱,不帶值或將過期時間設為過去:
<?php
setcookie('name'); // 或 setcookie('name', '', time()-3600);
?>
Cookie 屬於 HTTP Header,必須在任何輸出(HTML、空白、echo)之前送出,否則會觸發警告且 Cookie 失效。
正確範例:
<?php
setcookie('name', 'jeff');
echo "Hello Everyone!";
?>
錯誤範例: 先輸出內容再設定 Cookie
<?php
echo "Some output...";
setcookie('name', 'jeff'); // 警告:Header already sent
?>
掌握 setcookie() 的六個參數與「輸出前設定」原則,即可靈活運用 Cookie 實現跨頁面狀態管理、記住登入狀態、追蹤用戶偏好等功能。實務上建議搭配 Session 機制使用,兼顧安全與便利性。