创建 PHP/MySQL 应用程序 - 所有登录尝试均失败

Posted

技术标签:

【中文标题】创建 PHP/MySQL 应用程序 - 所有登录尝试均失败【英文标题】:Creating a PHP/MySQL application - all login attempts fail 【发布时间】:2019-02-01 06:29:37 【问题描述】:

我正在使用 phpmysql 创建一个 Web 应用程序。我设置了一个注册/登录页面。我已经通过应用程序注册了多个帐户,我看到消息说帐户已成功创建,但是当我尝试登录时,它失败并显示“无效的用户名或密码”错误消息。 当我转到 PHPMyAdmin 时,我可以看到所有用户帐户都存在于 users 表中,并且我可以看到用户名和他们的密码(后者是散列格式)。所以我不明白为什么我无法登录。

这是我的登录表单(在 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"

【问题讨论】:

【参考方案1】:

使用$stmt-&gt;execute() 后,您需要use $stmt-&gt;fetch() to retrieve 来自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;

【讨论】:

谢谢,但不幸的是这并没有帮助 - 我仍然遇到同样的错误。【参考方案2】:

我设法找到了导致问题的原因。当我最初在数据库中创建用户表时,我将密码字段的最大字符数设置为 40。我没有考虑到密码的哈希版本可能会超过 40 个字符。一旦我将限制从 40 增加到更高的值并创建了一个新帐户,我就能够成功登录。

【讨论】:

***.com/questions/21479655/… 涵盖了这个问题。要点之一:始终在 Stack Overflow 上的数据库问题中显示表定义。

以上是关于创建 PHP/MySQL 应用程序 - 所有登录尝试均失败的主要内容,如果未能解决你的问题,请参考以下文章

PHP / Mysql 无法从 sql 数据库中检索当前登录的 first_name

PHP+MySQL制作简单的用户注册登录界面(注释超详细~附源代码)

php+mysql基础增删查改

如何记录所有 Web 事务 (PHP/Laravel)

一篇博客让你学会部署社交网站( SVN+nginx+PHP+MySQL+MFS 内含所有源码包)

如何正确处理 PHP / MySQL / Apache 中的国际字符