PHP实现从SQL数据库调用每周节目单并高亮当前播放内容
嘿,这个需求做起来其实挺清晰的,我帮你拆解成几个关键步骤,附上可直接参考的代码示例,你可以根据自己的实际情况调整:
核心思路与实现步骤
1. 先给数据库补个关键字段(如果还没有的话)
因为节目是每周重复的,你需要给每个节目条目加一个weekday字段(INT类型,1=周一,7=周日),这样才能精准区分不同日期的节目。如果数据库里已经有类似字段,这步可以跳过。
2. 数据库连接与节目查询
用PDO连接数据库(比mysql_*函数更安全可靠),然后根据用户选中的日期(默认显示当天)查询对应星期几的节目,同时按播放时间排序,确保节目顺序正确:
// 设置时区(根据你的地区调整,比如中国用Asia/Shanghai) date_default_timezone_set('Asia/Shanghai'); // 数据库连接(PDO示例) $dsn = 'mysql:host=你的数据库地址;dbname=你的数据库名;charset=utf8mb4'; $username = '你的用户名'; $password = '你的密码'; try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("数据库连接失败: " . $e->getMessage()); } // 处理选中的星期几:PHP date('w')返回0=周日,1=周一...6=周六,我们转成1=周一,7=周日 $today = date('w'); $selected_day = isset($_GET['day']) ? (int)$_GET['day'] : ($today == 0 ? 7 : $today); // 映射星期几的中文名称 $day_names = [ 1 => '周一', 2 => '周二', 3 => '周三', 4 => '周四', 5 => '周五', 6 => '周六', 7 => '周日' ]; // 查询对应星期几的节目,按开始时间排序 $stmt = $pdo->prepare("SELECT title, host, timeslot FROM schedule WHERE weekday = ? ORDER BY STR_TO_DATE(timeslot, '%l:%i%p')"); $stmt->execute([$selected_day]); $shows = $stmt->fetchAll(PDO::FETCH_ASSOC);
3. 写个辅助函数判断当前节目
这个函数会检查两个条件:一是当前选中的日期是否是今天,二是当前时间是否落在节目的播放时段内,还处理了跨午夜的特殊情况(比如11:00pm - 1:00am):
/** * 判断是否是正在播放的节目 * @param string $timeslot 节目时段(如"1:00pm - 3:00pm") * @param int $selected_day 当前选中的星期几(1-7) * @return bool */ function isCurrentShow($timeslot, $selected_day) { // 先判断选中的日期是否是今天 $today = date('w'); $today_mapped = $today == 0 ? 7 : $today; if ($today_mapped != $selected_day) { return false; } // 拆分开始和结束时间 list($start_str, $end_str) = explode('-', $timeslot); $start_str = trim($start_str); $end_str = trim($end_str); // 转换为可比较的时间戳(仅取时分部分) $start_time = strtotime($start_str); $end_time = strtotime($end_str); $current_time = strtotime(date('h:iA')); // 处理跨午夜的节目(结束时间早于开始时间) if ($end_time < $start_time) { return ($current_time >= $start_time) || ($current_time <= $end_time); } else { return ($current_time >= $start_time) && ($current_time <= $end_time); } }
4. 构建7天切换标签
生成可点击的周一至周日标签,点击后通过URL参数day切换显示对应日期的节目,当前选中的标签会高亮:
// 生成星期几切换标签 echo '<div class="day-tabs">'; foreach ($day_names as $day_num => $day_name) { $active_class = ($day_num == $selected_day) ? 'active' : ''; echo "<a href=\"?day={$day_num}\" class=\"tab {$active_class}\">{$day_name}</a>"; } echo '</div>';
5. 生成节目列表并高亮当前节目
循环查询到的节目数据,给正在播放的节目添加current-show类,配合CSS实现高亮效果:
// 生成节目单列表 echo '<div class="schedule-list">'; if (empty($shows)) { echo '<p>当天暂无节目安排</p>'; } else { foreach ($shows as $show) { $is_current = isCurrentShow($show['timeslot'], $selected_day); $item_class = $is_current ? 'show-item current-show' : 'show-item'; echo "<div class=\"{$item_class}\">"; echo "<h3 class=\"show-title\">{$show['title']}</h3>"; echo "<p class=\"show-host\">主持人: {$show['host']}</p>"; echo "<p class=\"show-timeslot\">{$show['timeslot']}</p>"; echo '</div>'; } } echo '</div>';
6. 添加上对应的CSS样式
用CSS美化标签和节目列表,重点是高亮正在播放的节目:
/* 星期标签样式 */ .day-tabs { margin-bottom: 20px; border-bottom: 1px solid #e9ecef; } .day-tabs .tab { display: inline-block; padding: 10px 18px; text-decoration: none; color: #495057; margin-right: 8px; border-radius: 4px 4px 0 0; transition: background-color 0.2s; } .day-tabs .tab:hover { background-color: #f8f9fa; } .day-tabs .tab.active { background-color: #007bff; color: white; border-bottom: 1px solid #007bff; } /* 节目列表样式 */ .schedule-list { max-width: 800px; } .show-item { padding: 16px; border: 1px solid #e9ecef; border-radius: 6px; margin-bottom: 12px; transition: box-shadow 0.2s; } .show-item:hover { box-shadow: 0 2px 4px rgba(0,0,0,0.05); } /* 正在播放的节目高亮样式 */ .show-item.current-show { background-color: #d4edda; border-color: #c3e6cb; box-shadow: 0 0 6px rgba(40, 167, 69, 0.15); } .show-title { margin: 0 0 6px 0; font-size: 1.25em; color: #212529; } .show-host { margin: 0 0 6px 0; color: #6c757d; font-size: 0.9em; } .show-timeslot { margin: 0; font-weight: 600; color: #495057; }
一些注意事项
- 确保PHP的时区设置正确,否则时间判断会出错;
- 如果你的数据库不是MySQL,
STR_TO_DATE函数需要换成对应数据库的时间转换函数(比如PostgreSQL用TO_TIMESTAMP); - 如果节目时段的格式不统一(比如有的是"1pm"没有分钟),
strtotime也能处理,但最好统一格式; - 可以考虑把常用的逻辑封装成类或者函数,方便后续维护。
内容的提问来源于stack exchange,提问作者Ry-guy
相关产品推荐
相关产品推荐

