setcookie() 必須在**任何輸出之前**呼叫,因為 Cookie 是透過 HTTP Response Header 設定。一旦有輸出(含空白、BOM、echo),Header 即鎖定無法修改。
<?php
echo "歡迎"; // 輸出內容
setcookie('name', 'value'); // 錯誤!Header 已發送
?>
開啟 error_reporting(E_ALL) 會看到:
Warning: Cannot modify header information – headers already sent by (output started at ...)
<?php
// 1. 設定 Cookie(最頂端,無任何輸出前)
setcookie('page', 'a.php', time() + 3600, '/'); // 有效期 1 小時,全站可用
// 2. 讀取 Cookie(下次請求才會出現在 $_COOKIE)
$page = $_COOKIE['page'] ?? 'unknown';
// 3. 輸出 HTML
?><!DOCTYPE html>
<html><body>
From <?= htmlspecialchars($page) ?><br><br>
<a href="b.php">Go to b.php</a>
</body></html>
| 參數 | 說明 | 範例 |
|---|---|---|
| name | Cookie 名稱 | 'user_id' |
| value | 儲存值(自動 urlencode) | 'john' |
| expire | Unix 時間戳,0 或省略為瀏覽器關閉失效 | time()+86400 (1天) |
| path | 生效路徑,'/' 代表全域 | '/' |
| domain | 生效域名,預設為當前域名 | '.example.com' |
| secure | 僅 HTTPS 傳輸 | true |
| httponly | 禁止 JS 存取,防 XSS | true |
a.php
<?php
setcookie('page', 'a.php', time()+3600, '/');
$from = $_COOKIE['page'] ?? 'unknown';
?><!DOCTYPE html>
<html><body>
From <?= htmlspecialchars($from) ?><br><br>
<a href="b.php">Go to b.php</a>
</body></html>
b.php
<?php
setcookie('page', 'b.php', time()+3600, '/');
$from = $_COOKIE['page'] ?? 'unknown';
?><!DOCTYPE html>
<html><body>
From <?= htmlspecialchars($from) ?><br><br>
<a href="a.php">Back to a.php</a>
</body></html>
setcookie() 在 <?php 開啟標籤後**第一行**執行include/require 引入的檔案有輸出error_reporting(E_ALL) 捕捉警告Set-Cookie Header