You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP检测MySQL用户订阅到期并禁用其登录权限

嘿,这个需求其实挺常见的,我来给你拆解一下具体的实现步骤,分逻辑梳理和代码实现两部分,这样更清晰:

核心逻辑梳理

用户登录时的校验流程应该是这样的:

  1. 先验证用户提交的账号密码是否正确
  2. 若账号密码有效,立即检查订阅到期时间sub_expire是否早于当前时间
  3. 如果订阅已过期,不管当前active状态是什么,直接将其更新为no,并拒绝登录请求
  4. 如果订阅未过期,再检查active字段是否为yes,是则允许登录,否则拒绝
具体代码实现(推荐用PDO,更安全)

首先是数据库连接和登录校验的完整代码:

// 初始化PDO数据库连接(替换成你的数据库信息)
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
$dbUser = 'your_username';
$dbPass = 'your_password';

try {
    $pdo = new PDO($dsn, $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("数据库连接失败:" . $e->getMessage());
}

// 处理用户登录请求(假设前端提交了username和password)
session_start();
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';

// 第一步:查询用户信息(包含订阅到期时间、激活状态、密码哈希)
$stmt = $pdo->prepare("SELECT id, sub_expire, active, password_hash FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

// 账号不存在或密码错误的统一提示(避免泄露信息)
if (!$user || !password_verify($password, $user['password_hash'])) {
    echo "用户名或密码错误";
    exit;
}

// 第二步:检查订阅是否过期(用时间戳比较更精准)
$currentTime = time();
$expireTime = strtotime($user['sub_expire']);

if ($expireTime < $currentTime) {
    // 订阅已过期,更新active为no
    $updateStmt = $pdo->prepare("UPDATE users SET active = 'no' WHERE id = ?");
    $updateStmt->execute([$user['id']]);
    
    echo "您的订阅已过期,请续费后重新登录";
    exit;
}

// 第三步:检查账号是否处于激活状态
if ($user['active'] !== 'yes') {
    echo "您的账号已被禁用,请联系管理员";
    exit;
}

// 到这里说明校验通过,执行登录逻辑(比如设置session)
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $username;
echo "登录成功!";
优化小提示
  • 时区一致性:确保PHP和MySQL的时区一致,比如在PHP里设置date_default_timezone_set('Asia/Shanghai');,MySQL里执行SET time_zone = '+08:00';,避免时间比较出错。
  • 减少数据库请求:可以把订阅检查和更新合并成一条SQL语句,减少一次数据库交互:
    UPDATE users 
    SET active = 'no' 
    WHERE id = ? AND sub_expire < NOW() AND active = 'yes';
    
    执行这条语句后再查询用户状态即可。
  • 密码安全:永远不要存明文密码,一定要用password_hash()生成哈希值存储,用password_verify()验证,这是PHP的标准安全做法。

内容的提问来源于stack exchange,提问作者Boxecutor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:58:27