password_verify为真密码时为false

时间:2019-12-17 13:51:11

标签: php mysqli prepared-statement password-hash

我目前正在尝试使用password_hash()和password_verify()方法。

所以我要继续并创建一个小的登录/注册。

问题是每当我打开登录名时,输出为:

  

失败

我也不知道为什么。.我已经将数据库中密码字段的长度设置为255,但是仍然无法正常工作。

这是我的register.php

<?php
require_once('db.php');

$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);

$p = password_hash($_GET['password'], PASSWORD_DEFAULT);

$stmt = $db->prepare("INSERT INTO users (username, password) VALUES (?,?)");
$stmt->bind_param('ss', $username, $p);

$stmt->execute();

$stmt->close();
$db->close();
?>

我的登录名如下:

<?php
session_start();

error_reporting(0);

require_once('db.php');

function e($input) {
    return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}

$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);

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

$stmt->execute();

$stmt->bind_result($username, $password);
$row = $stmt->fetch();

if (!empty($row)) { 
    if (password_verify($_GET['password'], $row['password'])) {
        echo 'success'; 
    } 
    else 
    {
        echo 'failed';
    }
} 
else 
{
    echo "This user does not exist"; 
}

$stmt->close();
$db->close();
?>

我不知道该如何工作:/

1 个答案:

答案 0 :(得分:5)

$stmt->fetch(); 返回数据。它将数据绑定到bind_result()中定义的变量。

因此,在$stmt->fetch()之后,您将在$username中拥有用户名,并在$password中拥有密码。

因此,真正应该比较的是:

if ($stmt->fetch()) {
    // here 
    if (password_verify($_GET['password'], $password)) {
        echo 'success'; 
    } 
    else 
    {
        echo 'failed';
    }
} 
else 
{
    echo "This user does not exist"; 
}