【发布时间】: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