password_verify在if语句中失败

时间:2018-05-27 20:32:58

标签: php sql

编辑:我猜星星刚刚失去对齐,因为在重新加载页面并尝试再次使用它之后就可以了。

我正在创建一个包含用户帐户的简单管理系统。我在登录位上遇到了困难,因为出于某种原因password_verify失败,如果它在if语句中。它可能与我从数据库中获取密码的方法有关,但我不确定。

这是什么不起作用

$query = $db->query("SELECT * FROM users WHERE `username` = '" . $db->real_escape_string($_POST['username']) . "';");

if (!$query or $query == NULL)
{
    echo $db->error . "<br>";
    exit("EXIT: database error");
}

while ($row = $query->fetch_assoc())
{
    if (password_verify($_POST['password'], $row['password']))
    {   
        $db->close();
        header("LOCATION: main.php");
        exit;
    }
    else
    {
        header("LOCATION: index.php?error=Wrong password.");
        exit("wrong password<br>");
    }
}

如果我用

替换行if (password_verify($_POST['password'], $row['password']))
$success = password_verify($_POST['password'], $row['password']);
if ($success)
// success

它按预期工作。我在做($row = $query->fetch_assoc())时有什么问题,或者我在其他地方犯了错误?我不明白为什么它不能在IF声明中起作用。我敢肯定我只做了一些愚蠢的事,但我不能为我的生活找到什么。

使用后一种方法进行密码验证会不好或者对我不好?

2 个答案:

答案 0 :(得分:-1)

我似乎在这里解决了问题:

if (!empty($_POST['password']))
{   
    while ($row = $query->fetch_assoc())
    {
        if (password_verify($_POST['password'], $row['password']))
        {                   
            $db->close();
            header("LOCATION: main.php");
            exit("EXIT: Logged in successfully.");
        }
        else
        {               
            header("LOCATION: index.php?error=Wrong password.");
            exit("EXIT: Wrong password");
        }
    }
}

我不认为这是问题的实际代码,而是我的数据库。我不知道它是否与它有任何关系,但phpmyadmin显示所有行的重复项。我使用SQL(今天)仍然很新,所以我不知道这是否正常。也许我只是需要花时间更新表格?谁知道呢。

答案 1 :(得分:-2)

  1. 确保清理您的输入,从不只使用$_POST['password'],但请改用sanitize filter

  2. 对我来说,你的第一个代码块工作得很好,而你的第二个代码块有不匹配的括号。