Php 我的数据库密码和用户填写的密码不匹配

Php 我的数据库密码和用户填写的密码不匹配,php,authentication,Php,Authentication,我的php登录文件有问题。我通过查看电子邮件向数据库询问密码。当我获得此密码时,我会将其与用户填写的密码进行核对 在密码\u验证($Passwd,$row['Passwd'])中,结果将始终返回0,但结果应返回1(密码匹配) 为什么我的密码彼此不匹配 登录代码: <?php if(isset($_POST['submit'])){ include_once '../includes/connection.php'; $Email = $_POST['email'];

我的php登录文件有问题。我通过查看电子邮件向数据库询问密码。当我获得此密码时,我会将其与用户填写的密码进行核对

密码\u验证($Passwd,$row['Passwd'])
中,结果将始终返回0,但结果应返回1(密码匹配)

为什么我的密码彼此不匹配

登录代码:

<?php
if(isset($_POST['submit'])){

    include_once '../includes/connection.php';

    $Email = $_POST['email'];
    $Passwd = $_POST['passwd'];

    //Create Template
    $sql = "SELECT Passwd FROM user WHERE Email = ?";

    //Create Prepared Statement
    $stmt = mysqli_stmt_init($conn);

    //Prepare Prepared Statement
    if(!mysqli_stmt_prepare($stmt, $sql)){

        echo "SQL Statement Failed";

    } else {

        mysqli_stmt_bind_param($stmt, "s", $Email);

        mysqli_stmt_execute($stmt);

        $res = mysqli_stmt_get_result($stmt);
        
        while ($row = mysqli_fetch_assoc($res)){
            
            echo $Passwd . "<br>";
            echo $row['Passwd'];

            if(password_verify($Passwd, $row['Passwd'])){
                echo "1";
            } else {
                echo "0";
            }
        }

    }

} else {

    header("Location: ../index.php?login=error");
}
?>

注册代码:

<?php

if(isset($_POST['submit'])){

    include_once '../includes/connection.php';

    $Username = $_POST['username'];
    $Email = $_POST['email'];
    $Passwd = $_POST['pwd'];

    //Create Template
    $sql = "INSERT INTO user (Username, Email, Passwd)
        VALUES (?, ?, ?);";

    //Create Prepared Statement
    $stmt = mysqli_stmt_init($conn);

    //Prepare Prepared Statement
    if (!mysqli_stmt_prepare($stmt, $sql)) {

        echo "SQL Statement Failed";

    } else {

        $hashed_passwd = password_hash($Passwd, PASSWORD_DEFAULT);
        
        //Replace '?' by the acctual data
        mysqli_stmt_bind_param($stmt, "sss", $Username, $Email, $hashed_passwd);

        //Run parameters inside database
        mysqli_stmt_execute($stmt);
    }


    header("Location: ../index.php?signup=succes");

} else {

    header("Location: ./index.php?sinup=error");

}

?>

Passwd
是数据库中的一个varchar(50)列。

手册上说:

建议将结果存储在可扩展到60个字符以上的数据库列中(最好选择255个字符)

因此,您需要为数据库中的密码列指定至少60个字符的大小-但建议使用更大的大小,例如255,以防将来更改默认哈希算法


您还需要重新生成存储在50个字符字段中的任何现有密码,因为它们在保存时会被截断,并且额外的信息已丢失,这意味着这些旧密码永远无法验证。

您显示的代码看起来正常。但是,由于我们无法查看您发送到服务器的电子邮件和密码,或者包含哈希密码的数据库行的外观,或者您最初是如何保存密码的,因此很难确切地确定可能出现了什么问题。当用户创建帐户时,密码通过
password\u hash
散列到数据库中。在我上面的代码中,$row['Passwd']返回哈希密码,如果我回显$Passwd,则返回用户在表单中填写的累计密码。所以$row['Passwd']是从数据库散列出来的,而$Passd是用户在表单OK中填写的内容。可能是第一次保存密码时出错了。你能给我看一下所有相关的代码吗?我在哪里可以发布我的其他代码?因为在stackoverflow上有一个时间限制。我把它写在下面作为一个答案-如果有帮助,请标记为“接受”和/或upvote。谢谢:-)