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>
故障根因
- 直接报错原因:第7行多余的查询语句写在了POST请求判断逻辑之外,且错误使用
$_GET获取参数。登录表单明确为POST提交,不会通过GET传递userNameName参数;同时ADMINPAGE.php中引入了loginDatabase.php,访问管理员页时这行代码会被直接执行,此时既没有GET参数也没有POST参数,必然触发未定义索引报错。 - 逻辑设计问题:
- 登录处理逻辑与页面展示逻辑耦合,管理员页重复引入登录处理文件,导致无提交参数时重复执行登录校验逻辑
- SQL语句直接拼接用户输入参数,存在严重SQL注入风险
- 调用
header()做跳转后没有终止代码执行,后续逻辑仍会运行,存在权限绕过风险 - 密码采用明文匹配,不符合安全存储规范
修复方案
- 删除
loginDatabase.php第7行多余的GET查询语句,所有参数获取操作都放在POST请求判断内部,可通过isset()提前判断参数是否存在,避免未定义索引报错 - 调整ADMINPAGE.php逻辑,移除对
loginDatabase.php的引入,登录状态校验直接判断$_SESSION中是否存在登录用户信息即可,不需要重复执行登录SQL查询 - 替换直接拼接SQL的写法,改用mysqli预处理语句绑定参数,彻底解决SQL注入风险;密码存储改用
password_hash()生成哈希值,校验时用password_verify()比对,禁止明文存储密码 - 所有
header()跳转语句后增加exit/die终止后续代码执行,避免逻辑漏洞
内容的提问来源于stack exchange,提问作者Lan
相关产品推荐
相关产品推荐

