Php MySQL查询不返回我的用户名行

Php MySQL查询不返回我的用户名行,php,html,mysql,Php,Html,Mysql,我把我的MySQL数据库连接到我的php代码,它工作得很好,因为我在其他一些地方使用它,我有一个注册/登录页面。注册工作也很好,我可以看到我的数据库中的所有细节。但是,我无法登录 if (isset($_POST['login_btn'])) { $username = $_POST['username']; $password = $_POST['password']; if (empty($username)) { array_push($e

我把我的MySQL数据库连接到我的php代码,它工作得很好,因为我在其他一些地方使用它,我有一个注册/登录页面。注册工作也很好,我可以看到我的数据库中的所有细节。但是,我无法登录

if (isset($_POST['login_btn'])) {
        $username = $_POST['username'];
        $password = $_POST['password'];

        if (empty($username)) { array_push($errors, "Username is required"); }
        if (empty($password)) { array_push($errors, "Password is required"); }
        if (empty($errors)) {
            $password = md5($password); 

            $stmt = $conn->prepare("SELECT * FROM users WHERE username='$username' and password='$password' LIMIT 1");
                        $stmt->execute();

            $result = $stmt->get_result();
            if (mysqli_num_rows($result) > 0) {

                $reg_user_id = mysqli_fetch_assoc($result)['id'];

                $_SESSION['user'] = getUserById($reg_user_id);

                if ( in_array($_SESSION['user']['role'], ["Admin", "Author"])) {
                    $_SESSION['message'] = "You are now logged in";

                    header('location: ' . BASE_URL . '/admin/dashboard.php');
                    exit(0);
                } else {
                    $_SESSION['message'] = "You are now logged in";

                    header('location: index.php');
                    exit(0);
                }
            } else {
                array_push($errors, 'Wrong credentials');
            }
        }
    }

我的代码总是转到错误凭据的else分支。看起来它从一开始就没有得到我的用户行。我在这个问题上陷入了困境。

尝试更改sql注入:

$stmt = $conn->prepare("SELECT * FROM users WHERE username='$username' and password='$password' LIMIT 1");
$result = $stmt->get_result();
if (mysqli_num_rows($result) > 0) {

另一个问题:

您是否已尝试将您的查询输入mysql面板? 您确定POST中的所有变量都正常吗? 为什么不使用密码验证

就像:

if (password_verify($_POST['password'], $user['password'])) {

}
仅使用用户名选择$user

完成:

$stmt = $conn->prepare("SELECT * FROM users WHERE username=?");
$stmt->bind_param('s',$username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
 while($user = $result->fetch_array()){

  if (password_verify($_POST['password'], $user['password'])) {
  //start all session var
  }

}
}

从您所写的内容来看,用户名没有发布。尝试查看您的前端表单中的用户名字段是否有输入错误。另外,在$username=$\u POST['username']下面添加此行var_dump$\u POST['username'];要查看用户名是否为空。请注意,没有订单的限制是公平的meaningless@Strawberry限制是无用的,因为用户名在理论上是无效的unique@SimoneRossaini公平点-因此,也许在少数情况下,无订单限制实际上是潜在有用的警告:您对参数化准备持开放态度,并且应该使用参数化准备语句,而不是手动生成查询。它们由或提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行。$user['password']来自何方?我接受了你的答案,因为它让我重构了我的代码,并一步一步地重新检查了一遍。。。我的问题最终有点愚蠢。我对密码进行了加密,但有一次我不知道为什么,出于测试目的,也许我在数据库中将我的密码手动更改为非加密版本。当然,当我尝试登录时,它找不到我的加密文件。请改用foreach。您不需要检查num_行。此外,我希望只有1行。检查用户是否存在并不重要为什么?您只需执行$user=$result->fetch\u assoc;如果$user&&password\u验证$\u POST['password',$user['password']
$stmt = $conn->prepare("SELECT * FROM users WHERE username=?");
$stmt->bind_param('s',$username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
 while($user = $result->fetch_array()){

  if (password_verify($_POST['password'], $user['password'])) {
  //start all session var
  }

}
}