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

如何使用Node.js向MySQL插入含重复值的数组实现订单批量入库

解决方案

问题原因

当你选择多个商品提交时,req.body.OrderNo和req.body.quantity为数组类型,原代码直接将数组拼接进SQL语句时,数组会被自动转为逗号分隔的字符串,导致单组值的数量超过定义的字段数,因此触发「列数与值计数不匹配」的报错。

实现逻辑

不需要使用MySQL游标,直接利用MySQL支持的批量插入语法即可实现需求:一条INSERT语句可以同时传入多组值,每组值对应一行数据,公共字段直接在JS层复用即可。
⚠️ 注意:原代码直接拼接用户输入到SQL语句存在SQL注入风险,推荐使用参数化查询实现。

修改后代码

app.post("/send-data", (req,res)=>{
    // 统一转为数组,兼容单选/多选场景
    const orderNos = Array.isArray(req.body.OrderNo) ? req.body.OrderNo : [req.body.OrderNo];
    const quantities = Array.isArray(req.body.quantity) ? req.body.quantity : [req.body.quantity];
    // 提取公共字段
    const commonFields = [
        req.body.fname,
        req.body.lname,
        req.body.Contact,
        req.body.email,
        req.body.facebook,
        req.body.date,
        req.body.delivery,
        req.body.payment,
        req.body.time
    ];
    // 生成批量插入的占位符和参数
    const values = [];
    const params = [];
    orderNos.forEach((orderNo, index) => {
        values.push('(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
        params.push(orderNo, quantities[index], ...commonFields);
    });
    // 拼接SQL语句
    const sql = `INSERT INTO foodorder.orders (
        food_id,
        qty,
        customer_FName,
        customer_LName,
        customer_number,
        customer_email,
        customer_facebook,
        order_date,
        delivery_option,
        mode_of_payment,
        delivery_time
    ) VALUES ${values.join(',')}`;
    // 执行参数化查询
    con.query(sql, params, (err,result) => {
        if(!err){
            res.send(result);
        }
        else{
            res.json(req.body);
            throw err;
        }
    })
});

内容的提问来源于stack exchange,提问作者Carl-Valencia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:24:04