如何正确编码实现插入数据时NAME列不接受重复值?
插入数据时避免NAME列重复值的正确实现方案
原代码存在的关键问题
- 前后端参数不匹配:前端input的
name属性是text,但后端PHP用$_POST['name']取值,根本拿不到输入内容 - 前端属性拼写错误:
readonyy是readonly的拼写错误 - 错误信息传递逻辑混乱:前端判断
$errors['name']但输出$errors['n'],前后不一致 - SQL注入风险:直接把用户输入拼进SQL语句,存在安全隐患
- 无实际插入逻辑:只做了重复判断,但没编写插入数据的代码
- 错误信息未保留:直接跳转回首页,错误信息无法传递给前端展示
修正后的完整代码
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
相关产品推荐
相关产品推荐

