PDO执行INSERT语句重复插入两行的问题排查求助
解决重复插入数据的问题
问题根源
你的代码没有任何触发条件,只要访问这个PHP文件(包括页面刷新、新标签打开)就会直接执行INSERT语句。另外当前写法存在严重的SQL注入风险,且可能因浏览器的额外请求(比如请求favicon.ico)导致重复插入两行。
分步解决方案
1. 仅在用户主动触发时执行插入
通过表单提交触发插入逻辑,而非页面加载就执行:
<?php $db_host = ""; $db_name = ""; $db_user = ""; $db_pass = ""; $db_syntax = "mysql:host=$db_host;dbname=$db_name"; $db_connection = new PDO($db_syntax, $db_user, $db_pass); $db_connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 开启错误提示便于调试 // 仅当POST请求提交时才执行插入 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $name = "Name Namadooo"; $email = "email@email.com"; $password = password_hash("password", PASSWORD_DEFAULT); $date = date("Y-m-d H:i:s"); // 使用PDO预处理语句,彻底避免SQL注入 $insert_user = "INSERT INTO users (name,email,password,date) VALUES (:name,:email,:password,:date)"; $stmt = $db_connection->prepare($insert_user); $stmt->execute([ ':name' => $name, ':email' => $email, ':password' => $password, ':date' => $date ]); // 插入完成后重定向,避免刷新页面重复提交(PRG模式) header("Location: " . $_SERVER['PHP_SELF']); exit; } ?> <!-- 前端触发按钮 --> <form method="POST"> <button type="submit">添加用户</button> </form>
2. 数据库层面添加唯一约束
如果要确保email这类字段不重复,给数据表加唯一索引:
ALTER TABLE users ADD UNIQUE INDEX idx_unique_email (email);
这样即便代码出现重复提交,数据库会直接拒绝重复请求,避免脏数据。
3. 排查"每次插入两行"的特殊情况
若上述逻辑生效后仍插入两行,检查:
- 服务器是否将浏览器请求的
favicon.ico指向了当前PHP文件 - 页面中是否存在重复的表单提交逻辑或重复触发的AJAX请求
关键注意事项
- 禁止直接将变量拼接进SQL语句,必须用PDO预处理语句防范SQL注入
- 采用PRG模式(Post/Redirect/Get):插入完成后重定向到当前页面,用户刷新时只会执行GET请求,不会重复提交
内容的提问来源于stack exchange,提问作者Theo Toke
相关产品推荐
相关产品推荐

