我无法让这个简单的查询执行。我正在使用无名参数化查询和Postgres + PostGIS。 PDO语句错误信息如下:
Array
(
[0] => 42601
[1] => 7
[2] => ERROR: syntax error at or near "$6" at character 28
)
PostGreSQL中的语法错误是什么,这让我感到愚蠢,我找不到它......
以下是有问题的查询
$sql = "SELECT ?,?,?,?,?
FROM ?
WHERE ST_Distance((SELECT the_geom FROM polyon_table WHERE gid = ? ), ?.the_geom) < 0.1";
然后我准备它...... $stmt = $dbh->prepare($sql);
。来自$ dbh的errorInfo给出了代码00000(成功)。
$params
如下:
array(8) {
[0]=>
string(4) "area"
[1]=>
string(9) "perimeter"
[2]=>
string(6) "lat"
[3]=>
string(6) "lon"
[4]=>
string(8) "data"
[5]=>
string(10) "myTable"
[6]=>
int(8)
[7]=>
string(10) "myTable"
}
然后我执行并传递$params array
。 $stmt->execute($params)
我打印错误代码并获取此信息:
Array
(
[0] => 42601
[1] => 7
[2] => ERROR: syntax error at or near "$6" at character 28
)
$stmt->debugDumpParams();
如下:
SQL: [112] SELECT ?,?,?,?,? FROM ? WHERE ST_Distance((SELECT the_geom FROM polygon_table WHERE gid = ? ), ?.the_geom)< 0.1
Params: 8
Key: Position #0:
paramno=0
name=[0] ""
is_param=1
param_type=2
...
// shortened it to save space.... all of them look the same, except 6, which has param type = 1
Key: Position #7:
paramno=7
name=[0] ""
is_param=1
param_type=2
所以,在尝试了几件事之后(单独循环和绑定params,将$params
中的int(8)更改为字符串等)。我将sql复制并粘贴到终端中以运行查询。我非常小心地按照$params
的确切顺序替换了所有变量,并且运行正常。
我的结论是第六个变量(整数)没有正确插入。任何想法为什么会发生这种情况?
希望这种错误不是一个重复的问题。我经历了3页问题。
答案 0 :(得分:6)
您可以使用查询参数替换文字值,但不能替换表名,列名,值列表,表达式,SQL关键字等。
以这种方式思考:在prepare
时,SQL解析器必须知道您的查询使用的所有语法,以及您正在使用的表和列。否则,它会如何知道您的数据库中是否存在这些表和列,或者它是否应该给您一个错误?它应该在准备时给你任何与不存在的表相关的错误,而不是在执行时。
因此,当您为第6个参数值提供字符串“myTable”时,就像执行查询一样:
SELECT ... FROM 'myTable' ...
也就是说,它不是表名,而是引用的字符串文字。这在SQL中没有任何意义;这是语法和语义的错误。
答案 1 :(得分:1)
我不完全确定,但我不认为您可以参数化表名,我甚至不确定您是否可以使用列,但我还没有对其进行测试。
另外,不确定?.column
是否有效。我不认为它只是用字符串替换参数。