错误的密码警报消息未显示

时间:2018-06-25 14:19:46

标签: php mysql mysqli

我正在为我的登录页面创建一个操作代码。这是我的尝试:

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 :(得分:0)

这是您选择的查询:

$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){ ... }

您正在以SELECTWHEREuname = '$uname'条件的pass = '$pass'请求,所以有两种可能性:

1 /如果用户具有良好的一致并通过,则将使用$data['uname'] == $uname$data['uname'] == $uname

选择一行

因此您将满足以下条件:$data['uname'] == $uname AND $data['pass'] == $pass)

2 /如果为$data['uname'] != $uname$data['uname'] != $uname,您将只选择$data中的任何内容

这样,您将满足第一个条件:$data['uname'] != $uname,无论如何

编辑:我也会添加一些很好的建议,人们也会在评论中给您

  • 您应该使用准备好的声明(由Qirel,Dimitris Filippou建议)
  • 您应该对密码进行哈希处理(由Dimitris Filippou建议)
  • 如果pass或uname不正确,则不应说出哪一个是错误的,因为在这种情况下,人们可以找到一个用户是否存在(如Magnus Eriksson的建议)

答案 1 :(得分:0)

如果密码错误,则$ data中将没有任何内容,因此如果显示错误的用户名不存在,它将首先被捕获。

最简单的解决方案是您必须获取该用户的密码。

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

然后,如果密码为空,则将该密码与用户密码一起使用,则该用户不存在,否则密码错误。

相关问题