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

PHP Cookie 完整使用指南:設置、讀取、刪除與登錄實戰

     編輯:PHP 綜合知識

Cookie 是 HTTP 協議中實現會話狀態的關鍵機制。PHP 通過 setcookie() 向瀏覽器發送 Cookie,後續請求會自動攜帶。本文從基礎語法到完整登錄案例,系統講解 Cookie 的全生命周期管理。

基礎語法與參數詳解

setcookie(string $name, string $value, int $expire = 0, string $path = '', string $domain = '', bool $secure = false, bool $httponly = false): bool
參數說明
nameCookie 名稱(必填)
valueCookie 值(必填),自動 URL 編碼
expire過期時間戳(秒),0 表示會話結束失效
path生效路徑,默認當前目錄
domain生效域名,支持子域共享
secure僅 HTTPS 傳輸
httponly禁止 JavaScript 訪問,防 XSS

核心操作代碼示例

設置 Cookie

<?php
// 簡單設置(會話級)
setcookie('mycookie', 'value');

// 1 小時後過期
setcookie('withExpire', 'Expire_in_1_hour', time() + 3600);

// 完整參數
setcookie('FullCookie', 'Full_cookie_value', time() + 3600, '/forum', 'www.example.com', true, true);
?>

讀取 Cookie

<?php
// 推薦使用 $_COOKIE 超全局變量
echo $_COOKIE['mycookie'] ?? '未設置';

// 兼容舊版本
echo $HTTP_COOKIE_VARS['mycookie'] ?? '未設置';
?>

刪除 Cookie

本質是將過期時間設為過去:

<?php
// 推薦寫法:設置值為空並過期
setcookie('mycookie', '', time() - 3600);

// 等效寫法
setcookie('mycookie');
setcookie('mycookie', '');
setcookie('mycookie', false);
?>

進階技巧:記錄過期時間

為了在客戶端也能知道過期時間,可雙 Cookie 存儲:

<?php
$expire = time() + 86400; // 24 小時
setcookie('var_name', 'var_value', $expire);
setcookie('var_name_expire', $expire, $expire); // 同步過期時間
?>

實戰案例:基於 Cookie 的用戶登錄系統

1. 數據庫配置 connectvars.php

<?php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', '19900101');
define('DB_NAME', 'test');
?>

2. 登錄頁 logIn.php

<?php
require_once 'connectvars.php';
$error_msg = '';

// 已登錄則跳轉
if (isset($_COOKIE['user_id'])) {
    header('Location: loged.php');
    exit;
}

if (isset($_POST['submit'])) {
    $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    $username = mysqli_real_escape_string($dbc, trim($_POST['username']));
    $password = mysqli_real_escape_string($dbc, trim($_POST['password']));

    if (!empty($username) && !empty($password)) {
        // 使用 SHA 加密驗證(生產環境建議用 password_hash)
        $query = "SELECT user_id, username FROM mismatch_user WHERE username = '$username' AND password = SHA('$password')";
        $data = mysqli_query($dbc, $query);

        if (mysqli_num_rows($data) === 1) {
            $row = mysqli_fetch_array($data);
            setcookie('user_id', $row['user_id'], time() + 3600);
            setcookie('username', $row['username'], time() + 3600);
            header('Location: loged.php');
            exit;
        } else {
            $error_msg = '用戶名或密碼錯誤';
        }
    } else {
        $error_msg = '請填寫完整信息';
    }
}
?>
<html>
<head><title>登錄</title></head>
<body>
<h3>用戶登錄</h3>
<?php if (!empty($error_msg)): ?><p class="error"><?= $error_msg ?></p><?php endif; ?>
<form method="post" action="">
    <label>用戶名: <input type="text" name="username" value=""></label><br>
    <label>密碼: <input type="password" name="password"></label><br>
    <input type="submit" name="submit" value="登錄">
</form>
</body>
</html>

3. 登錄後頁面 loged.php

<?php
if (isset($_COOKIE['username'])) {
    echo '歡迎,' . htmlspecialchars($_COOKIE['username']) . '<br>';
    echo '<a href="logOut.php">退出登錄</a>';
} else {
    header('Location: logIn.php');
}
?>

4. 退出登錄 logOut.php

<?php
if (isset($_COOKIE['user_id'])) {
    setcookie('user_id', '', time() - 3600);
    setcookie('username', '', time() - 3600);
}
header('Location: logIn.php');
?>

關鍵注意事項

  1. 設置順序:同頁面多個 setcookie 從後往前生效,需先寫入再刪除。
  2. 路徑作用域:Cookie 面向路徑,默認當前目錄,跨目錄需顯式設置 path=/。
  3. 安全性:敏感 Cookie 必須設置 httponly 與 secure,防止 XSS 與中間人攻擊。
  4. 編碼:值自動 URL 編碼/解碼,若需原始值請用 setrawcookie()。

掌握以上內容,即可靈活運用 Cookie 實現會話管理、記住登錄等常見功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved