Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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登录不工作。使用密码进行验证,似乎会导致一些问题_Php_Forms_Mysqli_Submit_Password Hash - Fatal编程技术网

PHP登录不工作。使用密码进行验证,似乎会导致一些问题

PHP登录不工作。使用密码进行验证,似乎会导致一些问题,php,forms,mysqli,submit,password-hash,Php,Forms,Mysqli,Submit,Password Hash,我不知道为什么它不起作用 Login.php $email = $_POST['email]; $password = $_POST['password]; $validEmail = filter_var($email, FILTER_VALIDATE_EMAIL); $getpassword = $connect->query("SELECT password FROM users WHERE email = '$validEmail'"); $row = $getpassword

我不知道为什么它不起作用

Login.php

$email = $_POST['email];
$password = $_POST['password];

$validEmail = filter_var($email, FILTER_VALIDATE_EMAIL);

$getpassword = $connect->query("SELECT password FROM users WHERE email = '$validEmail'");
$row = $getpassword->fetch_assoc();
所有这些都很好。我得到了电子邮件连接的密码,这样我就可以“验证”密码

$passVarify = password_varify($password, $row['password']);
当我尝试“echo”out或在“$passVerify”上使用“var_dump”/“print_r”时,它只显示数字“1”? 在验证密码后,我运行另一个查询,以便获得“userid”和“privileges”。我需要“解除锁定”或再次将密码设置为“正常”,以便可以进行下面的查询

$result = $objConnection->query("SELECT userid, privileges FROM users WHERE email = '$validEmail' && password = '$passVarify'");
下面的代码似乎没有接收到查询?只是因为某些原因它不起作用

if($result->num_rows > 0) {

    $row = $result->fetch_assoc();

    $userid = $_SESSION['userid'] = $row['userid'];
    $privileges = $_SESSION['privileges'] = $row['privileges'];

}

有什么好主意吗?因为我一直在绞尽脑汁想弄明白为什么第一个“查询”有效而第二个无效

你让自己的生活很艰难

首先,密码验证()的结果为真或假,即验证或未验证。它不会解除密码的锁定。应该没有任何东西可以解除散列的哈希

另外,从数据库中获取数据不需要进行两次单独的调用

您也不需要将电子邮件地址从POST数组复制到标量变量中

因此,对于您的代码来说,这将是一个更简单的流程

此外,您实际上不需要过滤用户输入的密码。如果不正确,
验证密码()
将失败,这就是您需要知道的全部内容

$result = $connect->query("SELECT userid, privilages, password
                           FROM users 
                           WHERE email = '{$_POST['email']}'");

$user = $result->fetch_assoc();

if ( ! password_verify($_POST['password'], $user['password']) ) {
    // show the password error screen
    exit;
} else {
    // save all the SELECTED user info into a sub array of SESSION
    // to be used later
    $_SESSION['user'] = $user;
}
您应该真正使用参数化查询,而不是将POST变量注入查询中


password\u verify
返回true或false,其他不返回。如果您已经确认一切正常,则不需要使用WHERE子句的密码。您可以不只是获取一列,而是获取所有需要的列,并在凭据正确时设置所需内容,否则将打印错误和/或重定向。您正在使用
密码\u哈希/验证
:很好。您正在将用户提供的值注入到SQL查询中:糟糕……谢谢:)我知道有很多事情我应该/可以做得更好,但我已经很久没有做过程序员了。所以现在,我在做我几年前做的事。我想学习PDO和OOP,因为我听过和读过,它应该是一种“更简单”和更好的方法?如果我错了,请纠正我。再次感谢,你没有错。但您当前的代码似乎使用的是MYSQLI,而不是PDO
$stmt= $connect->query("SELECT userid, privilages, password
                           FROM users 
                           WHERE email = ?");

$stmt->bind_param("s", $_POST['email']);
$stmt->execute();

$result = $stmt->get_result();
$user = $result->fetch_array(MYSQLI_ASSOC);