Java 登录仅对数据库中的最后一个用户有效

Java 登录仅对数据库中的最后一个用户有效,java,mysql,jdbc,Java,Mysql,Jdbc,出于某种原因,登录只对数据库中的最后一个用户有效。我有一个while循环,但我认为它使程序转到最后一个用户。我尝试使用if语句,但只有第一个用户才能登录 if (username!=null && password!=null) { pagename = "main"; } else { username = request.getParameter("username"); password = request.getParameter("p

出于某种原因,登录只对数据库中的最后一个用户有效。我有一个
while
循环,但我认为它使程序转到最后一个用户。我尝试使用
if
语句,但只有第一个用户才能登录

  if (username!=null && password!=null) {
    pagename = "main";
    } else {
    username = request.getParameter("username");
    password = request.getParameter("password");

            while(results.next()) 
            { 
            if(results.getString(2).equals(password) && results.getString(1).equals(username)) 
            { 
            pagename="main";
            } 
            else 
            { 
            pagename="start";
            } 
    }
  }

这是如何导致的,我如何解决它?

您正在将整个DB表复制到Java内存中,并在
中对所有记录进行循环比较。当与记录匹配时,您不会中止
while
循环,因此它会继续在其余记录上循环,因此
页面名每次都会被“start”覆盖

您需要添加一个
break
语句:

if (results.getString(2).equals(password) && results.getString(1).equals(username)) { 
    pagename="main";
    break;
}
或者,更好的方法是让SQL完成它的设计任务,选择并返回所需的数据:

preparedStatement = connection.prepareStatement("SELECT id FROM user WHERE username=? AND password=MD5(?)");
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();

if (resultSet.next()) {
    pagename = "main";
}
else {
    pagename = "start";
}

这更有效、更合理。

您正在将整个DB表复制到Java内存中,并在
中进行比较,同时对所有记录进行
循环。当与记录匹配时,您不会中止
while
循环,因此它会继续在其余记录上循环,因此
页面名每次都会被“start”覆盖

您需要添加一个
break
语句:

if (results.getString(2).equals(password) && results.getString(1).equals(username)) { 
    pagename="main";
    break;
}
或者,更好的方法是让SQL完成它的设计任务,选择并返回所需的数据:

preparedStatement = connection.prepareStatement("SELECT id FROM user WHERE username=? AND password=MD5(?)");
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
resultSet = preparedStatement.executeQuery();

if (resultSet.next()) {
    pagename = "main";
}
else {
    pagename = "start";
}

这更有效、更合理。

为什么要在整个表中循环执行此操作?如果你有1000000条记录呢?您应该使用WHERE子句查询数据库,并传递用户名和密码参数,然后只需检查是否有返回的行。

为什么要循环整个表来执行此操作?如果你有1000000条记录呢?您应该使用WHERE子句查询数据库,并传递用户名和密码参数,然后简单地检查是否有返回的行。

这是我们需要小心使用loops-1的情况之一;这可以通过使用调试器来解决…这是我们需要小心使用循环-1的情况之一;这可以通过使用调试器来解决…感谢您对mysql的解释谢谢您对mysql的解释