Как правильно сделать авторизацию с помощью PDO?
Я впервые пробую PDO и впервые делаю регистрацию и авторизацию.
С регистрацией проблем не было. Но теперь с fectchAll независимо от обстоятельств выдает пустой массив.
Я хочу понять где я допустил ошибки и как сделать правильно?
Вот код:
<?php
require 'connectDB.php';
$login = filter_var(trim($_POST['login']), FILTER_SANITIZE_STRING);
$password = filter_var(trim($_POST['password']), FILTER_SANITIZE_STRING);
$password = password_hash($password, PASSWORD_DEFAULT);
// sql запрос в базу
$sql = "'SELECT FROM * `users` WHERE `login` = '$login' AND `password` = '$password'";
$query = $pdo->prepare($sql);
$user = $query->fetchAll();
if (count($user) == 0) {
echo '<script>alert("Такой пользователь не найден")</script>';
exit();
}
print_r($user);
exit();
// $query->execute([
// 'login' => $login,
// 'password' => $password
// ]);
Лично мне кажется я не совсем хорошо обрабатываю sql запрос. Но если я его нормально сделаю, то что мне дальше делать?
Ответы (1 шт):
Ошибок у вас довольно много. Некоторые из них:
В sql запросе в самом начале стоит лишний апостроф.
Также пишется SELECT * FROM , а не SELECT FROM *
Если вы делаете запрос в prepare, то для начала нужно ставить "заглушки", а не готовые значения. Готовые значения подставляем только в следующем шаге внутри execute. (Ниже есть пример)
Также очень важно, что если мы проверяем пароль, захешированный через password_hash(), проверить его корректность мы должны уже в другой функции -
password_verify($password, $hash)
где 1 параметром мы передаем введенный пароль пользователя,
а 2-м параметром захешированный пароль из базы
Поэтому убедитесь предварительно, что ваши пароли в базе хранятся уже в захешированном виде.
Так же не следует в данном случае применять функцию filter_var c фильтром FILTER_SANITIZE_STRING, поскольку он может испортить логин и пароль, и они не совпадут.
Все исправил и прокомментировал в коде ниже, можете сравнить со своим.
require 'connectDB.php';
$login = trim($_POST['login']);
$password = trim($_POST['password']);
// sql запрос в базу (знак "?" это заглушка
// в которую мы подставим значение в execute далее)
$sql = "SELECT * FROM `users` WHERE `login` = ?";
$query = $pdo->prepare($sql);
// Сейчас как раз подставляем значение в нашу "?" - загрушку выше.
$query->execute([$login]);
// В данном случае лучше использовать fetch вместо fetchAll,
// так ищем в базе только 1 совпадение
$user = $query->fetch(PDO::FETCH_ASSOC);
// Теперь проверяем правильный ли введен пароль
// с помощью password_verify()
if($user && password_verify($password, $user['password'])) {
echo 'Авторизация прошла успешно';
} else {
echo '<script>alert("Такой пользователь не найден")</script>';
exit();
}
//print_r($user);
Что касается константы PDO::FETCH_ASSOC внутри fetch, - она нам возвращает только текстовые индексы. Это аналог mysql_fetch_assoc()