带有复选框的Java MYSQL选择[重复]

Posted

技术标签:

【中文标题】带有复选框的Java MYSQL选择[重复]【英文标题】:Java MYSQL select with checkbox [duplicate] 【发布时间】:2012-12-01 07:03:09 【问题描述】:

可能重复:PreparedStatement IN clause alternatives?

我想根据复选框选择从 mysql 中进行选择。 (复选框有 ID,从数据库中选择应该选择 where ID= ? -> 选择的 ID)

我用 MVC 架构来组织它:

在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

在 servlet 中我得到值

  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));


目前它只对一个 id 有效(因为我只有一个选择)。我怎样才能用复选框做到这一点?如何将“catids”转发到 bean 并创建 mysql-query 动态? (从 fragen 中选择 id,其中 kategorie_id= [ALL CHECKED BOXES])

提前致谢!!!!

【问题讨论】:

这就是你所需要的***.com/questions/178479/… 【参考方案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 注入的“最佳实践”方式。

【讨论】:

非常感谢!我的另一个问题是,将 servlet 中的 catids 提供给 bean:“FrageBean f=FragenBean.getRandomQuestionByCategory(catids);”如何将 String[] 变量提供给我的 bean?谢谢 为什么不将getRandomQuestionByCategory的形参声明为数组呢?【参考方案2】:

在您的班级中创建以下方法。放置正确的驱动程序类和 url 连接,并将 catids 作为字符串数组传递。

假设:我假设列 "quest_id" 是表 quest 中的 int 类型。

 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 + id;
                prefix = ",";
            

            query = queryStart + queryMiddle + queryEnd;
            System.out.println(query);

            Class.forName("DriverClass....................");
            Connection conn = DriverManager.getConnection("connection url ..................");
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(query);

            while (rs.next())
            
                int fragenid = rs.getInt("id");
                System.out.println("ID = " + fragenid);
            
        
    
    catch (Exception e)
    
        e.printStackTrace();
    

【讨论】:

非常感谢!我的另一个问题是,将 servlet 中的 catids 提供给 bean:“FrageBean f=FragenBean.getRandomQuestionByCategory(catids);”如何将 String[] 变量提供给我的 bean?谢谢 这实际上是一个危险的答案。想想“SQL 注入”!!! @StephenC = 如果您使用的是 java.sql.Sament,那么您是对的,那么它很容易受到 sql 注入的攻击。在将输入发送到数据库之前,您需要注意并验证您的输入。但它需要一些时间,这是因为 sunmicrosystem 尚未弃用此接口的原因。谢谢 @user1880437 请详细描述问题。我无法理解您的下一个问题。 @RaisAlam - 1) 如果您在验证输入时非常小心,则可以安全地使用 Statement(带参数),但使用 @987654322 更简单(并且暗示更安全) @。 2) Statement 不被弃用的原因是它有很多非常安全的用例。但这不是这些用例之一。

以上是关于带有复选框的Java MYSQL选择[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有复选框和所有可点击的Android ListView [重复]

带有选中和后标记的CSS表单复选框样式[重复]

带有链接的 HTML 表格行未选中复选框 [重复]

如何使用复选框将Android联系人添加到列表视图中[重复]

如何在管理面板中为多行添加带有批量操作(如 CRUD)的复选框 [重复]

带有单选按钮的 JAVA WorldWin 层树