php - password_verify() 总是返回 false

标签 php mysql authentication

我是一个新手,我正在尝试使用 PHP 和 Mysql 创建一个登录系统。完成注册表并添加几个用户后,我试图创建一个登录表单。但它总是返回错误,说我的您的用户名或密码不正确!。下面是我的代码。如果有人可以帮助我,那就太好了。如果我的怀疑太基本了,请提前道歉:/

<?php
    session_start();
    include '.\includes\functions\db.php';
?>

<?php
    $username = strtolower(mysqli_real_escape_string($db, $_POST['username']));
    $password = strtolower(mysqli_real_escape_string($db, $_POST['password']));

    $sql        = "SELECT * FROM users WHERE username = '$username' ";
    $result     = mysqli_query($db, $sql);
    $row        = mysqli_fetch_assoc($result);
    $hash_pwd   = $row['password'];
    echo $hash_pwd;
    echo $password;
    $hash       = password_verify($password, $hash_pwd);

    if ($hash ==0) {
        header("Location: ./index.php?error=check");
        exit();
    }else {
        $sql = "SELECT * FROM user WHERE username = '$username' AND password = '$hash_pwd'";
        $result = mysqli_query($db, $sql);
        if (mysqli_num_rows($result) == 0) {
            echo "Your username or password is incorrect!";
        }else {
            $_SESSION['id'] = $row['id'];
            $_SESSION['username'] = $row['username'];
        }
        //header("Location: ./index.php");
    }
?>

我的注册页面如下

<?php
//This Page is for registration of users
?>

<?php
// this php tag is for all includes
include '.\includes\functions\db.php';

?>

<?php
//print isset($_POST["submit"]);
//Getting all details inserted in form
if(isset($_POST["register"])){
    $username   = $_POST['username'];
    $firstname  = $_POST['firstname'];
    $lastname   = $_POST['lastname'];
    $email      = $_POST['email'];
    $password   = $_POST['password'];
    $date       = date('Y-m-d H:i:s');

    //Encrypting and Securing recieved data
    $username               = strtolower(mysqli_real_escape_string($db, $username));
    $firstname              = strtolower(mysqli_real_escape_string($db, $firstname));
    $lastname               = strtolower(mysqli_real_escape_string($db, $lastname));
    $email                  = strtolower(mysqli_real_escape_string($db, $email));
    $password               = strtolower(mysqli_real_escape_string($db, $password));
    $encryptedpassword      = password_hash($password, PASSWORD_DEFAULT);

    //To check duplication of email ids
    $sql        = "SELECT email FROM users WHERE email='$email'";
    $result     = mysqli_query($db, $sql);
    $row        = mysqli_num_rows($result);//$row will return count of rows if any duplicate email ids are found

    //To check duplication of usernames
    $sql2       = "SELECT username FROM users WHERE username='$username'";
    $result2    = mysqli_query($db, $sql2);
    $row2        = mysqli_num_rows($result2);//$row2 will return count of rows if any duplicate usernames are found

    //conditions to check what all duplicates are found
    if($row > 0 && $row2 >0){
        echo "Sorry...This email id and username is already taken!!!";
    } elseif ($row > 0 ) {
        echo "Sorry...This email id is already taken!";
    } elseif ($row2 > 0) {
        echo "Sorry...This Username is already taken!";
    }else {
        $query  = mysqli_query($db, "INSERT INTO users (username, firstname, lastname, password, email, regdate) VALUES
        ('$username', '$firstname', '$lastname', '$encryptedpassword', '$email', '$date')");
        if($query){
            echo "Thank You! you are now registered.";
        }
    }
}

?>

最佳答案

我的代码中的错误是因为我的 where 子句中的 password = '$hash_pwd' 条件。当我使用给定的用户名重试行并稍后使用 php 验证密码时,它按预期工作。我猜想在 php 中使用 password_hash() 散列的密码不能像加密一样被检索和验证。无论如何,感谢您的所有回复

关于php - password_verify() 总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637613/

相关文章:

php - 这个动态查询代码,问题在哪里(php)?

php - 如何使用 the_field 从 https 加载图像

javascript - 如果另一个类在循环中有此类,则 Jquery 添加类

php - 模型函数内部的 Laravel orm 数据库查询

authentication - 如何使用 Node.js、Express 和 Mongoose 进行身份验证?

authentication - Symfony2 - 管理用户的好方法

ios - 我可以在 iPhone 应用程序上使用 Facebook 身份验证服务器端流程并仍然进行客户端交互吗?

php - 所有 localhost http 链接都重定向到 https

MySQL 查询计数和连接

mysql - 列中的第一个字母是大写,而选择时是小写