Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用mysql数据库的Java GUI登录只接受访问的最后一行密码,忽略rest_Java_Mysql - Fatal编程技术网

使用mysql数据库的Java GUI登录只接受访问的最后一行密码,忽略rest

使用mysql数据库的Java GUI登录只接受访问的最后一行密码,忽略rest,java,mysql,Java,Mysql,我正在尝试使用mysql数据库制作一个带有登录验证的JavaGUI。例如,目前我相信它只是从最后一行获取密码 第一行-username=user,password=1234 第二行-username=admin,password=12345 这些只是暂时的,直到问题解决,我计划将它们的密码散列,并使其成为一个用户可以创建一个新的帐户,而不是什么,我已经创建了 关于我的问题,它似乎只拿起了密码12345,而不是1234。。。如果没有用户名也没关系,因此如果我想登录,它会接受一个空用户名和密码123

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

第一行-
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将获得secondrow
username
和password获得第二行密码。第三次类似,现在uname拥有第三行的username。第三行结束后
rs。next()
return
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 = ?
确保有一个结果行。它甚至可以是一个计数查询,您只需检查结果是否为一


这样,您还可以对数据库中的密码进行散列,出于其他安全原因,您应该这样做。

源代码中的一行空白就足够了。
{
之后或
}
之前的空行通常也是多余的。@JamesKerr如果没有代码,您的问题在这里没有价值。如果您不想显示代码,请删除整个问题。我对
//use//
这是什么意思感到困惑。不回答问题-1我很抱歉。我试图分享我所做的。如果它没有达到目的,我会删除它。嗯,我仍然不知道该怎么做。@jameskerr你不明白?你的查询是什么?哪一行你不明白?嗯,当我使用它时,它给了我一个SQL语法错误。@jameskerr你的SQL语法意味着什么?它给了我这个错误,当我将字符串添加到resultset
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException中时:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“?”附近使用的正确语法
select * from person where userid = ? and password = ?