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

使用PHP和MySQL查询时,如何匹配字段中指定内容(跳过前缀编码)的问题

使用PHP和MySQL查询时,如何匹配字段中指定内容(跳过前缀编码)的问题

嘿,我完全懂你的困扰!你现在的查询逻辑是用code LIKE '$param_term',而$param_term是搜索词加后缀%,这意味着MySQL只会匹配以搜索词开头的code字段内容。但你的code字段是「编码+疾病名称」的格式(比如"A000 Cholera..."),搜"Cholera"的时候自然找不到——因为字段开头是编码,不是疾病名称呀。

我给你几个实用的解决方案,按通用性排序:


方案1:匹配字段任意位置的搜索词(最通用)

把通配符%同时加到搜索词的前面和后面,这样不管搜索词在code字段的哪个位置,都能被匹配到。不过一定要划重点:绝对不能直接把用户输入拼进SQL里,这会引发严重的SQL注入漏洞,必须用预处理语句(参数化查询)。

举个mysqli的实现例子:

// 假设你已经建立了mysqli连接,变量名为$conn
$search_term = $_REQUEST["term"];
// 前后都加通配符,实现模糊匹配
$param_term = "%{$search_term}%";

// 使用预处理语句避免SQL注入
$sql = "SELECT `id`, `code` FROM icd_ten_codes WHERE code LIKE ?";
$stmt = $conn->prepare($sql);
// 绑定参数,"s"表示参数为字符串类型
$stmt->bind_param("s", $param_term);
$stmt->execute();
// 获取查询结果集
$result = $stmt->get_result();

// 遍历输出结果
while ($row = $result->fetch_assoc()) {
    echo "ID: {$row['id']}, 内容: {$row['code']}<br>";
}

如果用PDO的话,写法类似:

// 假设PDO连接实例为$pdo
$search_term = $_REQUEST["term"];
$param_term = "%{$search_term}%";

$sql = "SELECT `id`, `code` FROM icd_ten_codes WHERE code LIKE :term";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':term', $param_term, PDO::PARAM_STR);
$stmt->execute();

$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 后续处理结果...

方案2:跳过固定长度的编码前缀(更精准)

如果你能确定所有编码都是固定长度(比如你的例子里是4位字符,A000、A001),可以用MySQL的SUBSTRING函数直接截取编码后的内容,再进行匹配。这样就只针对疾病名称部分搜索,不会误匹配编码内容。

比如编码是4位加1个空格,那么从第5个字符开始就是疾病名称:

$search_term = $_REQUEST["term"];
$param_term = "%{$search_term}%";

$sql = "SELECT `id`, `code` FROM icd_ten_codes WHERE SUBSTRING(code, 5) LIKE ?";
// 后续的预处理绑定、执行步骤和方案1一致

这个方案的优势是匹配更精准,但缺点是依赖固定的编码长度,如果以后编码格式变化(比如变成5位),这个查询就会失效。


为什么你之前试的_ 没用?

你之前用$param_term = $_REQUEST["term"] . '_ ';,这里的_是MySQL的「单个字符通配符」,_ 表示匹配1个字符加2个空格,但你的字段结构是4位编码加1个空格,这个通配符完全不符合字段格式,自然搜不到结果啦。


备注:内容来源于stack exchange,提问作者Cody Long

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:14:42