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地址是否被阻止,如果没有,则继续
另外,我想用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.";
}