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

如何通过AJAX获取多查询结果并解决人员部门信息串位问题

问题诊断与解决方案

核心问题

我一眼就看出问题出在哪了——你的$dpt变量没有在每次处理新人员的时候重置!你把$dpt = "";放在了while循环外面,导致每次处理下一个人员时,$dpt会保留上一个人员的部门内容并不断累加,最终出现后面的人员显示前面人员部门的串位情况。

另外你的代码还有两个小bug需要修正:

  • 查询国家的SQL语句末尾多了一个多余的单引号
  • 变量名写错:$$country应该是$country

修复后的基础版代码

先把核心问题解决,调整变量位置并修正语法错误:

<?php
if(isset($_GET['name'])){
  $name = $_GET['name'];
  $ret = "";
  // 注意:mysql扩展已废弃,建议后续改用mysqli/PDO,这里先按你的代码逻辑修正
  $query = mysql_query("select id,name,phone,country_id,departments from persons where name like '%$name%'");
  while($data = mysql_fetch_assoc($query)){
    // 关键:每次处理新人员时,重置$dpt变量!
    $dpt = "";
    $name = $data['name'];
    $phone = $data['phone'];
    $country_id = $data['country_id'];
    // 修正SQL末尾的多余单引号
    $queryr= mysql_query("select country from countries where country_id = $country_id");
    // 修正变量名错误
    $country = mysql_fetch_array($queryr);
    $country_name = $country['country'];
    $depart = $data['departments'];
    $department=explode(",",$depart);
    foreach($department as $departments){
      $depart_fetch = mysql_query("select department_name from departments where id='$departments'");
      $fetch1 = mysql_fetch_array($depart_fetch);
      // 注意:你查询的是department_name,这里要对应上字段名
      $depart_list = $fetch1['department_name'];
      $dpt=$dpt."<div> ".$depart_list." </div>";
    }
    $ret=$ret."<tr><td> ".$name." </td><td> ".$phone." </td><td> ".$country_name." </td><td> ".$dpt."</td></tr>";
  }
  echo $ret;
}
?>

进阶优化建议

1. 替换废弃的mysql扩展

mysql_*系列函数已经在PHP7.0中被彻底移除,强烈建议改用mysqli或PDO,同时使用预处理语句防止SQL注入(你的当前代码存在严重的注入风险)。

2. 减少数据库查询次数

现在的代码每个人员要查一次国家、每个部门查一次数据库,效率极低。可以用JOIN和IN查询优化:

<?php
if(isset($_GET['name'])){
  // 改用mysqli连接数据库
  $conn = mysqli_connect("localhost", "你的用户名", "你的密码", "你的数据库名");
  // 转义用户输入,防止注入
  $name = mysqli_real_escape_string($conn, $_GET['name']);
  $ret = "";

  // 用JOIN一次性获取人员+国家信息,避免多次查询
  $query = mysqli_query($conn, "SELECT p.id, p.name, p.phone, c.country, p.departments 
                                FROM persons p 
                                LEFT JOIN countries c ON p.country_id = c.country_id
                                WHERE p.name LIKE '%$name%'");
  
  while($data = mysqli_fetch_assoc($query)){
    $dpt = "";
    $name = $data['name'];
    $phone = $data['phone'];
    $country_name = $data['country'];
    $depart_ids = $data['departments'];
    
    if(!empty($depart_ids)){
      // 用IN查询一次性获取所有部门名称,减少数据库请求
      $depart_query = mysqli_query($conn, "SELECT department_name FROM departments WHERE id IN ($depart_ids)");
      while($dept = mysqli_fetch_assoc($depart_query)){
        $dpt .= "<div> ".$dept['department_name']." </div>";
      }
    }
    
    $ret .= "<tr><td> ".$name." </td><td> ".$phone." </td><td> ".$country_name." </td><td> ".$dpt."</td></tr>";
  }
  echo $ret;
  mysqli_close($conn);
}
?>

3. 前端防抖优化

可以在输入时增加防抖逻辑,避免用户快速输入时频繁触发AJAX请求:

$(document).ready(function() {
  let debounceTimer;
  $("#cmp_name").keyup(function(){
    clearTimeout(debounceTimer);
    // 停止输入300ms后再发起请求
    debounceTimer = setTimeout(() => {
      $.ajax({
        url: "filter.php",
        data: {name: $("#cmp_name").val()},
        method: 'GET',
        success: function(html){
          $("#datas").html(html);
        }
      })
    }, 300);
  });
});

内容的提问来源于stack exchange,提问作者Haris Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:38