如何通过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
相关产品推荐
相关产品推荐

