PHP MySQL 基于列/行值动态选择多表查询的问题排查
代码问题排查
- 问题1:SQL语法错误,SELECT字段段尾多余逗号
原语句SELECT students.*, $course.*, FROM里$course.*后的逗号不符合SQL语法,会直接导致查询执行失败。 - 问题2:缺少单条学生记录的筛选条件
循环内的关联查询没有限定是当前遍历的学生记录,会查询所有学生和对应课程表的匹配结果,fetch_assoc()只会取第一条,完全匹配不到你要的当前学生的关联数据。 - 问题3:同名字段覆盖问题
students表和课程表都有id、msg_num字段,直接SELECT *的话,课程表的同名字段会覆盖students表的字段值,导致数据异常。 - 问题4:缺少错误校验逻辑
没有判断SQL执行是否成功,出现错误时无法定位问题,也会直接触发后续调用fetch_assoc()的报错。
修正后的代码
<div style="position:relative; margin:auto; width:400px; font-family:Poppins; font-size:16px; border:2px solid black; padding:10px; margin-top:100px;"> <?php include 'db_connect.php'; $selected_courses = array("biology", "chemistry", "physics"); $sql1 = "SELECT * FROM students"; $result1 = $conn->query($sql1); while($row1 = $result1->fetch_assoc()){ // 校验course_num合法性,避免数组越界 if (!isset($selected_courses[$row1['course_num']])) { echo "STUDENT NAME: ". $row1['name'] . "<br>"; echo "DETAILS: 无对应课程数据<br>"; echo "MSG NUM: ". $row1['msg_num'] . "<br><br>"; continue; } $course = $selected_courses[$row1['course_num']]; // 修复多余逗号,增加当前学生的id筛选条件,避免全表匹配,同名字段加别名 $sql2 = "SELECT students.name as student_name, students.msg_num as student_msg, $course.details FROM students, $course WHERE students.id = {$row1['id']} AND students.msg_num = $course.msg_num"; $result2 = $conn->query($sql2); // 校验查询结果是否存在 if ($result2 && $result2->num_rows > 0) { $row2 = $result2->fetch_assoc(); echo "STUDENT NAME: ". $row2['student_name'] . "<br>"; echo "DETAILS: ". $row2['details'] . "<br>"; echo "MSG NUM: ". $row2['student_msg'] . "<br>"; } else { // 没有匹配到关联数据的情况处理 echo "STUDENT NAME: ". $row1['name'] . "<br>"; echo "DETAILS: 未匹配到课程详情<br>"; echo "MSG NUM: ". $row1['msg_num'] . "<br>"; } echo "<br>"; } $conn->close(); ?> </div>
内容的提问来源于stack exchange,提问作者Aaron Esteban
相关产品推荐
相关产品推荐

