PHP PDO数组结果返回,但不适用于IF



我有一个使用PDO的PHP脚本,我根据数据库检查用户提交的电子邮件/密码。如果查询返回一行,则它应该将用户带到成功页面,或者如果凭据不正确,则应将其带到失败的登录页面。但是,用户始终被带到失败页。

$sql = "SELECT email, password FROM user WHERE email= $email AND password = $password";
$stm = $db->prepare($sql);
$stm->execute();
$result = $stm->fetchColumn();
if ($result !== FALSE) {
header('Location: ./success.html');
}
else {
header('Location: ./failed.html');
}

您最初的问题只是插入到查询中的变量周围缺少引号。

仅仅解决这个问题就会让你容易受到SQL注入攻击。正确使用语句准备和执行将解决这个问题。永远不要,永远不要存储明文密码。保存它们时,请使用password_hash,然后使用如下所示的代码来验证它们。

$password = $_POST["password"];
$email = $_POST["email"];
$sql = "SELECT password FROM user WHERE email= ?";
$stm = $db->prepare($sql);
$stm->execute([$email]);
$result = $stm->fetchColumn();    
if ($result !== FALSE) {
if (password_verify($password, $result[0])) {
header("Location: ./success.html);
exit;
}
}
header("Location: ./failed.html");

有关密码哈希的更多详细信息,请参阅SO的其他地方。

请注意,为简洁起见,我不检查prepare()execute()函数的结果。你应该这样做。

最新更新