2012-12-31 66 views
-2

我正在處理用戶登錄頁面。我希望管理員有權訪問管理員部分,但不是常規用戶。以下代碼的工作原理除了如果除管理員以外的用戶登錄,他們會得到錯誤的密碼錯誤併發送到正確的頁面。如果允許否定答案和正答案,我認爲嵌套有問題。我非常感謝在這個問題上的任何幫助。在java中嵌套if語句

 try { 
     String sql="Select * from Users1"; 
     String host ="jdbc:derby://localhost:1527/Nash"; 
     String uName = "CON"; 
     String uPass = "smokes"; 
     Connection con = DriverManager.getConnection(host, uName, uPass); 
     Statement stmt=con.createStatement(); 
     ResultSet rs = stmt.executeQuery(sql); 
     String user= userName.getText(); 
     String pwd= password.getText(); 
     while(rs.next()) { 
     String uname=rs.getString("User_name"); 
     String pass=rs.getString("Password"); 
     String admin1=rs.getString("admin"); 

if ((user.equals(uname)) && (pwd.equals(pass))) 
    { 
    mainPanel.setVisible(true); 
    blankContent.setVisible(true); 
    adminButton.setEnabled(false); 
    receiptContent.setVisible(false); 
    memberContent.setVisible(false); 
    securityPanel.setVisible(false); 
    } 

     if ((user.equals(uname)) && (pwd.equals(pass))&&(admin1.equals("y"))) 
     { 
      mainPanel.setVisible(true); 
      blankContent.setVisible(true); 
      adminButton.setEnabled(true); 
      receiptContent.setVisible(false); 
      memberContent.setVisible(false); 
      securityPanel.setVisible(false); 
     } 
else 
    { 
      JOptionPane.showMessageDialog(null, "User name and password do" 
        + " not match!","ALERT!", JOptionPane.ERROR_MESSAGE); 

      } 
} } catch (SQLException ex) { 
     Logger.getLogger(program.class.getName()).log(Level.SEVERE, null, ex); 
    } 

編輯 以下是編輯的代碼鏈接---> New revised code link

+2

我不確定這是否符合您的想法。我不確定每一行是什麼,但是你的標籤結構相當複雜。嘗試一個autoformat;看看是否解決了這個問題? – Zyerah

+0

好吧,顯然問題出在'&&(admin1.equals(「y」)'。如果其中任何一個語句都是false,它會立即進入'else',您需要將其分解爲單獨的語句 – Apropos

+0

如果這些答案都不起作用,那麼確保'admin1 = rs.getString(「admin」);''返回'y' **或**'Y'並且確保你沒有在檢查'admin1'時傳遞'null' – Smit

回答

0

除非你缺少一個小故障導致此問題(From your pastebin code in your comment)你正在做的一切是正確的。

你的while語句在這裏是個大問題。它將繼續檢查數據庫中的所有記錄。

使用break一旦你得到了所需的用戶。

boolean isPass = false; 
while(rs.next()){ 
    // Your user authentication 
    if ((user.equals(uname)) && (pwd.equals(pass))) 
    { 
     if (admin1.equals("y")) { 
      // do your admin operation 
      break; 
     } else { 
      // do your non admin operation 
      break; 
     } 
    } else { 
     // if authentication fails 
     isPass = true 
    } 
} 
// Outside of while block 
if(isPass){ 
    // if authentication fails show error message 
    JOptionPane.showMessageDialog(null, "User name and password do" 
      + " not match!","ALERT!", JOptionPane.ERROR_MESSAGE); 
} 

我發現這個代碼片段展示瞭如何利用突破並意識到,你也應該讓這個breakelse part其他明智它會繼續顯示爲所有那些成爲虛假認證記錄錯誤信息在if部分。

我會建議從另一種方法獲取您的數據庫值,並在另一種方法中進行身份驗證。

+0

我認爲這會工作...但沒有問題仍然存在 –

+0

現在的問題在哪裏?如果你正確地使用它,'break'應該在你的情況下工作得很好。 – Smit

+0

同樣的問題...我認爲我正確地應用了它...錯誤消息仍然出現在用戶可以看到主頁面之前。 –

3

您需要將您的else了一個級別。代碼格式化使得很難說明發生了什麼,但其他內容在admin if聲明中。就像這樣:

if ((user.equals(uname)) && (pwd.equals(pass))) 
{ 
    if (admin1.equals("y")) 
    { 
     // ... admin 
    } 
    else 
    { 
     // ... regular user 
    } 
} 
else 
{ 
    JOptionPane.showMessageDialog(null, "User name and password do" 
      + " not match!","ALERT!", JOptionPane.ERROR_MESSAGE); 
} 
+1

你添加'else'的方式,'if'之後永遠不會被評估爲真。如果用戶名錯誤或密碼錯誤,您只能到達那裏。但這是它測試的第一部分。有幾種方法可以重新排列它。我會把一個如果用戶和PW,然後另一個測試的大括號內的管理員。如果管理員是真的,做一件事,否則做另一件事。 –

+1

呃...我並不感到驚訝我的標籤結構已經搞亂了(我是java新手),我已經嘗試了所有的建議,但問題仍然存在。 –

+0

@李Meador,謝謝你的收穫。我已經編輯了我的答案,在邏輯上是正確的,對此感到遺憾。 –

0

做到像

if ((user.equals(uname)) && (pwd.equals(pass))) 
    { 
    mainPanel.setVisible(true); 
    blankContent.setVisible(true); 
    receiptContent.setVisible(false); 
    memberContent.setVisible(false); 
    securityPanel.setVisible(false); 
    adminButton.setEnabled(false); 
      if(admin1.equals("y")) 
       adminButton.setEnabled(true); 

    } 


else 
    { 
      JOptionPane.showMessageDialog(null, "User name and password do" 
        + " not match!","ALERT!", JOptionPane.ERROR_MESSAGE); 

      } 
+0

我實現了這個建議,它使我的代碼看起來更整潔,但沒有解決問題。我很欣賞每個人的努力。 –