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

Php 如何制作一个超过60分钟的倒计时计时器,php,Php,这是我登录页面上的命令流 用户加载页面 php检查ip地址是否在数据库中,如果不在,则添加它 php检查数据库中的ip地址是否被阻止,如果没有,则继续 如果被阻止,脚本将继续从数据库获取ip被阻止的时间,并计算剩余时间,直到用户可以再次尝试登录。封锁时间为15分钟 然而,问题是,如果用户在小时后45-59分钟被阻止,那么45+15=00(因为60不会在时间上出现)和任何介于45和60之间的数字(不包括45和60)都将超过小时,因此,例如,如果我在11:48被阻止,我将在12:03被取消阻止

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

  • 用户加载页面
  • php检查ip地址是否在数据库中,如果不在,则添加它
  • php检查数据库中的ip地址是否被阻止,如果没有,则继续
如果被阻止,脚本将继续从数据库获取ip被阻止的时间,并计算剩余时间,直到用户可以再次尝试登录。封锁时间为15分钟

然而,问题是,如果用户在小时后45-59分钟被阻止,那么45+15=00(因为60不会在时间上出现)和任何介于45和60之间的数字(不包括45和60)都将超过小时,因此,例如,如果我在11:48被阻止,我将在12:03被取消阻止

问题是,如果你还没有弄明白,我该如何对倒计时进行编码,使它在一个小时之后,而不是在59分钟之后突然停止


另外,我想用php实现这一点,因为我不需要实时显示剩余的时间。

当前分钟从来都不是问题。您关心的是自上次阻止以来的持续时间,而不是“那是什么时候”:

block_user.php:

<?php
$now = new DateTime();
write_block_into_database($ip_address, $now->format('Y-m-d H:i:s'));
?>

检查_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
}

这就是我想出来的

$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.";
}
$date=new DateTime();
$currentTime=$date->getTimestamp();
$blockTime=“1453494620”//该值将取自mysql数据库
$timeappeased=$currentTime-$blockTime;
回显“当前时间:$currentTime”;
echo“
阻塞时间:$blockTime
”; 如果($timeappeased<900){ $leftTime=((900-$timeappeased)/60)+1; $DotPosition=(stripos($leftTime,“.”)+1; 如果($DotPosition==3 | |$DotPosition==2){ $leftTime=substr($leftTime,0,$DotPosition-1); } 如果($leftTime==1){ $minuteString=“分钟”; }else$minuteString=“分钟”; echo“
由于尝试了太多不正确的尝试,您被阻止尝试登录。
请在$leftTime$MinuteString中重试。“; }否则{ /*出于测试目的,这里用户将通过更新 ips封锁区*/ echo“
您已被解锁。”; }
当前时间:1453495488

封锁时间:1453494620

由于尝试了太多不正确的尝试,您被阻止尝试登录

请在1分钟后重试


谢谢你们告诉我有关UNIX时间戳的事情。如果我知道他们,我就不会问了。:)

代码中的时间保持通常使用UNIX时间戳来完成,而UNIX时间戳不会出现此问题。你是怎么保持时间的?你需要全力以赴才能真正遇到这个问题…@deceze似乎是我们的远房表亲Y2K@deceze:小心Y2K38。它已经咬了我几次了,比如“这份合同有效期30年”。UNIX时间戳应该被弃用,考虑到“PISKVOR”在这个例子中听起来并不像Y2K38,但是在使用32位UNIX时间戳时肯定会有所察觉。@ PISKVOR,如果你用它的包管理器在任何一个现代*NIX系统上建立PHP,您几乎可以肯定会得到64位版本的PHP,其中
PHP\u INT\u MAX!=2147483647
。现在完全可以在PHP中使用64位(如果您对环境有一点控制的话)。当然,您当然应该使用
DateTime
提供的更高的抽象,但是UNIX时间戳仍然是有效的和有用的。这些函数显然是用于向数据库写入/读取数据的伪代码-这与如何实现并不完全相关。
$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.";
}