PDO сверка пользователя с hash_password

238
09 августа 2017, 21:00

в бд залиты пользователи с hash_password, при извлечении не пойму как сделать, чтобы пароль нормально проверялся. с PDO работаю первый день, камнями не кидаться =) Вот мой кривокод:

    <?php
    require_once "libs/db.php";
    $data = $_POST;
    if(isset($data['do_login']))
    {
        $errors = array();
        $query = ('SELECT EXISTS (SELECT 1 FROM users WHERE u_login = :login)');
        $stmt = $pdo->prepare($query);
        $stmt->execute(['login' => $data['login']]);
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
        if (password_verify($data['password'], $results['u_password'])) {
            echo "LOGGED IN";
        } else {
            echo "LOGGIN FAILED";
        }
    }
?>
<form action="login.php" method="POST">
    <p>Ваш логин: <input type="text" name="login" value="<?= @$data['login']; ?>"></p>
    <p>Ваш Пароль: <input type="password" name="password" value="<?= @$data['password']; ?>"></p>
    <p><button type="submit" name="do_login">Войти</button></p>
</form>

Ошибка Notice: Undefined index: u_password in C:\MAMP\htdocs\project1\login.php on line 12 LOGGIN FAILED

Подскажите где я тут накосячил, и как лучше это сделать можно было вообще.

Answer 1
  1. Ошибка в запросе, вы проверяете наличие пользователя с определённым логином, а не загружаете данные этого пользователя. Нужно SELECT * FROM users WHERE u_login = :login.
  2. fetchAll возвращает массив массивов (всю таблицу а не отдельную запись), Для того чтоб получить только 1 запись нужно делать fetch.

    if(isset($data['do_login']))
    { 
        $errors = [];
        $query = 'SELECT * FROM users WHERE u_login = :login';
        $stmt = $pdo->prepare($query);
        $stmt->execute(['login' => $data['login']]);
        $results = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($result && password_verify($data['password'], $results['u_password'])) 
        {
            echo "LOGGED IN";
        }
        else 
        {
            echo "LOGGIN FAILED";
        }
    }`
    
READ ALSO
Преобразовать время в метку времени UNIX

Преобразовать время в метку времени UNIX

Я получаю дату и время в таком формате: 2017-8-15T12:45 Как ее можно преобразовать в метку времени UNIX?

270
Работа с текстом: удаление и вставка

Работа с текстом: удаление и вставка

Предположим есть строка:

252