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
相关产品推荐
相关产品推荐

