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

PHP Cookie 與 Session 深度解析:從基礎到購物車實戰

     編輯:PHP 綜合知識

1. Cookie 基礎

Cookie 是瀏覽器存儲的少量數據(≤4KB),隨請求自動發送。包含名稱、值、過期時間、路徑、域、Secure/HttpOnly 標志。單域名限制 20 個。

設置 Cookie

<?php
// 推薦:setcookie() 自動構建 Set-Cookie 頭
// 必須在任何輸出前調用
setcookie("vegetable", "artichoke", time() + 3600, "/", ".example.com", true, true);
// 參數:名、值、過期時間戳、路徑、域、Secure、HttpOnly

// 讀取:$_COOKIE 超全局數組(僅包含當前請求攜帶的 Cookie)
if (isset($_COOKIE['vegetable'])) {
    echo "歡迎回來,你選擇了: " . htmlspecialchars($_COOKIE['vegetable']);
}

刪除 Cookie

<?php
// 設置過期時間為過去
setcookie("vegetable", "", time() - 3600, "/", ".example.com", true, true);
// 必須保持路徑、域、Secure 一致才能生效

2. Session 機制

Session 將數據存儲在服務端(默認文件),僅通過 session_id(Cookie 或 URL 傳遞)關聯客戶端。啟動:session_start()(必在輸出前)。數據存取:$_SESSION 超全局數組。

基本用法

<?php
session_start();
// 存儲
$_SESSION['product1'] = 'Sonic Screwdriver';
$_SESSION['product2'] = 'HAL 2000';
// 讀取(任意頁面)
echo $_SESSION['product1'];
// 銷毀
session_destroy(); // 刪除服務端文件
$_SESSION = [];    // 清空當前腳本數組
if (ini_get("session.use_cookies")) {
    setcookie(session_name(), '', time()-42000, '/'); // 刪除 ID Cookie
}

3. 實戰:基於 Session 的購物車

商品選擇頁 (cart_add.php)

<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['products'])) {
    // 合併去重
    $existing = $_SESSION['cart'] ?? [];
    $new = array_unique(array_merge($existing, $_POST['products']));
    $_SESSION['cart'] = $new;
    echo "<p>商品已加入購物車!</p>";
}
?>
<form method="post">
    <select name="products[]" multiple size="5">
        <option value="Sonic Screwdriver">Sonic Screwdriver</option>
        <option value="HAL 2000">HAL 2000</option>
        <option value="Tardis">Tardis</option>
        <option value="ORAC">ORAC</option>
    </select>
    <button type="submit">加入購物車</button>
</form>
<a href="cart_view.php">查看購物車</a>

購物車展示頁 (cart_view.php)

<?php
session_start();
echo "<h1>購物車</h1>";
if (!empty($_SESSION['cart'])) {
    echo "<ol>";
    foreach ($_SESSION['cart'] as $item) {
        echo "<li>" . htmlspecialchars($item) . "</li>";
    }
    echo "</ol>";
} else {
    echo "<p>購物車為空</p>";
}
?>
<a href="cart_add.php">繼續購物</a>

4. 進階主題

Session ID 傳遞方式

  • Cookie(默認): session.use_cookies=1, session.use_only_cookies=1(推薦,防 Session Fixation)。
  • URL 重寫: session.use_trans_sid=1 自動在鏈接附加 PHPSESSID=...,不推薦(暴露 ID、緩存污染)。

自定義存儲處理器

實現 SessionHandlerInterface 或使用 session_set_save_handler() 將 Session 存入 Redis、MySQL、Memcached,實現集群共享。

安全配置建議 (php.ini)

session.cookie_httponly = 1      ; 防 JS 訪問
session.cookie_secure = 1        ; 僅 HTTPS(生產環境)
session.use_strict_mode = 1      ; 拒絕未初始化 ID
session.gc_maxlifetime = 1440    ; 垃圾回收壽命(秒)
session.save_path = "/var/lib/php/sessions" ; 確保權限正確
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved