PHP接收JSON数组插入MySQL时触发1062主键重复错误求助
解决MySQL错误1062(主键重复)及PHP代码问题
首先拆解你遇到的问题:
错误码1062是MySQL的主键/唯一约束重复错误,错误信息里的'1-1'说明你的commande_burger表使用了复合主键(由commande_id和burger_id共同组成)——也就是说,同一个订单(commande_id=1)下不能存在两条burger_id=1的记录。
而导致你重复插入同一主键组合的核心原因,是PHP代码里的一个mysqli使用误区:
mysqli的
bind_param()方法要求传入变量的引用,不能直接传入表达式(比如intval($id))
你现在写的$stmt->bind_param("iii",intval($idtable),intval($id),intval($value));,其中intval()返回的是一个临时值,不是变量引用。第一次绑定后,后续循环里的参数不会被正确更新,导致每次执行mysqli_stmt_execute($stmt)时,都是在插入第一次的参数值(commande_id=1, burger_id=1, quantite=3),自然触发主键重复错误。
修正后的PHP代码
<?php ini_set('display_errors',1); error_reporting(E_ALL); // Headers header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: POST"); $data = file_get_contents("php://input"); if(isset($data)){ $json = json_decode($data); echo json_encode(array("message" => "DATA RECEIVE")); echo count($json); // 建立数据库连接 $con = mysqli_connect("localhost","root","","fastfood"); if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); exit; } // 预处理SQL语句(仅需执行一次) $sql = "INSERT INTO `commande_burger` (`commande_id`,`burger_id`,`quantite`) VALUES(?,?,?)"; $stmt = $con->prepare($sql); if (!$stmt) { echo "Prepare failed: " . $con->error; exit; } // 定义用于绑定的变量(必须是变量,才能传递引用) $commande_id = intval(1); // 你的$idtable固定为1 $burger_id = 0; $quantite = 0; // 绑定变量到预处理语句 $stmt->bind_param("iii", $commande_id, $burger_id, $quantite); foreach ($json as $item) { $burger_id = intval($item->id); $quantite = intval($item->quantite); if($quantite > 0){ // 执行插入并处理结果 if ($stmt->execute()) { echo "ID = ".$burger_id; echo "\nLa valeur est > à zero et vaut : ".$quantite; printf("\n %d ligne insérée.\n", $stmt->affected_rows); } else { echo "\n ERREUR pour burger ID ".$burger_id." : \n".$stmt->error; } } } // 关闭语句和连接 $stmt->close(); $con->close(); }else{ http_response_code(503); echo json_encode(array("message" => "DATA ERROR")); } ?>
额外注意事项
- 复合主键逻辑调整:如果你的业务允许同一个订单下重复添加同一个汉堡(比如用户多次选购同一款),建议修改表结构:
- 新增自增主键字段(比如
id) - 将原复合主键改为唯一索引(可选,根据业务需求决定)
- 新增自增主键字段(比如
- 错误处理强化:修正后的代码增加了
prepare和execute的错误检查,方便你快速定位问题 - 循环优化:把原
for循环改为foreach遍历JSON数组,代码更简洁易读 - 变量作用域:确保绑定的变量在每次循环中都被正确赋值,避免旧值残留
内容的提问来源于stack exchange,提问作者Jérémie Daix
相关产品推荐
相关产品推荐

