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

PHP会员到期日期比较误判问题求助:日期判断返回错误结果

问题分析与解决方案

你遇到的问题核心是用字符串格式的日期做大小比较,d.m.Y这种格式的字符串在PHP里是按字符顺序逐位对比的,不是按实际日期的先后逻辑,所以会出现误判。

举个例子:假设会员到期日是30.09.2024(9月30日),当前日期是01.10.2024(10月1日),字符串比较时"01.10.2024"的第一个字符是0,比"30.09.2024"的第一个字符3小,PHP会认为当前日期更小,完全搞反了实际的日期先后。而==能正常运行,是因为只有当两个字符串完全一致时才会返回true,刚好日期相同时字符串匹配,所以没暴露问题。

正确的解决方法:直接比较时间戳(整数)

时间戳是从1970年1月1日到当前时间的秒数,是整数类型,直接用整数比较大小完全符合日期的先后逻辑,不会出错。修改后的代码如下:

// 计算会员到期的时间戳($memberdate是数据库中存储的会员起始日期,确保格式能被strtotime识别)
$memberEndTimestamp = strtotime($memberdate . ' + 7 days');
// 获取当前时间的时间戳,如果要精确到当天0点,用strtotime('today')替代time()
$nowTimestamp = time();

if ($nowTimestamp > $memberEndTimestamp) { 
    include "./login/connection.php";
    // 修复SQL注入风险,用参数绑定替代直接拼接变量
    $sql5 = "UPDATE `users` SET `member` = '0' WHERE email = ?";
    $conn5 = $db->prepare($sql5);
    $conn5->execute([$email]);        
    $membermessage = "您不是会员"; 
    $memberenddate = "点击购买会员!";
}

额外提醒

原代码里的SQL语句存在SQL注入风险,直接把$email拼到SQL里是非常不安全的做法,上面的代码已经改成了参数绑定的写法,这是PHP操作数据库的基本安全规范,一定要养成习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:30