繁体   English   中英

语句始终返回false

[英]The statement always return false

我为登录系统编写了该语句,但该语句不起作用,提取功能正常运行,因为如果我尝试回显$ hash,它看起来还不错,但是如果我尝试此验证语句,即使输入也总是返回false在数据库中是相同的,数据库看起来很好,它具有varchar(255),这是我的代码

<?php

if(isset($_POST['submit'])){
    include 'database.php';
    $uid = mysqli_real_escape_string($conn,$_POST['uid']);
    $pass = mysqli_real_escape_string($conn,$_POST['pass']);

    $query = "SELECT * FROM user WHERE username ='$uid'";
    $tbl = mysqli_query($conn, $query);
    if (mysqli_num_rows($tbl)>0){

        $row = mysqli_fetch_array($tbl, MYSQLI_ASSOC);
        $hash = $row['password'];
        if (password_verify($pass, $hash)){
            echo "success";
        } else {
            echo "log in error";
        }
    }
}

编辑

我删除了mysqli_real_escape_string,但仍返回false,这里是新代码,我从数据库中选择全部以验证用户名,因此,如果输入中的用户名或密码位于数据库内部,则用户将被重定向到错误的密码页

<?php

if(isset($_POST['submit'])){
    include 'database.php';
$uid = $_POST['uid'];
$pass = $_POST['pass'];

$query = "SELECT * FROM user WHERE username ='$uid'";
$tbl = mysqli_query($conn, $query);
if (mysqli_num_rows($tbl)>0){

    $row = mysqli_fetch_array($tbl, MYSQLI_ASSOC);
    $hash = $row['password'];
     if (password_verify($pass, $hash)){
         echo "success";
     }
     else {
         echo "log in error";
     }

}
}

我有一个注册页面,这是我进行哈希处理的位置,然后将其存储在数据库中,这是我的代码

$sql = "SELECT * FROM 'user' WHERE username ='$uid'";
    $result = mysqli_query($conn, $sql);
    $resultCheck = mysqli_num_rows($result);
}
  if ($resultCheck > 0) {
    header("Location:.../user.add.php?the inputs are already taken");
    exit();
  }
  else {
      $hashedpass = password_hash($pwd, PASSWORD_DEFAULT);
      //insert the new user to the user database
      $sql = "INSERT INTO user (userID, username, password)
      VALUES (NULL, '$uid', '$hashedpass');";
      $result = mysqli_query($conn, $sql);
      header("Location:../user.add.php?success sir");
    exit();
  }

您可能会在比较之前修改密码:

$pass = mysqli_real_escape_string($conn,$_POST['pass']);

在某些情况下,这不会有所作为,但在某些情况下会有所不同。

如果我尝试回显$ hash,它看起来很好

对于人类来说,在网页上输出可能看起来很直观,但这是否意味着两个值是二进制等效的? 并非总是如此,代码的结果似乎恰好表明了这一点。

由于您不在SQL查询中使用此值,因此无需转义它:

$pass = $_POST['pass'];

旁注:无论如何,您都不应依赖转义输入来在SQL查询中使用。 相反,请不要在查询中首先使用用户可修改的值作为代码。 请改用查询参数 一个通常链接的堆栈溢出问题提供了一些出色的示例和解释,可以帮助您入门。 从长远来看,您的代码将更安全,更稳定,更易于调试和维护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM