PHP Cookie 操作指南:设置、读取与删除详解
了解如何在PHP中正确使用Cookie来维持用户登录状态和记录偏好。本指南涵盖setcookie()函数的参数详解、有效期计算方法以及完整的登录注销流程实现,确保数据在不同页面间稳定传输。
结果或目标
在Web开发中,服务器需要通过某种方式记住客户端的身份或偏好。Cookie 是一种存储在浏览器端的小文本文件,由服务器发送并在后续请求中自动回传。本文将展示如何利用 PHP 的 setcookie() 函数创建 Cookie,并通过 $_COOKIE 超级全局数组读取数据,最终实现一个包含登录、验证和注销功能的完整流程。
准备条件
- 环境要求:已部署支持 PHP 的 Web 服务器(如 Apache/Nginx + PHP)。
- 基本认知:理解 HTTP 协议的无状态特性,知道 Cookie 是基于响应头(
Set-Cookie)下发的。 - 重要限制:
setcookie()函数必须在任何 HTML 输出之前调用,因为它需要修改 HTTP 头部信息。如果已经输出了任何字符(包括空格),设置将会失败。
真实操作顺序
第1步:理解核心函数与参数
使用 setcookie() 设置 Cookie 时,需关注以下参数:
- name (必需):Cookie 的名称,例如
'user_id'。 - value (可选):Cookie 的值。注意值会自动进行 URL 编码。
- expire (可选):过期时间戳。若省略,则关闭浏览器即失效。可使用
time()+3600设置为1小时后失效。 - path (可选):Cookie 有效的服务器路径。设为
'/'表示对整站有效,默认为当前目录。 - domain (可选):Cookie 有效的域名。如需跨子域共享,需设置主域名。
- 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秒),并清空其值:
// 标准删除方法
setcookie('mycookie', '', time() - 3600);
// 或者只传递名称(部分浏览器兼容性好,但建议明确指定时间和路径以确保彻底清除)
// setcookie('mycookie');
// 确认删除后查看数组
print_r($_COOKIE);
第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 操作的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









