2016-12-12 4 views
0

私は現在、単純なJDBCのプロジェクトに取り組んでいると私は、ログインフォームこのボタンは私が示したことをされて作成した新しいページをクリックするJavaのJDBCスイングログインフォームのエラー

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    try 
{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    con=DriverManager.getConnection("jdbc:mysql://localhost/company","root","redhat"); 
    stmt=con.createStatement(); 
    String nm=jTextField1.getText(); 
    char[] pass=jPasswordField1.getPassword(); 
    String pw=Arrays.toString(pass); 
    String sql="select * from login where uname='"+nm+"' and pass='"+pw+"'"; 
    rs=stmt.executeQuery(sql); 
    if(rs.next()) 
    { 
     new MainPage().setVisible(true); 
     this.setVisible(false); 
    } 
    else 
    { 
     JOptionPane.showMessageDialog(this, "Wrong User name or password"); 
     jTextField1.setText(""); 
     jPasswordField1.setText(""); 

    } 
} 
catch(Exception e) 
{ 
    System.out.println(e); 
} 
}    ` 

で立ち往生しています、 「間違ったユーザー名またはパスワード」メッセージダイアログが表示されます。 私の間違いは何ですか? 私のデータベースはmysqlにあります。

+0

は値 'NM + "と" + pw'の両方を印刷しようとあなたは違い –

+0

は、あなたの接続文字列は、String.Formatの – InitLipton

+0

をされて使用して文字列を構築表示されますポート番号が分からない。 –

答えて

0

Arrays.ToString指定した配列の内容の文字列表現を返します。文字列表現は、配列の要素のリストで構成されます。あなたのケースでは

代わりの

String pw = Arrays.toString(pass); 

あなた

は、文字列表現にパスワードを取得するために使用されなければなりません。

String pw = String.copyValueOf(pass); 
0

これは、クエリが空の結果セットを返すことを示しているようです。 DBに対して直接実行するとどうなりますか?

また、は配列の文字列表現を提供します。おそらく配列の内容をStringにしたいと思うでしょう。違いがあります。代わりにnew String(pass)を使用してみてください。

0

「間違ったユーザー名またはパスワード」は、rsがヌルであるか、またはrs'sizeが0であることを意味します。 名前とパスワードを確認する必要があります。

3

エラー1:Arrays.toString(char[])は、例えば、配列表現を返します。 [p, a, s, s, w, o, r, d]

修正1:使用new String(char[])代わりjPasswordField1でパスワードがpasswordであれば、結果はこの文字列です。


エラー2: SQLステートメントを構築するために文字列連結を使用します。これにより、あなたのコードはSQL Injection攻撃の影響を受けやすくなります。ハッカーはのデータを盗んでテーブルを削除することができます

修正2:PreparedStatementを使用してください。


エラー3:がリソースを解放しません。これによりメモリリークが発生します。

修正3:try-with-resourcesを使用してください。


結果:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    try { 
     boolean loginOk; 
     Class.forName("com.mysql.jdbc.Driver"); 
     try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost/company","root","redhat")) { 
      String sql = "select * from login where uname=? and pass=?"; 
      try (PreparedStatement stmt = con.prepareStatement(sql)) { 
       stmt.setString(1, jTextField1.getText()); 
       stmt.setString(2, new String(jPasswordField1.getPassword())); 
       try (ResultSet rs = stmt.executeQuery(sql)) { 
        loginOk = rs.next(); 
       } 
      } 
     } 
     if (loginOk) { 
      new MainPage().setVisible(true); 
      this.setVisible(false); 
     } else { 
      JOptionPane.showMessageDialog(this, "Wrong User name or password"); 
      jTextField1.setText(""); 
      jPasswordField1.setText(""); 
     } 
    } catch(Exception e) { 
     System.out.println(e); 
    } 
}