Postgres INSERT INTO查询bug?

时间:2010-12-16 23:45:33

标签: postgresql insert

以下Postgres查询出了什么问题?

INSERT INTO kayak.airports(name, x, y, city) VALUES( $name, $x, $y, $city) 
WHERE airport_id='$airport_id
编辑(感谢Donnie帮助我取得进步): 我试过了:

$query="UPDATE kayak.airports SET name=$name, x = $x, y = $y, city = $city
WHERE airports.airport_id='$airport_id'"; 

它说“列'布里斯班'不存在”(布里斯班是第一个插入的城市。)我取出了SET和WHERE之间的所有内容,除了“x = $ x”并且已成功插入。同上“y = $ y”。当只留下名字= $ name时,它说

"Query failed: ERROR: syntax error at or near "International" LINE 1: UPDATE kayak .airports SET name=Brisbane International WHERE... ^"

3 个答案:

答案 0 :(得分:3)

未引用您的查询字符串。不要使用PHP变量插值来构建SQL查询,因为这会使您的脚本或应用程序容易受到SQL注入攻击。

相反,使用参数化查询。因此,您的上述查询将变为:

$query = 'UPDATE kayak.airports SET name = $1, x = $2, y = $3, city = $4'.
         'WHERE airports.airport_id = $5';

然后,您将使用参数化查询调用函数pg_query_params来传递所需的参数:

$result = pg_query_params($query, $parameters)

$parameters是参数数组。

另请注意,$ query字符串是单引号,因为 $ n 占位符不适用于插值。这可以防止任何错误(例如通过首先碰撞字母来键入真实的变量名称)并消除SQL注入的任何可能性。

答案 1 :(得分:1)

您正在尝试插入文字值。 where条款毫无意义。

对于insert,您只能在where中使用insert ... select来限制select返回的内容。

也许您真的希望update现有记录?

答案 2 :(得分:1)

对我来说,如果我收到一个不存在列的错误,通常是我引用错误(或根本没有)的错误。

您尝试仅更新名称字段时出现的错误消息证实了这一点:

ERROR: syntax error at or near "International" LINE 1:

(克拉应该指向查询中的问题区域。)

您要传递到UPDATE语句中名称字段的值需要引用,就像您传递给airport_id的值一样。 (我将猜测x和y是整数,这不需要引用,这就是为什么当你尝试更新那些字段时没有出现错误的原因。)(我要去另外一个猜测,你传递给城市的价值也需要引用,但你很快就会想到这一点。:))

最终结果扩展UPDATE看起来像这样:

UPDATE kayak.airports
SET name='Brisbane International', x = 123, y = 456, city = 'Brisbane'
WHERE ...