我如何制作一个超过60分钟的倒数计时器

时间:2016-01-21 11:29:17

标签: php

这是我的登录页面上的命令流

  • 用户加载页面
  • php检查ip地址是否在db中,如果没有,则添加
  • php检查ip地址是否在db中被阻止,如果没有继续

如果被阻止,脚本将继续从数据库中获取ip被阻止的时间,并计算用户可以再次尝试登录之前剩余的时间。禁止时间为15分钟。

然而问题是如果用户在一小时后的45-59分钟被阻止,那么45 + 15 = 00(当时60不会出现)以及45到60之间的任何数字,不包括45例如,如果我在11:48被封锁,我将在12:03被解锁。

问题是,如果你还没有弄明白的话,我是如何对倒数计时器进行编码的,以便它超过一小时,并且当它超过59分钟时不会出现。

我也想在php中这样做,因为我不需要实时显示剩余的时间。

2 个答案:

答案 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;

示例:

  • 在12:48被阻止
  • 在13:10检查:12:48 + 1小时= 13:48,13:48&gt; = 13:10,失败
  • 在15:10检查:12:48 + 1小时= 13:48,13:48&lt; 15:10,传递

答案 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时间戳的信息。如果我知道他们,我就不会问。 :)