You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP+MySQL获取HTML表单字段值报Undefined index错误排查

PHP+MySQL用户登录功能报错排查

问题表现

开发基于PHP+MySQL的用户登录功能时,loginDatabase.php第7行持续抛出报错:

Notice: Undefined index: userNameName in /opt/lampp/htdocs/UsersDatabaseProgram/loginDatabase.php on line 7

无法定位故障原因,涉及3个核心业务文件,各文件作用与源码如下。


涉及文件说明与源码

LOGINPAGE.html

  • 功能:用户登录入口页,提供用户名、密码输入框,表单通过PHP POST方法提交到后端处理
<html>
<head>
<title>
LOG IN
</title>
<style>
body {
text-align: center;
}

</style>

</head>

<body>

<form action = "loginDatabase.php" method = "POST">

<label>User name:</label>
<input type="text" id="userNameID" name="userNameName" required>
<br />

<label>Password:</label>
<input type="password" id="passwordID" name="passwordName" required>
<br />

<input type="submit" id="submitLoginID" name="submitLoginName">
</form>


</body>
</html>

LOGINDATABASE.php

  • 功能:登录逻辑处理页,预期接收登录页提交的用户名,查询MySQL中addUsers表的匹配记录,登录成功后根据用户等级跳转到普通用户页或管理员页
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
include('connect.php');

session_start();

// 第7行,即报错所在行
$result = mysqli_query($con, "SELECT * FROM addUsers WHERE userName = '" . $_GET['userNameName'] . "'");
if ($_SERVER ["REQUEST_METHOD"] == "POST") {
    

$userName = $_POST['userNameName'];
$password = $_POST['passwordName'];
/*
该段代码无法正常运行
$email = $row['email'];
$userlevel = $row['userLevel'];
*/
        $sql = "SELECT * FROM addUsers WHERE userName = '".$userName."' AND password = '".$password."'";
        
        $result = mysqli_query($con, $sql);
$row = mysqli_fetch_array($result);
$count = mysqli_num_rows($result);

if ($row["userLevel"] == "user") {
    $_SESSION["userName"] = $userName;
   header('location: userPage.php');

} elseif ($row["userLevel"] == "admin") {
    
    $_SESSION["userName"] = $userName;
header('location: adminPage.php');

} else {
echo "<h1> Login failed. Invalid username or password.</h1>";  

}
}

?>

ADMINPAGE.php

  • 功能:管理员登录成功后的展示页,用于展示用户名、用户等级、邮箱等账号信息
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
include('connect.php');
include('loginDatabase.php');




?>

<html>
<head>
<style>
body {
text-align: center;
}

</style>

</head>

<body>
<h2>Admin</h2>
<a href = "logOut.php">Log-out</a> <br />
<a href = "viewRecords.php">View records</a> <br />
<a href = "addUsers.html">Add Record</a> <br />

<label>Welcome</label><br />
<?php echo $_SESSION["userName"] ?>
<br />

<label>User level: </label> 
<?php 


while ($row = mysqli_fetch_array($result)) {
?>
<input type = "text" name = "userLevelName" value = " <?php echo $row['userLevel']; ?>"> <br />
<label>Email: </label>
<input type = "text" name = "userEmailName" value = " <?php echo $row['email']; ?>">
<?php

}


?>
<br />

</body>
</html>

故障根因

  1. 直接报错原因:第7行多余的查询语句写在了POST请求判断逻辑之外,且错误使用$_GET获取参数。登录表单明确为POST提交,不会通过GET传递userNameName参数;同时ADMINPAGE.php中引入了loginDatabase.php,访问管理员页时这行代码会被直接执行,此时既没有GET参数也没有POST参数,必然触发未定义索引报错。
  2. 逻辑设计问题:
    • 登录处理逻辑与页面展示逻辑耦合,管理员页重复引入登录处理文件,导致无提交参数时重复执行登录校验逻辑
    • SQL语句直接拼接用户输入参数,存在严重SQL注入风险
    • 调用header()做跳转后没有终止代码执行,后续逻辑仍会运行,存在权限绕过风险
    • 密码采用明文匹配,不符合安全存储规范

修复方案

  1. 删除loginDatabase.php第7行多余的GET查询语句,所有参数获取操作都放在POST请求判断内部,可通过isset()提前判断参数是否存在,避免未定义索引报错
  2. 调整ADMINPAGE.php逻辑,移除对loginDatabase.php的引入,登录状态校验直接判断$_SESSION中是否存在登录用户信息即可,不需要重复执行登录SQL查询
  3. 替换直接拼接SQL的写法,改用mysqli预处理语句绑定参数,彻底解决SQL注入风险;密码存储改用password_hash()生成哈希值,校验时用password_verify()比对,禁止明文存储密码
  4. 所有header()跳转语句后增加exit/die终止后续代码执行,避免逻辑漏洞

内容的提问来源于stack exchange,提问作者Lan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:18:14