代码不会在else语句

时间:2016-10-10 08:56:25

标签: php mysql pdo login

我的基本登录示例有点问题。当用户名和密码组合不正确时,else语句中的错误消息将不会显示。是因为while循环吗?我需要帮助。

<?php

$db = new PDO('mysql:host=127.0.0.1;dbname=project', 'root', '');

if(isset($_POST['username'], $_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $result = $db->query("SELECT * FROM users WHERE username='$username' AND password='$password'");

    if(empty($username) || empty($password)) {
        echo 'Empty';
    }

    while($row = $result->fetch(PDO::FETCH_OBJ)) {
        if($username == $row->username && $password == $row->password) {
            echo 'Logged in';
        } else {
            echo 'Incorrect username and password combination';
        }
    }
}

3 个答案:

答案 0 :(得分:2)

无需重新检查查询结果。因为,如果查询成功,那么 fetch()函数将返回结果行,否则返回false。

更改以下代码

while($row = $result->fetch(PDO::FETCH_OBJ)) {
    if($username == $row->username && $password == $row->password) {
        echo 'Logged in';
    } else {
        echo 'Incorrect username and password combination';
    }
}

$row = $result->fetch(PDO::FETCH_OBJ);
if($row){
  echo 'Logged in';
}else{
  echo 'Incorrect username and password combination';
}

注意: 用户名字段应该是唯一列,因为您的登录目的。

答案 1 :(得分:1)

当然它不会显示。这是因为当您获取结果时,它不返回任何行,或者只是为空。也就是说,while循环内的代码不会执行。

您也可以根据用户名和密码条件执行计算返回的行数的查询。

$result = $db->query("SELECT COUNT(*) FROM users WHERE username='$username' AND password='$password'");

if (($row = $result->fetchColumn()) != 0) {
    // logged in
}
else {
    // incorrect username and password
}

答案 2 :(得分:0)

如果用户名和密码都正确,则select语句仅返回值。因此,如果它不正确,循环中的代码将不会执行。

尝试从sql语句中删除密码检查:

"SELECT * FROM users WHERE username='$username';"