首页 > 解决方案 > PHP PDO 无法绑定浮点参数以按整数字段搜索

问题描述

我有一个与 PDO 和 Postgres 相关的问题:

当我尝试按字段搜索float值时出现错误:integer

$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > ?');
$stmt->execute([9.5]);

这也不起作用:

$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > ?');
$stmt->execute(['9.5']);

这也不起作用:

$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > ?');
$param = 9.5;
$stmt->bindParam(1, $param, \PDO::PARAM_INT);
$stmt->execute();

错误:Invalid text representation: 7 ERROR: invalid input syntax for integer: "9.5"

这是设计使然还是 postgres/pdo 不兼容?

顺便说一句,当我内联不带引号的浮点数时它会起作用:

$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field > 9.5');
$stmt->execute();

而且 postgres 不会对 int 进行类型处理,因为我在运行这些查询时会看到不同的记录:

$con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field < 5.1');
$con->prepare('SELECT t.* FROM my_table t WHERE t.integer_field < 4.9');
#given that integer_field is 5

版本:PHP 7.2.19 PostgreSQL 10.4

标签: phppostgresqlpdo

解决方案


过了一会儿,我弄清楚了工作查询:

$stmt = $con->prepare('SELECT t.* FROM my_table t WHERE CAST(t.integer_field AS FLOAT) > ?');
$stmt->execute([9.5]);

如果您有替代解决方案,请不要犹豫发布其他答案!


推荐阅读