php - 该语句总是返回 false

标签 php mysql

我为登录系统编写了这个语句,但它不起作用,获取函数可以正常工作,因为如果我尝试回显 $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']);

在某些情况下这不会产生影响,但在某些情况下却会产生影响。

if I try to echo out the $hash, it looks fine

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

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

$pass = $_POST['pass'];
<小时/>

旁注:无论如何,您不应该依赖转义输入来在 SQL 查询中使用。相反,首先不要在查询中使用用户可修改的值作为代码。使用query parameters反而。 A commonly linked Stack Overflow question有一些很好的示例和解释可以帮助您入门。从长远来看,您的代码将更安全、更稳定、更易于调试和维护。

关于php - 该语句总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54420563/

相关文章:

php - 如何使用 PHPMyAdmin 在 PHP 中添加多个评论框?

mysql - 从多个表的单个列中检索数据以充当另一个表的列

mysql - 加入 "AND"条件中的 case 语句

php - mysql 选择 * 带计数

c# - MySQL 检查用户是否存在 C#

php - MySQL语法错误将php字符串插入表中

php - 获取 Twig 中数组的索引#

php - 如何查看用户之前是否发过帖子,如果有,突出显示他过去的帖子?

php - 数据未从 MySQL 数据库获取

php - 格式错误的字段路径 ""(InvalidArgumentException)