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

如何用PHP+MySQL根据当前时间查询当前及下一门课程

实现步骤

一、MySQL查询语句

我们可以通过两种方式获取目标数据:分开查询或合并成一次查询,具体如下:

方式1:分开查询

  1. 查询当前正在进行的课程
SELECT * FROM Subject 
WHERE start_time <= CURTIME() 
AND end_time >= CURTIME();
  1. 查询下一门课程(取最早开始的)
SELECT * FROM Subject 
WHERE start_time > CURTIME() 
ORDER BY start_time ASC 
LIMIT 1;

方式2:合并查询(一次获取两个结果)

用UNION合并两个查询结果,同时新增course_type字段区分当前/下一门课程:

(SELECT *, '当前课程' AS course_type 
 FROM Subject 
 WHERE start_time <= CURTIME() 
 AND end_time >= CURTIME())
UNION
(SELECT *, '下一门课程' AS course_type 
 FROM Subject 
 WHERE start_time > CURTIME() 
 ORDER BY start_time ASC 
 LIMIT 1)
ORDER BY course_type;

说明:CURTIME()会返回MySQL服务器的当前时间(格式为HH:MM:SS),即便你的时间字段是HH:MM格式,MySQL也能自动兼容比较。

二、PHP代码实现

推荐方案:使用PDO连接数据库

PDO比mysqli更安全灵活,代码示例如下:

<?php
// 数据库连接参数
$host = 'localhost';
$dbname = '你的数据库名';
$username = '数据库用户名';
$password = '数据库密码';

try {
    // 初始化PDO连接
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 执行合并查询
    $sql = "(SELECT *, '当前课程' AS course_type FROM Subject WHERE start_time <= CURTIME() AND end_time >= CURTIME())
            UNION
            (SELECT *, '下一门课程' AS course_type FROM Subject WHERE start_time > CURTIME() ORDER BY start_time ASC LIMIT 1)
            ORDER BY course_type";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute();

    // 获取查询结果
    $courses = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // 遍历输出结果
    foreach ($courses as $course) {
        echo "{$course['course_type']}:课程ID {$course['Subject_id']},时间 {$course['start_time']}-{$course['end_time']}<br>";
    }

} catch(PDOException $e) {
    die("数据库错误: " . $e->getMessage());
}

// 关闭连接(PDO会自动回收,也可手动释放)
$pdo = null;
?>

备选方案:使用mysqli连接数据库

如果习惯用mysqli,代码示例如下:

<?php
$host = 'localhost';
$dbname = '你的数据库名';
$username = '数据库用户名';
$password = '数据库密码';

// 创建mysqli连接
$conn = new mysqli($host, $username, $password, $dbname);

// 检查连接状态
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 设置字符编码
$conn->set_charset("utf8mb4");

// 执行查询
$sql = "(SELECT *, '当前课程' AS course_type FROM Subject WHERE start_time <= CURTIME() AND end_time >= CURTIME())
        UNION
        (SELECT *, '下一门课程' AS course_type FROM Subject WHERE start_time > CURTIME() ORDER BY start_time ASC LIMIT 1)
        ORDER BY course_type";

$result = $conn->query($sql);

// 输出结果
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "{$row['course_type']}:课程ID {$row['Subject_id']},时间 {$row['start_time']}-{$row['end_time']}<br>";
    }
} else {
    echo "暂无符合条件的课程";
}

// 关闭连接
$conn->close();
?>

注意事项

  • 确保数据库中start_time和end_time字段为TIME类型,若为字符串类型,只要格式是HH:MM或HH:MM:SS,MySQL也能正常比较。
  • 如果当前时间已超过所有课程的结束时间,下一门课程的查询会返回空,建议在PHP中增加判断逻辑,比如提示“今日已无后续课程”。

内容的提问来源于stack exchange,提问作者ملاذ عبود ابراهيم عثمان

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:55:06