如何检查用户套餐是否已过期 附SQL查询实现代码
现有代码问题
你当前的实现有几个核心问题,完全达不到检查套餐过期的目的:
- 判断逻辑写反:现有SQL条件
plan_start_date >='$today' && plan_end_date <='$today'只有当套餐起止日期都等于今天时才会返回结果,根本不符合过期判断规则。套餐过期的判定标准是当前日期晚于套餐结束日期,也就是plan_end_date < $today,不需要额外判断开始日期。 - 存在SQL注入风险:直接将
$today、$user_id变量拼接到SQL字符串中,没有做转义处理,攻击者可以构造恶意参数窃取、篡改数据库数据。 - 语法兼容性问题:SQL中逻辑与建议使用标准语法
AND,&&属于非标准兼容语法,在部分数据库环境下会运行异常。
修正后代码(判断套餐已过期场景)
$sql = "SELECT * FROM `user_plan` WHERE `plan_end_date` < '" . $today . "' AND `user_id`='" . $user_id . "';"; $db->sql($sql); $result = $db->getResult(); // 若$result不为空,说明查询到该用户已过期的套餐记录
补充:如果你实际要判断的是「用户套餐处于有效期内」,把查询条件改为
plan_start_date <= '" . $today . "' AND plan_end_date >= '" . $today . "'即可。
安全优化方案
强烈建议替换字符串拼接的写法,用参数化预处理查询从根源避免SQL注入,参考写法(具体方法名匹配你实际使用的数据库操作类即可):
$stmt = $db->prepare("SELECT * FROM `user_plan` WHERE `plan_end_date` < ? AND `user_id` = ?"); $stmt->bind_param("ss", $today, $user_id); $stmt->execute(); $result = $stmt->getResult();
内容的提问来源于stack exchange,提问作者HITESH PATIL
相关产品推荐
相关产品推荐

