PHP优化MySQL LIKE查询PDO预处理语句无返回结果问题求助
问题根源
核心问题为传入的$term参数额外携带了单引号,与PDO参数绑定逻辑冲突:
- 原始拼接SQL的版本中,带单引号的
$term(格式为'%search term%')拼入语句后,实际执行条件为LIKE '%search term%',符合MySQL LIKE语法要求,可正常返回结果。 - 改用参数绑定后,PDO会自动对传入字符串做转义、引号包裹处理,此时携带单引号的
$term会被转义为\'%search term%\,最终执行条件变为LIKE '\'%search term%\'',等同于匹配内容本身包含单引号、百分号和搜索词的记录,因此返回空结果。
解决方案
- 调整参数传入规则:调用
get_searched_ipinfo前,无需为搜索词添加外层单引号,仅保留两侧百分号即可,即传入函数的$term格式为%search term%。 - 可对代码做进一步简化优化,参考代码如下:
public function get_searched_ipinfo($term){ // 若需在函数内统一处理%包裹,可打开下一行注释,调用方无需再处理 // $term = '%' . trim($term, '%') . '%'; $stmt = $this->connect()->prepare('SELECT * FROM ipinfo WHERE office LIKE ? OR vlanID LIKE ? OR vlanRules LIKE ? OR ipType LIKE ? OR ipAddress LIKE ? OR ipCIDR LIKE ? OR ipMask LIKE ? OR hostname LIKE ? OR isp LIKE ? OR notes LIKE ? OR url LIKE ?'); $stmt->execute(array_fill(0, 11, $term)); return $stmt->fetchAll(); }
若需保留命名占位符写法,只需确保传入的$term无多余外层单引号,原有写法即可正常运行。
内容的提问来源于stack exchange,提问作者Don Abel
相关产品推荐
相关产品推荐

