这是我的登录页面上的命令流
如果被阻止,脚本将继续从数据库中获取ip被阻止的时间,并计算用户可以再次尝试登录之前剩余的时间。禁止时间为15分钟。
然而问题是如果用户在一小时后的45-59分钟被阻止,那么45 + 15 = 00(当时60不会出现)以及45到60之间的任何数字,不包括45例如,如果我在11:48被封锁,我将在12:03被解锁。
问题是,如果你还没有弄明白的话,我是如何对倒数计时器进行编码的,以便它超过一小时,并且当它超过59分钟时不会出现。
我也想在php中这样做,因为我不需要实时显示剩余的时间。
答案 0 :(得分:1)
目前的分钟绝不是问题。您关注自上次被阻止后的持续时间,而不是"那是什么时间":
block_user.php:
<?php
$now = new DateTime();
write_block_into_database($ip_address, $now->format('Y-m-d H:i:s'));
?>
check_block.php
<?php
$sql = 'SELECT 1 FROM sometable WHERE ip_address=? AND DATE_ADD(blocked_at, INTERVAL 1 HOURS) >= NOW()';
if(get_result($sql, $ip_address)) {
// this address is blocked
} else {
// no recent block found
}
或者,如果你想在PHP中进行比较:
check_locally.php:
<?php
$sql = "SELECT blocked_at FROM sometable WHERE ip_address=?";
$db_row = get_row($sql,$ip_address);
if ($db_row) {
$blocked = new DateTime($db_row->blocked_at);
$blocked->modify('+1 hour');
$now = new DateTime();
if ($blocked >= $now) {
// still blocked
} else {
// was blocked earlier, no more
}
} else {
// not blocked
}
换句话说:&#34;如果我花时间阻止IP并添加一小时,现在仍然在该时间点之前?&#34;
示例:
答案 1 :(得分:0)
这是我设法提出的
$date = new DateTime();
$currentTime = $date->getTimestamp();
$blockTime = "1453494620";//This value will be taken from the mysql db
$timeElapsed = $currentTime - $blockTime;
echo "Current Time: $currentTime";
echo "<br>Block Time: $blockTime <br>";
if ($timeElapsed < 900){
$leftTime = ((900 - $timeElapsed) / 60) + 1;
$DotPosition = (stripos($leftTime, ".")) + 1;
if($DotPosition == 3 || $DotPosition == 2){
$leftTime = substr($leftTime, 0, $DotPosition - 1);
}
if($leftTime == 1){
$minutesString = "minute";
} else $minutesString = "minutes";
echo "<br>You are blocked from trying to login for too many incorrect tries.
<br>Please try again in $leftTime $minutesString.";
} else {
/*for test purpose, here the user will get unblocked on the mysql by updating the
ips blockout field */
echo "<br>You have been unblocked.";
}
当前时间:1453495488
封锁时间:1453494620
您被阻止尝试登录太多不正确的尝试。
请在1分钟后再试一次。
感谢大家告诉我有关UNIX时间戳的信息。如果我知道他们,我就不会问。 :)