0

さて、私の問題は次のとおりです。ユーザーがログイン試行に 3 回失敗すると、IP アドレスに基づいて 1 時間アカウントからロックアウトされることになっています。IP アドレスは、「試行回数」および「時間」フィールドとともに「login_attempts」テーブルに格納されます。時間を取得するコードを次に示します。これは、ユーザーが再度ログインを試みることができる時間であるため、それに 1 時間を追加します。

$user_time = new DateTime('20:04:18');    // example time pulled from the db
$add = new DateInterval('PT1H');          // +1 hour
$user->add($add);                         // should now be 21:04:18

さて、ここに現在の時刻のコードがあります。もう一度、時間を作ります。1 時間もかからないので、ユーザーはまだロックアウトされているはずです。

$now = new DateTime('20:43:22');
if ($now->format('g:i a') < $user_time->format('g:i a')) {
         $diff = $user_time->diff($now);
         echo 'You still have ' . $diff->format('%i minutes') . ' until you can try again.';
}
 else {
        // reset login attempts, process login

何らかの理由で、これが正しく機能しません。私は何を間違っていますか?

4

2 に答える 2

0

データベース テーブルに int データ型の時間フィールドを用意し、ログイン試行ごとに time() 関数の出力を保存することをお勧めします。n 回失敗すると、ユーザーはロックされ、ロックアウトが初期化されます。ロックアウト時間が経過したかどうかを確認するには、current time() 関数の出力を、3 回目の失敗後に保存された出力と比較します。

$lockout = 3600;//if one hour
$query_result_for_last_attempt = "some query";
if((time()-$query_result_for_last_attempt) > $lockout){
header(site.php);
}else{
echo "you still need to wait";
}

もちろん、このコードで実現できるより良い空想があります。

于 2013-02-21T04:10:39.240 に答える
0

日付の比較が問題だと思います。format() の代わりに getTimestamp() を使用してみてください。

$now = new DateTime('20:43:22');
if ($now->getTimestamp() < $user_time->getTimestamp()) {
         $diff = $user_time->diff($now);
         echo 'You still have ' . $diff->format('%i minutes') . ' until you can try again.';
}
 else {
        // reset login attempts, process login
于 2013-02-24T19:25:06.733 に答える