Java数据库验证无法返回true,请求排查问题
问题分析与修复方案
核心问题总结
你的代码始终无法返回true并显示正确提示,根源是以下几个关键错误:
1. 变量作用域错误
类成员变量private boolean ahmet;在while循环中被重新声明为局部变量,导致类成员变量从未被正确赋值,始终保持默认的false:
// 这里声明的是局部变量,和类成员变量ahmet无关 if(id == 1){ boolean ahmet = ekle == true; } else if (id == 0 ){boolean ahmet = ekle == false;}
修正写法:直接修改类成员变量,不要重新声明
if(id == 1){ ahmet = true; } else { ahmet = false; }
注:ekle初始值为false,ekle == true的结果永远是false,属于逻辑错误,应直接赋值true/false
2. SQL语法问题
MySQL中逻辑与的标准关键字是AND,而非&&(虽部分环境兼容,但不符合标准),修正后的SQL语句:
rs = oku.executeQuery("SELECT count(id) as `giris` FROM dbkullanici.kullanicilar WHERE id ="+ cevrilenid +" AND sifre = '"+sifrebilgisi+"'");
建议用反引号包裹别名,避免关键字冲突
3. SQL注入风险(严重)
直接拼接用户输入到SQL语句中,存在极高的SQL注入风险,必须改用PreparedStatement:
String sql = "SELECT count(id) as `giris` FROM dbkullanici.kullanicilar WHERE id = ? AND sifre = ?"; PreparedStatement pstmt = connect.prepareStatement(sql); pstmt.setInt(1, cevrilenid); pstmt.setString(2, sifrebilgisi); ResultSet rs = pstmt.executeQuery();
4. 资源泄漏问题
Connection、Statement、ResultSet使用后未关闭,会导致数据库连接耗尽,建议用try-with-resources自动关闭资源:
try (Connection connect = db.getConnection(); PreparedStatement pstmt = connect.prepareStatement(sql)) { // 执行数据库操作 } catch (SQLException e) { // 异常处理 }
5. 复制粘贴错误
你错误地将idtext4的值赋值给了tutarbilgisi,应该取tutartext的内容:
// 原错误代码 String tutarbilgisi = idtext4.getText(); // 修正后 String tutarbilgisi = tutartext.getText();
完整修复后的kontrol()方法示例
public void kontrol() { boolean ahmet = false; // 初始化默认值 String sql = "SELECT count(id) as `giris` FROM dbkullanici.kullanicilar WHERE id = ? AND sifre = ?"; try (Connection connect = new dbbaglanti().getConnection(); PreparedStatement pstmt = connect.prepareStatement(sql)) { String cekilenid = idtext4.getText(); int cevrilenid = Integer.parseInt(cekilenid); String sifrebilgisi = sifretext4.getText(); // 修正tutartext的取值 String tutarbilgisi = tutartext.getText(); int cevrilentutar = Integer.parseInt(tutarbilgisi); pstmt.setInt(1, cevrilenid); pstmt.setString(2, sifrebilgisi); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { int count = rs.getInt("giris"); ahmet = count == 1; } } if (ahmet) { erortext.setText("verilerdogru"); } else { erortext.setText("Bilgileriniz Veritabanımızda ki veriler ile eşleşmedi"); } } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "Lütfen geçerli sayısal değer giriniz!"); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "Veritabanı bağlantı hatası: " + e.getMessage()); Logger.getLogger(para_ekle.class.getName()).log(Level.SEVERE, null, e); } }
内容的提问来源于stack exchange,提问作者İki Dost
相关产品推荐
相关产品推荐

