Как правильно сделать авторизацию с помощью 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 шт):

Автор решения: Dmitry_allread_return

Ошибок у вас довольно много. Некоторые из них:

В 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()

→ Ссылка