如何使用 PDO 在 PHP 中绑定 bigint 值?

Posted

技术标签:

【中文标题】如何使用 PDO 在 PHP 中绑定 bigint 值?【英文标题】:How do I bind a bigint value in PHP using PDO? 【发布时间】:2018-01-24 18:39:45 【问题描述】:

我在 PostgreSQL 数据库中有一个大整数列。

到目前为止,我还没有找到一种在 php 中制定 PDO 插入的方法。

PHP Predefined Constants 仅列出 PDO::PARAM_INT。当我在我的声明中使用它时,我收到以下错误。请注意,即使我没有在 bindValue 语句中包含数据类型,我也会遇到相同的错误。据我了解,通过省略类型 PHP 正在使用基于变量类型的PDO::PARAM_INT

带有消息“SQLSTATE[22003]”的未捕获异常“PDOException”:数值超出范围:7 错误:值“2978878787878787878”;超出 index.php:163 中整数类型的范围

How do I store a BIGINT in mysql using PDO? 是一个问题here,它谈到了同样的问题。但是,他们直接使用字符串作为数据库列类型。虽然这是一个很好的解决方法,但它不会考虑您是否无法更改数据库类型。

有没有一种方法可以在 PHP 中将 bigint 与 PDO 结合使用而无需修改数据库?

示例代码

$query  =   "INSERT INTO clients ";
$query  .=  "(timestamp, name, value) ";
$query  .=  "VALUES (now(), :name, :value) ";
$query  .=  "RETURNING id";

$name = "Bob Probert";
$value = 2978878787878787878; // note this is less than bigint max of 9223372036854775807

$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->bindValue(':value', $value, PDO::PARAM_INT);

表格

                                                           Table "db.clients"
    Column     |            Type             |                      Modifiers                       | Storage  | Stats target | Description 
---------------+-----------------------------+------------------------------------------------------+----------+--------------+-------------
 id            | integer                     | not null default nextval('tickets_id_seq'::regclass) | plain    |              | 
 timestamp     | timestamp without time zone |                                                      | plain    |              | 
 name          | character varying(40)       |                                                      | extended |              | 
 value         | bigint                      | not null                                             | plain    |              | 
Indexes:
    "tickets_pkey" PRIMARY KEY, btree (id)

【问题讨论】:

您确定它是您数据库中的 BIGINT 吗?你能展示你的表架构吗? @aynber +1,异常提到字段的整数类型,而不是 bigint is out of range for type integer' in 这告诉您您的数据类型是INT 而不是您声称的BigINT 表已添加到原始帖子中。 可能有助于了解一些事情。您使用的是 64 位硬件吗?操作系统是 64 位的吗?你用的是什么版本的php?什么 echo PHP_INT_MAX;给你? 【参考方案1】:

我不知道这是否适用于 PostgreSQL,但对于 MySQL,将这些值绑定为字符串有效。

【讨论】:

以上是关于如何使用 PDO 在 PHP 中绑定 bigint 值?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 PHP 中绑定 SQL 变量?

如何在 PDO 中为准备好的查询绑定参数?

PHP PDO - 绑定表名? [复制]

在 PHP 中将十进制/双精度/浮点值与 PDO 绑定的最佳方法是啥?

如何将 ISO8601 TSQL DATETIME 参数与 PDO 绑定?