You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:33:10