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

NodeJS实现MySQL多组重量/包裹类型的收入求和查询方案咨询

解决多行包裹收入查询及求和问题

1. 前端表单调整:提交数组格式数据

修改表单中下拉框的name属性,让数据以数组形式提交,确保后端能接收多行对应的数据:

<!-- 每一行的重量选择框 -->
<select name="weight[]" class="weight-input">
  <!-- 重量选项 -->
</select>

<!-- 每一行的包裹类型选择框 -->
<select name="parceltype[]" class="type-input">
  <!-- 类型选项 -->
</select>

提交后,后端可通过req.body.weight和req.body.parceltype获取两个长度一致的数组,每个元素对应一行的重量与类型。

2. 后端接收并校验数据

在Node.js路由中先获取并校验提交的数据:

// 以Express框架为例,获取表单数据
const weights = req.body.weight || [];
const parcelTypes = req.body.parceltype || [];

// 校验规则:最多5行,且重量与类型数组长度匹配
if (weights.length > 5 || weights.length !== parcelTypes.length) {
  return res.status(400).send("最多支持5行数据,且每行重量与类型需一一对应");
}

3. 批量查询数据库并计算总和

不要循环逐行查询(效率低且易出问题),改用批量条件查询,同时用参数化查询避免SQL注入:

// 构造批量查询条件:(weight = ? AND type = ?) OR ...
const conditionStr = weights.map((_, idx) => "(weight = ? AND type = ?)").join(" OR ");
const sql = `SELECT Revenue FROM revenuecard WHERE ${conditionStr}`;

// 整理参数数组:按顺序放入每行的重量和类型
const queryParams = [];
for (let i = 0; i < weights.length; i++) {
  queryParams.push(weights[i], parcelTypes[i]);
}

// 执行查询并计算总和
con1.query(sql, queryParams, function (err, data) {
  if (err) throw err;
  
  let totalRevenue = 0;
  data.forEach(item => {
    // 处理可能的空值,确保求和不出错
    totalRevenue += parseFloat(item.Revenue) || 0;
  });
  
  // 将总和传给结果页面模板
  res.render("result-page", { revenue: totalRevenue });
});

注:你原代码中JSON.stringify(revenue)是错误写法,查询结果data是包含多行数据的数组,需从每个item.Revenue中取值。

4. 页面显示总和

保持原HTML显示代码即可,现在模板接收的revenue已经是多行收入的总和:

<label style="text-align:right; padding-right:25px;" id="revenue" class="revenue"> <%= revenue %> </label>

额外注意点

  • SQL注入防护:必须用参数化查询(代码中的?占位符),绝对不要直接拼接SQL字符串。
  • 前端限制:可在添加行的JS逻辑中限制最多添加5行,减少后端校验压力。
  • 异常处理:如果某行的重量/类型在数据库中无匹配数据,要通过|| 0确保求和时不会出现NaN。

内容的提问来源于stack exchange,提问作者Icing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:15:37