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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:12:24