PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
发布时间 - 2025-12-31 00:00:00 点击率:次本文介绍如何在 php 中结合 mysql 查询,根据当前星期几和时间,精准筛选出“正在播出”或“即将播出”的电台节目,支持跨日自动回环(7天循环),并避免时间计算错误。
在构建电台类网站时,一个常见需求是:在首页动态展示「当前正在|直播|的主持人」和「下一位即将上线的主持人」。由于节目表仅存储了星期几(DAY: 0–6,对应周日–周六)和每日固定时段(如 START: "20:00"),无法直接用 DATETIME 类型做范围比较——这导致标准的时间函数(如 NOW())无法直接参与排序或过滤。
原始思路(如 $currentDay = date("w") + $currentTime = date("H:i"))虽能获取当前信息,但仅靠 PHP 端逐条判断效率低、逻辑易错,且难以优雅处理「今日无剩余节目 → 自动跳转至明日首个节目」这类边界场景。
✅ 正确解法:将时间逻辑下沉至 MySQL 层,利用 TIMESTAMP(CURDATE(), START) 构造当日完整时间点,并结合 ABS() 实现“距离当前时刻最近”的语义排序。
以下是推荐的健壮查询方案(已修正原答案中的关键缺陷):
? THEN TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL (`DAY` - ?) DAY), `START`)
ELSE TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL (7 + `DAY` - ?) DAY), `START`)
END ASC
LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->execute([$currentDay, $currentDay, $currentDay, $currentDay]);
$nextShow = $stmt->fetch(PDO::FETCH_ASSOC);
?>? 为什么这样设计?
- 使用 CASE WHEN 显式处理三种情况:
- DAY == today → 用 CURDATE() 拼接;
- DAY > today → 向后推算天数(如今天周三 3,节目在周五 5 → +2 天);
- DAY
- 排序依据是「构造出的真实 DATETIME 值」,天然支持 NOW() 之后的首个节目的精确命中,无需 ABS() 这种近似技巧(原答案中 ABS(TIMESTAMP(...) - NOW()) 在跨日时会误判,
例如 23:50 和次日 00:10 的差值远小于 00:10 与 NOW() 的真实间隔)。 - 全程使用参数化查询,杜绝 SQL 注入风险。
? 额外建议:
- 数据库中 DAY 字段建议添加索引:ALTER TABLE puzzle ADD INDEX idx_day_status (DAY, STATUS);
- 若节目可能持续到次日凌晨(如 START: "23:30", END: "01:30"),需额外扩展 END 字段逻辑,此时应改用 TIME_TO_SEC() 计算跨日时长。
- 前端展示时,可用 date('l H:i', strtotime($row['start_time'])) 格式化为“Monday 20:00”。
通过将业务时间逻辑封装进可预测、可索引的 SQL,既保障了性能,又大幅提升了代码可维护性与准确性。
# mysql
# php
# 前端
# 为什么
# sql
# 封装
# date
# timestamp
# 循环
# table
# 数据库
# 首个
# 次日
# 装进
# 这类
# 三种
# 跳转
# 强烈推荐
# 首页
# 时应
# 数据库中
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
制作公司内部网站有哪些,内网如何建网站?
详解jQuery停止动画——stop()方法的使用
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Android利用动画实现背景逐渐变暗
如何在IIS服务器上快速部署高效网站?
如何快速启动建站代理加盟业务?
如何快速选择适合个人网站的云服务器配置?
如何用AWS免费套餐快速搭建高效网站?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何快速上传自定义模板至建站之星?
Linux网络带宽限制_tc配置实践解析【教程】
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel API资源类怎么用_Laravel API Resource数据转换
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
微信小程序 require机制详解及实例代码
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
简历没回改:利用AI润色让你的文字更专业
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何在搬瓦工VPS快速搭建网站?
深圳网站制作的公司有哪些,dido官方网站?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Linux系统命令中tree命令详解
微信公众帐号开发教程之图文消息全攻略
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
微信小程序 scroll-view组件实现列表页实例代码
Thinkphp 中 distinct 的用法解析
C++用Dijkstra(迪杰斯特拉)算法求最短路径
网页设计与网站制作内容,怎样注册网站?
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
在线教育网站制作平台,山西立德教育官网?
使用C语言编写圣诞表白程序
如何在新浪SAE免费搭建个人博客?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
浅谈javascript alert和confirm的美化
如何在 React 中条件性地遍历数组并渲染元素
html5的keygen标签为什么废弃_替代方案说明【解答】


例如 23:50 和次日 00:10 的差值远小于 00:10 与 NOW() 的真实间隔)。