当前位置:首页 > PHP

php实现记住

2026-02-14 20:17:15PHP

PHP 实现记住登录功能

使用 Cookie 和 Session 结合的方式可以实现记住登录功能。以下是具体实现方法:

php实现记住

设置 Cookie 和 Session

在用户登录成功后,生成一个唯一的 token 并存入数据库,同时设置 Cookie 和 Session:

php实现记住

// 用户登录验证成功后
if ($login_success) {
    // 生成唯一 token
    $token = bin2hex(random_bytes(32));

    // 存储 token 到数据库
    $expires = time() + 86400 * 30; // 30 天后过期
    $sql = "INSERT INTO user_tokens (user_id, token, expires) VALUES (?, ?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$user_id, $token, $expires]);

    // 设置 Cookie
    setcookie('remember_token', $token, $expires, '/');

    // 设置 Session
    $_SESSION['user_id'] = $user_id;
}

自动登录验证

在每次页面加载时检查是否存在 remember_token Cookie,并验证 token 是否有效:

// 检查 Session 是否已登录
if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token'])) {
    $token = $_COOKIE['remember_token'];

    // 查询数据库验证 token
    $sql = "SELECT user_id FROM user_tokens WHERE token = ? AND expires > ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$token, time()]);
    $row = $stmt->fetch();

    if ($row) {
        // token 有效,设置 Session
        $_SESSION['user_id'] = $row['user_id'];

        // 可选:更新 token 过期时间
        $new_expires = time() + 86400 * 30;
        $sql = "UPDATE user_tokens SET expires = ? WHERE token = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$new_expires, $token]);

        setcookie('remember_token', $token, $new_expires, '/');
    }
}

注销处理

用户注销时需要清除 Session 和 Cookie:

// 注销操作
session_destroy();

// 清除 remember_token
if (isset($_COOKIE['remember_token'])) {
    // 从数据库删除 token
    $sql = "DELETE FROM user_tokens WHERE token = ?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$_COOKIE['remember_token']]);

    // 清除 Cookie
    setcookie('remember_token', '', time() - 3600, '/');
}

安全注意事项

  1. 使用 HTTPS 协议传输 Cookie
  2. 设置 Cookie 的 HttpOnly 和 Secure 属性
  3. 定期清理过期的 token
  4. 对 token 使用足够的熵值(长度)
// 更安全的 Cookie 设置
setcookie(
    'remember_token',
    $token,
    [
        'expires' => $expires,
        'path' => '/',
        'domain' => 'yourdomain.com',
        'secure' => true,
        'httponly' => true,
        'samesite' => 'Strict'
    ]
);

这种方法结合了 Session 和 Cookie 的优点,既保证了安全性又实现了记住登录功能。Session 用于短期验证,Cookie 用于长期记住用户。

标签: php
分享给朋友:

相关文章

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…

php实现注册登陆

php实现注册登陆

PHP 注册功能实现 创建数据库表结构(MySQL示例): CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…