You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java While循环条件校验异常:重复Rank仍被插入问题求助

问题分析与解决方案

核心问题

  1. 语法错误:if语句未闭合},导致else作用域混乱,即便触发重复提示,后续插入逻辑仍会执行
  2. 逻辑错误:在while(rs.next())循环内直接处理else插入,只要循环中某条记录不匹配目标职级,就会执行插入,而非等所有记录检查完毕确认无重复再操作
  3. SQL注入风险:原查询用字符串拼接构造SQL,存在安全隐患

修正后的代码

// 用参数绑定重构查询SQL,避免注入
String valChecker = "SELECT * FROM `committee_memba` WHERE (Rank = ? OR Rank = ?) AND committee_name = ?";
PreparedStatement stmt = conn.prepareStatement(valChecker);
stmt.setString(1, "Chairperson");
stmt.setString(2, "Vice-Chair");
stmt.setString(3, jComboBox1.getSelectedItem().toString());

ResultSet rs = stmt.executeQuery();
boolean rankExists = false; // 标记目标职级是否已存在

while (rs.next()) {
    String rnk = rs.getString("Rank");
    System.err.println(rnk);
    // 找到匹配职级,标记为已存在并跳出循环
    if ((rnk.equals("Chairperson") && rank.equals("Chairperson")) 
        || (rnk.equals("Vice-Chair") && rank.equals("Vice-Chair"))) {
        rankExists = true;
        break;
    }
}

// 循环结束后统一判断是否执行插入
if (rankExists) {
    JOptionPane.showMessageDialog(rootPane, 
        "Your Rank, " + rank + " already Exist, please review your membership or remove "+rank+" before adding another");
} else {
    pst.setString(3, rank);
    pst.execute();
    JOptionPane.showMessageDialog(this, "Saved, OK");
}

// 关闭资源(避免内存泄漏)
rs.close();
stmt.close();

关键修正点

  • 新增rankExists标记变量,循环仅负责检测重复职级,不直接处理插入逻辑
  • 循环结束后根据标记统一判断:存在重复则提示,不存在才执行插入
  • 重构查询SQL为参数绑定形式,彻底避免SQL注入风险
  • 补全语法结构,确保代码逻辑作用域正确

内容的提问来源于stack exchange,提问作者janet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:18:39