2013-04-07 41 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

相关问题