如何用PHP+MySQL根据当前时间查询当前及下一门课程
实现步骤
一、MySQL查询语句
我们可以通过两种方式获取目标数据:分开查询或合并成一次查询,具体如下:
方式1:分开查询
- 查询当前正在进行的课程
SELECT * FROM Subject WHERE start_time <= CURTIME() AND end_time >= CURTIME();
- 查询下一门课程(取最早开始的)
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,提问作者ملاذ عبود ابراهيم عثمان
相关产品推荐
相关产品推荐

