2

重複の可能性:
PreparedStatement IN 句の代替案?

チェックボックスの選択に基づいてMYSQLから選択したい。(チェックボックスには ID があり、データベースからの選択では ID= ? -> 選択された ID を選択する必要があります)

MVC アーキテクチャで整理します。

  • in jsp は私のフォームです(これは動的であるため、さらに多くの可能性があります)

      <input type="checkbox" name="checkboxes" value="1">XY
      <input type="checkbox" name="checkboxes" value="2">XY
      <input type="checkbox" name="checkboxes" value="3">XY
    
  • サーブレットで値を取得します

      String[] catids  = request.getParameterValues("checkboxes");
    
      //Forward to bean -> doesnt work because catids is like an array
      FrageBean f=FragenBean.getRandomQuestionByCategory(catids);
    
  • 私の豆は:

    public static FrageBean getRandomQuestionByCategory(String catids) {
    ArrayList<Integer> alleFragenIds = new ArrayList<Integer>();
    
    DatabaseMetaData dbmd;
    Statement sql;
    Connection db = null;
    
    
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException ex) {
        System.out.println("driver not found");
    }
    try {
        db = DriverManager
                .getConnection("jdbc:mysql://localhost:3306/xyz?"
                + "user=root&password=xyz");
        dbmd = db.getMetaData();
    
        System.out.println("Connected with: " + dbmd.getUserName() + " | "
                + "Connection to: " + dbmd.getDatabaseProductName() + " " + dbmd.getDatabaseProductVersion() + " successful.\n");
        sql = db.createStatement();
    } catch (SQLException ex) {
        System.out.println("Error: " + ex);
    }
    
    try {
    
        String query = "select id from quest where quest_id=?";
        PreparedStatement prest = db.prepareStatement( query);
    
        prest.setString(1, catids);
    
    
        ResultSet rs = prest.executeQuery();
        ArrayList fragenliste = new ArrayList();
        while (rs.next()) {
            int fragenid = rs.getInt("id");
            alleFragenIds.add(fragenid);
    
        }
    
        rs.close();
        db.close();
    
    
    } catch (SQLException ex) {
        System.out.println("Error: " + ex);
    }
    
    Random r = new Random();
    int frageIndex = r.nextInt(alleFragenIds.size());
     System.out.println("Contents of al: " + alleFragenIds);
    return new FrageBean(alleFragenIds.get(frageIndex));
    
    }
    

現時点では、1 つの ID に対してのみ機能していました (選択肢が 1 つしかなかったため)。チェックボックスでそれを行うにはどうすればよいですか?「catids」を Bean に転送し、mysql-query ダイナミックを作成するにはどうすればよいですか? (kategorie_id= [ALL CHECKED BOXES] の fragen から ID を選択)

前もって感謝します!!!!

4

2 に答える 2

1

@RaisAlamの答えは、SQLインジェクションに対して脆弱であるため、危険です。修正されたバージョンは次のとおりです。

public  void displayRecords(String[] catids) {
    try {
        String queryStart = "select id from quest where quest_id in ( ";
        String queryMiddle = "";
        String prefix = "";
        String queryEnd = " )";
        String query = "";

        if (catids != null && catids.length > 0) {
            for (String id : catids) {
                queryMiddle = queryMiddle + prefix + "?";
                prefix = ",";
            }
            query = queryStart + queryMiddle + queryEnd;
            System.out.println(query);
            Class.forName(....);
            Connection conn = DriverManager.getConnection(....);
            PreparedStatement stmt = conn.createPreparedStatement(query);
            int i = 1;
            for (String id : catids) {
                stmt.setInt(i++, Integer.parseInt(id));
            }
            ResultSet rs = stmt.executeQuery(query);
            while (rs.next()) {
                int fragenid = rs.getInt("id");
                System.out.println("ID = " + fragenid);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

各パラメーターのプレースホルダーでPreparedStatementを使用することは、SQLインジェクションを回避するための「ベストプラクティス」の方法です。

于 2012-12-13T12:57:37.057 に答える