如何展示第1、2、3天的销售记录?现有SQL查询无法获取有效日报
解决每日销售报表展示问题
核心问题分析
- 字段名不匹配:SQL查询的是
date字段,但PHP代码中调用的是$row['date_purchase'],这会导致无法正确获取日期数据,甚至触发错误。 - 查询范围错误:当前SQL仅筛选最近1天的记录,无法获取第2、3天的销售数据。
- 缺乏错误处理:未检查数据库查询是否成功,若
$conn->query($sql)返回false,后续fetch_array()会直接报错。
修正后的代码实现
方案1:按日期分组展示三天的销售记录
以下代码会查询最近3天的销售数据,并按日期分组展示:
<?php // 修正字段名,查询最近3天的记录,按日期和purchaseid倒序 $sql = "SELECT * FROM purchase WHERE date_purchase >= DATE_SUB(CURDATE(), INTERVAL 3 DAY) ORDER BY DATE(date_purchase) DESC, purchaseid DESC"; $query = $conn->query($sql); // 检查查询是否成功 if (!$query) { echo "<tr><td colspan='5'>数据库查询失败:" . $conn->error . "</td></tr>"; } else { $current_date = ''; while ($row = $query->fetch_array()) { $row_date = date('M d, Y', strtotime($row['date_purchase'])); // 当日期变化时,添加日期标题行 if ($row_date != $current_date) { $current_date = $row_date; echo "<tr><th colspan='5' class='text-center'>$current_date</th></tr>"; } ?> <tr> <td><?php echo date('M d, Y h:i A', strtotime($row['date_purchase'])) ?></td> <td><?php echo htmlspecialchars($row['customer']); ?></td> <td class="text-right">₱ <?php echo number_format($row['total'], 2); ?></td> <td><?php echo htmlspecialchars($row['modeOfPayment']); ?></td> <td> <a href="#details<?php echo $row['purchaseid']; ?>" data-toggle="modal" class="btn btn-primary btn-sm"> <span class="glyphicon glyphicon-search"></span> View </a> <?php include('sales_modal.php'); ?> </td> </tr> <?php } // 若无数据,提示空状态 if ($query->num_rows === 0) { echo "<tr><td colspan='5' class='text-center'>最近3天无销售记录</td></tr>"; } } ?>
方案2:分别查询每天的销售记录
若需要单独获取第1天(昨天)、第2天(前天)、第3天(大前天)的数据,可以使用以下SQL:
<?php // 第1天(昨天) $sql_day1 = "SELECT * FROM purchase WHERE DATE(date_purchase) = DATE_SUB(CURDATE(), INTERVAL 1 DAY) ORDER BY purchaseid DESC"; // 第2天(前天) $sql_day2 = "SELECT * FROM purchase WHERE DATE(date_purchase) = DATE_SUB(CURDATE(), INTERVAL 2 DAY) ORDER BY purchaseid DESC"; // 第3天(大前天) $sql_day3 = "SELECT * FROM purchase WHERE DATE(date_purchase) = DATE_SUB(CURDATE(), INTERVAL 3 DAY) ORDER BY purchaseid DESC"; // 封装查询和展示函数 function displaySales($conn, $sql, $day_label) { $query = $conn->query($sql); echo "<tr><th colspan='5' class='text-center'>$day_label</th></tr>"; if (!$query) { echo "<tr><td colspan='5'>查询失败:" . $conn->error . "</td></tr>"; return; } if ($query->num_rows === 0) { echo "<tr><td colspan='5' class='text-center'>无销售记录</td></tr>"; return; } while ($row = $query->fetch_array()) { ?> <tr> <td><?php echo date('M d, Y h:i A', strtotime($row['date_purchase'])) ?></td> <td><?php echo htmlspecialchars($row['customer']); ?></td> <td class="text-right">₱ <?php echo number_format($row['total'], 2); ?></td> <td><?php echo htmlspecialchars($row['modeOfPayment']); ?></td> <td> <a href="#details<?php echo $row['purchaseid']; ?>" data-toggle="modal" class="btn btn-primary btn-sm"> <span class="glyphicon glyphicon-search"></span> View </a> <?php include('sales_modal.php'); ?> </td> </tr> <?php } } // 依次展示三天数据 displaySales($conn, $sql_day1, "第1天(昨天)"); displaySales($conn, $sql_day2, "第2天(前天)"); displaySales($conn, $sql_day3, "第3天(大前天)"); ?>
关键修正点说明
- 字段名统一:将SQL中的
date改为date_purchase,与PHP代码中的字段调用保持一致。 - 日期筛选逻辑:使用
CURDATE()获取当前日期,结合DATE_SUB()精确筛选指定天数的记录,避免包含时间部分的误差。 - 错误处理:增加查询结果检查,避免无数据或查询失败时出现白屏或报错。
- XSS防护:使用
htmlspecialchars()处理用户输入的字段(如customer、modeOfPayment),防止跨站脚本攻击。
内容的提问来源于stack exchange,提问作者Dicky Atendido
相关产品推荐
相关产品推荐

