2015-11-25 2 views
0

Мне нужен сценарий для регистрации попыток входа в систему: если пользователь пытается войти в систему 3 раза с неправильным паролем, тогда скрипт предупредит пользователя о входе в систему другим способом.Зарегистрировать три неудачных попытки входа

Я пробовал этот способ, но он не работает. Как мне сделать эту работу? Было бы также оценено объяснение реализации кода.

public function log($usrname, $password, $type) { 

    try { 
     $stmt = $this->db->prepare("SELECT * FROM $table WHERE username=:username and password =:password and type=:type"); 
     $stmt->execute(array(':username' => $usrname, ':password' => $password, ':type' => $type)); 
     $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 
     if ($stmt->rowCount()== 1) { 
      echo "loged in"; 
      } else if($stmt->rowCount == 0){ 
       $ec = 0; 

       $error = ++$ec; 
       if(count($error)== 3){ 
        echo "you provide wrong username and password 3 times"; 
       } 
      } 
     } 
    } catch (PDOException $e) { 
     $e->getMessage(); 
    } 
} 
+1

Для достижения этой цели, вы, чтобы сохранить сеанс –

+0

но сессия не является хорошей идеей, потому что он может просто очистить от браузера! – Arun

ответ

2

Вы должны иметь поле «попытка» в таблице базы данных и каждый раз, когда Вы логин с неправильным паролем просто обновить счетчик в поле таблицы, и вы можете проверить количество попытка в состояние ошибки. если логин - это успех, просто сбросьте счетчик попыток до 0.

Я предоставляю здесь логику кода. но я не проверял его. используйте эту логику.

Но я предлагаю вам проверить имя пользователя зарегистрирован с таблицей

public function log($usrname, $password, $type) { 

     try { 

      $stmt0 = $this->db->prepare("SELECT username FROM $table WHERE username=:username");     
      $stmt0->execute(array(':username' => $usrname); 
      if ($stmt0->rowCount()== 1) { 

        $stmt = $this->db->prepare("SELECT * FROM $table WHERE username=:username and password =:password and type=:type"); 
        $stmt->execute(array(':username' => $usrname, ':password' => $password, ':type' => $type)); 
        $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 
        if ($stmt->rowCount()== 1) { 
         echo "loged in"; 
         // UPDATE THE attempt field to 0 here 
         $stmt2 = $this->db->prepare("UPDATE $table SET attempt=:attepmt WHERE username=:username"); 
         $stmt2->execute(array(':username' => $usrname, ':attempt' => 0)); 

        }else if($stmt->rowCount == 0){      
          // select the attempt field and check this is 3 
          $stmt3 = $this->db->prepare("SELECT attempt FROM $table WHERE username=:username"); 
          $stmt3->execute(array(':username' => $usrname)); 
          $obj= $stmt3->fetch(PDO::FETCH_OBJ); 
          if($obj->attempt==3){       
           echo "you provide wrong username and password 3 times"; 
          } 
         $attempt = $obj->attempt+1; 
         $stmt4 = $this->db->prepare("UPDATE $table SET attempt=:attepmt WHERE username=:username"); 
         $stmt4->execute(array(':username' => $usrname, ':attempt' => $attempt)); 


        } 


      }else{ 
       echo "Username is not found in table !"; 
      } 
     } catch (PDOException $e) { 
      $e->getMessage(); 
     } 

}

1

вы можете использовать $_SESSION для подсчета числа попыток.

public function log($usrname, $password, $type) { 

    try { 
     $stmt = $this->db->prepare("SELECT * FROM $table WHERE username=:username and password =:password and type=:type"); 
     $stmt->execute(array(':username' => $usrname, ':password' => $password, ':type' => $type)); 
     $userRow = $stmt->fetch(PDO::FETCH_ASSOC); 
     if ($stmt->rowCount()== 1) { 
      echo "loged in"; 
      } else if($stmt->rowCount == 0){ 
       if(isset($_SESSION['attempt'])) 
       { 
        $_SESSION['attempt']=$_SESSION['attempt']+1; 
        }else { 
        $_SESSION['attempt']=1; 
        } 
       $error = ++$ec; 
       if($_SESSION['attempt']== 3){ 
        echo "you provide wrong username and password 3 times"; 
       } 
      } 
     } 
    } catch (PDOException $e) { 
     $e->getMessage(); 
    } 
} 
+1

, но сеанс не является хорошей идеей, потому что он может просто очистить браузер! – Arun

+0

@Arun, каковы шансы пользователя ввести правильное имя пользователя в вашем случае. –

+0

он спросил «если пользователь пытается войти в систему 3 раза с неправильным паролем, тогда сценарий будет предупреждать пользователя о входе в систему другим способом», поэтому в этом случае имя пользователя должно быть действительным! в противном случае он должен распечатать сообщение, так как пользователь не зарегистрирован – Arun