使用mysql数据库的Java GUI登录只接受访问的最后一行密码,忽略rest
我正在尝试使用mysql数据库制作一个带有登录验证的JavaGUI。例如,目前我相信它只是从最后一行获取密码 第一行-使用mysql数据库的Java GUI登录只接受访问的最后一行密码,忽略rest,java,mysql,Java,Mysql,我正在尝试使用mysql数据库制作一个带有登录验证的JavaGUI。例如,目前我相信它只是从最后一行获取密码 第一行-username=user,password=1234 第二行-username=admin,password=12345 这些只是暂时的,直到问题解决,我计划将它们的密码散列,并使其成为一个用户可以创建一个新的帐户,而不是什么,我已经创建了 关于我的问题,它似乎只拿起了密码12345,而不是1234。。。如果没有用户名也没关系,因此如果我想登录,它会接受一个空用户名和密码123
username=user,password=1234
第二行-username=admin,password=12345
这些只是暂时的,直到问题解决,我计划将它们的密码散列,并使其成为一个用户可以创建一个新的帐户,而不是什么,我已经创建了
关于我的问题,它似乎只拿起了密码12345,而不是1234。。。如果没有用户名也没关系,因此如果我想登录,它会接受一个空用户名和密码12345。我想解决这个问题,并使其能够选择表中的任何用户名和密码,而不仅仅是最后一行
以下是我的代码。Hello##我只是一个初学者,我想与大家分享我的工作。
始终为连接到数据库创建不同的类。
这将使您的代码更干净
我将用一个例子向你演示
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 */
}
**现在该类连接我了**
解决你的问题
String user=username_field.getText();
PreparedStatement ps = con.prepareStatement(
"SELECT ID, username, password FROM person where username=user" );
问题就在这方面
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行用于rs.next()
将返回true,因此循环进入并uname
获取第一行的用户名
,同样的密码也获取第一个密码。现在再次rs.next()
rows返回true
因此现在uname将获得secondrowusername
和password获得第二行密码。第三次类似,现在uname拥有第三行的username。第三行结束后rs。next()
returnfalse
并因此退出循环。因此,最后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 = ?
确保有一个结果行。它甚至可以是一个计数查询,您只需检查结果是否为一
这样,您还可以对数据库中的密码进行散列,出于其他安全原因,您应该这样做。源代码中的一行空白就足够了。
{
之后或}
之前的空行通常也是多余的。@JamesKerr如果没有代码,您的问题在这里没有价值。如果您不想显示代码,请删除整个问题。我对//use//
这是什么意思感到困惑。不回答问题-1我很抱歉。我试图分享我所做的。如果它没有达到目的,我会删除它。嗯,我仍然不知道该怎么做。@jameskerr你不明白?你的查询是什么?哪一行你不明白?嗯,当我使用它时,它给了我一个SQL语法错误。@jameskerr你的SQL语法意味着什么?它给了我这个错误,当我将字符串添加到resultsetcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException中时:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“?”附近使用的正确语法
select * from person where userid = ? and password = ?