PHP登录密码_verify

时间:2017-02-15 15:04:21

标签: php mysql

我正在学习如何使用预处理语句,我想我会尝试使用password_hash()password_verify()函数登录系统(简单)。我已经成功地使用准备好的状态数据库插入数据,现在我希望验证密码并对用户做一些事情。

我似乎在这个阶段收到了失败的消息:

$stmt = $conn->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);

$username = $_POST['ulogin'];
$password = $_POST['upassword'];

$stmt->execute();
$stmt->bind_result($username, $password);



$row = $stmt->fetch();
if ($stmt->num_rows == 1) {
    if (password_verify($password, $row['user_password'])) {
        echo 'success';
    }
} else {
 echo "Wrong data";
}

$stmt->close();
$conn->close();

如果我执行了var_dump($stmt->fetch());并且登录用户名是正确的,请返回bool(true)

我现在不确定如何尝试验证密码。

2 个答案:

答案 0 :(得分:5)

<?php

$stmt = $conn->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);

$username = $_POST['ulogin'];
$password = $_POST['upassword'];

$stmt->execute();
$stmt->bind_result($username, $password);
$row = $stmt->fetch(); //fetch DB results


if (!empty($row)) { // checks if the user actually exists(true/false returned)
    if (password_verify($_POST['upassword'], $row['password'])) {
        echo 'success'; // password_verify success!
    } else {
    echo 'failed';
    }
} else {
    echo "This user does not exist"; //email entered does not match any in DB
}

$stmt->close();
$conn->close();

您无需检查行数。如果由于任何原因未验证密码,也要有else语句

答案 1 :(得分:2)

这是你的一个问题:

$password = $_POST['upassword'];
...
$stmt->bind_result($username, $password);
...
if (password_verify($password, $row['user_password'])) {

您正在覆盖$password变量,因此它不再是已过帐的值。

使用POST值可以解决问题:

 if (password_verify($_POST['upassword'], $row['user_password'])) {

 if (password_verify($_POST['upassword'], $password)) {

因为您已将结果中的密码绑定到该变量。

此外,如果您在数据库中的用户名是唯一的,则可以替换:

$row = $stmt->fetch();
if ($stmt->num_rows == 1) {

使用:

if ($row = $stmt->fetch()) {