使用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
相关产品推荐
相关产品推荐

