2010-12-16 16 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'"; 

をそれは「列 『ブリスベン』が存在しない」と述べた(ブリスベンは、挿入する最初の都市であります)私は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... ^" 

答えて

1

リテラル値を挿入しようとしています。 where句は意味をなさない。

insertについて、あなただけselectを返しているものを制限するinsert ... selectwhereを使用することができます。

実際には、既存のレコードupdateにしたいですか?

1

私にとっては、列が存在しないというエラーが表示された場合、それは通常、私が何かを間違って引用した(または全くない)というヒントです。これは名前だけのフィールドを更新するためにあなたの試みからのエラーメッセージによって裏付けされ

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

(カラットは、クエリ内の問題領域に右指している必要があります。)

値あなたはあなたのUPDATEステートメントのnameフィールドに渡しています。これは、あなたがairport_idに渡している値のように引用符で囲む必要があります。 (私はxとyが整数であると推測していますが、これは引用を必要としないため、フィールドを更新しようとするとエラーが発生しません)あなたが街に渡す値があまりにも引用符で囲む必要がありますことを、別の野生の推測を取るが、あなたはおそらくすぐにそれを把握します:))

最終結果拡大UPDATEは、次のようなものになります。

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

クエリ文字列は引用符で囲まれていません。 SQLクエリを構築するためにPHP変数補間を使用しないでください。これは、スクリプトやアプリケーションをSQLインジェクション攻撃に対して脆弱にするためです。

代わりに、パラメータ化されたクエリを使用します。したがって、上記のクエリは次のようになります。$parametersはパラメータの配列である

$result = pg_query_params($query, $parameters) 

:次に

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

、あなたは必要なパラメータを渡す機能pg_query_paramsを呼び出し、パラメータ化クエリを使用します。

$ nプレースホルダには補間がないため、$クエリ文字列は一重引用符です。これにより、何らかの間違い(最初に文字をバンプすることによって実際の変数名を入力するなど)が防止され、SQL注入の可能性が排除されます。

+0

投稿を「削除」、「編集」、「元に戻す」ことができます。回答時間に影響したり、他の副作用があるかもしれません。 -/ –

+0

ああ、ありがとう!それは知らなかった。私は答えの時間を気にしない、私はちょうど打ちながら偶然によってTab +スペースを打つ... –

+0

@フランク:編集をありがとう。私はそれをキャッチしなかった、私は他の1つを見つけた... :) –