如何在评估表单中仅展示学生所选课程的教师姓名与科目
解决方案:仅展示当前登录学生所选课程的教师及科目
问题分析
现有代码存在两个核心问题导致无法实现需求:
- 登录验证后的学生信息查询逻辑被错误放置在
exit()之后,永远无法执行,导致无法获取当前学生的class_id用于过滤课程。 - 原SQL查询未关联学生所属班级,会返回所有未完成评估的教师-课程记录,而非当前学生的对应课程。
修正步骤
1. 修复学生信息获取逻辑
将获取当前学生信息的代码移到exit()语句之前,确保能正确拿到学生的class_id:
<?php session_start(); require './config.php';//database connection //prevent access without log in if (!isset($_SESSION['id']) || (trim ($_SESSION['id']) == '')) { header('location: student.php'); exit(); } // 修正:将学生信息查询移到exit()之前,确保能执行 $query = mysqli_query($db, "SELECT * FROM `student_list` WHERE school_id='".$_SESSION['id']."'"); $student_row = mysqli_fetch_assoc($query);
2. 修改SQL查询,过滤当前学生的课程
更新查询语句,通过student_list.class_id关联restriction_list.class_id,只返回当前学生所属班级对应的教师和课程,同时保留“未完成评估”的过滤条件:
// 获取当前学生的班级ID $student_class_id = $student_row['class_id']; // 修正后的查询语句 $restriction = $db->query(" SELECT r.id, s.id as sid, f.id as fid, concat(f.Lname,' ',f.Fname,' ',f.Mname) as faculty, s.subject_code as subject, s.subject_description as description FROM restriction_list r INNER JOIN faculty_list f ON f.id = r.faculty_id INNER JOIN class_list s ON s.id = r.subject_id -- 新增:过滤当前学生所属班级的课程 WHERE r.class_id = '".$student_class_id."' -- 保留原有的未评估过滤条件 AND r.id NOT IN (SELECT restriction_id from evaluation_list) ");
3. 完整修正后的PHP代码
<?php session_start(); require './config.php';//database connection //prevent access without log in if (!isset($_SESSION['id']) || (trim ($_SESSION['id']) == '')) { header('location: student.php'); exit(); } // 获取当前登录学生的信息 $query = mysqli_query($db, "SELECT * FROM `student_list` WHERE school_id='".$_SESSION['id']."'"); $student_row = mysqli_fetch_assoc($query); $rid=''; $faculty_id=''; $subject_id=''; if(isset($_GET['rid'])) $rid = $_GET['rid']; if(isset($_GET['fid'])) $faculty_id = $_GET['fid']; if(isset($_GET['sid'])) $subject_id = $_GET['sid']; // 修正后的查询:仅返回当前学生班级对应的未评估课程 $student_class_id = $student_row['class_id']; $restriction = $db->query(" SELECT r.id, s.id as sid, f.id as fid, concat(f.Lname,' ',f.Fname,' ',f.Mname) as faculty, s.subject_code as subject, s.subject_description as description FROM restriction_list r INNER JOIN faculty_list f ON f.id = r.faculty_id INNER JOIN class_list s ON s.id = r.subject_id WHERE r.class_id = '".$student_class_id."' AND r.id NOT IN (SELECT restriction_id from evaluation_list) "); ?>
4. HTML部分无需修改
原有的HTML列表渲染代码可以直接使用,因为它会基于修正后的查询结果展示内容。
关键说明
- 通过
student_list.class_id与restriction_list.class_id关联,确保只加载当前学生班级的课程。 - 保留了原有的
r.id NOT IN (SELECT restriction_id from evaluation_list)条件,避免学生重复评估同一课程。 - 修正了学生信息查询的位置错误,确保能正确获取当前学生的班级ID。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

