【问题标题】:PHP PDO can't bind a float parameter to search by integer fieldPHP PDO 无法绑定浮点参数以按整数字段搜索
【发布时间】:2019-12-10 08:30:19
【问题描述】:

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

当我尝试通过integer 字段搜索float 值时遇到错误:

$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

【问题讨论】:

  • 整数不能包含小数。所有整数都是整数(所有自然数都是整数),但并非所有整数都是整数。
  • 是的,但我可以查询“WHERE t.integer_field/2 > 9.5”
  • 这可能与您在execute() 中传递变量的方式有关。我怀疑如果您将 9.5 括在引号/单引号中,它会起作用,但我对此并不完全确定,因为您将检查字符串是否为 &gt;
  • execute 所有值都被视为 PDO::PARAM_STR。尝试使用bindParamPDO::PARAM_INT
  • 我会尝试根据php.net/manual/en/pdo.setattribute.phpPDO::ATTR_EMULATE_PREPARES 设置为false,因为我认为您的错误是在SQL 有机会到达数据库并保留$stmt-&gt;bindParam(1, $param, \PDO::PARAM_INT); 代码之前引起的

标签: php postgresql pdo


【解决方案1】:

过了一会儿,我找到了有效的查询:

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

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

【讨论】:

  • 这是与ATTR_EMULATE_PREPARES 切换为真还是假?
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2017-01-31
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多