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

PHP中使用日期选择器查询无数据时,如何返回提示替代报错?

解决PHP日期范围查询销售数据无数据时报错的问题

在PHP项目中使用日期选择器查询销售数据时,指定日期范围内无数据会导致页面报错,需刷新才能恢复。以下是针对视图、控制器、模型层的修改方案,实现无数据时显示「没有数据」提示,避免报错。


1. 模型层(修复SQL注入+标准化结果返回)

原代码存在SQL注入风险,且无数据时返回空数组可能引发后续页面处理错误。修改后:

static public function mdlSalesDatesRange($table, $initialDate, $finalDate, $value1){
    $pdo = Connection::connect();
    $stmt = null;

    if($initialDate == null){
        $stmt = $pdo->prepare("SELECT * FROM $table WHERE relatedAccountID = :value1 ORDER BY id ASC");
        $stmt->bindParam(":value1", $value1, PDO::PARAM_INT);
    }else if($initialDate == $finalDate){
        $stmt = $pdo->prepare("SELECT * FROM $table WHERE relatedAccountID = :value1 AND saleDate LIKE :saleDate");
        $stmt->bindParam(":value1", $value1, PDO::PARAM_INT);
        $stmt->bindParam(":saleDate", "%{$finalDate}%", PDO::PARAM_STR);
    }else{
        $actualDate = new DateTime();
        $actualDate->add(new DateInterval("P1D"));
        $actualDatePlusOne = $actualDate->format("Y-m-d");

        $finalDate2 = new DateTime($finalDate);
        $finalDate2->add(new DateInterval("P1D"));
        $finalDatePlusOne = $finalDate2->format("Y-m-d");

        if($finalDatePlusOne == $actualDatePlusOne){
            $stmt = $pdo->prepare("SELECT * FROM $table WHERE relatedAccountID = :value1 AND saleDate BETWEEN :initialDate AND :finalDatePlusOne");
            $stmt->bindParam(":finalDatePlusOne", $finalDatePlusOne, PDO::PARAM_STR);
        }else{
            $stmt = $pdo->prepare("SELECT * FROM $table WHERE relatedAccountID = :value1 AND saleDate BETWEEN :initialDate AND :finalDate");
            $stmt->bindParam(":finalDate", $finalDate, PDO::PARAM_STR);
        }
        $stmt->bindParam(":value1", $value1, PDO::PARAM_INT);
        $stmt->bindParam(":initialDate", $initialDate, PDO::PARAM_STR);
    }
    
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // 无数据时返回空数组,统一后续视图处理逻辑
    return $result ?: [];
}

修改点:

  • 全量改用参数绑定,彻底规避SQL注入风险
  • 统一获取PDO连接,减少重复调用
  • 标准化结果返回,无数据时返回空数组而非原查询的空集合

2. 控制器层(增加异常捕获,避免页面崩溃)

static public function ctrSalesDatesRange($initialDate, $finalDate, $value1){
    $table = "sales";
    try {
        $answer = ModelSales::mdlSalesDatesRange($table, $initialDate, $finalDate, $value1);
        return $answer;
    } catch(PDOException $e) {
        // 可选:将错误信息写入日志
        // error_log("销售数据查询异常: " . $e->getMessage());
        return [];
    }
}

修改点:

  • 增加PDO异常捕获,避免数据库查询错误直接暴露到页面
  • 异常时返回空数组,让视图统一处理无数据逻辑

3. 视图层(判断结果并显示提示)

// 完善参数判断,确保两个日期参数同时存在
if(isset($_GET["initialDate"]) && isset($_GET["finalDate"])){
    $initialDate = $_GET["initialDate"];
    $finalDate = $_GET["finalDate"];
}else{
    $initialDate = null;
    $finalDate = null;
}

$value1 = $_SESSION["relatedAccountID"];
$answer = ControllerSales::ctrSalesDatesRange($initialDate, $finalDate, $value1);

// 处理无数据场景
if(empty($answer)){
    echo "<p>没有数据</p>";
}else{
    // 原有数据渲染逻辑,示例如下
    foreach($answer as $sale){
        echo "<div>日期:{$sale['saleDate']} | 金额:{$sale['amount']}</div>";
    }
}

修改点:

  • 完善日期参数的存在性判断,避免单参数缺失引发逻辑错误
  • 用empty()判断查询结果,无数据时直接显示提示文本,正常数据则执行原有渲染逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:50:44