php实现记住登录
PHP实现记住登录功能
使用Cookie存储登录凭证
在用户登录成功后,生成一个唯一的token,将其存储在数据库中,并设置一个长期有效的cookie。当用户再次访问时,检查cookie中的token是否有效。
// 用户登录成功后生成token
$token = bin2hex(random_bytes(32));
$expire = time() + 60 * 60 * 24 * 30; // 30天有效期
// 存储token到数据库
$stmt = $pdo->prepare("INSERT INTO remember_tokens (user_id, token, expires_at) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $token, date('Y-m-d H:i:s', $expire)]);
// 设置cookie
setcookie('remember_token', $token, $expire, '/', '', true, true);
验证记住登录状态
每次页面加载时检查是否存在remember_token cookie,并验证其有效性。

if (isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
$stmt = $pdo->prepare("SELECT user_id FROM remember_tokens WHERE token = ? AND expires_at > NOW()");
$stmt->execute([$token]);
$row = $stmt->fetch();
if ($row) {
// 登录用户
$_SESSION['user_id'] = $row['user_id'];
} else {
// 无效token,删除cookie
setcookie('remember_token', '', time() - 3600, '/');
}
}
安全注意事项
- 使用HTTPS确保cookie传输安全
- 设置cookie的HttpOnly和Secure标志
- 定期清理过期的token
- 允许用户主动注销时删除token
// 用户注销时删除token
if (isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
$pdo->prepare("DELETE FROM remember_tokens WHERE token = ?")->execute([$token]);
setcookie('remember_token', '', time() - 3600, '/');
}
数据库表结构示例
CREATE TABLE remember_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
token VARCHAR(64) NOT NULL,
expires_at DATETIME NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);






