Создание приложения PHP / MySQL - все попытки входа не удаются - PullRequest
0 голосов
/ 26 августа 2018

Я создаю веб-приложение с PHP и MySQL.У меня есть страница регистрации / входа.Я зарегистрировал несколько учетных записей с помощью приложения и вижу сообщение о том, что учетная запись была успешно создана, но при попытке войти в систему происходит сбой с сообщением об ошибке «Неверное имя пользователя или пароль».Когда я захожу в PHPMyAdmin, я вижу, что все учетные записи пользователей присутствуют в таблице пользователей, и я вижу имена пользователей и их пароли (последняя в хешированном формате).Поэтому я не понимаю, почему я не могу войти.

Это моя форма входа (в index.php):

<!-- login form -->
    <form method="post" action="php/login.php">
      <div class="form-group">
        <input class="form-control" type="text" name="username" placeholder="Username" required>
      </div>

      <div class="form-group">
        <input class="form-control" type="password" name="password" placeholder="Password" required>
      </div>

      <div class="form-group">
        <input class="btn btn-primary" type="submit" name="login" value="Login">
      </div>
    </form>
 <!-- ./login form -->

и это login.php:

 <?php
  require_once "../functions.php";

  db_connect();

  $sql = "SELECT id, username, password FROM users WHERE username = ?";

  $statement = $conn->prepare($sql);
  $statement->bind_param('s', $_POST['username']);
  $statement->execute();
  $statement->store_result();
  $statement->bind_result($id, $username, $password);
  $statement->fetch();

  if ($statement->execute()) {
    if(password_verify($_POST['password'], $password)) {
      $_SESSION['user_id'] = $id;
      $_SESSION['user_username'] = $username;
      redirect_to("/home.php");
    } else {
      redirect_to("/index.php?login_error=true");
    }
  } else {
    echo "Error: " . $conn->error;
  }
  ?>

Это код сообщения об ошибке (в index.php):

<?php if(isset($_GET['login_error'])): ?>
<div class="alert alert-danger">
  <p>Invalid username or password!</p>
</div>

В Apache access.log я вижу: 127.0.0.1 - - [26 /Aug / 2018: 14: 54: 07 +0100] "GET /index.php?login_error=true HTTP / 1.1" 200 1230 "http://localhost/index.php?registered=true"" Mozilla / 5.0 (X11; Ubuntu; Linux x86_64; rv: 61.0)) Gecko / 20100101 Firefox / 61,0 "

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Мне удалось найти причину проблемы.Когда я изначально создал таблицу пользователей в базе данных, я установил максимальное количество символов для поля пароля равным 40. Я не учел, что хешированные версии паролей, вероятно, будут длиннее 40 символов.Как только я увеличил лимит с 40 до гораздо более высокого значения и создал новую учетную запись, я смог успешно войти в систему.

0 голосов
/ 26 августа 2018

После использования $stmt->execute() вам нужно , использовать $stmt->fetch(), чтобы извлечь набор результатов из вашего запроса SELECT.

Попробуйте что-то вроде этого:

if ($statement->execute()) {
  while ($statement->fetch()) {
      if(password_verify($_POST['password'], $password)) {
        $_SESSION['user_id'] = $id;
        $_SESSION['user_username'] = $username;
        redirect_to("/home.php");
      }
  }
  redirect_to("/index.php?login_error=true");
} else {
  echo "Error: " . $conn->error;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...