PHP PostgreSQL PDO 无法使用 LIKE 绑定参数

Posted

技术标签:

【中文标题】PHP PostgreSQL PDO 无法使用 LIKE 绑定参数【英文标题】:PHP PostgreSQL PDO can't bind parameter with LIKE 【发布时间】:2021-11-20 00:45:14 【问题描述】:

使用 php PDO 尝试在数据库中进行简单的搜索。错误返回意味着PDO 无法确定参数类型。我在绑定它时将其明确指定为STR,并将其转换为查询字符串中的varchar。该查询在没有 CAST 的情况下在 mysql 中运行良好。

// Get course retry limit from database
$query = $this->db_connection->prepare("
SELECT column FROM datbase.table
WHERE
column LIKE CAST(CONCAT('%', :search_term, '%') as varchar)
GROUP BY column"
);
$query->bindValue(':search_term', $search_term, PDO::PARAM_STR);
$query->execute();

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: :search_term 

如果我像在直接查询调用中那样使用单引号明确转义查询中的字符串,我会收到另一个错误:

Fatal error: Uncaught PDOException: SQLSTATE[42P18]: Indeterminate datatype: 7 ERROR: could not determine data type of parameter $1

【问题讨论】:

【参考方案1】:

我通过将内部的 CAST 直接移动到参数来解决这个问题。不知道为什么需要它,因为 PHP 变量是一个已编码为大写的字符串。

这是正确的查询:

$query = $this->db_connection->prepare("
SELECT column FROM datbase.table
WHERE
column LIKE CONCAT('%', CAST(:search_term as VARCHAR), ' %')
GROUP BY column"
);
$query->bindValue(':search_term', $search_term, PDO::PARAM_STR);
$query->execute();

【讨论】:

以上是关于PHP PostgreSQL PDO 无法使用 LIKE 绑定参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP PDO 设置 PostgreSQL 架构的最佳替代方案

为啥 PHP PDO DSN 是 MySQL 与 PostgreSQL 不同的格式?

在 Centos 7.6 上为 PostgreSQL 安装 PHP 7.4 PDO 驱动程序

yii链接postgresql

将 PDO 与 PostgreSQL 一起使用时如何忽略问号作为占位符

具有扩展 PDOStatement 的 PDO 在设置为 NULL 时无法断开连接