如何用PHP检测MySQL用户订阅到期并禁用其登录权限
嘿,这个需求其实挺常见的,我来给你拆解一下具体的实现步骤,分逻辑梳理和代码实现两部分,这样更清晰:
核心逻辑梳理
用户登录时的校验流程应该是这样的:
- 先验证用户提交的账号密码是否正确
- 若账号密码有效,立即检查订阅到期时间
sub_expire是否早于当前时间 - 如果订阅已过期,不管当前
active状态是什么,直接将其更新为no,并拒绝登录请求 - 如果订阅未过期,再检查
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
相关产品推荐
相关产品推荐

