我有一个使用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');
}
答案 0 :(得分:1)
您最初的问题只是在查询中插入的变量周围缺少引号。
仅解决该问题,您将容易受到SQL injection attacks的攻击。正确使用statement preparation and execution将解决此问题。而且永远不会存储明文密码。保存它们时,请使用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");
有关密码哈希的更多详细信息,请参见elsewhere on SO。
请注意,为简便起见,我没有检查prepare()
或execute()
函数的结果。您应该这样做。