
本文详解如何正确通过post方法获取html登录表单中的用户名与密码,并在php中安全执行mysql查询,避免undefined index错误和sql注入风险。
本文详解如何正确通过post方法获取html登录表单中的用户名与密码,并在php中安全执行mysql查询,避免undefined index错误和sql注入风险。
在Web开发中,将HTML表单数据(如用户名、密码)传递至PHP后端并用于数据库查询,是用户认证的基础环节。但初学者常因混淆$_GET与$_POST、变量作用域错误或未校验请求方法,导致“Notice: Undefined index”等运行时错误。以您提供的LOGINPAGE.html为例,表单明确使用method="POST",因此所有字段(userNameName、passwordName)必须通过$_POST超全局数组访问——绝不可用$_GET,否则将触发Undefined index警告(如原代码第7行$_GET['userNameName']即为典型错误)。
此外,原始代码存在严重安全隐患:直接拼接用户输入到SQL语句中(如"WHERE userName = '".$userName."' AND password = '".$password."'"),极易遭受SQL注入攻击。现代PHP开发应弃用字符串拼接,改用预处理语句(Prepared Statements)。以下是重构后的loginDatabase.php核心逻辑:
<?php mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
include('connect.php');
session_start();
// 仅在POST请求时处理登录逻辑
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$userName = $_POST['userNameName'] ?? '';
$password = $_POST['passwordName'] ?? '';
// ✅ 使用预处理语句防止SQL注入
$stmt = $con->prepare("SELECT * FROM addUsers WHERE userName = ? AND password = ?");
$stmt->bind_param("ss", $userName, $password);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 1) {
$row = $result->fetch_assoc();
$_SESSION['userName'] = $userName;
if ($row['userLevel'] === 'admin') {
header('Location: adminPage.php');
} elseif ($row['userLevel'] === 'user') {
header('Location: userPage.php');
} else {
echo "<h1>Login failed: Invalid user level.</h1>";
}
} else {
echo "<h1>Login failed. Invalid username or password.</h1>";
}
exit; // 防止后续代码执行
} else {
http_response_code(405);
echo "Method Not Allowed";
}
?>
关键改进说明:
- ✅ 严格区分请求方法:
$_SERVER['REQUEST_METHOD'] === 'POST'确保仅响应POST请求; - ✅ 空值防御:使用空合并操作符
?? ''避免未定义索引; - ✅ 预处理语句:
bind_param("ss", ...)将用户输入作为参数绑定,彻底阻断SQL注入; - ✅ 及时终止:
exit防止重定向后继续执行后续代码; - ⚠️ 密码存储警示:示例中仍使用明文密码比对,生产环境必须使用
password_hash()+password_verify(),严禁明文存储密码。
最后,请注意ADMINPAGE.php中不应include('loginDatabase.php')——该文件负责登录处理,不应被页面直接包含;其逻辑应独立运行,并通过Session传递用户状态。adminPage.php只需验证$_SESSION['userName']是否存在,再通过新查询获取用户信息(同样需用预处理语句),而非复用loginDatabase.php的$result变量(该变量在登录页执行后已失效)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











