如何检测即将过期产品并统计行数?现有PHP查询有误
修复即将过期产品统计的PHP代码问题
原代码存在多处逻辑错误和效率问题,无法正确统计即将过期(过期前3天内)的产品数量,以下是问题分析和修正方案:
原代码的核心问题
- 循环内重复执行SQL查询,覆盖了初始的
$result变量,导致循环逻辑混乱甚至提前终止 - SQL查询条件完全错误:未关联产品的
expiry_date字段,仅用循环中单个产品计算出的$expiringdate做全局筛选,根本无法统计所有符合条件的产品 - 日期处理冗余且有风险:用
date($row['expiry_date'])转换数据库日期可能引发格式错误,应直接使用原生日期对象处理 - 未做参数绑定,存在SQL注入风险
修正后的代码
<?php include('../connect.php'); // 直接通过SQL统计符合条件的产品:筛选距离过期≤3天且未过期的记录 $stmt = $db->prepare("SELECT COUNT(*) AS expiring_count FROM rawprod WHERE CURDATE() >= DATE_SUB(expiry_date, INTERVAL 3 DAY) AND expiry_date >= CURDATE()"); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); $rowcountEXP = $row['expiring_count']; ?> <div style="text-align:center;"> Expiring Raw Product: <font style="color:green; font:bold 22px 'Aleo';">[<?php echo $rowcountEXP; ?>]</font> </div>
代码说明
- 利用MySQL内置日期函数直接在数据库层面完成筛选,比PHP循环遍历所有数据的效率高很多
- 精准匹配需求逻辑:当前日期≥过期日-3天,且过期日≥当前日期(确保产品未过期),完美覆盖示例中11-25过期、11-22即视为即将过期的场景
- 通过
COUNT(*)直接获取统计结果,无需遍历数据行,代码更简洁 - 避免了变量覆盖、冗余计算等问题,逻辑更可靠
内容的提问来源于stack exchange,提问作者Toto Deleon
相关产品推荐
相关产品推荐

