2016-04-08 4 views
1

これに答えて検索しましたが、類似するものは見つかりませんでした。既に私の答えがあるかもしれない質問をチェックしましたが、もう一度解決策はありません。データベース接続が完了していないJavaログインメソッド

だからまず、ここでは完了しないコードは、次のとおりです。ここ

Class.forName(DRIVER); 

    Connection connection = DriverManager.getConnection(URL, USER, 
      PASS); 

    Statement statement = connection.createStatement(); 
    e = email.getText(); 
    p = password.getText(); 
    String SQL = "SELECT email, password FROM healthcareProfessional WHERE email = '" + e 
      + "' AND password = '" + p + "';"; 

    ResultSet resultSet = statement.executeQuery(SQL); 
    while (resultSet.next()) { 
     if (email.getText().equals(resultSet.getString("email")) 
       && password.getText().equals(resultSet.getString("password"))) { 
      Main.applyHomescreenLayout(); 
     } else if (email.getText().equals("") || password.getText().equals("")) { 
      errorMessage.setText("Incorrect Email."); 
      errorMessage.setTextFill(Color.RED); 
      FadeTransition fadeTransition = new FadeTransition(Duration.millis(3000.0), errorMessage); 
      fadeTransition.setFromValue(3000.0); 
      fadeTransition.setToValue(0.0); 
      fadeTransition.playFromStart(); 
     } 
    } 

すべてが、私は、有効なログイン資格情報を入力して正常に動作します。しかし、電子メールまたはパスワードを空白のままにしてログインしようとすると、メッセージが表示されず、理由を理解できません。誰かが私を正しい方向に向けることができますか?

また、接続を削除すると、以下のコードが完全に機能し、メッセージが表示されます。

if (email.getText().equals("") || password.getText().equals("")) { 
     errorMessage.setText("Incorrect Email or Password."); 
     errorMessage.setTextFill(Color.RED); 
     FadeTransition fadeTransition = new FadeTransition(Duration.millis(3000.0), errorMessage); 
     fadeTransition.setFromValue(3000.0); 
     fadeTransition.setToValue(0.0); 
     fadeTransition.playFromStart(); 
    } 

私はまたのどれも働いていない、もし内の結果セット、ステートメントとの接続を閉じると、else文場合、.isEmptyと.equals(「」)を(置き換え)、および個別の結果セットを使用して試してみました。

+0

例外がスローされますか? – jtahlborn

+0

いいえ、例外はありません。 –

+0

「else」ブロックにどのような条件でアクセスする予定ですか? –

答えて

0

メールアドレスとパスワードが空白ではなく、一致していないときは、任意のメッセージを得るのですか?

一致する組み合わせがない場合、resultSetは空になり、next()は常にfalseと評価され、whileループを完全にスキップします。 (コードがミスを持つことができるので、ここにはコンパイラを)私がやるんだろう何

は次のとおりです。

ResultSet resultSet = statement.executeQuery(SQL); 
if (resultSet.next()) { 
    //No need to re-validate 
    Main.applyHomescreenLayout(); 
} else { 
    //no email|password combination found on database 
    errorMessage.setText("Incorrect Email."); 
     errorMessage.setTextFill(Color.RED); 
     FadeTransition fadeTransition = new FadeTransition(Duration.millis(3000.0), errorMessage); 
     fadeTransition.setFromValue(3000.0); 
     fadeTransition.setToValue(0.0); 
     fadeTransition.playFromStart(); 
} 

は、これは前に述べたが、強化されることは常に良いですしたSQLを避けるために準備された文を見てみましょう注射。

+0

偉大な答え。私はこれで作業することができます。ありがとう。 –

+0

私はまた、あなたがちょうど彼が間違って何をしているかについてユーザーに明確にすることが空白の電子メール/パスワードを持っているときに別のメッセージを使用することをお勧めします。たぶんelse文の中でコードを再利用して、それをshowErrorMessage(String message)関数の中に入れることができます。 – marcellorvalle

1

まず、このチェックは、データベースをチェックする前に、つまりユーザーの資格情報をチェックするためにDBクエリを実行する前にチェックする必要があります。

if (email.getText().equals("") || password.getText().equals("")) { 
      errorMessage.setText("Incorrect Email."); 
      errorMessage.setTextFill(Color.RED); 
      FadeTransition fadeTransition = new FadeTransition(Duration.millis(3000.0), errorMessage); 
      fadeTransition.setFromValue(3000.0); 
      fadeTransition.setToValue(0.0); 
      fadeTransition.playFromStart(); 
     } 

パスワードのないユーザーまたは電子メールIDを持たないユーザーがデータベースチェックを盗聴することを許可してはなりません。

第2に、DB接続はtry catchブロックで、finallyブロックではすべての接続オブジェクト、文オブジェクトを解放します。

第3に、SQLインジェクションからシステムを保護するために準備された文を使用します。このようにしてクエリを作成するのは良い方法ではありません。

https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

+0

Prepared Statementの使用についてのヒントをありがとう。 –

0

ブロックelseブロックには基本的に到達できません。

あなたのSQL文がデータベースemailフィールドがemailテキストフィールド内のテキストと等しく、そのためのデータベースpasswordフィールドがpasswordテキストフィールド内のテキストに等しいいるデータベースのテーブルの行のみを選択する(またはPasswordField、恐らく)。

ので、ユーザはemailpasswordブランクのいずれかを離れた場合、それはemailが空であるかpasswordはそれぞれ、空白になっているため、データベースから行のみを選択します。その場合には、結果セットの任意の行のために、テスト

if (email.getText().equals(resultSet.getString("email")) 
    && password.getText().equals(resultSet.getString("password"))) 

はまだtrueに評価されますので、あなたはelseブロックに到達しません。データベース・テーブルには、このような行がない場合は、単に空の結果セットを取得し、あなたはどちらかそれらの条件の下でelseブロック(あるいはifブロック)に達していますので、あなたのwhileループ繰り返し処理は、回をゼロ。

関連する問題