2016-07-12 3 views
0
query = "UPDATE personal_details SET '" + field + "' = '" + edit + "' WHERE associate_id = '" + associate_id + "'"; 

ここで私のテーブル名はpersonal_detailsであり、私はテーブルの列名を変数filedのパラメータとし、その新しい値を編集に取ります。このコードはJavaにあります。私がアクセスしているデータベースはPostgreSQLにあります。このように列名を渡すことはできますか?

+2

、それが働くだろうが、あなたはこれらの変数があると仮定すると、SQLインジェクション攻撃に対して広く開か次のようになります。その代わりに、たとえば、パラメータを持つPreparedStatementを使用しますユーザー入力から来る –

+0

はい、このようなクエリを渡すことができます。あなたはこれに関する問題に直面していますか? –

+0

はい。私は一重引用符を削除しました。 query = "UPDATE personal_details SET" +フィールド+ "=" "+編集+" 'WHERE associate_id =' "+ associate_id +" '"; –

答えて

0

クエリを含む文字列を作成しています。データベースは、文字列がどのように構築されているのか分かりません。最終的には、解析、コンパイル、実行される文字列を渡すだけです。そう、はい、このようにクエリを構築することができます。

パラメータとして列名またはテーブル名をクエリに渡すことはできません。パラメータとして他の値をクエリに渡すことをお勧めします。

1

あなたはプレーンな連結を使用して文字列を構築することができますが、より多くの推奨方法があります。

  1. 使用のStringBuilder/StringBufferをあなたがループ内の文字列を連結特別な場合には、プログラム速度を最適化するための文字列を構築する際に、
  2. 最も推奨される方法は、PreparedStatementを使用してパラメータ値を入力することです。参照:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
+0

StringBuilderの使用は、クエリ構築にはお勧めできません。 StringBufferは推奨されていません。もう使用しないでください。 –

+0

@ adriaan-kosterは、廃止予定のStringBufferと合意し、StringBuilderが最適なソリューションではないという点についても同意しました。私はちょうど可能な方法のほとんどを示しました。個人的には**私は** PreparedStatements **を使うのが好きです。 – lospejos

1

このようなクエリは作成しないでください。 @Roryが指摘したように、セキュリティ上の問題のために悪い習慣です。あなたがこれを行うことができます

String updateTableSQL = "UPDATE DBUSER SET USERNAME = ? WHERE USER_ID = ?"; 
PreparedStatement preparedStatement = dbConnection.prepareStatement(updateTableSQL); 
preparedStatement.setString(1, "mkyong_new_value"); 
preparedStatement.setInt(2, 1001); 
// execute insert SQL stetement 
preparedStatement .executeUpdate(); 

mkyongからの引用)

関連する問題