如何使用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
相关产品推荐
相关产品推荐

