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

如何在PDO的LIKE子句中正确处理带撇号的字符串?

搞定PDO中LIKE搜索含撇号姓名的问题

嘿,我知道你现在卡在PDO用LIKE搜带撇号的姓名上了——明明数据存在,却搜不到结果,不过好在你硬编码的例子能跑,这说明问题出在动态处理的方式上,不是PDO本身的锅。

为啥会踩坑?

大概率是你在动态生成搜索词的时候,要么手动瞎转义了撇号,要么把通配符和参数绑定的逻辑搞混了,导致SQL里的匹配模式不对。

正确的打开方式

记住一个核心:别自己拼SQL,全靠PDO的参数绑定来处理特殊字符,撇号这种特殊符号PDO会自动帮你转义,完全不用你操心。直接看代码:

// 比如这是你从用户输入或者其他地方拿到的带撇号的搜索词,比如"A'"
$targetLastName = "A'";

// 先把搜索词和通配符拼好,比如要搜以A'开头的姓氏
$likePattern = $targetLastName . '%';

// 写SQL的时候,LIKE后面直接用占位符就行
$sql = "SELECT p.last_name, p.first_name FROM person p WHERE p.last_name LIKE ? AND p.first_name LIKE ?";

// 准备语句+执行,PDO会自动处理撇号的转义
$stmt = $pdo->prepare($sql);
// 第二个参数如果是任意名字,就传'%'就行,和你硬编码的逻辑一致
$stmt->execute([$likePattern, '%']);

// 拿结果就完事了
$matches = $stmt->fetchAll(PDO::FETCH_ASSOC);

为啥你硬编码的代码能跑?

你硬编码的"A'%能成功,是因为双引号包裹的PHP字符串里,撇号不需要额外转义,直接传到SQL里就是正确的匹配模式。而用参数绑定的话,PDO会自动处理所有特殊字符的转义,效果和你硬编码的完全一样,还更安全。

额外提醒

  • 最好把PDO的ATTR_EMULATE_PREPARES设为false,让数据库真正用预处理语句,这样兼容性和安全性都更高。
  • 千万别手贱用addslashes()或者老掉牙的mysql_real_escape_string()去处理搜索词,PDO的参数绑定已经把这些活干了,手动处理反而会让匹配模式出错,搜不到结果。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:35:08