如何在PHP导出的CSV销售报表中添加全量销售额汇总行
CSV报表新增全量销售额总计行实现方案
核心实现要点
- 无需对原有功能做重构,仅需在现有逻辑基础上补充一次轻量汇总查询,拿到当前年月筛选、状态为Sale条件下的全量总销售笔数、总销售金额,在所有用户明细行写入完成后,追加一行和表头列数完全对齐的总计行即可
- 总计行USER列标记为总计,打开CSV时可快速区分汇总行和普通用户数据,不会和实际用户名混淆
- 顺带修复原有代码的共性问题,避免实际运行时出现下载异常、数据泄露、格式错乱的问题
可直接落地的调整后代码
$m = $_REQUEST['m']; $y = $_REQUEST['y']; $date = "$y-$m"; $output = fopen('php://output', 'w'); // 修正原有HTTP头的拼写错误,避免部分浏览器识别文件名异常 header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="sales-report-'.$date.'.csv"'); // 1. 查询按用户分组的销售明细,改用参数绑定替代字符串拼接,规避SQL注入风险 $qry = "SELECT poster_name AS USER, COUNT(*) AS TOTAL_SALES, SUM(amount) AS SUM_TOTAL, DATE_FORMAT(date, '%Y %M') AS MONTH FROM details WHERE status = 'Sale' AND date LIKE ? GROUP BY poster_name"; $stmt = $db->prepare($qry); $stmt->execute(["%{$date}%"]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // 2. 查询当前筛选条件下的全量汇总值,仅取需要的字段减少查询开销 $totalStmt = $db->prepare("SELECT COUNT(*) AS ALL_TOTAL_SALES, SUM(amount) AS ALL_SUM_TOTAL FROM details WHERE status = 'Sale' AND date LIKE ?"); $totalStmt->execute(["%{$date}%"]); $totalData = $totalStmt->fetch(PDO::FETCH_ASSOC); $count = 0; // 空数据场景提前写入表头,避免生成完全空白的CSV文件 if (empty($rows)) { fputcsv($output, ['USER', 'TOTAL_SALES', 'SUM_TOTAL', 'MONTH']); } foreach ($rows as $line) { if ($count == 0) { fputcsv($output, array_keys($line)); } fputcsv($output, array_values($line)); $count++; } // 3. 在所有明细写完后追加总计行,严格匹配4列的结构避免列错位 fputcsv($output, [ '*总计*', $totalData['ALL_TOTAL_SALES'] ?? 0, $totalData['ALL_SUM_TOTAL'] ?? 0, '' ]); // 刷新输出缓冲区后关闭句柄,避免最后一段数据残留未写入文件 fflush($output); fclose($output);
实际效果
- 导出的CSV中,所有用户的销售统计明细在前,最后固定追加一行汇总数据,展示全量总销售笔数、总销售金额,列结构和表头完全对齐
- 原有代码存在的SQL注入风险、HTTP头拼写错误、输出缓冲区未刷新、空数据无表头的问题同步修复,可直接上线运行
内容的提问来源于stack exchange,提问作者Regina
相关产品推荐
相关产品推荐

