2013-04-07 59 views
1

我想檢查一個database表中是否已存在username表。Java - 如何檢查在MySQL表中是否存在用戶名

Java代碼:

if (e.getSource() == jButton2) 
{ 
    U = jTextField1.getText(); 
    if (jTextField1.getText().trim().equals("")) 
    { 
    JOptionPane.showMessageDialog(this, "Please Write Username !"); 
    } 
    else if (jPasswordField1.getText().equals("")) 
    { 
    JOptionPane.showMessageDialog(this, "Please Write Password !"); 
    } 
    else 
    { 
    try { 
     String Driver = "com.mysql.jdbc.Driver"; 
     String URL = "jdbc:mysql://localhost:3306/LoginForm"; 
     Class.forName(Driver); 
     Connection Conn = DriverManager.getConnection(URL, "root", "12345"); 
     Statement S = Conn.createStatement(); 
     ResultSet RS = S.executeQuery(
      "SELECT * FROM login where username ='" + U + 
      "' and Password ='" + jPasswordField1.getText() + "'"); 

     while (RS.next()) { 
     String Username = RS.getString("Username"); 
     String Password = RS.getString("Password"); 
     String Admin = RS.getString("Admin"); 

     if (Username.equals(U) & Password.equals(jPasswordField1.getText()) & 
      Admin.equals("0")) 
     { 

      JOptionPane.showMessageDialog(this, "Logged In Successfully !"); 
      this.dispose(); 
      NormalUsers NU = new NormalUsers(); 
      break; 

     } 
     else if (Username.equals(U) & 
      Password.equals(jPasswordField1.getText()) & Admin.equals("1")) 
     { 

      JOptionPane.showMessageDialog(this, 
      "Logged In Successfully , Opening Administration Panel !"); 

      this.dispose(); 
      AdminPanel AP = new AdminPanel(); 
      break; 
     } 
     else 
     { 
      JOptionPane.showMessageDialog(this, "Invalid Username Or Password!"); 
     } 
     } 
    } 
    catch (SQLException | ClassNotFoundException ex) 
    { 
    } 
    } 
} 

的問題是:

  • 如果有在database沒有行,那麼就沒有一個錯誤信息:Invalid Username or Password
  • 當我手動執行SQL查詢時:SELECT * From Login我看到該行在那裏存在,但由於我在password上過濾,因此它不會進入while loop

我該如何使用java來檢查用戶名是否存在於MySQL表中?

回答

6

對於此查詢類型特別,你不通過ResultSet需要循環。

您正試圖找到一個確定的記錄。你將不會有兩個記錄具有相同的用戶名/密碼(我假設登錄表的主鍵是用戶名),所以只需要一個if(rs.next())就足夠了。如果存在,驗證以檢查它是否是管理員。

此外,在查詢你已經暗示該記錄必須有指定的用戶名和密碼,無需來測試它一旦返回的結果集。

只要測試用戶類型,如果它是管理員,顯示相應的消息,否則,做適當的。

如果rs.next()未被滿足,則用戶不存在,因此在else塊中,可以顯示有關用戶未找到或無效的錯誤消息。

+0

我試過沒有循環,沒有做任何事情! – 2013-04-07 16:25:48

+0

如果您嘗試使用確實存在的用戶/密碼,那麼這是與查詢相關的問題。如果您嘗試使用不存在的用戶/密碼,您是否將'else'塊放在'if(rs.next())'上? – Noe 2013-04-07 16:35:05

+0

是啊我認爲這是一個查詢相關的問題.. – 2013-04-07 16:56:23

5

你需要處理的事情是MySQL查詢。我認爲WHERE條款的查詢是您正在尋找的。你

可能還希望把這些代碼在一個單獨的類,以防止烹飪一些spaghetti code

下面的鏈接是有關PHP語言的答案,但你需要看看什麼是MYSQL query和邏輯:Check If Username Exists

嘗試是這樣的:

public String login(String uname, String password) throws Exception{ 

    String status=null; 
    ConnectionHandler handler=new ConnectionHandler(); //class for connection 
    Connection con=handler.createConnection(); 
    Statement stmt=con.createStatement(); 
    String query="select * from loginTable where username=" + 
     "\""+uname+"\""+";"; //get username 

    ResultSet rs=stmt.executeQuery(query); 
    String checkUser=rs.getString(1); 
    String checkPass=rs.getString(2); 
    if(checkUser.equals(uname) && checkPass.equals(password)){ 
     status="True"; 
    } 
    else{ 
     status="False"; 
    } 
    con.close(); 
    return status; 
} 

使用此status字符串我確定用戶名是否驗證。讓SQL完成繁重的工作(而不是用java自己編寫代碼)。

+0

我不明白你的答案對不起 – 2013-04-07 16:26:12

+0

@ user2197451請參閱編輯回答。我的意思是它不是一個與語言有關的問題,但一個MySQL查詢 – lazyprogrammer 2013-04-07 16:30:36

+0

你試過解決方案,讓我知道輸出 – lazyprogrammer 2013-04-07 16:35:56

2

你可以做一個SELECT COUNT(*) AS total FROM login where username ... 然後resultSet.getInt("total")。如果用戶已經存在的總數大於0。 我也會使用PreparedStatement,因爲它不太容易受到SQL注入攻擊。 看看https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java。 SQL計數 例...

ResultSet RS = S.executeQuery("SELECT COUNT(*) AS total FROM login where username ='" + U + "' and Password ='" + jPasswordField1.getText() + "'"); 
     while (RS.next()) { 
      if(RS.getInt("total") > 0) { 
       // user already exists 
      } else { 
       // user does not exist 
      } 
     } 
+0

請舉例 – 2013-04-07 16:25:16

+0

您是指Sql Injection的一個例子還是一個count的例子?爲計數做以下 – 2013-04-07 16:34:26

+0

什麼也沒有發生! – 2013-04-07 16:55:20

2

假設只有一行被返回,您可以用if語句替換while循環。執行查詢後,您也不需要檢查用戶名和密碼,因爲這由where子句處理。所以,你的查詢可以修改爲:

PreparedStatement prest = Conn.prepareStatement("SELECT Admin FROM login WHERE username = ? and Password = ?"); 
prest.setString(1, U); 
prest.setString(2, jPasswordField1.getText()); 

,然後用處理它的if語句:

if (rs.next()) { 
    //Process user level (Normal or admin) 
} else { 
    //Incorrect login details 
} 
+0

這個查詢是非常危險的:它容易受到微不足道的SQL注入攻擊。不要使用這個SQL;使用準備的語句! – mpierce 2013-04-07 16:30:45

+0

是的,他應該使用準備好的語句,但我的觀點是,沒有必要使用SELECT *。 – SteveBT 2013-04-07 16:40:31

+0

更正您的答案,以便它不會受到SQL注入風險的攻擊,我會刪除我的downvote。 – skuntsel 2013-04-07 16:45:50

0

我是新來的Java,但我認爲你應該檢查你的jPasswordField,如果它是一個JTextBox沒有問題,但如果它是一個JPasswordField然後getText()返回一個byte[]不是字符串,您需要首先將byte[]轉換爲string

相關問題