PHP PostgreSQL PDO 使用LIKE查询时无法绑定参数问题求助
问题解决方法
两个报错对应不同的底层原因,可按以下步骤修复:
1. 调整参数绑定逻辑,解决HY093参数识别错误
该报错是因为部分PDO驱动无法正确解析嵌套在CAST、CONCAT等函数内部的命名占位符,你不需要在SQL语句中拼接通配符,提前把搜索词和百分号拼接完成后再绑定即可,修改后的基础代码如下:
// 提前拼接带前后通配符的搜索字符串 $search_wildcard = '%' . $search_term . '%'; $query = $this->db_connection->prepare(" SELECT `column` FROM database.table WHERE `column` LIKE :search_term GROUP BY `column` "); $query->bindValue(':search_term', $search_wildcard, PDO::PARAM_STR); $query->execute();
注意修正原代码中datbase的拼写错误,补全为database
2. 适配PostgreSQL驱动,解决42P18类型推断错误
42P18是PostgreSQL驱动独有的报错:当参数出现在函数内部时,PG无法自动推断参数类型。如果你确实需要强制类型转换,直接在占位符后指定类型即可,不要把占位符放在CAST函数内部:
$search_wildcard = '%' . $search_term . '%'; $query = $this->db_connection->prepare(" SELECT `column` FROM database.table WHERE `column` LIKE :search_term::varchar GROUP BY `column` "); $query->bindValue(':search_term', $search_wildcard, PDO::PARAM_STR); $query->execute();
3. 通用注意事项
- 不要给SQL中的占位符加单引号,加引号后PDO会将其识别为普通字符串,不会当做参数处理
- 用关键字作为字段名时,建议用反引号(MySQL)或双引号(PostgreSQL)包裹,避免语法冲突
- 如果你使用的是MySQL驱动,不需要额外加强制类型转换逻辑,上面第一版代码即可正常运行
内容的提问来源于stack exchange,提问作者I'm Root James
相关产品推荐
相关产品推荐

