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
相关产品推荐
相关产品推荐

