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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:36:04