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

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")); 
} 
?>

额外注意事项

  1. 复合主键逻辑调整:如果你的业务允许同一个订单下重复添加同一个汉堡(比如用户多次选购同一款),建议修改表结构:
    • 新增自增主键字段(比如id)
    • 将原复合主键改为唯一索引(可选,根据业务需求决定)
  2. 错误处理强化:修正后的代码增加了prepare和execute的错误检查,方便你快速定位问题
  3. 循环优化:把原for循环改为foreach遍历JSON数组,代码更简洁易读
  4. 变量作用域:确保绑定的变量在每次循环中都被正确赋值,避免旧值残留

内容的提问来源于stack exchange,提问作者Jérémie Daix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:53:18