PHP中如何设置产品过期、无效状态?代码逻辑异常求助
问题排查:带有效期的产品状态判断逻辑错误
先理清楚你的需求逻辑,正确的状态划分应该是:
- Not Valid:当前时间超过产品有效期(
$now > $valid) - Overdue:当前时间在有效期内,但距离过期不足30天(
$due < $now < $valid,其中$due是$valid往前推30天的日期) - 有效状态:当前时间距离过期还有30天及以上(
$now <= $due)
看你的代码,核心问题是条件判断完全写反了,直接导致逻辑彻底混乱:
- 第一个条件
if ($due > $now && $now > $valid):因为$due是$valid减去30天得到的,所以$due必然小于$valid,$now不可能同时大于$valid且小于$due,这个分支永远不会触发。 - 第二个条件
elseif ($due > $now && $now < $valid):这个分支匹配的是「当前时间距离过期还有30天以上」的情况,但你却把它标记成了Not Valid,完全和需求相反。 - 所有本该显示
Not Valid的场景,最终都落到了else分支里,自然不符合预期。
修正后的代码
这里建议你优先用时间戳做日期比较,因为字符串格式(比如d-M-y)的日期比较可能会因格式解析、本地化问题出错,用整数类型的时间戳更可靠:
// 先把日期字符串转换为时间戳,避免字符串比较的坑 $nowTimestamp = strtotime(date("d-M-y")); $validTimestamp = strtotime($valid); $dueTimestamp = strtotime($due); if ($nowTimestamp > $validTimestamp) { // 超过有效期 → Not Valid $vendor = '<td style="color:red;text-align: center;font-weight: bold">'.$rowpur['ven_code'].' (Not Valid)</td>'; } elseif ($nowTimestamp > $dueTimestamp && $nowTimestamp <= $validTimestamp) { // 有效期内,但不足30天过期 → Overdue $vendor = '<td style="color:red;text-align: center;font-weight: bold">'.$rowpur['ven_code'].' (Overdue)</td>'; } else { // 距离过期还有30天及以上 → 有效状态 $vendor = '<td style="text-align: center;font-weight: bold">'.$rowpur['ven_code'].'</td>'; }
额外优化建议
可以把状态判断逻辑封装成独立函数,方便复用和后续维护:
function getVendorStatus($nowStr, $validStr, $dueStr) { $nowTs = strtotime($nowStr); $validTs = strtotime($validStr); $dueTs = strtotime($dueStr); if ($nowTs > $validTs) return 'Not Valid'; if ($nowTs > $dueTs) return 'Overdue'; return 'Valid'; } // 调用示例 $status = getVendorStatus(date("d-M-y"), $valid, $due); $style = $status !== 'Valid' ? 'color:red;' : ''; $vendor = "<td style='{$style}text-align: center;font-weight: bold'>{$rowpur['ven_code']} ({$status})</td>";
内容的提问来源于stack exchange,提问作者Franksye Sipangkar
相关产品推荐
相关产品推荐

