PHP提交注册表单到MySQL出现Undefined array key报错如何解决?
代码错误排查与修复方案
核心报错原因
你遇到的Undefined array key告警,直接原因是前端表单的提交方式属性拼写错误,导致参数没有按POST方式传递到后端,后端$_POST数组为空,无法读取对应字段。
所有需要修正的问题列表
- 前端form标签
method属性拼写错误:你写的是methode="POST",正确属性名为method,浏览器识别不到错误属性时会默认用GET方式提交参数,后端用$_POST自然读取不到值。 - 前端HTML结构冗余:重复声明了
<!DOCTYPE html>、<html>、<head>、<body>标签,需要删除重复部分保证HTML结构合法。 - 后端没有做参数存在性校验:直接读取
$_POST内的字段,未判断字段是否存在,即使用户正常提交,如果漏填对应输入框也会触发同类告警。 - SQL语句存在语法错误和注入风险:字符串类型的字段(vorname、nachname、email)在SQL语句中没有用单引号包裹,会导致SQL执行失败;直接拼接用户输入的参数会引发SQL注入漏洞,推荐用预处理语句处理。
- 数据库连接关闭变量名错误:你定义的数据库连接变量是
$con,最后关闭连接写的是$mysqli->close(),变量名不匹配会触发报错。 - 密码明文存储风险:当前直接将随机生成的密码明文存入数据库,不符合安全规范,建议哈希加密后存储。
修正后的代码
前端页面代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Mahlzeit</title> <link rel="stylesheet" href="./Login.css"> <link rel="stylesheet" type="text/css" href="slide navbar Login.css"> <link href="https://fonts.googleapis.com/css2?family=Jost:wght@500&display=swap" rel="stylesheet"> </head> <body> <div class="main"> <input type="checkbox" id="chk" aria-hidden="true"> <div class="signup"> <form action="http://localhost/Kulinarik/signup_save.php" method="POST" id="signup"> <label for="chk" aria-hidden="true">Sign up</label> <input type="text" name="vorname" placeholder="Vorname" id="vorname" required> <input type="text" name="nachname" placeholder="Nachname" id="nachname" required> <input type="email" name="email" placeholder="Email" id="email" required> <button type="submit" value="signup">Sign up</button> </form> </div> <div class="login"> <form action="login_save.php" method="POST" id="login"> <label for="chk" aria-hidden="true">Login</label> <input type="email" name="email" placeholder="Email" required/> <input type="password" name="pswd" placeholder="Password" required/> <button type="submit" value="Login">Login</button> <a class="changepassword">Passwort ändern</a> </form> </div> </div> </body> </html>
后端处理代码
<?php session_start(); $con = mysqli_connect('localhost','root','123456', 'userdata'); // 校验数据库连接是否正常 if (!$con) { die("数据库连接失败: " . mysqli_connect_error()); } // 先判断参数是否存在 if (!isset($_POST['email'], $_POST['vorname'], $_POST['nachname'])) { die("提交的参数不完整,请检查表单填写内容"); } $email = $_POST['email']; $vorname = $_POST['vorname']; $nachname = $_POST['nachname']; $passwort = rand(0, 999999); // 密码加密(可选,建议开启) // $hashed_pass = password_hash($passwort, PASSWORD_DEFAULT); // 用预处理语句校验邮箱是否存在,避免注入 $check_stmt = mysqli_prepare($con, "SELECT email FROM signup WHERE email = ?"); mysqli_stmt_bind_param($check_stmt, "s", $email); mysqli_stmt_execute($check_stmt); $result = mysqli_stmt_get_result($check_stmt); if ($result->num_rows == 0) { // 预处理插入语句 $insert_stmt = mysqli_prepare($con, "INSERT INTO signup (vorname, nachname, email, Passwort) VALUES (?, ?, ?, ?)"); mysqli_stmt_bind_param($insert_stmt, "sssi", $vorname, $nachname, $email, $passwort); // 如果用了加密密码,上面一行改成mysqli_stmt_bind_param($insert_stmt, "ssss", $vorname, $nachname, $email, $hashed_pass); if (mysqli_stmt_execute($insert_stmt)) { header("Location: Login.html"); exit(); } else { echo "插入数据失败: " . mysqli_stmt_error($insert_stmt); } mysqli_stmt_close($insert_stmt); } else { echo "User ist bereits registriert"; } mysqli_stmt_close($check_stmt); mysqli_close($con); ?>
内容的提问来源于stack exchange,提问作者Etzi138
相关产品推荐
相关产品推荐

