【问题标题】:Cannot bind value as INT with PDO pgsql driver无法将值绑定为 INT 与 PDO pgsql 驱动程序
【发布时间】:2021-06-11 23:47:59
【问题描述】:

我正在运行以下代码:

$pdo = new PDO('pgsql:host=localhost;port=5432', 'postgres', 'postgres');

$statement = $pdo->prepare("
    SELECT ST_AsText(
        ST_Transform(
            ST_GeomFromText('POINT(0 0)', 2154),
            ?
        )
    )
");

$statement->bindValue(1, 4326, PDO::PARAM_INT);
$statement->execute();

我收到以下错误:

PDOException: SQLSTATE[XX000]: Internal error: 7 ERROR: could not parse proj string '4326'

查看ST_Transform() 的定义,我可以看到问题在于PostgreSQL 将? 占位符值作为text 而不是integer,我可以通过在@987654326 中运行这些查询来重现它@命令行:

这很好用:

    SELECT ST_AsText(
        ST_Transform(
            ST_GeomFromText('POINT(0 0)', 2154),
            4326
        )
    )

这给出了错误:

    SELECT ST_AsText(
        ST_Transform(
            ST_GeomFromText('POINT(0 0)', 2154),
            '4326'
        )
    )

因此,pgsql PDO 驱动程序很可能会忽略赋予bindValue()PDO::PARAM_INT 类型,并始终将参数作为字符串传递。我尝试打开和关闭PDO::ATTR_EMULATE_PREPARES,结果相同。

这是 PDO pgsql 驱动程序的已知问题吗?还是我遗漏了什么?

【问题讨论】:

  • 只是想法:无论传递什么,都将第二个参数中的值转换为查询中的int?粗略......它应该作为“让你修复”。此外,您是否尝试过查询和绑定中的命名参数。 postgres 驱动程序可能允许将其作为标准。我没有postgres,所以没有尝试过这些。这只是我会尝试的事情。

标签: php postgresql pdo


【解决方案1】:

根据 PDO pg 驱动程序的source code,驱动程序为每个参数添加引号,无论其类型如何。

这是一个非常古老的行为,甚至是 reported as a bug,但由于这是驱动程序的预期行为,因此报告被驳回。

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多