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
相关产品推荐
相关产品推荐

