![](/img/trans.png)
[英]Java gui with login authetnication via mysql database not working and changing logic
[英]Java GUI login with mysql database only accept last row password for access ignoring rest
我正在尝试通过使用mysql数据库使Java gui进行登录验证。 目前,我认为它只是从最后一行获取密码,例如
第一行- username = user, password = 1234
第二行- username = admin, password = 12345
这些只是暂时的,直到解决为止,我计划对它们进行密码哈希处理,然后也进行设置,以便用户可以创建一个新帐户,而不能创建一个我已经创建的帐户。
关于我的问题,似乎只选择了密码12345,而不是1234 ...是否没有用户名也没关系,因此,如果我要登录,它接受一个空白的用户名和密码12345。我想解决此问题并使其正确,以便它可以选择表中的所有用户名和密码,而不仅仅是最后一行。
下面是我的代码。
问题在这条线
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()
返回boolean时,它检查是否存在任何行,如果是,则返回如果没有,返回true,否则返回false。现在假设总共有3行,那么rs.next()
将返回true,这样循环就进入了内部, uname
获得了firstrow的username
, 同样 ,密码也获得了第一个密码。现在再次rs.next()
行返回true
所以现在uname将获得第二行username
,密码将获得第二行密码。这是第三次,现在uname具有第三行的用户名.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();
现在,当您只有一行时。
您做错了。 而不是搜索匹配用户和做的密码相匹配自己的数据库,你应该问的数据库是否有两个匹配,通过
select * from person where userid = ? and password = ?
而只是确保有一个结果行。 它甚至可能是一个计数查询,您只需检查结果是否为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 */
}
**现在是class 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" );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.