首页 > 解决方案 > php 只将数据库的第一行作为正确的凭据

问题描述

这是我登录论坛的代码。它的问题是它只接受第一个用户名和密码(基本上只有第一行)作为正确的凭据,关于我如何更改它的任何想法?!

    <?php
      session_start();
      include_once("connect.php");
        $token = "";
        if($con->connect_error){
          die("Connection failed: ".$con->connect_error);
        }
        $sql = "SELECT * FROM authme";
        $result = mysqli_query($con, $sql) or die(mysqli_error($con));
    while(mysqli_num_rows($result)>0){
      while($row = $result->fetch_assoc()){

          if(isset($_POST['realname']))


          $username = $_POST['realname'];


        if($result->num_rows>1){






            if(mysqli_num_rows($result)>1){


            $_SESSION['uid'] = $row['id'];
            $_SESSION['realname'] = $row['realname'];


            }
            $password = '$SHA$'.substr($row['password'],5,16).'$'.hash('sha256', hash('sha256',$_POST['password']).substr($row['password'],5,16));



            if($password == $row['password'] ){

            header("Location: index.php");
            exit();
           }
          else {
            echo "INVALID INFORMATION, PLEASE RETURN!";
        //    header("location: index.php");
            session_destroy();
            exit();
          }
          }

          }
    }
         ?>

?

我决定尝试创建一个使用数据库的登录论坛,该数据库对通过注册表接收的密码进行加密。此代码仅将我输入的第一个用户名和密码视为正确,这还不够,正如您可以想象的那样。

标签: phplogin

解决方案


欢迎使用 PHP 编程。我将尝试分享一些可以帮助您解决问题的原则。

1.) PHP 中最好的特性之一是 print_r() 函数。使用此功能,您几乎可以在浏览器中将任何内容输出为文本。因此,在这种情况下,您可能希望在“$result = mysqli_query($con, $sql) or die(mysqli_error($con));”这一行之后立即插入一个 print_r($result)。这将输出 PHP 正在接收的查询结果。这可用于帮助您排除故障并确定您的代码无法正常工作的原因。完成故障排除后,删除该行。

2.) 您似乎对 while 循环内的行数进行了多次检查。我不确定你为什么在那里有这些,但你可能想通过使用 echo 或 print 在浏览器中显示值以进行故障排除来检查这些是否导致你的麻烦。完成故障排除后,删除该行。

3.) 您正在查询的数据的另一个整体概念。发送一个获取整个表并将其返回给程序的查询是低效的,然后程序会遍历每一行以查找数据。相反,您应该编写一个 SQL 查询以仅返回您想要的数据行。确保您使用准备好的语句

4.) 你的编码标准可能会有所改进,如果你清楚地标记你的语句,它会更容易阅读。考虑阅读PSR-2。例如,此代码似乎缺少 {}。

if(isset($_POST['realname']))
$username = $_POST['realname'];

推荐阅读