如何调试 PHP 数据库代码


How to debug PHP database code?

我是PHP新手,需要以下代码的帮助。当我输入错误的用户ID而不是给出消息"用户ID不存在"时,它显示"密码/ID不匹配。请指导我错在哪里。

<?php
    session_start();
    $id = $_POST['userid'];
    $pwd = $_POST['paswd'];
    $con = mysqli_connect("localhost", "????", "????", "??????");
    if ($con) {
        $result = mysqli_query($con, "SELECT * FROM users WHERE userid=$id");
        if ($result) {
            $row = mysql_fetch_array($result);
            if ($row["userid"] == $id && $row["paswd"] == $pwd) {
                echo "Welcome! You are a authenticate user";
                if ($id == $pwd)
                //my default login id and password are same
                {
                    header("Location: changepwd.html");
                } else {
                    header("Location: dataentry.html");
                }
            } else {
                echo "ID/Password Mismatch";
            }
        } else {
            echo "User does not Exist !!!";
        }
    } else {
        echo "Connection failed - ".mysqli_error()." -- ".mysqli_errno();
    }
?>

你遇到的主要问题是你在mysqlimysql函数之间混淆了。这两个库彼此不兼容;您只能使用其中一个。

换句话说,以下行是错误的:

$row=mysql_fetch_array($result);

需要更改为使用mysqli_

当我在这里,暂时跑题时,我还要指出你犯的其他一些错误:

  1. 您不会转义 SQL 输入。只需将恶意值发布到$_POST['userid']即可轻松破解您的代码。必须使用正确的转义或参数绑定。(由于您使用的是mysqli,我推荐后者;这是一种更好的技术)。

  2. 您的密码检查很差 - 您似乎没有进行任何类型的哈希处理,所以我想您的密码以纯文本形式存储在数据库中。如果是这种情况,那么您的数据库将非常容易受到攻击。应始终对密码进行哈希处理,切勿将实际密码值存储在数据库中。

我已经跑题了,所以我不会进一步解释这些观点; 如果您需要有关其中任何一点的帮助,我建议您单独提出问题(或在此处搜索;我相信也有很多现有的建议可用)。

else 
{
echo "ID/Password Mismatch"; 
}

与 if($row["userid"]==$id && $row["paswd"]==$pwd) {

所以既然你给了错误的ID。它呼应:ID/Password Mismatch此外,if ($result) {else永远不会显示

 $result = mysqli_query($con, "SELECT * FROM users WHERE userid=$id");

您需要一些额外的检查:

选择 * 返回 1 行(不是 0,也不是更多)

您需要保护 HTML 表单输入的数据(例如,有人可以输入 1 or 1 以返回所有行

<?php
session_start();
$con = mysqli_connect("localhost", "????", "????", "??????");
$id  = mysqli_real_escape_string($_POST['userid']);
$pwd = mysqli_real_escape_string($_POST['paswd']);
if ($con) {
    // don't even do the query if data are incomplete
    if (empty($id) || empty($pwd)
      $result = false;
    else
    {
      // optionnal : if userid is supposed to be a number
      // $id = (int)$id;
      $result = mysqli_query($con, "SELECT * FROM users WHERE userid='$id'");
    }
    if (mysqli_num_rows($result) != 1)
      $result = false;
    if ($result) {
        $row = mysqli_fetch_assoc($result);
        if ($row["userid"] == $id && $row["paswd"] == $pwd) {
            echo "Welcome! You are a authenticate user";
            if ($id == $pwd)
            //my default login id and password are same
                {
                header("Location: changepwd.html");
            } else {
                header("Location: dataentry.html");
            }
        } else {
            echo "ID/Password Mismatch";
        }
    } else {
        echo "User does not Exist, or incomplete input";
    }
} else {
    echo "Connection failed - " . mysqli_error() . " -- " . mysqli_errno();
}
?>

在检查$result是否为空时尝试使用 isset() 方法。

这是符合的

     if ($result) {.......}

     if (isset($result)) { .......}

$result 始终为真,因为 mysqli_query() 仅在查询失败时才返回 false。例如,您可以使用 empty() 检查$result是否有实际内容。

You can use this sql compare password as well with userid

$sql="从用户中选择 *,其中用户ID='".$id."和password='".$pwd.";