0

検索クエリを実行し、結果をJTable. nameageIDJComboBoxなど、検索するフィールドをユーザーが選択できる場所があります。

これは私のコードです。

try {
    Class.forName("com.mysql.jdbc.Driver");    
    String connectionUrl = "jdbc:mysql://localhost/db?" + "user=root&password=";
    con = DriverManager.getConnection(connectionUrl);
    Statement state = con.createStatement();

    ResultSet result = state.executeQuery("SELECT * FROM db.atelier where '" + 
        jComboBox1.getSelectedItem().toString() + "'='" +
        jTextField1.getText().toString() + "'");

    ResultSetMetaData resultMeta = result.getMetaData();

    while(result.next()){
        model.addRow(new Object[]{result.getObject(1),result.getObject(2)});      
        model.setDataVector(
            new Object[][]{{result.getObject(1),result.getObject(2)},{}},                           
            new Object[]{resultMeta.getColumnName(1),resultMeta.getColumnName(2)});
        }

    jPanel1.revalidate();
    model.fireTableDataChanged();
    this.repaint();
    state.close();
}
catch (SQLException e){
    System.out.println("SQL Exception: "+ e.toString());
}
catch (ClassNotFoundException cE){
    System.out.println("Class Not Found Exception: "+ cE.toString());
}

con=null;
4

2 に答える 2

2

コンボボックスの選択項目を囲む一重引用符を削除して、文字列リテラルではなくフィールド名にする必要があります。さらに、テキスト フィールドが?SQL 文字列に置き換わる追加パラメータとして与えられる PreparedStatement の方が優れています。これにより、テキスト フィールドに入力された一重引用符 (およびバックスラッシュなど) がエスケープされます。

于 2012-04-17T22:38:51.600 に答える
1

ところで、検索クエリを作成している方法では、アプリケーションが SQL インジェクションにさらされるだけです。

于 2012-04-17T22:26:13.307 に答える