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

PHP时间比较逻辑错误排查:密码重置请求时间判断异常

问题分析与修复方案

嘿,我一眼就发现你代码里的两个关键问题啦,这就是为什么逻辑一直走反的原因:

1. 逻辑判断完全搞反了

你的预期逻辑是:

  • 若密码重置请求发生在10分钟内 → 显示“请等待10分钟后重试”
  • 若请求超过10分钟 → 显示“密码重置邮件已发送”

但你写的条件是:

if($user->getPasswordRequestedAt() <= date("Y-m-d H:i:s", strtotime('-10 minutes')))

这个条件的意思是「如果请求时间早于等于10分钟前」,这时候返回no_resend页面——完全和你的预期逻辑相反!

2. 类型不匹配导致的隐性错误

$user->getPasswordRequestedAt()返回的是**DateTime对象**,而date()函数返回的是字符串。PHP在比较对象和字符串时,会把对象转换成字符串再比较,但这个转换过程可能出现你意想不到的问题,导致比较结果不准确。


修复后的代码

我帮你调整了逻辑,并且统一用DateTime对象来做时间比较,更可靠:

// 创建10分钟前的DateTime对象
$tenMinutesAgo = new \DateTime('-10 minutes');
// 获取用户的密码重置请求时间(DateTime对象)
$passwordRequestedAt = $user->getPasswordRequestedAt();

// 额外处理:如果用户从未发起过重置请求(getPasswordRequestedAt()返回null),默认走发送邮件分支
if ($passwordRequestedAt !== null && $passwordRequestedAt >= $tenMinutesAgo) {
    // 请求发生在10分钟内 → 显示等待重试页面
    return $this->render('@User/Resetting/no_resend.html.twig', [
        'username' => $username
    ]);
} else {
    // 请求超过10分钟,或从未发起过请求 → 显示邮件已发送页面
    return $this->render('@User/Resetting/check_email.html.twig', [
        'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
    ]);
}

额外说明

我加了$passwordRequestedAt !== null的判断,是因为如果用户从来没发起过密码重置请求,这个值可能是null,直接比较会报错,提前处理能避免这种异常情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:17:39