使用mysqli获取指定班级学生总数失败的技术问题
问题解决:根据学生ID统计对应班级总人数
原代码的核心问题是:执行的SQL会分组统计所有班级的人数,最后用mysqli_num_rows($res1)返回的是班级的数量,完全不符合你要获取「指定班级学生总数」的需求。
修正思路
- 先通过传入的学生ID,获取该学生所属班级的
sigles值 - 再根据这个
sigles值,统计对应班级的总人数 - 必须用预处理语句避免SQL注入风险
修正后的代码
<div class="bio"> <span><b>Student's name: </b></span><span class="text-uppercase pl-3"><?php echo $row['student_name'] ?></span><br> <span><b>Position in class:</b></span> <span>47</span> out of <span> <?php $id = $_GET['id']; // 1. 获取当前学生的班级sigles值 $stmt = $conn->prepare("SELECT sigles FROM tbl_student WHERE id = ?"); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); $student_data = $result->fetch_assoc(); $target_class = $student_data['sigles']; // 2. 统计该班级的总人数 $stmt_count = $conn->prepare("SELECT COUNT(*) AS total_members FROM tbl_student WHERE sigles = ?"); // 如果sigles是数字类型,把第二个参数改成"i" $stmt_count->bind_param("s", $target_class); $stmt_count->execute(); $count_result = $stmt_count->get_result(); $class_total = $count_result->fetch_assoc(); echo $class_total['total_members']; // 关闭语句连接 $stmt->close(); $stmt_count->close(); ?> </span> pupils <br> <span><b>Division:</b></span> <span>1</span> </div>
更简洁的单SQL写法
也可以用一条关联查询直接完成,省去两次查询的步骤:
<div class="bio"> <span><b>Student's name: </b></span><span class="text-uppercase pl-3"><?php echo $row['student_name'] ?></span><br> <span><b>Position in class:</b></span> <span>47</span> out of <span> <?php $id = $_GET['id']; $stmt = $conn->prepare("SELECT COUNT(*) AS total_members FROM tbl_student s1 JOIN tbl_student s2 ON s1.sigles = s2.sigles WHERE s2.id = ?"); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); $class_total = $result->fetch_assoc(); echo $class_total['total_members']; $stmt->close(); ?> </span> pupils <br> <span><b>Division:</b></span> <span>1</span> </div>
关键说明
- 原代码的
GROUP BY sigles会把所有班级分组,mysqli_num_rows返回的是分组后的班级数量,不是单个班级的人数 - 必须先定位到当前学生的班级,再统计该班级的行数,才能得到预期结果
- 预处理语句能有效避免SQL注入,比直接拼接SQL更安全
内容的提问来源于stack exchange,提问作者kato james
相关产品推荐
相关产品推荐

