PHP/PDO 无法绑定(bind) 'TIMESTAMP WITHOUT TIME ZONE' 值

标签 php postgresql pdo

我正在尝试使用 PHP 的 PDO 库针对我的 PostgreSQL 数据库准备和执行查询,但它没有按预期工作。

当使用命令行 psql 客户端时,如下所示:

=> SELECT TIMESTAMP WITHOUT TIME ZONE '2013-01-01 00:00:00';

      timestamp      
---------------------
 2013-01-01 00:00:00
(1 row)

但是,我似乎无法使用 PHP/PDO 执行相同的操作。以下代码:

<?php
try
{
    $db = new PDO(...);
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $db->prepare("SELECT TIMESTAMP WITHOUT TIME ZONE ?;");

    $stmt->bindValue(1, "2013-01-01 00:00:00", PDO::PARAM_STR);
    $stmt->execute();

    $row = $stmt->fetch();

    echo $row[0];
}
catch(PDOException $e)
{
    die($e->getMessage());
}
?>

产生以下错误:

SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1" LINE 1: SELECT TIMESTAMP WITHOUT TIME ZONE $1; ^

我知道 PostgreSQL 的 to_timestamp() 函数,该函数确实 有效,但它返回的是 TIMESTAMP WITH TIME ZONE - 问题所在因为 to_timestamp 不是不可变函数(即不根据服务器的时区配置返回不同的结果)。

同样的,绑定(bind)下面的就如我所愿,可以准备成功:

SELECT to_timestamp(?, 'YYYY-MM-DD HH24:MI:SS')::TIMESTAMP WITHOUT TIME ZONE;

但我希望有更简洁/更简洁的内容。

我是否只是错误地准备了我的语句,或者,如果这永远行不通,从我的应用程序中的字符串到 PostgreSQL 中的 TIMESTAMP WITHOUT TIME ZONE 的替代方法是什么?

最佳答案

尝试直接转换它,加上括号以避免混淆 PDO/Postgres:

(?)::timestamp

关于PHP/PDO 无法绑定(bind) 'TIMESTAMP WITHOUT TIME ZONE' 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19437629/

相关文章:

php - AJAX 不返回任何数据

postgresql - Sequelize 迁移工具找不到 config.json 中定义的架构

python - 使用 SqlAlchemy 和 PostgreSQL 更新 .. LIMIT 1

postgresql - 使用 JDBC,如何在 postgres 文本中搜索问号?

php - mysql PDO 更新查询错误 1062 key '4146' 的重复条目 'PRIMARY'

php - PDO 绑定(bind)偏移量

php - 消除重复条目的最优雅的方法

php - 如何让元素只出现在移动主页上(wordpress)

php - array_splice() 在循环内无法正常工作

php - 如何检查MySQL中是否存在某行? (即检查 MySQL 中是否存在用户名或电子邮件)