PHP PDO数组结果返回但不能与IF一起使用

时间:2018-10-05 02:08:57

标签: php if-statement pdo comparison

我有一个使用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');

}

1 个答案:

答案 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()函数的结果。您应该这样做。