0

PreparedStatementを作成しようとしています:

stmt = conn.prepareStatement("SELECT POLBRP, POLTYP, POLNOP, INCPTP, TRMTHP, " +
            "CLTKYP , CANDTP, POLSTP, EXPRYP, OINCPP, CANRNP, PAYMDP,
            KCNFLP, KCRTSP, KACADP, KSCHMP, EXPRYP FROM " 
            + POLHDR + " WHERE POLNOP = " + idNumber + 
            " AND POLBRP = " + branch + " AND POLTYP = " + product + 
            " AND OINCPP <= "+date );

そして、これはSQLExceptionをスローします:[SQL0206]列ADは指定されたテーブルにありません。

select句で列ADを指定したことがないため、列ADがどこから取得されているのかわかりません(完全に盲目で愚かでない限り)

誰か助けてもらえますか?

4

3 に答える 3

4

変数が文字列の場合、たとえばbranch

" AND POLBRP = " + branch + " ...

その後、値を引用するのを忘れました

" AND POLBRP = '" + branch + "' ...

しかし、実際の解決策はプレースホルダーを使用することです

... AND POLBRP = ? ...

これにより、このような問題を完全に防ぐことができます。これが、PreparedStatementの設計対象です。

于 2013-01-30T14:58:49.433 に答える
1

JavaでのSQLインジェクションの防止は、次の適切な使用法を示していますPreparedStatement

プリペアドステートメントプリペアドステートメントに引数として渡される変数は、JDBCドライバーによって自動的にエスケープされます。

例:ps.1

String selectStatement = "SELECT * FROM User WHERE userId = ? ";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);
prepStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();

同じソースから、同じセクションで次のようになります。

プリペアドステートメントはSQLインジェクションに対する防御に役立ちますが、プリペアドステートメントの不適切な使用によるSQLインジェクション攻撃の可能性があります。以下の例は、入力変数がプリペアドステートメントに直接渡され、それによってSQLインジェクション攻撃への道を開くようなシナリオを説明しています。

例:ps.2

String strUserName = request.getParameter("Txt_UserName"); 
PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");
于 2013-01-30T15:00:02.897 に答える
1

クエリを次のように変更してみてください。

SELECT
  POLBRP,
  POLTYP,
  POLNOP,
  INCPTP,
  TRMTHP,
  CLTKYP,
  CANDTP,
  POLSTP,
  EXPRYP,
  OINCPP,
  CANRNP,
  PAYMDP,
  KCNFLP,
  KCRTSP,
  KACADP,
  KSCHMP,
  EXPRYP
FROM TableName WHERE POLNOP = ? AND POLBRP = ? AND POLTYP = ? AND OINCPP <= ?";

次に、以下を使用します。

stmt.setString(1, "ValueOfPOLNOP");
...

クエリが実行されると、 PreparedStatement#setString(int、String)メソッド?に渡した値に置き換えられます

于 2013-01-30T15:02:18.020 に答える