如何用PHP & MySQL实现供应商应付账款总额统计系统
没问题,我来帮你搞定这个供应商应付账款统计的需求!你的核心问题是需要对供应商进行分组汇总,而不是逐条显示记录,下面是具体的解决方案:
实现供应商应付账款总额统计系统
你当前的代码会返回所有匹配id=$id的单条记录,导致同一个供应商重复出现。要实现每个供应商仅显示一次并展示应付总额,关键是利用MySQL的分组聚合功能,而不是循环所有原始记录。
步骤1:编写正确的SQL查询
我们需要用GROUP BY按供应商分组,搭配SUM()函数计算该供应商所有dues的总和。另外注意:原代码中的WHERE id=$id可能不符合需求——如果id是每条记录的唯一标识,这个条件只会返回单条记录,根本没法做汇总。如果是要过滤特定范围的记录(比如某时间段),可以保留WHERE子句;如果不需要过滤,直接去掉即可。
正确的SQL语句如下:
SELECT supplier, SUM(dues) AS total_dues, MIN(id) AS representative_id FROM managment -- 这里可以加过滤条件,比如 WHERE create_time >= '2024-01-01' GROUP BY supplier ORDER BY supplier;
SUM(dues) AS total_dues:计算每个供应商的应付总额,给结果起别名方便PHP调用MIN(id) AS representative_id:分组后每条记录对应多个id,这里取最小的id作为代表(你也可以改成MAX(id),根据需求调整)GROUP BY supplier:强制MySQL按供应商分组,确保每个供应商只返回一行汇总数据
步骤2:修改PHP代码
把原有查询替换成上面的SQL,然后循环输出汇总后的内容即可:
// 假设$connection已经是有效的MySQL连接 $sql = "SELECT supplier, SUM(dues) AS total_dues, MIN(id) AS representative_id FROM managment GROUP BY supplier ORDER BY supplier"; $query = mysqli_query($connection, $sql); // 检查查询是否成功,避免报错 if (!$query) { die("查询失败: " . mysqli_error($connection)); } ?> <table border="1"> <thead> <tr> <th>代表ID</th> <th>供应商</th> <th>应付总额</th> </tr> </thead> <tbody> <?php while ($row = mysqli_fetch_assoc($query)) { ?> <tr> <td><?php echo $row['representative_id']; ?></td> <td><?php echo htmlspecialchars($row['supplier']); ?></td> <td><?php echo htmlspecialchars($row['total_dues']); ?></td> </tr> <?php } ?> </tbody> </table>
步骤3:安全优化(必做!)
如果你的查询需要加入动态条件(比如原代码中的$id),绝对不要直接拼接SQL字符串,要用预处理语句防止SQL注入:
// 示例:过滤某个分类下的供应商 $category_id = 5; // 假设这是动态传入的参数 $sql = "SELECT supplier, SUM(dues) AS total_dues, MIN(id) AS representative_id FROM managment WHERE category_id = ? GROUP BY supplier ORDER BY supplier"; // 初始化预处理语句 $stmt = mysqli_prepare($connection, $sql); // 绑定参数(i表示整数,s表示字符串,根据实际参数类型调整) mysqli_stmt_bind_param($stmt, "i", $category_id); // 执行查询 mysqli_stmt_execute($stmt); // 获取结果集 $result = mysqli_stmt_get_result($stmt); // 循环输出逻辑和之前一致 while ($row = mysqli_fetch_assoc($result)) { // 输出内容 }
额外提示
- 用
htmlspecialchars()输出内容可以防止XSS攻击,这是前端输出的最佳实践 - 如果只是想查询单个供应商的总额,可以去掉GROUP BY,直接用
SELECT SUM(dues) FROM managment WHERE supplier = ?
内容的提问来源于stack exchange,提问作者Hamza Ali
相关产品推荐
相关产品推荐

