2012-05-11 48 views
0

由於某種原因,登錄僅適用於數據庫中的最後一位用戶。我有一個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"; 
      } 
    } 
    } 

這是怎麼造成的,我該如何解決呢?

+0

這是我們需要小心使用循環 – kosa

+0

-1;這可以通過使用調試器來解決...... – home

+0

@home:或邏輯意義:) – BalusC

回答

4

您正在將整個數據庫表複製到Java內存中,並在while循環中對所有記錄進行比較。當與記錄匹配時,您不會中止while循環,因此它會繼續循環播放其餘記錄,因此pagename每次都會被「開始」覆蓋。

您需要添加一個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"; 
} 

這是更有效和明智的。

+0

謝謝你的mysql解釋 – toky

+0

不客氣。 – BalusC

0

爲什麼要循環整個表來做到這一點?如果你有1000000條記錄怎麼辦?您應該使用WHERE子句傳遞用戶名和密碼參數來查詢數據庫,然後檢查是否有返回的行。

相關問題