首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Cookie 實戰:記錄用戶首次/上次/本次訪問時間完整範例

     編輯:PHP 相關知識

核心代碼(已修復原始碼語法錯誤)

<?php
// 1. 設定正確的 Content-Type 與編碼
header('Content-Type: text/html; charset=utf-8');

$cookieName = 'visit_time';
$now        = date('Y-m-d H:i:s');

// 2. 判斷 Cookie 是否存在
if (!isset($_COOKIE[$cookieName])) {
    // 首次訪問:設定 Cookie(預設 session 級,瀏覽器關閉失效)
    setcookie($cookieName, $now);
    echo "歡迎你第一次訪問網站!<br>";
} else {
    // 再次訪問:讀取上次時間,並更新 Cookie(有效期 60 秒,演示用)
    $lastVisit = htmlspecialchars($_COOKIE[$cookieName], ENT_QUOTES, 'UTF-8');
    setcookie($cookieName, $now, time() + 60); // 修復:原碼漏掉 '+'
    echo "你上次訪問網站的時間為:{$lastVisit}<br>";
}

// 3. 顯示本次訪問時間
echo "你本次訪問網站的時間為:{$now}";

關鍵細節深度解析

1. setcookie() 參數陷阱

setcookie(string $name, string $value = "", int $expires_or_options = 0, 
          string $path = "", string $domain = "", bool $secure = false, bool $httponly = false)
  • expires:time() + 60 表示 60 秒後過期。原始碼寫成 time() 60 會導致語法錯誤。
  • path:預設為當前腳本目錄,建議明確設定 '/' 全站可用。
  • httponly:設為 true 防止 JavaScript 竊取(防 XSS)。
  • secure:HTTPS 環境下必須設 true,否則 Cookie 不發送。

2. Cookie vs Session 選型

本例屬「輕量追蹤」,Cookie 足夠;若涉及用戶身份,請改用 Session + CSRF 保護。

3. 安全加固建議

  1. 輸出轉義:htmlspecialchars() 防止 Cookie 值注入 XSS(雖本例由伺服器寫入,但防禦性編程必備)。
  2. 簽名驗證:hash_hmac('sha256', $value, $secret) 防止用戶端竄改時間。
  3. 加密存儲:敏感資訊用 openssl_encrypt (AES-256-GCM) 加密後再寫入 Cookie。
  4. SameSite 屬性:PHP 7.3+ setcookie(..., ['samesite' => 'Lax']) 防禦 CSRF。

進階版:記錄最近 5 次訪問時間(陣列序列化)

$maxRecords = 5;
$cookieName = 'visit_history';

$history = isset($_COOKIE[$cookieName]) ? json_decode($_COOKIE[$cookieName], true) : [];
if (!is_array($history)) $history = [];

$now = date('c'); // ISO 8601 格式,利於排序/解析
array_unshift($history, $now);
$history = array_slice($history, 0, $maxRecords);

setcookie($cookieName, json_encode($history), time() + 86400 * 30, '/', '', true, true);
// httponly=true, secure=true (需 HTTPS)

echo "最近訪問記錄:<br>";
foreach ($history as $i => $t) {
    echo ($i+1) . ". " . date('Y-m-d H:i:s', strtotime($t)) . "<br>";
}

總結

Cookie 是 HTTP 無狀態協議中維持「微量狀態」的基石。掌握 setcookie 完整參數、輸出轉義、安全屬性,能讓你輕鬆實現「記住我」、「最近瀏覽」、「首次引導」等常見功能,同時守住安全底線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性CookieSession
存儲位置客戶端瀏覽器伺服器端 (文件/Redis/DB)
容量限制單個 4KB,域名下約 20-50 個受伺服器記憶體/磁碟限制,較大
安全性可被竄改/竊取,需簽名/加密相對安全,ID 傳輸仍需防固定
適用場景記憶偏好、追蹤、輕量狀態登入態、購物車、敏感業務數據