Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP密码\u验证始终返回false_Php_Mysql_Passwords - Fatal编程技术网

PHP密码\u验证始终返回false

PHP密码\u验证始终返回false,php,mysql,passwords,Php,Mysql,Passwords,我一直在开发一个Android应用程序,它可以注册用户并登录到远程MySQL数据库。我已经仔细检查了我的Android代码和从应用程序发送到PHP的信息 显然,问题出在login.php文件的某个地方。用户注册成功,但之后我无法登录 My DB有3个字段: id/int(11) 电子邮件/varchar(255) 密码/字符(60) 注册一个用户会给我密码字段60个字符的哈希值。到目前为止,一切顺利。但当我尝试登录时,总是会收到失败响应 我使用的是PHP5.4,因为我仅限于PHP5.4 以下

我一直在开发一个Android应用程序,它可以注册用户并登录到远程MySQL数据库。我已经仔细检查了我的Android代码和从应用程序发送到PHP的信息

显然,问题出在login.php文件的某个地方。用户注册成功,但之后我无法登录

My DB有3个字段:

  • id/int(11)
  • 电子邮件/varchar(255)
  • 密码/字符(60)
注册一个用户会给我密码字段60个字符的哈希值。到目前为止,一切顺利。但当我尝试登录时,总是会收到失败响应

我使用的是PHP5.4,因为我仅限于PHP5.4

以下是我的登录PHP代码:

<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
    $email = $_POST['email'];
    $passwordFromPost = $_POST['password']; 
    require_once('dbconnect.php');  
    $sql = "SELECT password FROM users WHERE email = '$email'";
    $hash = mysqli_query($con, $sql);
    require_once('lib/password.php');
    if (password_verify($passwordFromPost, $hash)) {
        echo 'success';
    } else {
        echo 'failure';
    }
}
?>
<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
    $email = $_POST['email'];
    $passwordFromPost = $_POST['password'];
    require_once('lib/password.php');
    $hash = password_hash($passwordFromPost, PASSWORD_BCRYPT);
    if($hash) {
        require_once('dbconnect.php');
        $sql = "INSERT INTO users (email, password) VALUES ('$email','$hash')";     
        if(mysqli_query($con, $sql)){
            echo "Registered succesfully";
        } else {
            echo "Unable to register the account";
        }
    } else {
        echo 'error';
    }
} else {
    echo 'error';
}
?>

您的登录php文件应该是

<?php
if($_SERVER['REQUEST_METHOD']=='POST'){
 $email = $_POST['email'];
 $passwordFromPost = $_POST['password']; 
 require_once('dbconnect.php');  
 $sql = "SELECT password FROM users WHERE email = '$email'";
 $rst = mysqli_query($con, $sql);
 $hash = mysqli_fetch_row($rst);
 require_once('lib/password.php');
 if (password_verify($passwordFromPost, $hash['password'])) {
    echo 'success';
  } else {
    echo 'failure';
  }
}
?>

您忘记取行了。因此,您没有根据字符串进行验证

<?php

$result = mysqli_query($con, $sql);
$row    = mysqli_fetch_array($result);
password_verify($passwordFromPost, $row['password']);

您需要获取行:

<?php
    if($_SERVER['REQUEST_METHOD']=='POST'){
        $email = $_POST['email'];
        $passwordFromPost = $_POST['password']; 
        require_once('dbconnect.php');  
        $sql = "SELECT password FROM users WHERE email = '$email'";
        $hash = mysqli_query($con, $sql);
        while ($row = mysqli_fetch_row($hash)) {
            require_once('lib/password.php');
            if (password_verify($passwordFromPost, $row["password"])) {
                echo 'success';
            } else {
                echo 'failure';
            }
        }
    }
?>

lib/password.php中有什么内容?注册用户时,您是否确定加密的密码不超过60个字符,并将其截断?
mysqli_query()
返回包含密码列的行的结果集(在本例中,希望只有1行)。。。。。您需要获取行并获取password列来执行此操作verify@HuzaibShafi这说明您在这里检查的变量是错误的
if(password\u verify($passwordFromPost,$hash)){
并且必须查询密码行。那没有任何意义,因为据我所知,
密码\u散列
算法每次都会生成不同的散列。@sergio martell no.。所有好的散列算法都会为同一个字符串生成相同的散列不……如果OP要根据存储在使用密码的数据库\u验证(),则他们不应从中散列密码input@HuzaibShafi我已经尝试过你的代码方案。它不起作用。另外,我正在尝试用相同的密码注册不同的帐户,并且存储的哈希值总是不同的。@马克·贝克表示歉意。。我没有查看验证函数的代码。非常感谢!这实际上解决了问题莱姆!如果这是一个解释,那就太好了。注意了。“塞尔莫马特尔如果它解决了你的问题,考虑接受答案。这里是如何返回这里,并用滴答/检查标记做同样的事情,直到变成绿色。这通知了社区,找到了解决方案。否则,其他人可能会想到。问题仍然悬而未决,可能需要发布(更多)答案。现在已检查。再次感谢@Fred ii-同时,感谢您提供的解释。