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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:54:02