PHP MySQLi家长登录无法显示对应学生考勤数据的问题求助
问题分析与解决方案
核心问题在于你查询学生信息的SQL语句没有限定当前登录的家长,导致返回所有学生与家长的关联记录,而fetch_assoc()只会取出第一条结果,所以新家长登录后依然显示第一个注册家长对应的学生信息。
修正步骤
1. 修正学生姓名查询代码
原SQL缺少当前家长的过滤条件,需要加入WHERE parent.id = ?来绑定登录家长的ID,同时用预处理语句避免SQL注入风险:
// for student name display $qu = "SELECT student.* FROM student INNER JOIN parent ON student.idno = parent.sidno WHERE parent.id = ?"; $stmt = $conn->prepare($qu); $stmt->bind_param("i", $_SESSION['id']); // 假设parent.id为整数类型 $stmt->execute(); $r1 = $stmt->get_result(); $rws1 = $r1->fetch_assoc(); if ($rws1) { $full1 = $rws1['sfname'] . " " . $rws1['slname']; echo "Student Name: " . $full1; } else { echo "未找到关联学生信息"; }
2. 修正考勤查询代码
同样需要限定当前家长,先获取对应学生的idno,再基于该ID查询考勤数据:
// view by date (parent can select the date to view student attendance in a table) if(isset($_POST['viewAttbydate'])){ // 获取当前家长关联的学生ID $que = "SELECT student.idno FROM student INNER JOIN parent ON student.idno = parent.sidno WHERE parent.id = ?"; $stmt = $conn->prepare($que); $stmt->bind_param("i", $_SESSION['id']); $stmt->execute(); $r0 = $stmt->get_result(); $rws0 = $r0->fetch_assoc(); if ($rws0) { $admidno = $rws0['idno']; // 示例:查询该学生指定日期的考勤(假设考勤表为attendance,关联student.idno) $attQuery = "SELECT * FROM attendance WHERE student_idno = ? AND attendance_date = ?"; $attStmt = $conn->prepare($attQuery); $attStmt->bind_param("is", $admidno, $_POST['att_date']); // 假设日期为字符串类型 $attStmt->execute(); $attResult = $attStmt->get_result(); // 后续处理考勤数据的逻辑... } else { echo "未找到关联学生信息"; } }
额外注意事项
- 确认家长登录后
$_SESSION['id']正确存储了parent表的主键pid - 若一个家长可能关联多个学生,需用
while循环遍历查询结果,而非仅取第一条 - 始终坚持使用预处理语句,杜绝SQL注入风险
内容的提问来源于stack exchange,提问作者hobihobi
相关产品推荐
相关产品推荐

