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

PHP无法一次性将JSON数据批量插入MySQL或执行ON DUPLICATE KEY UPDATE

搞定重复插入问题!

嘿,我帮你找到问题根源啦!你每次运行PHP都会重复插入数据,核心原因是**ON DUPLICATE KEY UPDATE的语法错误**,导致主键重复时数据库根本没触发更新操作,再加上代码没做错误处理,你没察觉到执行失败的情况。

1. 先说说语法错在哪

你写的ON DUPLICATE KEY UPDATE部分,VALUES()里不该填具体的字符串值,而是要填字段名!比如正确的写法是sale_item=VALUES(sale_item),意思是“用插入语句中sale_item字段的值来更新现有记录的sale_item”,而你之前写的sale_item=VALUES('".$row["sale_item"]."')完全不符合语法规范,数据库根本识别不了这个更新逻辑。

2. 给你修正后的完整代码

另外,强烈建议用预处理语句,既能避免SQL注入风险,又能让代码更健壮。下面是调整好的代码:

<?php
// 建立数据库连接
$connect = mysqli_connect("localhost", "root", "", "mytest");

// 检查连接是否成功
if (!$connect) {
    die("数据库连不上哦: " . mysqli_connect_error());
}

// 读取JSON文件
$filename = "path.json";
$data = file_get_contents($filename);
$array = json_decode($data, true);

// 准备预处理SQL语句
$sql = "INSERT INTO tbl_sales(sale_item, sale_qty, row_inserted_on, last_edited_on, id) 
        VALUES (?, ?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE 
            sale_item = VALUES(sale_item),
            sale_qty = VALUES(sale_qty),
            row_inserted_on = VALUES(row_inserted_on),
            last_edited_on = VALUES(last_edited_on)";

$stmt = mysqli_prepare($connect, $sql);

// 绑定参数,对应字段类型:s=字符串,i=整数
mysqli_stmt_bind_param($stmt, "sissi", $sale_item, $sale_qty, $row_inserted_on, $last_edited_on, $id);

// 循环处理每条JSON数据
foreach ($array as $row) {
    // 转换数据类型,匹配表结构的int类型
    $sale_item = $row["sale_item"];
    $sale_qty = (int)$row["sale_qty"];
    $row_inserted_on = $row["row_inserted_on"];
    $last_edited_on = $row["last_edited_on"];
    $id = (int)$row["id"];
    
    // 执行语句
    mysqli_stmt_execute($stmt);
}

// 清理资源
mysqli_stmt_close($stmt);
mysqli_close($connect);

echo "<h1>数据同步搞定啦!</h1>";
?>

3. 几个额外的小提醒

  • 类型匹配:你的表中sale_qty和id是整数类型,JSON里的对应值是字符串,所以要转成整数再插入,避免类型不兼容的问题。
  • 错误排查:如果之后还是有问题,可以在mysqli_stmt_execute后面加个错误检查:
    if (!mysqli_stmt_execute($stmt)) {
        echo "这条数据出问题啦: " . mysqli_stmt_error($stmt);
    }
    
  • 主键确认:一定要确保id字段确实是表的主键,这样ON DUPLICATE KEY UPDATE才能在主键重复时触发更新操作哦。

内容的提问来源于stack exchange,提问作者S.Sakthybaalan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:23:31