Результат массива PHP PDO возвращается, но не работает с IF - PullRequest
0 голосов
/ 05 октября 2018

У меня есть PHP-скрипт, использующий PDO, где я проверяю отправленный пользователем адрес электронной почты / пароль по базе данных.Если запрос возвращает строку, предполагается, что он перенаправляет пользователя на страницу успеха, или если учетные данные неверны, они должны быть перенаправлены на страницу неудачного входа.Однако пользователь всегда попадает на страницу сбоя.

$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 голосов
/ 05 октября 2018

В исходной проблеме просто отсутствовали кавычки вокруг переменных, вставленных в запрос.

Простое исправление этой проблемы сделало бы вас уязвимыми для атак 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() функций.Вы должны делать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...