1

我正在尝试使用 mysql 数据库制作带有登录验证的 java gui。目前我相信它只是从最后一行获取密码,例如

第一行 -username = user, password = 1234 第二行 -username = admin, password = 12345

在解决之前,这些只是暂时的,我计划对它们进行哈希处理并设置密码,以便用户可以创建一个新帐户以及我已经创建的其他帐户。

关于我的问题,它似乎只选择了密码 12345 而不是 1234 ......如果没有用户名也没关系,因此如果我想登录它接受一个空白的用户名和密码 12345。我想解决这个问题并使它可以选择表中的任何用户名和密码,而不仅仅是最后一行。

下面是我的代码。

4

3 回答 3

1

问题出在这一行

resultSet = statement.executeQuery(            
                "SELECT ID, username, password FROM person" );

当查询被执行时,它将检索所有行。现在当你在这里做

while ( resultSet.next() ) 
             {
                Uname = resultSet.getString("username");
                Pass = resultSet.getString("password");
.............
//rest codes
}

Uname不断变化,因此你得到最后一行上面的while循环的一点解释首先,光标在第一行上方,当rs.next()返回布尔值时,它检查是否存在任何行,如果是,则返回true,否则返回false。现在假设您总共有 3 行,然后 forrs.next()将返回 true,因此循环进入内部并uname获取第一行username密码,类似地,密码也获得第一个密码。现在再次rs.next()返回行,true所以现在 uname 将获得第二username密码,密码获得第二行密码。类似地第 3 次,现在 uname 有第 3 行的用户名。3 行结束rs.next()后返回false因此退出循环。所以最后 Uname 包含最后一行的用户名和 Pass 包含最后一行的密码

更新 我的建议是这样使用

PreparedStatement pt=connection.prepareStatement("SELECT ID, username, password FROM person WHERE username=?");
pt.setString(1,username);
resultSet = pt.executeQuery();

现在你将只有一排。

于 2013-10-05T09:32:55.147 回答
0

你这样做是错误的。而不是在数据库中搜索匹配的用户并自己进行密码匹配,您应该通过以下方式询问数据库是否两者都匹配

select * from person where userid = ? and password = ?

并确保有一个结果行。它甚至可以是一个计数查询,您只需检查结果是否为 1。

这样,您还可以散列数据库中的密码,出于其他安全原因,无论如何您都应该这样做。

于 2013-10-06T09:29:29.287 回答
-1

你好##我只是一个初学者,我想分享我的工作。

始终为连接数据库创建不同的类。这将使您的代码更干净。

我将用一个例子向你展示

private void btn_LoginActionPerformed(java.awt.event.ActionEvent evt) {
    /*LOGIC*/ 

super.Show("Select * from Login");// this class is extending a class connect me
        try{
            int Checker = 0;// a flag 

        while(rs.next())
        {
    String user = field_UserId.getText();//values coming from field
            String pass = field_Password.getText();
    String user1 = rs.getString("User");//values coming from database
            String pass1 = rs.getString("Pass");

                if( user.equals(user1)& pass.equals(pass1))
                {      
                    //if enters into loop user is valid
                    Checker=1;//setting flag to 1

                }


          }
          if(Checker == 0  )
          {     JOptionPane.showMessageDialog(null,"Check Id&Password");
                field_UserId.setText("");
                field_Password.setText("");
          }


          }


    catch(Exception ex_connection)
 {
        System.out.println(ex_connection);


}

            /*LOGIC ENDED   */
     }

**现在上课connectme * *

    class Connectme
  {
String Name;
String Number;
ResultSet rs,r,rs1;
ResultSetMetaData md;
Statement st;
Statement st1;
int p=0;


Connectme()
{


try 
    {

        Class.forName("com.mysql.jdbc.Driver");
    Connection  con=  
          DriverManager.getConnection("jdbc:mysql://localhost:3306/Storage","root","");
        st= con.createStatement();  
        st1 = con.createStatement();

   }
catch(Exception ex_connection)
{
    System.out.println("damnnn");
    JOptionPane.showMessageDialog(null,"Check Database Connection");
}

}

void queryExecute(String insert)
{


try
{



        /*begin-to execute query ins database*/

            st.executeUpdate(insert);



        /*end-to enter values in database*/

}
catch(Exception ex_connection)
{
        System.out.println(ex_connection);


}
}


void Show(String table_name)
{

    try
{


    String insert = ("Select * from " + table_name + "");



        rs = st1.executeQuery(insert);
      md = rs.getMetaData();


}
    catch(Exception ex_connection)
{
        System.out.println(ex_connection);

        System.out.println("waah");


}

}


 void Show1(String insert1)
 { 

    try
 {



        rs1= st.executeQuery(insert1);
        /* while (rs1.next()) {
         System.out.print(rs1.getString("Price"));

         }*/


 md = rs1.getMetaData();


}
    catch(Exception ex_connection)
{
        System.out.println(ex_connection);




}

  }

 }
解决您的问题
                 String user=username_field.getText();
              PreparedStatement ps = con.prepareStatement(            
            "SELECT ID, username, password FROM person where username=user" );
于 2013-10-05T09:31:38.057 回答