2013-04-23 79 views
0

我一直在連接到一個mySQL數據庫的登錄頁面,它一直在觸發「錯誤的用戶名或密碼警報」。登錄頁面的錯誤與數據庫檢索

我打印出所有的值,並且找不到我錯在哪裏。

我的表格是以bcsapril是表格中的第一個條目的方式設置的,它打印出來的文本字段中的用戶名不等於從數據庫中檢索到的值。 和IVE試圖改變 如果(rs2.next()) 成 而(rs2.next())

下一幀露面但即時得到的「不正確」的消息中的相同的次數作爲數據庫中條目的數量。

我唯一的問題是爲什麼「bcsapril」總是我的代碼正在檢索的用戶名。任何幫助都會很棒。

if(evt.getKeyCode() == KeyEvent.VK_ENTER){ 
    String user = userTx.getText(); 
    String pwd = new String (passTx.getPassword()); 
    String sql = "SELECT * FROM accounts"; 
    boolean loggedIn = false; 

    try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/dardb","root","1234"); 
      PreparedStatement stmt = con.prepareStatement(sql); 
      ResultSet rs2 = stmt.executeQuery(sql); 
     while(rs2.next()) { 
      String uname = rs2.getString("username"); 
      String password = rs2.getString("password"); 
       if((user.equals(uname)) && (pwd.equals(password))){ 
        loggedIn = true; 
       } 
     } 

     if(loggedIn){ 
      DarDBMainFrame x = new DarDBMainFrame(); 
        x.setVisible(true); 
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
        setBounds(0,0,screenSize.width, screenSize.height); 
        setVisible(true); 
        x.setUsername(user); 
        pack();  
        setUser(user); 
        dispose(); 
     }else{ 
        JOptionPane.showMessageDialog(this, "Incorrect Username or Password!", "Login Error", JOptionPane.ERROR_MESSAGE); 
        System.out.println(user); 
        System.out.println(pwd); 
      } 
    }catch (ClassNotFoundException | SQLException | HeadlessException e){ 
     JOptionPane.showMessageDialog(this, e.getMessage()); 
    } 
    } 

回答

0

從@拉維的回答繼,如果必須循環,我建議如下(爲清楚起見移除多餘的代碼):

boolean loggedIn = false; 

while(rs2.next()) { 
    if((user.equals(uname)) && (pwd.equals(password))){ 
     loggedIn = true; 
     break; 
    } 
} 

if (!loggedIn) { 
    JOptionPane.showMessageDialog(this, "Incorrect Username or Password!", "Login Error", JOptionPane.ERROR_MESSAGE); 
} 
+0

同一件事:( 日誌中,但仍顯示「不正確的用戶名和密碼」的4倍 – MrZooYork 2013-04-23 03:36:47

+0

你肯定你有「不正確的用戶名和密碼」的while()循環之外? – nullPainter 2013-04-23 03:37:40

+1

如果正在顯示它的4倍,那麼你在循環內,100%。你應該有內部迴路標誌變量。如果你發現1場,設置標誌爲true。如果發現不匹配,設置標誌設置爲false。一旦你退出循環,顯示相應的味精。順便說一句,如果你找到了比賽,打破當場循環。您可以發佈更新的代碼? – 2013-04-23 03:42:15

0

不運行的代碼,我懷疑這個問題是因爲你沒有提供where子句的SQL限制的結果,所提供的用戶名。

取而代之,您將選擇表格中的所有結果並僅檢索第一個結果(通過rs2.next())。

更常見的方法是:

  1. 創建窗體的一份準備好的聲明:

    SELECT * FROM accounts WHERE username = ? and password = ?

  2. 在準備好的聲明中設置的第一個參數是用戶名輸入由用戶,第二個參數爲用戶的密碼

  3. 確定返回多少行 - if有一個結果,那麼就可以認爲認證成功

樣品(未經測試)代號爲準備好的聲明提取物可以是:

String sql = "SELECT * FROM accounts WHERE username=? AND password=?"; 
Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/dardb","root","1234"); 
PreparedStatement statement = con.prepareStatement(sql); 

statement.setString(1, uname); 
statement.setString(2, password); 

ResultSet resultSet = statement.executeQuery(); 

旁註一旦你掌握了這方面的工作 - 你應該真的不會在數據庫中存儲純文本密碼 - 至少嘗試使用類似SHA-1的值。

請注意,我建議使用準備好的語句,而不是直接將用戶名和密碼放入SQL中以防止SQL注入攻擊。

+0

這是非常有用的,但是能否請您闡述一下SHA- 1您建議的價值。我知道,並覺得這可以幫助我在將來 – MrZooYork 2013-04-23 03:26:41

+0

這是一種存儲價值的方式,不容易被人讀取。例如,如果有人惡意獲取數據庫,他們將無法獲得所有用戶的密碼。這不是萬無一失的,但它明顯比純文本更好。 – nullPainter 2013-04-23 03:31:32

+0

我明白了。像加密。早晚得看清楚。非常感謝! – MrZooYork 2013-04-23 03:33:34

0

它應該是while(rs2.next)而不是if(rs2.next),因爲您正在檢索帳戶表中的所有記錄。

如果您在提供其中子句在您的SQL語句中,那麼如果的條件會沒事的。

+0

是香港專業教育學院這樣做了,不過「不正確的用戶名/密碼」窗口之後succssfully顯示下一幀 – MrZooYork 2013-04-23 03:15:28

+0

仍然出現4次(相同數目的在帳目表條目)。這是因爲在表中的每個(非匹配)的記錄,你正在進入'else'塊。如果你確實想遍歷整個表格,你應該在循環之外取出錯誤條件,並且只在沒有找到匹配時才顯示文本。 – nullPainter 2013-04-23 03:20:03

+0

我知道這是基本的東西,但我真的很困惑放置else塊的位置,因爲我需要檢查表中的每個條目。非常感謝你的耐心BTW – MrZooYork 2013-04-23 03:25:31