Сообщение о неверном пароле не отображается - PullRequest
0 голосов
/ 25 июня 2018

Я делаю код действия для своей страницы входа. Вот моя попытка:

if(isset($_POST['sign_in'])){
    if(empty($_POST['uname'])){
        echo "<script>alert('Enter Username')</script>";
    }else{
        $uname = $_POST['uname'];
        if(empty($_POST['pass'])){
            echo "<script>alert('Enter Password')</script>";
        }else{
            $pass = $_POST['pass'];
            $select = $db->prepare("SELECT * FROM users WHERE uname = '$uname' AND pass = '$pass'");
            $select->setFetchMode(PDO::FETCH_ASSOC);
            $select->execute();
            $data = $select->fetch();
            if($data['uname'] != $uname){
                echo "<script>alert('Username Does Not Exist')</script>";
            }elseif($data['uname'] == $uname AND $data['pass'] != $pass){
                echo "<script>alert('Password Is Not Correct')</script>";
            }elseif($data['uname'] == $uname AND $data['pass'] == $pass){
                $_SESSION['uname'] = $data['uname'];
                $_SESSION['pass'] = $data['pass'];
                echo "<META HTTP-EQUIV='Refresh' Content='0; URL=profile.php'>";
            }else{
                echo "<script>alert('Please Try Again')</script>";
            }
        }
    }
}

Итак, как вы можете видеть, я разделил каждую проверку на вложенные операторы if / else.

Теперь моя проблема с этим кодом заключается в том, что он не показывает сообщение Неправильный пароль , когда пользователь вводит неправильный пароль в пределах правильного имени пользователя.

elseif($data['uname'] == $uname AND $data['pass'] != $pass){
            echo "<script>alert('Password Is Not Correct')</script>";

И вместо этого сообщения появляется сообщение об ошибке Имя пользователя !

Итак, мой вопрос, как я могу исправить эту проблему?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Если пароль неверный, то в $ data ничего не будет, поэтому сначала он будет перехвачен, если имя пользователя с ошибкой не будет отображаться.

Самое простое решение - вы должны получить пароль этого пользователя.

$q1 = "select password from users where uname= $uname;

затем проверьте этот пароль с помощью пароля пользователя, если пароль пуст, то пользователь не существует, иначе пароль неверный.

0 голосов
/ 25 июня 2018

Это ваш запрос на выбор:

$select = $db->prepare("SELECT * FROM users WHERE uname = '$uname' AND pass = '$pass'");
$select->setFetchMode(PDO::FETCH_ASSOC);
$select->execute();
$data = $select->fetch();

Что вы сейчас тестируете?

if($data['uname'] != $uname){ ... }

elseif($data['uname'] == $uname AND $data['pass'] != $pass){ ... }

elseif($data['uname'] == $uname AND $data['pass'] == $pass){ ... }

Вы выполняете запрос SELECT с условием WHERE для uname = '$uname' AND pass = '$pass', поэтому 2 варианта:

1 / Если у пользователя есть хорошие uname и pass, вы выберете одну строку с помощью $data['uname'] == $uname AND $data['uname'] == $uname

Итак, вы заполните это условие: $data['uname'] == $uname AND $data['pass'] == $pass)

2 / Если $data['uname'] != $uname ИЛИ $data['uname'] != $uname, вы просто ничего не выберете в $data

Таким образом, вы будете выполнять первое условие: $data['uname'] != $uname независимо от того, что

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

  • Вы должны использовать подготовленное заявление (по предложению Qirel, Dimitris Filippou)
  • Вы должны хешировать свой пароль (как подсказал Димитрис Филиппоу)
  • Если pass или uname неверны, вы не должны говорить, какой из них неправильный, потому что в этом случае люди могут найти, существует ли один пользователь или нет (как предложено Магнусом Эрикссоном)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...