1

I have a table called Produkt and in this table there are several products called test.

When I want to do that code:

public Produkt findByName(String name) throws SQLException{
    log.error("Enter findByName with parameters: " + name);
    PreparedStatement ps;
    ResultSet rs = null;
    String query = "SELECT * FROM Produkt WHERE name=" + name;
    ps=hsqlmanager.getConnection().prepareStatement(query);
    rs = ps.executeQuery();
    ps.close();
    if(rs.next()) return(new Produkt(rs));
    else return(null);
}

it always gives me an sql error:

Exception in thread "main" java.sql.SQLSyntaxErrorException: user
lacks privilege or object not found: TEST   at
org.hsqldb.jdbc.Util.sqlException(Unknown Source)   at
org.hsqldb.jdbc.Util.sqlException(Unknown Source)   at
org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)    at
org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)     at
dao.DAOProdukt.findByName(DAOProdukt.java:157)  at
dao.test_produkt_dao.main(test_produkt_dao.java:23)

why? i appreaciate your answer!!!

UPDATE:

Why are the PS incorrectly used? Pls tell me so that I can learn from that?

4

3 に答える 3

5

nameパラメータを引用符で囲まずに、無効な SQL ステートメントを生成しています

String query = "SELECT * FROM Produkt WHERE name='" + name + "'";
                                                 ^--      ^^^^^^
于 2012-09-26T16:16:32.903 に答える
1

SQL 内に値を含めるべきではありません。引用に十分注意しないと、SQL インジェクション攻撃を招きます。(文字列以外の値については、潜在的に誤った文字列変換も導入されます。ああ、コードとデータを効果的に混在させます。SQL の変数値に対して「いいえ」と言うだけです...)

代わりに、パラメータを使用してPreparedStatementから、パラメータの値を探している名前に設定します。例えば:

String query = "SELECT * FROM Produkt WHERE name = ?";
PreparedStatement ps = hsqlmanager.getConnection().prepareStatement(query);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();

例外がスローされた場合にリソースがリークしないようclose()に、ブロック内にステートメントも含める必要があることに注意してください。finally

HSQLDB 固有の詳細については、HSQLDB ユーザー ガイドのデータ アクセスと変更の部分を参照してください。より一般的な情報については、プリペアド ステートメントに関する JDBC チュートリアルを参照してください。

于 2012-09-26T16:24:42.917 に答える
1

SQL インジェクションを防ぐには、PreparedStatements を正しく使用する必要があります。また、必要に応じてパラメーターを引用符で囲みます。

String query = "SELECT * FROM Produkt WHERE name=?";
PreparedStatement ps=hsqlmanager.getConnection().prepareStatement(query);
ps.setString(1, name);
于 2012-09-26T16:23:39.807 に答える