Php 密码验证一直返回false,我在任何地方都找不到答案

Php 密码验证一直返回false,我在任何地方都找不到答案,php,Php,密码验证始终返回false。我已经看到了这里的每一个答案,但没有一个有用。密码字段为varchar255。当我从数据库中转储密码时,它会显示string60,密码是正确的,但函数仍然返回false。 以下是存储在数据库中的代码: if(empty($_POST['pass'])) { $passErr = "Password required!"; $errors[] = "Pass error"; } else { $pass = test_input($_POST["

密码验证始终返回false。我已经看到了这里的每一个答案,但没有一个有用。密码字段为varchar255。当我从数据库中转储密码时,它会显示string60,密码是正确的,但函数仍然返回false。 以下是存储在数据库中的代码:

if(empty($_POST['pass'])) {
    $passErr = "Password required!";
    $errors[] = "Pass error";
} else {
    $pass = test_input($_POST["pass"]);

    if(!preg_match("/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/", $pass)) {
        $passErr = "Password not well formed";
        $errors[] = "Pass error";
    } else {
        $pass_hashed = password_hash($pass, PASSWORD_DEFAULT);

    }
}
$hash_ver = md5(rand(0, 1000));
$status = "";
$stm = $conn->prepare("INSERT INTO user VALUES(?, ?, ?, ?, ?, ?, ?, ?)");

$stm->bind_param("sssssssi", $id, $pass_hashed, $email, $fName, $lName, $hash_ver, $status, $id_role);

$stm->execute();
echo strlen($pass_hashed);
这是登录脚本的一部分

if(count($array) != 0) {
    echo "<script>alert('Ima gresaka')</script>";
} else {

    include('connectionFile/connection.php');


    $stmt = $conn->prepare("SELECT `name`,`last_name`,`status_verif`,`email`,`password` FROM user WHERE `email`=?");
    $stmt->bind_param("s", $email);
    $stmt->execute();

    if($res = $stmt->get_result()) {
        $count = $res->num_rows;

        if($count == 1) {

            $row = $res->fetch_assoc();
            $passwordb = $row['password'];

            //echo "<p>".$passwordb."</p>";

            $verify = password_verify($pass, $passwordb);

            if($verify) {
                echo "<script>alert('Password match')</script>";
            } else {
                var_dump($verify);
                var_dump($passwordb);
                echo "<script>alert('Password doesnt match')</script>";
            }

        } else {
            echo "<script>alert('0 rows')</script>";
        }

    } else {
        echo "<script>alert('No rows at all')</script>";
    }

}
有两个可能的原因:

1$通过=测试输入$通过后[通过]

函数test\u输入对用户未知的$\u POST['pass']字符串执行某些操作。另外,$pass的值没有在第二个代码块中声明

二,

您插入的值没有插入到正确的SQL列中,或者您从SQL中提取的值不是正确的列,可能您正在提取并比较您插入的md5哈希

如果您可以显示一个示例输出,例如您的revar_dump values state,这将非常有用

显示$pass在第二个代码块中是如何设置的,以及test_输入在第一个代码块中实际做了什么,这将非常有帮助

代码的各个部分都需要改进

此外,仔细考虑您的逻辑结构-如果$pass不适合您的preg_匹配怎么办?它仍将插入到您的数据库中。您需要正确地捕捉这些类型的流问题


,或者更好。

我认为问题在于变量$row之后。它无法识别登录脚本中的$passwordb=$row['password']。 试试这样的话:

// $rows = $res->fetch_assoc();

while( ($row = $res->fetch_assoc()) !== FALSE ) {
    $rows[] = $row;
}

function returnArray( $rows, $string )
{
    foreach( $rows as $row )
    {
    return $row[ $string ];
    }
}

$passwordb = returnArray( $rows, 'password');

//etc.........

谢谢你花时间解决我的问题,我设法找到了错误。问题在于$pass变量。包含连接文件后,$pass变量没有返回我期望的值,因为连接文件中还有另一个$pass变量。再次感谢您,很抱歉,我仍在学习如何正确使用StackOverflow。

您是否尝试回显您的$pass?它能像你期望的那样打印出来吗?这个方法对测试输入有什么作用?可能是添加/嵌入了一些你不知道的东西。你也不应该以任何方式操纵密码,这可能是所有这一切的原因。请评论你的代码,Andrija,这将使你和其他人更容易理解你的代码。我想你没有参与你的问题。好吧,我把这个留给你。有些东西在操纵你的输入,你需要找出原因。你可以随时为将来的用户编辑你的帖子,祝你好运。也许你正在提取和比较你插入的md5哈希这不是要插入的内容。一开始我是这么想的,但是他们插入了正确的变量。MD5看起来是另一个东西。@Fred ii-OP正在插入这两个值,但我们不知道要插入哪些列,而且我们没有收到DB示意图,我认为这是一个选项,尽管不太可能;我完全不知道为什么我没有为这个潜在的兔子洞发布答案。祝你一切顺利,如果你需要一个好手电筒,请告诉我;-编辑:我得走了。@Fred ii-正如伟大的海盗黑胡子所说:当你消除了不可能,那么剩下的任何东西,无论多么不可能,都一定是我的密码散列不存在的原因work@Fred-我这么做只是为了同情!哈哈。。。。。祝你过得愉快,先生!
// $rows = $res->fetch_assoc();

while( ($row = $res->fetch_assoc()) !== FALSE ) {
    $rows[] = $row;
}

function returnArray( $rows, $string )
{
    foreach( $rows as $row )
    {
    return $row[ $string ];
    }
}

$passwordb = returnArray( $rows, 'password');

//etc.........