PHP Cookie 操作指南:设置、读取与删除详解

山海之间
山海之间
发布时间:2026-10-14| 2人浏览过
原创

了解如何在PHP中正确使用Cookie来维持用户登录状态和记录偏好。本指南涵盖setcookie()函数的参数详解、有效期计算方法以及完整的登录注销流程实现,确保数据在不同页面间稳定传输。

结果或目标

在Web开发中,服务器需要通过某种方式记住客户端的身份或偏好。Cookie 是一种存储在浏览器端的小文本文件,由服务器发送并在后续请求中自动回传。本文将展示如何利用 PHP 的 setcookie() 函数创建 Cookie,并通过 $_COOKIE 超级全局数组读取数据,最终实现一个包含登录、验证和注销功能的完整流程。

准备条件

  • 环境要求:已部署支持 PHP 的 Web 服务器(如 Apache/Nginx + PHP)。
  • 基本认知:理解 HTTP 协议的无状态特性,知道 Cookie 是基于响应头(Set-Cookie)下发的。
  • 重要限制:setcookie() 函数必须在任何 HTML 输出之前调用,因为它需要修改 HTTP 头部信息。如果已经输出了任何字符(包括空格),设置将会失败。

真实操作顺序

第1步:理解核心函数与参数

使用 setcookie() 设置 Cookie 时,需关注以下参数:

  1. name (必需):Cookie 的名称,例如 'user_id'。
  2. value (可选):Cookie 的值。注意值会自动进行 URL 编码。
  3. expire (可选):过期时间戳。若省略,则关闭浏览器即失效。可使用 time()+3600 设置为1小时后失效。
  4. path (可选):Cookie 有效的服务器路径。设为 '/' 表示对整站有效,默认为当前目录。
  5. domain (可选):Cookie 有效的域名。如需跨子域共享,需设置主域名。
  6. secure (可选):1 表示仅通过 HTTPS 传输;0 允许 HTTP。

读取 Cookie 时,直接访问超全局变量 $_COOKIE['name']。例如:

复制代码 代码如下:
// 设置一个简单的 Cookie
setcookie('mycookie', 'value');

// 读取 Cookie
echo $_COOKIE['mycookie'];

// 检查是否存在
if (isset($_COOKIE['mycookie'])) {
    echo "Cookie exists.";
}

第2步:计算与控制有效期

合理设置过期时间是关键。PHP 提供了 mktime() 函数来计算特定日期的时间戳,也常用 time() 配合偏移量。例如,若要设置 Y2K 纪念 Cookie 或在24小时后过期:

复制代码 代码如下:
// 方法一:相对于当前时间的秒数
setcookie('temporary', 'data', time() + 86400); // 24小时后过期

// 方法二:指定具体日期时间
$y2k = mktime(0, 0, 0, 1, 1, 2000);
setcookie('year2000', 'legacy', $y2k);

// 方法三:存储过期时间本身以便前端显示
$expire = time() + 3600;
setcookie('session_token', 'abc123', $expire);
setcookie('session_token_expire', $expire, $expire);

第3步:删除 Cookie

删除 Cookie 的本质是将其过期时间设置为过去的时间点。推荐做法是将过期时间设为当前时间减去一段缓冲时间(如3600秒),并清空其值:

复制代码 代码如下:

第4步:整合登录流程实战

下面是一个基于 MySQL 登录验证并使用 Cookie 保持登录状态的完整案例。请注意,实际生产中应使用预处理语句防止 SQL 注入,此处为演示逻辑简化了部分安全细节。

配置连接:

复制代码 代码如下:
<?php
// connectvars.php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASSWORD', ''); // 请替换为你的密码
define('DB_NAME', 'test');
?>

登录处理页 (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);
    // 注意:生产环境请使用 prepare statement
    $user_username = mysqli_real_escape_string($dbc, trim($_POST['username']));
    $user_password = mysqli_real_escape_string($dbc, trim($_POST['password']));

    if(!empty($user_username) && !empty($user_password)) {
        // 假设数据库中 password 字段存的是 SHA1 加密后的密文
        $query = "SELECT user_id, username FROM users WHERE username = '$user_username' AND password = SHA('$user_password')";
        $data = mysqli_query($dbc, $query);

        if(mysqli_num_rows($data) == 1) {
            $row = mysqli_fetch_array($data);
            // 设置 Cookie 保存用户ID和用户名
            setcookie('user_id', $row['user_id']);
            setcookie('username', $row['username']);
            header('Location: loged.php');
            exit();
        } else {
            $error_msg = '用户名或密码错误';
        }
        mysqli_close($dbc);
    } else {
        $error_msg = '请输入有效的用户名和密码';
    }
}
?>
<!DOCTYPE html>
<html>
<head><title>登录</title></head>
<body>
<h3>用户登录</h3>
<p style="color:red"></p>
<form method="post" action="">
  <label>用户名:</label>
  <input type="text" name="username" /><br/>
  <label>密码:</label>
  <input type="password" name="password" /><br/>
  <input type="submit" value="Log In" name="submit" />
</form>
</body>
</html>

登录成功页 (loged.php):

复制代码 代码如下:
<?php
if(isset($_COOKIE['username'])) {
    echo '欢迎回来, ' . htmlspecialchars($_COOKIE['username']) . '!<br/>';
    echo '<a href="logOut.php">退出登录</a>';
} else {
    header('Location: logIn.php');
}
?>

注销页 (logOut.php):

复制代码 代码如下:
<?php
// 删除所有相关的 Cookie
if(isset($_COOKIE['user_id'])) {
    setcookie('user_id', '', time() - 3600, '/');
    setcookie('username', '', time() - 3600, '/');
}
// 重定向回登录页
header('Location: logIn.php');
exit();
?>

完成判断与注意事项

当你在浏览器中执行上述代码,刷新页面后可以通过开发者工具(Network -> Headers -> Set-Cookie)看到服务器下发的 Cookie。再次请求时,可以看到浏览器自动发送了该 Cookie,从而实现了状态保持。

  • 执行顺序:在同一脚本中,如果要先删除再设置同名 Cookie,必须先写 setcookie 设置语句,再写删除语句。因为 Header 是一起发送的,后面的指令会覆盖前面的。
  • 路径作用域:默认情况下,Cookie 只对设置它的目录及其子目录可见。如果需要在整个网站共享,务必设置 path='/'。
  • 安全性:对于敏感信息,建议使用 setrawcookie() 避免自动编码,并结合 secure=1 和 httpOnly=true(虽然原生 setcookie 不支持 httpOnly 直接传参,但可通过 session_set_cookie_params 或设置 Header 实现)来增强安全性。
  • 调试技巧:如果设置失败,首先检查是否有误输出的 HTML 或空格。可以使用 var_dump(headers_list()) 查看当前是否还有未发送的头部。

简要总结

通过本文的操作,您掌握了 PHP 中 Cookie 的生命周期管理。从基本的 setcookie 语法,到利用时间戳精确控制有效期,再到结合数据库实现的完整登录注销闭环,这些知识点构成了 Web 身份认证的基础。在实际应用中,请始终考虑安全性和数据隔离,避免将敏感明文存储在 Cookie 中。

以上就是 PHP Cookie 使用方法学习笔记分享的详细内容,更多关于 PHP cookie 操作的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。