比较在登录脚本中使用php中的datetime

比较在登录脚本中使用php中的datetime

问题描述:

好吧,所以我的问题是这样的:当用户有3次失败的登录尝试时,他/她应该根据IP地址在一小时内被锁定在他的帐户之外。 IP地址与'attempt'和'time'字段一起存储在表'login_attempts'中。这里是我的代码拉的时间,然后我一个小时添加到它,因为这是当它应该是当用户可以尝试再次登录:比较在登录脚本中使用php中的datetime

$user_time = new DateTime('20:04:18'); // example time pulled from the db 
$add = new DateInterval('PT1H');   // +1 hour 
$user->add($add);       // should now be 21:04:18 

好了,所以现在这里是为代码当前时间。再次,我要弥补一段时间。这将不到一个小时,所以用户仍然应该被锁定:

$now = new DateTime('20:43:22'); 
if ($now->format('g:i a') < $user_time->format('g:i a')) { 
     $diff = $user_time->diff($now); 
     echo 'You still have ' . $diff->format('%i minutes') . ' until you can try again.'; 
} 
else { 
     // reset login attempts, process login 

由于某些原因,这种方式无法正常工作。我究竟做错了什么?

+0

为什么你的条件不使用diff而不是格式? – Ares 2013-02-21 03:35:18

您最好在数据库表中使用int数据类型设置时间字段,并为每次登录尝试存储time()函数的输出。第n次尝试失败后,用户被锁定并初始化锁定。要检查锁定时间是否结束,只需将当前时间()函数的输出与第三次失败尝试后存储的函数的输出进行比较。

$lockout = 3600;//if one hour 
$query_result_for_last_attempt = "some query"; 
if((time()-$query_result_for_last_attempt) > $lockout){ 
header(site.php); 
}else{ 
echo "you still need to wait"; 
} 

当然,你可以用代码做的事情有你的幻想!

+0

好的,当用户填写表单并点击登录时,我得到了用户的IP地址,如果它尚未放入数据库中,它将被添加。然后我检查登录尝试次数。如果登录尝试失败尝试的时间是否存储在数据库中。我认为如果它大于,它应该是让用户再次登录的时间,对吧? – 2013-02-21 04:25:57

+0

这是正确的,你最好看看登录是否成功,你需要更新login_attempts表,重置尝试计数器为0. – goseo 2013-02-21 04:32:38

+0

好吧......让我直接得到这个:$ lockout是1秒钟的时间。 $ query_result将是查询返回的时间,以查看上次登录尝试失败的时间。我不想给查询添加1小时,然后检查它是否大于$ lockout? – 2013-02-21 04:43:51

我认为你的日期比较是问题所在。尝试使用getTimestamp()而不是格式():

$now = new DateTime('20:43:22'); 
if ($now->getTimestamp() < $user_time->getTimestamp()) { 
     $diff = $user_time->diff($now); 
     echo 'You still have ' . $diff->format('%i minutes') . ' until you can try again.'; 
} 
else { 
     // reset login attempts, process login