2016-01-21 33 views
-4

這是一個倒數計時器命令我的登錄頁面我怎麼能作出這樣的去過去60分鐘

  • 用戶加載頁面,如果
  • PHP檢查IP地址在數據庫中,如果不是在流它增加了它
  • PHP檢查IP地址被封鎖在數據庫中,如果沒有則進行

,如果它被阻止腳本將繼續獲取IP被封在從數據庫的時間和計算直到剩下的時間l用戶可以嘗試重新登錄。封鎖時間爲15分鐘。

然而問題是,如果用戶在45-59分鐘後被阻止,那麼45 + 15 = 00(因爲60時間沒有出現)以及45到60之間的任何數字,不包括45和45。 60將超過小時,例如,如果我在11:48被阻擋,我將在12:03解鎖。

問題是,如果你還沒有想出是我如何編碼倒數計時器,所以它超過了小時,並沒有超過59分鐘超出時間。

另外我想在php中這樣做,因爲我沒有必要實際提供實時留下的時間。

+0

計時通常與UNIX時間戳,它不會出現此問題的完成。你是如何保持時間的?你還挺需要使出渾身解數來實際碰到這個問題...... – deceze

+0

@deceze好像Y2K –

+3

@Franz H60M非常遠房親戚......! – deceze

回答

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 
} 

換句話說:「如果我花時間IP封鎖並增加一個小時,現在還在那個時間點之前?」

實施例:

  • 擋在12點48
  • 在13:10檢查:12點48 + 1小時= 13點48分,13點48> = 13:10,失敗
  • 在15:10檢查:12:48 + 1小時= 13:48,13:48 < 15:10,通過
+0

這些函數顯然是用於寫入/從數據庫讀取數據的僞代碼 - 它的實現並不完全相關。 – Piskvor

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時間戳。如果我知道他們,我不會問。 :)代碼