PHP中date_end为空值时if判断失效 日期格式显示异常修复
问题根因
原代码逻辑存在三个实打实的问题:
- 判断条件覆盖不全:仅校验了
$_POST['date_end']等于字符串'0000-00-00'的场景,完全没有覆盖前端传空字符串、null、未传参的情况——这类值写入MySQL的date类型字段时会被存为NULL,而PHP松散比较规则下null == '0000-00-00'返回false,因此判断永远不成立,逻辑始终进入else分支。 - 无效日期无兜底处理:当
date_end为空值时,strtotime()解析失败会返回false,传入date()函数后会被识别为时间戳0(即1970年1月1日),最终拼接出的日期自然会带出01这类异常日值。 - 入库操作不符合安全规范:直接将原生
$_POST参数传入$wpdb->insert,未做转义和校验,存在SQL注入风险。
修复方案
补全判断逻辑,将所有无效结束日期场景统一归到单日期输出分支,同时补上安全校验,顺手修复原逻辑未覆盖的跨月、跨年活动日期展示错误:
- 入库前先用WordPress自带的
sanitize_text_field清理输入参数,insert操作时指定字段格式占位符,从根源规避注入风险 - 结束日期判断同时覆盖三类无效场景:值为空、值为
'0000-00-00'、strtotime解析失败返回false - 日期间隔展示增加层级判断:同年同月仅拼接结束日,同年跨月补充结束月份,跨年直接展示完整起止日期,避免格式错误
修复后代码
// 读取并清理前端提交参数 $event_title = sanitize_text_field($_POST['title']); $date_start = sanitize_text_field($_POST['date_start']); $date_end = sanitize_text_field($_POST['date_end']); $country = sanitize_text_field($_POST['country']); // 安全入库,通过占位符指定字段格式做转义 $wpdb->insert( "events", array( "title" => $event_title, "date_start" => $date_start, "date_end" => $date_end, "country" => $country ), array('%s', '%s', '%s', '%s') ); $ts_start = strtotime($date_start); $ts_end = strtotime($date_end); // 覆盖所有无效结束日期场景 if (empty($date_end) || $date_end == '0000-00-00' || $ts_end === false) { $event_date = date('F d, Y', $ts_start); } else { // 按日期跨度匹配对应展示格式 if (date('Y', $ts_start) === date('Y', $ts_end)) { if (date('F', $ts_start) === date('F', $ts_end)) { // 同年同月:仅拼接结束日 $event_date = date('F d - ', $ts_start) . date('d, Y', $ts_end); } else { // 同年跨月:拼接结束月+日 $event_date = date('F d - ', $ts_start) . date('F d, Y', $ts_end); } } else { // 跨年:拼接完整起止日期 $event_date = date('F d, Y - ', $ts_start) . date('F d, Y', $ts_end); } }
修复后只要结束日期为空、格式非法或为0000-00-00,都会正常输出单日期格式;存在有效结束日期时会自动根据日期跨度匹配展示格式,不会出现1970年相关的异常日期值。
内容的提问来源于stack exchange,提问作者Hadrian Clayton
相关产品推荐
相关产品推荐

