如何避免MariaDB中的insert查询插入重复数据?
重复插入的问题原因
- 代码逻辑错误:你先后两次调用了
execute()执行插入语句,第一次无判断直接执行一次,if条件判断时又执行了第二次,单次请求就会插入2条完全相同的记录。 - 预处理用法不规范:直接把变量拼接进SQL语句,没有用预处理的参数绑定能力,存在SQL注入风险。
- 额外场景风险:就算代码逻辑修复后,也可能出现用户刷新页面、重复点击提交按钮导致的重复提交问题。
修复方案
代码逻辑修复
移除多余的execute()调用,同时修正预处理写法,用参数绑定替代字符串拼接,修复后的示例代码如下:
// 预处理SQL用占位符代替直接拼接变量 $query = $connect->prepare("INSERT INTO posts (title, date, author, content, image) VALUES (?, ?, ?, ?, ?)"); // 绑定参数,sssss对应五个字符串类型参数,可根据实际字段类型调整 $query->bind_param("sssss", $title, $date, $author, $content, $fileNameNew); // 仅执行一次插入操作 if($query->execute()){ echo "发布成功"; // 提交成功后跳转到其他页面,防止刷新重复提交POST请求 // header('Location: post_list.php'); // exit(); $query->close(); }else{ echo "发布失败"; }
额外防护措施
- 数据库层防护:给
posts表的核心业务字段(比如标题+发布时间、或者你判定内容唯一的字段组合)添加唯一联合索引,即使逻辑层出现疏漏,数据库也会直接拒绝重复数据写入。 - 前端防护:给提交按钮添加点击后1-2秒的禁用逻辑,避免用户误触多次点击触发多次请求。
- 逻辑层防护:可以给表单添加一次性的CSRF Token,提交后校验Token有效性,校验通过立即销毁当前Token,同一个Token无法重复提交。
内容的提问来源于stack exchange,提问作者Agent21
相关产品推荐
相关产品推荐

