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

如何展示第1、2、3天的销售记录?现有SQL查询无法获取有效日报

解决每日销售报表展示问题

核心问题分析

  1. 字段名不匹配:SQL查询的是date字段,但PHP代码中调用的是$row['date_purchase'],这会导致无法正确获取日期数据,甚至触发错误。
  2. 查询范围错误:当前SQL仅筛选最近1天的记录,无法获取第2、3天的销售数据。
  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">&#8369; <?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">&#8369; <?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:35:29