setcookie() 定義的 Cookie 必須隨 HTTP 標頭一起送出,因此必須在任何輸出(HTML、空白、echo 等)之前呼叫。若在此之前有任何輸出,函式將失敗回傳 false;成功則回傳 true(不代表瀏覽器一定接受)。
bool setcookie(
string $name,
string $value = "",
int $expire = 0,
string $path = "",
string $domain = "",
bool $secure = false,
bool $httponly = false
)
註:PHP 5.2+ 新增 httponly 參數,防止 JavaScript 存取,提升安全性。
透過 $_COOKIE['name'] 讀取。命名建議:僅用英數字、底線,避免特殊字元。
儲存在客戶端,**切勿存放敏感資料**(密碼、Token 等)。值會自動 urlencode,讀取時自動解碼。若不想編碼,PHP 5.5+ 可用 setrawcookie()。
time() + 3600(1小時)、time() + 86400 * 30(30天)。/:整個網域有效(推薦)。/foo/:僅 /foo/ 及子目錄有效。.example.com:example.com 及所有子網域有效(前綴點可省略但建議加上)。www.example.com:僅 www 子網域有效。設 true 時,只有 HTTPS 連線會送出 Cookie。預設 false。正式環境強烈建議啟用。
設 true 可防 XSS 攻擊竊取 Cookie。現代框架預設開啟。
$value = 'user_pref_data';
setcookie('TestCookie', $value); // Session Cookie
setcookie('TestCookie', $value, time() + 3600); // 1小時
setcookie('TestCookie', $value, time() + 3600, '/', '.example.com', true, true); // 完整參數
<?php
echo $_COOKIE['TestCookie'] ?? '未設定';
print_r($_COOKIE); // 除錯用:顯示所有 Cookie
?>
將過期時間設為過去:
setcookie('TestCookie', '', time() - 3600);
setcookie('TestCookie', '', time() - 3600, '/', '.example.com', true, true);
<?php
setcookie('cookie[three]', 'cookiethree');
setcookie('cookie[two]', 'cookietwo');
setcookie('cookie[one]', 'cookieone');
// 讀取時自動成為陣列
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $name => $value) {
echo "$name : $value <br>";
}
}
/*
輸出:
three : cookiethree
two : cookietwo
one : cookieone
*/
?>
setcookie() 放在檔案最頂端。domain=.example.com。secure=true, httponly=true;敏感資料改用 Session 或加密 Token。Cookie 基礎不難,關鍵在掌握 path、domain、secure、httponly 這四個安全與作用域參數。正確設定才能兼顧便利性與安全性。