2010-12-16 94 views
1

以下Postgres查詢有什麼問題?Postgres INSERT INTO查詢錯誤?

INSERT INTO kayak.airports(name, x, y, city) VALUES($name, $x, $y, $city) 
WHERE airport_id='$airport_id 

EDIT(感謝甄子丹幫助我取得進步): 我想:

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

它說「列‘布里斯班’不存在」(布里斯班是要插入的第一座城市)除了「x = $ x」之外,我取出了SET和WHERE之間的所有內容,併成功插入了這些內容。同上「y = $ y」。當只留下名稱= $名稱它說

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

回答

1

您試圖插入文字值。 A where子句沒有意義。

對於insert,您只能在insert ... select中使用where來限制select返回的內容。

也許你真的想要update一個現有的記錄?

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 ... 
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是參數數組。

另請注意,$查詢字符串是單引號的,因爲$ n佔位符不適用於插值。這可以防止出現任何錯誤(例如,通過首先敲擊字母來輸入實際變量名稱),並消除SQL注入的可能性。

+0

您可以「刪除」,「編輯」,然後「取消刪除」帖子。它可能會影響答案時間或者有其他副作用: -/ – 2010-12-17 01:39:18

+0

哦,謝謝!我不知道。我不在意答案時間,我只是在輸入時偶然地打了TAB +空格... – 2010-12-17 01:45:43

+0

@Frank:感謝您的編輯。我沒有明白,但我找到了另一個...... :) – 2010-12-17 07:56:50