

新闻资讯
行业动态本文详解如何在 php 中结合 mysql 查询,根据当前日期与时间精准筛选出“当前正在播出”或“即将开始”的电台节目,支持跨日循环查找(7天内),避免时间错位与逻辑漏洞。
在构建电台类网站时,一个常见且关键的需求是:首页实时显示「当前正在|直播|的节目」和「下一个即将播出的节目」。然而,由于数据库中仅存储了星期几(DAY 字段,0=Sunday, 1=Monday…)和当日开始/结束时间(START, END),缺乏完整日期信息,直接用 NOW() 比较会失效——MySQL 无法原生理解 “本周三 20:00” 是指今天、明天还是下周。
原始思路(如 $currentDay = date("w"); $currentTime = date("H:i");)仅获取了局部时间片段,若仅靠 PHP 层遍历所有记录做字符串比对,不仅性能低下,还极易因跨日逻辑(例如:周二 23:50 查询,应匹配周三 00:30 的节目)而出错。
✅ 正确解法是:将星期逻辑转化为可排序的时间距离,并交由 MySQL 高效计算。核心策略分三步:
以下是生产就绪的 PHP + MySQL 实现:
立即学习“PHP免费学习笔记(深入)”;
= ? AND `STATUS` = 0
ORDER BY `DAY` ASC, time_diff ASC
LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->execute([$currentDateTime, $currentDay]);
$nextShow = $stmt->fetch(PDO::FETCH_ASSOC);
if ($nextShow) {
// 将数字 DAY 转为中文/英文星期(示例)
$weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
$showDay = $weekdays[$nextShow['DAY']];
echo "即将播出:{$nextShow['USERNAME']}({$showDay} {$nextShow['START']}–{$nextShow['END']})";
} else {
echo "暂无近期节目安排。";
}
?>⚠️ 重要注意事项:
接字符串构造 SQL(如原答案中的 ".$currentDay."),存在严重 SQL 注入风险;总结:时间逻辑不应全押在 PHP 循环里。善用 MySQL 的日期函数与排序能力,既能提升性能,又能写出更健壮、可维护的调度逻辑。