核心代碼
<?php
// 初始化計數
$count = 1;
if (!isset($_COOKIE['visittime'])) {
// 首次訪問
setcookie('visittime', date('Y-m-d H:i:s'));
setcookie('visitcount', 1);
echo '歡迎你第一次訪問網站!';
} else {
// 非首次:更新時間(有效期 60 秒示例),累加計數
setcookie('visittime', date('Y-m-d H:i:s'), time() + 60);
$count = $_COOKIE['visitcount'] + 1;
setcookie('visitcount', $count);
echo '你上次訪問網站的時間為:' . $_COOKIE['visittime'] . '
';
}
echo '你第 ' . $_COOKIE['visitcount'] . ' 次訪問網站的時間為:' . date('Y-m-d H:i:s');
?>
關鍵點解析
| 函數/操作 | 說明 | 注意事項 |
| setcookie(name, value, expire) | 發送 Cookie,必須在任何輸出前調用 | expire 為 Unix 時間戳;0 或省略為會話級 |
| $_COOKIE['key'] | 讀取客戶端發送的 Cookie | 僅包含上一次請求發送的值,剛 setcookie 不會立即生效 |
| date('Y-m-d H:i:s') | 格式化當前時間 | Y=四位年,m=兩位月,d=兩位日 |
常見問題與改進
- 剛設定的 Cookie 當前請求不可讀:
$_COOKIE 反映的是請求頭,需下一次請求才能讀到新值。代碼中直接使用 $count 變數輸出當前計數較妥當。
- 時間格式不一致:代碼中
date("y-m-d,H:i:s") 與 date("y-m-d H:i:s") 混用,建議統一用大寫 Y(四位年)與冒號分隔。
- 有效期過短:示例
time()+60 僅 60 秒,實際應設為天/月級(如 time()+86400*30)。
- 並發競態:高併發下 Cookie 計數可能不準,建議結合 Session/資料庫存儲。
- 安全性:敏感數據勿存 Cookie;可加入
httponly、secure、samesite 旗標(PHP 7.3+ setcookie 支援選項陣列)。
改進版(修正上述問題)
<?php
$visitCount = isset($_COOKIE['visitcount']) ? (int)$_COOKIE['visitcount'] : 0;
$lastVisit = isset($_COOKIE['visittime']) ? $_COOKIE['visittime'] : '';
$visitCount++;
$now = date('Y-m-d H:i:s');
setcookie('visitcount', $visitCount, time() + 86400 * 365, '/', '', false, true); // 1 年,httponly
setcookie('visittime', $now, time() + 86400 * 365, '/', '', false, true);
if ($visitCount === 1) {
echo '歡迎首次訪問!';
} else {
echo "上次訪問時間:$lastVisit
";
}
echo "這是您第 $visitCount 次訪問(當前時間:$now)";
?>