Как отобразить оставшееся время, прежде чем пользователь сможет предпринять еще один вход и запросить самую старую попытку? - PullRequest
0 голосов
/ 04 мая 2020

С моим текущим кодом я блокирую попытки пользователя, если в течение 10 минут было 5 попыток. В настоящее время он просто повторяет плоский интервал. Как отобразить точное количество времени, оставшегося до того, как они смогут начать еще одну попытку? Кроме того, как запросить попытки вернуть самую старую попытку сравнения с NOW ()?
Я использую формат отметки времени: 2020-05-03 14: 51: 41
Вот текущий код:

$sql=("SELECT email FROM login_fail where email=? AND `time` > (now() - interval 10 minute)");
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s",$_POST['username']);
    $stmt->execute();
    $stmt->store_result();
      if($stmt->num_rows > 4){

        die("Please try again in 10 minutes");
        // Id prefer.... die("Please try again in X minutes / seconds");
       }
     $stmt->bind_result($email);
     $stmt->fetch();

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

, чтобы получить время последнего сбоя, просто выполните MAX ()

SELECT max( `time` ) as LastLoginAttempt
   from login_fail 
   where email = ? 
     AND `time` > (now() - interval 10 minute)

Итак, из 4 попыток входа в систему вы заботитесь только о последнем времени. Если вы хотите применить разницу между временными метками, вы также можете добавить ее или просто вычислить на стороне PHP, получив обратно поле даты и времени. Ваш фильтр уже выполнен одним сотрудником, поэтому нет необходимости «группировать», так как он это один человек.

0 голосов
/ 04 мая 2020

Это вычислит минуты и секунды, и вы сможете связать результаты с новыми переменными.

$sql=("SELECT email,TIMESTAMPDIFF(MINUTE,`time`,NOW()) as timeagain, (TIMESTAMPDIFF(SECOND,`time`,NOW()) Mod 60) timeseconds FROM login_fail where email=? AND `time` > (now() - interval 10 minute) ORDER BY `time`");
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("s",$_POST['username']);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($email,$minute,$seconds);
    $stmt->fetch();
    if($stmt->num_rows > 4){

      die("Please try again in $minute minute(s) and $seconds second(s)");
      // Id prefer.... die("Please try again in X minutes / seconds");
    }    

РЕДАКТИРОВАТЬ Я ввел заказ по связи, чтобы получить первый из всех неудачных писем в последнюю минуту и ​​получить первую запись, с единственной интересной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...