Php 密码\u验证在密码\u散列后给出false,应为true

Php 密码\u验证在密码\u散列后给出false,应为true,php,mysql,hash,passwords,password-encryption,Php,Mysql,Hash,Passwords,Password Encryption,我一直得到错误的结果,这和不明白为什么 我按如下方式存储新用户及其密码: // get password input $pass = $_POST[ 'password' ]; $options = [ 'cost' => 12 ]; $pass = password_hash($pass, PASSWORD_DEFAULT, $options); // add to db $sql = "insert into clients(first_name, last_name,

我一直得到错误的结果,这和不明白为什么

我按如下方式存储新用户及其密码:

// get password input
$pass = $_POST[ 'password' ];

$options = [
    'cost' => 12
];

$pass = password_hash($pass, PASSWORD_DEFAULT, $options);
// add to db

$sql = "insert into clients(first_name, last_name, email, password_hash) values ('$fname', '$lname', '$email', '$pass')";
对于密码“123456”,我得到以下信息: $2y$12$DUD9LWGK2626R2NQZ6KSFEXFRHI/36RJrq8lAo8vk6XC6VKibIPVG

下一步验证密码:

// get password input
$pass = $_POST[ 'password' ];

// get row hash from database 
$sql = "select email, password_hash, active from clients where email = '$email'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows( $result ) == 0)
{
    // Email not found in the database... 
}

$row = mysqli_fetch_assoc($result);

// true if password is correct
if ( password_verify( $pass, $row['password_hash'] ) ) 
{
    // logged in
}
else 
{
    $passInDb = $row['password_hash'];
    // Login failed
    $_SESSION['error'] = "Incorrect email or password. Cannot verify: $pass ,\n $passInDb" ;
    // redirect to login page
    header('Location: ../index.php');   
}
现在,当我尝试登录时,我得到:

电子邮件或密码不正确。无法验证:123456,$2y$12$DUD9LWGK2626R2NQZ6KSFEXFRHI/36RJrq8lAo8vk6XC6VKibIPVG


我真的不明白为什么密码给了我假的

警告:使用mysqli时,您应该使用参数化查询,并将用户数据添加到查询中。不要使用字符串插值来完成此操作,因为您将创建严重的访问控制层。警告:编写自己的访问控制层并不容易,而且有很多机会使其严重出错。在这个简短的例子中,你有许多危险的原因,都是因为你鲁莽地缺乏自信。请不要编写自己的身份验证系统,因为任何现代的同类产品都带有强大的内置功能。您似乎没有在替换这些值。您不需要使用.$VALUE。insead的价值只有美元?但你,说真的,不是开玩笑,应该使用像PDO这样的准备好的语句。如果你不这样做,你会受到伤害。如果验证是真的,你就什么都没有了。你不应该在那里清除$\u SESSION['error'],或者设置$\u SESSION['username'],然后重定向到某个地方吗?换句话说,password\u verify是否真的返回false,或者只是因为缺少什么东西而看起来是这样。如果未在此页面上设置“无缓存头”,也可能会出现浏览器缓存问题。