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

如何正确编码实现插入数据时NAME列不接受重复值?

插入数据时避免NAME列重复值的正确实现方案

原代码存在的关键问题

  1. 前后端参数不匹配:前端input的name属性是text,但后端PHP用$_POST['name']取值,根本拿不到输入内容
  2. 前端属性拼写错误:readonyy是readonly的拼写错误
  3. 错误信息传递逻辑混乱:前端判断$errors['name']但输出$errors['n'],前后不一致
  4. SQL注入风险:直接把用户输入拼进SQL语句,存在安全隐患
  5. 无实际插入逻辑:只做了重复判断,但没编写插入数据的代码
  6. 错误信息未保留:直接跳转回首页,错误信息无法传递给前端展示

修正后的完整代码

1. 前端代码(index.php)

<form method="POST" action="insert.php">
    <input type="text" 
           name="name"  <!-- 修正name属性,和后端保持一致 -->
           id="text" 
           readonly=""  <!-- 修正拼写错误 -->
           autocomplete="off" 
           placeholder="Type here for manual inserting" 
           class="form-control" 
           value="<?php echo isset($errors['n']) ? htmlspecialchars($errors['n'], ENT_QUOTES) : ''; ?>" 
           required>
    <button type="submit" class="btn btn-success">Insert Name</button>
</form>

注意:必须把input放在<form>标签内,否则表单无法正常提交

2. 后端代码(insert.php)

<?php
// 假设$conn是已经建立好的数据库连接
session_start(); // 用session传递错误信息

$errors = [];

// 仅处理POST请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name'] ?? '');

    // 空值校验
    if (empty($name)) {
        $errors['n'] = "请输入姓名";
    } else {
        // 使用预处理语句避免SQL注入,同时检查重复
        $stmt = $conn->prepare("SELECT NAME FROM table_attendance WHERE NAME = ?");
        $stmt->bind_param("s", $name);
        $stmt->execute();
        $result = $stmt->get_result();

        if ($result->num_rows > 0) {
            $errors['n'] = "该人员已登记过";
        } else {
            // 执行插入操作
            $insertStmt = $conn->prepare("INSERT INTO table_attendance (NAME) VALUES (?)");
            $insertStmt->bind_param("s", $name);
            if (!$insertStmt->execute()) {
                $errors['n'] = "插入失败:" . $insertStmt->error;
            }
        }
        $stmt->close();
    }

    // 把错误信息存入session,跳转回首页
    $_SESSION['errors'] = $errors;
    header("Location: index.php");
    exit;
}
?>

3. 首页(index.php)接收错误信息的代码

在页面顶部添加:

<?php
session_start();
$errors = $_SESSION['errors'] ?? [];
// 清空session里的错误信息,避免刷新重复显示
unset($_SESSION['errors']);
?>

额外保障:数据库层面添加唯一约束

为了彻底避免重复,建议直接在数据库表的NAME字段添加唯一约束,即使后端逻辑出错,数据库也会拦截重复数据:

ALTER TABLE table_attendance ADD UNIQUE KEY unique_name (NAME);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:55:13