PDO应用无法检索TeamName含&符号的记录,如何处理查询?
解决PDO预处理查询无法检索含&符号记录的问题
嘿,我看了你的代码,其实你的PDO预处理写法本身完全没问题——参数绑定已经帮你处理了所有特殊字符的转义,包括&和单引号,所以根本不需要额外手动sanitise(手动处理反而容易搞出问题)。出现这个情况大概率是字符编码不一致或者$teamname变量在传递到这段代码前被意外转义了,给你几个排查方向:
检查PDO连接的字符编码
很多时候这种匹配失败都是编码不统一导致的。确保你在创建PDO连接时指定了正确的字符集(比如UTF-8),比如:$dbc = new PDO('mysql:host=你的主机地址;dbname=你的数据库名;charset=utf8mb4', '用户名', '密码');同时记得确认你的
Teams表中TeamName字段的字符集也是utf8mb4(或者和连接编码完全一致),编码不匹配会导致字符串存储和查询时的隐式转换,进而匹配失败。检查
$teamname的实际值
有可能在这段代码之前,$teamname被做了不必要的转义处理:- 如果它是从URL参数获取的,可能被自动
urlencode()过,导致&变成了%26,这时候去匹配数据库里的自然&肯定找不到。你可以先打印看看变量的实际内容:
如果确实是URL编码后的结果,用var_dump($teamname);urldecode()还原即可:$teamname = urldecode($teamname); - 要是之前用了
htmlspecialchars()或者htmlentities()处理,&会被转成&,这时候需要用htmlspecialchars_decode()还原:$teamname = htmlspecialchars_decode($teamname);
- 如果它是从URL参数获取的,可能被自动
排除其他隐性处理
检查一下代码里有没有其他地方对$teamname做了字符串替换、过滤之类的操作,这些都可能改变原始的字符串内容,导致匹配不上。
总的来说,你的预处理逻辑是正确的,问题不在PDO的参数绑定本身,重点放在编码一致性和变量的原始值检查上就好。
内容的提问来源于stack exchange,提问作者John Watt
相关产品推荐
相关产品推荐

