PHP环境下如何过滤jQuery autocomplete重复名称
解决jQuery Autocomplete重复姓名的问题
你遇到的核心问题是数据库中同一用户的多条活动记录,导致Autocomplete返回了重复的姓名选项。我们可以从后端SQL查询或PHP数组处理两个层面快速解决这个问题,同时顺便帮你修复一个潜在的安全隐患。
一、最直接的方案:修改SQL查询去重
你的get_name动作对应的SQL没有做去重处理,所以同一个姓名会被多次返回。只需要给SELECT语句加上DISTINCT关键字,让数据库直接返回唯一的姓名即可:
if($action=='get_name'){ // 添加DISTINCT关键字过滤重复姓名 $sqlquery = "SELECT DISTINCT rt_name FROM reg_ticket WHERE rt_name LIKE '%$name%' LIMIT 15"; $result = mysql_query($sqlquery) or die(mysql_error()); while($myrow = MySQL_fetch_array($result)){ $data[] = strtoupper($myrow['rt_name']); } }
修改后数据库只会返回每个姓名一次,Autocomplete的下拉列表里就不会出现重复项了。
二、备选方案:PHP数组层面去重
如果因为业务原因无法修改SQL(比如后续需要关联其他字段),也可以在PHP中用array_unique()函数对返回的姓名数组去重:
if($action=='get_name'){ $sqlquery = "SELECT rt_name FROM reg_ticket WHERE rt_name LIKE '%$name%' LIMIT 15"; $result = mysql_query($sqlquery) or die(mysql_error()); while($myrow = MySQL_fetch_array($result)){ $data[] = strtoupper($myrow['rt_name']); } // 对数组去重 $data = array_unique($data); // 重新索引数组,避免JSON结构异常 $data = array_values($data); }
重要安全提醒:修复SQL注入漏洞
你当前直接把$_GET['name']拼接到SQL语句里,存在严重的SQL注入风险!而且mysql_*系列函数早已在PHP 5.5后被废弃,建议尽快替换为mysqli预处理语句,示例如下:
// 假设已用mysqli连接数据库(替换原mysql_connect相关代码) if($action=='get_name'){ $sqlquery = "SELECT DISTINCT rt_name FROM reg_ticket WHERE rt_name LIKE ? LIMIT 15"; $stmt = $conn->prepare($sqlquery); $searchName = "%$name%"; $stmt->bind_param("s", $searchName); $stmt->execute(); $result = $stmt->get_result(); while($myrow = $result->fetch_assoc()){ $data[] = strtoupper($myrow['rt_name']); } $stmt->close(); }
你的jQuery代码不需要任何修改,只要后端返回唯一的姓名列表,Autocomplete自然就不会显示重复选项了。
内容的提问来源于stack exchange,提问作者hatched
相关产品推荐
相关产品推荐

