You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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();
}

关键改动说明

  1. 调整姓名输出位置:将姓名输出从循环内移到循环外,仅在第一次获取记录时输出一次。
  2. 完整处理第一条记录:取出第一条记录后,先输出姓名再输出该记录对应的书籍信息,避免遗漏第一条书籍数据。
  3. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:48:17