5

ハードコーディングされた値なしで、この SQL ステートメントをどのように記述しますか?

resultSet = statement
    .executeQuery("select * from myDatabase.myTable where name = 'john'");
// this works

むしろ次のようなものがあります:

String name = "john"; 
resultSet = statement
    .executeQuery("select * from myDatabase.myTable where name =" + name);
// Unknown column 'john' in 'where clause' at
// sun.reflect.NativeConstructorAccessorImpl.newInstance0...etc...

前もって感謝します..

4

6 に答える 6

25

あらゆる種類の SQL インジェクション攻撃への扉を開くため、現在行っている方法で SQL クエリを作成するのはひどい考えです。これを適切に行うには、代わりにプリペアド ステートメントを使用する必要があります。これにより、現在明らかに発生しているあらゆる種類のエスケープの問題も解決されます。

PreparedStatement statement = connection.prepareStatement("select * from myDatabase.myTable where name = ?");    
statement.setString(1, name);    
ResultSet resultSet = statement.executeQuery();

これは高価な呼び出しであることに注意してprepareStatement()ください (アプリケーション サーバーがステートメント キャッシュやその他の同様の機能を使用している場合を除きます)。理論的には、ステートメントを一度準備してから、複数回再利用するのが最善です (ただし、同時にではありません)。

String[] names = new String[] {"Isaac", "Hello"};
PreparedStatement statement = connection.prepareStatement("select * from myDatabase.myTable where name = ?");

for (String name: names) {
    statement.setString(1, name);    
    ResultSet resultSet = statement.executeQuery();
    ...
    ...
    statement.clearParameters();
}
于 2013-01-28T15:18:46.793 に答える
4

文字列を一重引用符で囲んでいないため、コードを修正しました。

String name = "john";
String sql = "select * from myDatabase.myTable where name = '" + name + "'";
// Examine the text of the query in the debugger, log it or print it out using System.out.println
resultSet = statement.executeQuery(sql);

クエリを実行する前に、クエリのテキストを印刷/ログして、問題がないかどうかを確認します。

定数のみが変更される同様のクエリを多数実行する場合は、準備済みステートメントの使用を検討してください

于 2013-01-28T15:19:07.190 に答える
1

これはうまくいくはずです:

String name = "john"; 
resultSet = statement
    .executeQuery("select * from myDatabase.myTable where name =" + "'" + name + "'");
于 2013-01-28T16:50:07.147 に答える
0

次のことを試してください:

String name = "john"; 

resultSet = statement
      .executeQuery("select * from myDatabase.myTable where myTable.name = '" + name + "'");
于 2013-01-28T15:26:29.143 に答える
0

値を引用符で囲む必要があります (john ではなく 'john')...

于 2013-01-28T15:18:01.253 に答える
-1

name文字列であるため、値を引用符で囲みます。

"select * from myDatabase.myTable where name ='" + name + "'"
于 2013-01-28T15:18:51.450 に答える