如何在PHP新增操作代码中检查数据库是否存在同名操作?
实现新增操作前检查同名的方法
你的代码目前存在两个问题:一是没做同名校验,二是直接拼接POST参数存在SQL注入风险,下面给你两种可靠的实现方式:
方法一:先查询再插入(应用层校验)
先查询数据库中是否已存在同名的operationname,确认不存在后再执行插入操作,同时改用预处理语句规避注入风险:
<?php include('db_conn.php'); // 接收并过滤参数 $operationname = trim($_POST['operationname']); $cost = trim($_POST['cost']); // 1. 检查是否存在同名记录 $checkSql = "SELECT COUNT(*) FROM operation WHERE operationname = ?"; $stmt = mysqli_prepare($con, $checkSql); mysqli_stmt_bind_param($stmt, "s", $operationname); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $count); mysqli_stmt_fetch($stmt); mysqli_stmt_close($stmt); if ($count > 0) { echo json_encode(['status' => 'failed', 'msg' => '该操作名称已存在']); exit; } // 2. 不存在则执行插入 $sql = "INSERT INTO operation(operationname,cost) VALUES(?, ?)"; $stmt = mysqli_prepare($con, $sql); // 第二个参数"sd":s表示字符串类型,d表示数值类型(若cost是字符串则改为"ss") mysqli_stmt_bind_param($stmt, "sd", $operationname, $cost); $query = mysqli_stmt_execute($stmt); if ($query) { echo json_encode(['status' => 'success']); } else { echo json_encode(['status' => 'failed', 'msg' => '插入失败']); } mysqli_stmt_close($stmt); mysqli_close($con); ?>
方法二:数据库层面加唯一约束+捕获错误(更可靠)
给operation表的operationname字段添加唯一约束,让数据库自动拦截重复插入,代码中只需捕获对应的错误即可,同样使用预处理语句:
第一步:给字段添加唯一约束
执行SQL修改表结构:
ALTER TABLE operation ADD UNIQUE INDEX idx_operationname (operationname);
第二步:修改PHP代码捕获重复错误
<?php include('db_conn.php'); $operationname = trim($_POST['operationname']); $cost = trim($_POST['cost']); $sql = "INSERT INTO operation(operationname,cost) VALUES(?, ?)"; $stmt = mysqli_prepare($con, $sql); mysqli_stmt_bind_param($stmt, "sd", $operationname, $cost); $query = mysqli_stmt_execute($stmt); if ($query) { echo json_encode(['status' => 'success']); } else { // 捕获MySQL唯一约束冲突错误(错误码1062) if (mysqli_errno($con) == 1062) { echo json_encode(['status' => 'failed', 'msg' => '该操作名称已存在']); } else { echo json_encode(['status' => 'failed', 'msg' => '插入失败: ' . mysqli_error($con)]); } } mysqli_stmt_close($stmt); mysqli_close($con); ?>
注意事项
- 优先选方法二,数据库层面的约束能避免高并发场景下的重复插入问题(比如两个请求同时检查都没查到,随后同时插入),方法一在这种场景下可能出现漏判。
- 绝对不要直接将用户输入拼接到SQL语句中,必须用预处理语句防止SQL注入攻击。
内容的提问来源于stack exchange,提问作者FJV26
相关产品推荐
相关产品推荐

