以下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... ^"
答案 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 ...