2017-12-20 17 views
0

私はjavaプログラムを使い慣れています。私は、EclipseとMySQLを使用してログインインターフェイスを使用してJavaプログラムを作成しました。一度私はログインを正常に2または3回メッセージを繰り返してログインします。メインインターフェイスの2倍の開きがあります。ここに私のコードです。ソリューションを探して。Javaログインエラー

JButton btnLogin = new JButton("Login"); 
    btnLogin.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 

      try { 

       String query = "select * from xyzlibrary.user_account"; 

       Statement st = con.createStatement(); 
       ResultSet rs=st.executeQuery(query); 

       while (rs.next()) { 

        String username= rs.getString(1); 
        String password= rs.getString(2); 

        if (tfusername.getText().equals(username) && tfpasswordField.getText().equals(password)) { 

         JOptionPane.showMessageDialog(null, "Login successfull!"); 

         Admin ad = new Admin(); 
         ad.setVisible(true); 

         dispose(); 

        }else 

         JOptionPane.showMessageDialog(null, "Incorrect User ID or Password!"); 


       } 


      } catch (Exception e) { 
       // TODO: handle exception 
      } 

     } 
    }); 
    btnLogin.setBounds(125, 187, 89, 23); 
    contentPane.add(btnLogin); 
+0

データベースのすべての*ユーザーレコードに対してチェックしています。代わりに、WHERE句をSQLに追加して、一致するユーザーレコード(または失敗したログインの場合はレコードなし)のみを返すことを検討してください。 – David

+0

1つ以上の結果を返す可能性が高い。ログインを確認したら、whileループを手動で終了する必要があります。 – scrappedcola

答えて

2

あなたはユーザーテーブルからすべての行を取得しますので、あなたのquerywhere句を追加します。その後、whileループのために、数行に応じて2,3以上のメッセージとウィンドウが表示されます。

0

クエリレベルでユーザー名とパスワードのフィールドをフィルタリングすることで、テーブルの関連レコードのみを選択する方がはるかに簡単です。

PreparedStatementまた、値をエスケープしてSQLインジェクションを防止するために使用してください。

以下の例では、テーブルの関連する列がusernamepasswordとなっていることを前提としていますが、列の実際の名前に変更するだけです。

// just change the column names to fit your table's columns 
String query = "SELECT username from xyzlibrary.user_account WHERE username = ? AND password = ?"; 

// create a PreparedStatement which will escape values correctly 
PreparedStatement st = con.prepareStatement(query); 

// replace values 
st.setString(1,tfusername.getText()); 
st.setString(2,tfpasswordField.getText()); 

ResultSet rs=st.executeQuery(); 

// if the result is not empty, the login is a success 
if(rs.next()){ 

    JOptionPane.showMessageDialog(null, "Login successfull!"); 

    Admin ad = new Admin(); 
    ad.setVisible(true); 

    dispose(); 

} 
else{ 

    JOptionPane.showMessageDialog(null, "Incorrect User ID or Password!"); 

} 
0

あなたがすることができるもう一つは、あなたが受け入れられたログインをプリントアウトした後リターン文を追加しています。それはあなたの直面する問題を解決します。しかし、長期的には、SQL WHERE句をSQL Select文に追加することをお勧めします。

0

「ログインが成功しました」というメッセージは、クエリの結果が何度も表示されます。したがって、2つのユーザー名を持つ場合、2回印刷されます。

なぜwhileループからプリントを移動しないのですか?この方法では、どれだけの結果が得られても1回だけ印刷されます。