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

名、姓存储在不同列时如何通过AJAX实现全名搜索?

分字段存储姓名的全名搜索解决方案

原有代码存在的问题

你当前的查询逻辑只能匹配搜索词完整包含在名、姓、手机号或地址中的场景,当用户输入带空格的全名(如Zakir Raza)时,无法匹配到firstName为Zakir、lastName为Raza的对应数据,同时直接拼接用户输入到SQL语句存在SQL注入风险,多余的str_split逻辑对拆分搜索关键词没有作用。

实现思路

  • 处理搜索输入:过滤首尾空格、连续无效空格
  • 新增全名匹配规则:调用SQL的CONCAT函数把firstName、lastName拼接为完整姓名后做模糊匹配,可同时支持「名+姓」「姓+名」两种搜索习惯
  • 高兼容场景可将搜索词按空格拆分为多个关键词,分别匹配各字段提升召回率
  • 全程使用预处理语句避免SQL注入风险

可直接使用的代码示例

<?php
// 连接数据库
include_once 'connect.php';

// 接收并处理搜索参数
$search_value = trim($_POST["search"] ?? '');
if (empty($search_value)) {
    // 空搜索可根据业务需求自定义返回逻辑
    $result = [];
    exit;
}

// 基础版:支持整段全名+单字段匹配,适合绝大多数场景
$stmt = $conn->prepare("SELECT * FROM customer 
    WHERE firstName LIKE ? 
    OR lastName LIKE ? 
    OR CONCAT(firstName, ' ', lastName) LIKE ? 
    OR CONCAT(lastName, ' ', firstName) LIKE ? 
    OR mobile LIKE ? 
    OR address LIKE ?");
$like_param = "%{$search_value}%";
$stmt->bind_param("ssssss", $like_param, $like_param, $like_param, $like_param, $like_param, $like_param);
$stmt->execute();
$result = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);

// 高配版:支持拆分关键词模糊匹配,比如输入Zakir R也能命中目标数据
/*
$keywords = array_filter(explode(' ', $search_value));
$where_clause = [];
$params = [];
foreach ($keywords as $kw) {
    $kw_like = "%{$kw}%";
    $where_clause[] = "firstName LIKE ? OR lastName LIKE ? OR mobile LIKE ? OR address LIKE ?";
    array_push($params, $kw_like, $kw_like, $kw_like, $kw_like);
}
$stmt = $conn->prepare("SELECT * FROM customer WHERE ".implode(' OR ', $where_clause));
$stmt->bind_param(str_repeat('s', count($params)), ...$params);
$stmt->execute();
$result = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
*/
?>

优化提示:

  1. 上述代码基于mysqli扩展编写,若使用PDO连接只需调整预处理绑定参数的语法即可
  2. 数据量较大时可给查询涉及的字段建前缀索引,或者开启MySQL全文索引提升查询性能
  3. 如果用户存在输入多空格的情况,可先把搜索词中的连续空格替换为单个空格再处理

内容的提问来源于stack exchange,提问作者Mohammad Zakir Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 20:42:03