如何在PHP中过滤SQL查询结果中的重复姓名?
解决查询结果重复显示姓名的问题
你的代码在while循环中每次迭代都会输出学生姓名,导致每条书籍记录都重复显示一遍姓名。要实现只显示一次姓名、下方列出对应书籍的效果,可以按以下方式修改代码:
修改后的代码
if(isset($_POST['search'])){ $searchbx = $_POST['search-bx']; // 改用预处理语句防止SQL注入,这是必须的安全措施 $sql = "SELECT Student_Details.Name, Loan_Books.Book_Number, Book_Details.Book_Name FROM Student_Details INNER JOIN Loan_Books ON Loan_Books.MemberID = Student_Details.MemberID INNER JOIN Book_Details ON Loan_Books.Book_Number = Book_Details.Book_Number WHERE Student_Details.MemberID = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $searchbx); // 若MemberID是整数类型,替换为"i" $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows > 0){ // 先获取第一条记录,输出姓名 $firstRow = $result->fetch_assoc(); echo $firstRow['Name'] . '<br>'; // 输出第一条记录对应的书籍 echo '书籍编号:' . $firstRow['Book_Number'] . '<br>'; echo '书名:' . $firstRow['Book_Name'] . '<br><br>'; // 循环输出剩余的书籍记录 while($row = $result->fetch_assoc()){ echo '书籍编号:' . $row['Book_Number'] . '<br>'; echo '书名:' . $row['Book_Name'] . '<br><br>'; } } else { echo '未找到相关借阅记录'; } $stmt->close(); }
关键改动说明
- 调整姓名输出位置:将姓名输出从循环内移到循环外,仅在第一次获取记录时输出一次。
- 完整处理第一条记录:取出第一条记录后,先输出姓名再输出该记录对应的书籍信息,避免遗漏第一条书籍数据。
- 修复SQL注入风险:原代码直接将用户输入拼入SQL语句,存在严重安全隐患,改用预处理语句绑定参数,确保查询安全。
另一种灵活实现方式(先收集数据再统一输出)
如果想更灵活地控制排版格式,可以先把所有书籍信息存入数组,再统一输出:
if(isset($_POST['search'])){ $searchbx = $_POST['search-bx']; $sql = "SELECT Student_Details.Name, Loan_Books.Book_Number, Book_Details.Book_Name FROM Student_Details INNER JOIN Loan_Books ON Loan_Books.MemberID = Student_Details.MemberID INNER JOIN Book_Details ON Loan_Books.Book_Number = Book_Details.Book_Number WHERE Student_Details.MemberID = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("s", $searchbx); $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows > 0){ $books = []; $studentName = ''; // 遍历所有记录,收集姓名和书籍数据 while($row = $result->fetch_assoc()){ if(empty($studentName)){ $studentName = $row['Name']; } $books[] = [ 'number' => $row['Book_Number'], 'name' => $row['Book_Name'] ]; } // 输出姓名 echo $studentName . '<br><br>'; // 遍历输出书籍列表 echo '<strong>借阅书籍列表:</strong><br>'; foreach($books as $book){ echo '- 编号:' . $book['number'] . ',书名:' . $book['name'] . '<br>'; } } else { echo '未找到相关借阅记录'; } $stmt->close(); }
内容的提问来源于stack exchange,提问作者A.t
相关产品推荐
相关产品推荐

