【问题标题】:PHP/PDO can't bind 'TIMESTAMP WITHOUT TIME ZONE' valuesPHP/PDO 无法绑定 'TIMESTAMP WITHOUT TIME ZONE' 值
【发布时间】:2013-10-26 14:05:16
【问题描述】:

我正在尝试使用 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 不是一个不可变函数(即不会根据服务器的时区配置返回不同的结果)。

同样的,绑定下面的内容就是我想要的,并且可以成功准备:

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

但我希望有一些更简洁/不那么冗长的东西。

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

【问题讨论】:

    标签: php postgresql pdo


    【解决方案1】:

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

    (?)::timestamp
    

    【讨论】:

    • 这很好用。谢谢!我很想针对 PDO 提交错误 - 或者语法 timestamp '2013-01-01 00:00:00' 出于某种原因不打算工作?
    • 我不确定它是否打算在没有显式转换运算符的情况下工作,即使那样你可能仍然需要在 Postgres 和其他适配器中使用括号(需要尝试验证,我承认我没有't.)
    猜你喜欢
    • 2012-04-04
    • 2021-11-12
    • 2011-07-22
    • 1970-01-01
    • 2023-01-10
    • 2013-11-25
    • 1970-01-01
    • 2011-03-14
    • 2020-09-20
    相关资源
    最近更新 更多