如何在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
相关产品推荐
相关产品推荐

