Php MySQL登录系统没有从数据库中获取结果

Php MySQL登录系统没有从数据库中获取结果,php,mysql,password-hash,Php,Mysql,Password Hash,我的登录系统不工作,因为我没有从数据库中获得结果或正确的结果。可能是因为数据库不接受mysqli\u stmt\u store\u结果,但如果mysqlnd打开,则无法查找。我的提供程序没有更改该结果的选项。那么,我的代码中是否有错误,或者是否存在数据库问题?您不应该这样做: <?php session_start(); include 'dbh.inc.php'; //The connection ($conn) is working $errors = array();

我的登录系统不工作,因为我没有从数据库中获得结果或正确的结果。可能是因为数据库不接受mysqli\u stmt\u store\u结果,但如果mysqlnd打开,则无法查找。我的提供程序没有更改该结果的选项。那么,我的代码中是否有错误,或者是否存在数据库问题?

您不应该这样做:

<?php
session_start();
include 'dbh.inc.php'; //The connection ($conn) is working

$errors = array();  

    //Login
    if (isset($_POST['login'])) {
        $username = $_POST['username'];
        $password_1 = $_POST['password_1'];
    
        if (empty($username)) {
            array_push($errors, 'enter username');
        }
        if (empty($password_1)) {
            array_push($errors, 'enter password');
        }
        if (!preg_match("/^[a-zA-Z0-9]*$/", $username)) {
            array_push($errors, 'username not correct');
            $username = "";
        }
    
        if (count($errors) == 0){      //The error is in this if condition
            $password = password_hash($password_1, PASSWORD_DEFAULT);
            $query = "SELECT * FROM users WHERE uidUsers=? AND pwdUsers=?";
            $stmt = mysqli_stmt_init($conn);
            mysqli_stmt_prepare($stmt, $query);
            mysqli_stmt_bind_param($stmt,'ss', $username, $password);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_store_result($stmt);
            $result = mysqli_stmt_num_rows($stmt);
            if (mysqli_num_rows($result) == 1){
                $_SESSION['uidUsers'] = $username;
                $idUsers_query = "SELECT idUsers FROM users WHERE uidUsers=? AND pwdUsers=?";
                $idUsers_stmt = mysqli_stmt_init($conn);
                mysqli_stmt_prepare($idUsers_stmt, $idUsers_query);
                mysqli_stmt_bind_param($idUsers_stmt,'ss', $username, $password);
                mysqli_stmt_execute($idUsers_stmt);
                mysqli_stmt_store_result($idUsers_stmt);
                $idUsers_result = $idUsers_stmt->get_result();
                $_SESSION['idUsers'] = $idUsers_result;
                $username = "";
                header("Location: https://...");
            }
            else{
                array_push($errors,'username or password not correct');
            }
        }
    }
    ?>
密码\u哈希不会在每次运行时生成相同的哈希

您应该在uid上运行查询,检索密码,并对其使用密码验证

我不使用mysqli,所以我在各种选项中都不是最合适的。当您在代码中回显各种调试点时,它会走多远


您似乎运行了两次相同的查询,第一次在绑定参数时使用$idUsers_stmt,尽管此时不存在该查询。我想这会使事情停止工作,但您可以很容易地调试它。

在这样的查询中,您不需要重新设置密码,也不需要说出密码=?选择密码并使用password\u verify确保密码正确。在sql中仅使用用户名/uidUsers作为输入参数,并获取密码作为结果。使用password_verifyWARNING检查密码警告:编写访问控制层并不容易,而且有很多机会使其严重出错。任何现代的like都有内置的,你可以使用。注意:它的详细程度大大降低,使代码更易于阅读和审核,并且不容易与过时的mysql_查询接口混淆,因为缺少一个i会造成麻烦。示例:$db=newmysqli…和$db->prepare…过程接口是PHP4时代的产物,不应在新代码中使用。此外,过程接口的错误检查和报告不够严格,这会阻碍调试工作。如果mysqli_num_rows$result==1{//在此条件之后,每次密码正确时,代码都会跳转到else条件。这意味着行数不是一,而是其他,或者是零,因为它与密码不匹配,因为您必须使用密码验证,而不是按您的方式执行,或者是空,因为查询中存在错误。
$password = password_hash($password_1, PASSWORD_DEFAULT);
$query = "SELECT * FROM users WHERE uidUsers=? AND pwdUsers=?";