2013-02-21 2 views
0

EDIT: SOLVED! Спасибо, парни! : DПочему rs.next() работает неправильно?

Даже если я набираю правильные учетные данные, я до сих пор получаю сообщение об ошибке showMessageDialog .. Я считаю, что rs.next() вернет значение, превышающее 0, тогда оно должно быть ограничено, если учетные данные пользователя будут совпадать с те в user_table, но я всегда получаю сообщение об ошибке, как будто учетные данные были несовместимы.

import java.sql.*; 
import javax.swing.*; 

public class System extends javax.swing.JFrame { 

    // variables needed for db connection 
    Connection conn; 
    Statement stmt; 
    ResultSet rs; 
    String sql; 
    String user; 
    char[] pass; 
    //for table row count 
    int ctr = 0; 
    //temporary variables needed in retrieving and inserting records in our db 
    int user_id; 
    String username; 
    String password; 

    public System() { 
     initComponents(); 
     setLocationRelativeTo(null); 
     dbConnect(); 
    } 

    public void dbConnect() { 
     conn = null; 
     String url = "jdbc:mysql://localhost:3306/item_db"; 
     String driver = "com.mysql.jdbc.Driver"; 
     String userName = "root"; 
     String password = ""; 
     try { 
      Class.forName(driver).newInstance(); 
      conn = DriverManager.getConnection(url, userName, password); 

      stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 
      sql = "Select * from users_table"; 
      rs = stmt.executeQuery(sql);//rs - will hold the records from the databa sql = "Select * from item_table";se 

     } catch (Exception e) { 
      JOptionPane.showMessageDialog(this, e.getMessage()); 
     } 
    } 

    private void login() { 

     try { 
      if (user != null && pass != null) { 
       sql = "Select * from users_table Where username='" + user + "' and password='" + pass + "'"; 
       rs = stmt.executeQuery(sql); 

       rs.next(); 
       if ((user.equals(username)) && (pass.equals(password))) { 
        JOptionPane.showMessageDialog(null, "You are now logon!"); 
       } 
       else { 
        JOptionPane.showMessageDialog(null, "damn!", "alert", JOptionPane.ERROR_MESSAGE); 
       } 
      } 
     } catch (SQLException err) { 
      JOptionPane.showMessageDialog(this, err.getMessage()); 
     } 

    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jLabel1 = new javax.swing.JLabel(); 
     jLabel2 = new javax.swing.JLabel(); 
     jTextField1 = new javax.swing.JTextField(); 
     jButton1 = new javax.swing.JButton(); 
     jButton2 = new javax.swing.JButton(); 
     jPasswordField1 = new javax.swing.JPasswordField(); 
     jLabel3 = new javax.swing.JLabel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jLabel1.setFont(new java.awt.Font("Calibri", 0, 18)); // NOI18N 
     jLabel1.setText("Username:"); 

     jLabel2.setFont(new java.awt.Font("Calibri", 0, 18)); // NOI18N 
     jLabel2.setText("Password:"); 

     jButton1.setText("Login"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     jButton2.setText("Cancel"); 

     jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/login.png"))); // NOI18N 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(46, 46, 46) 
         .addComponent(jLabel3)) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(82, 82, 82) 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addGroup(layout.createSequentialGroup() 
           .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
            .addComponent(jLabel2) 
            .addComponent(jLabel1)) 
           .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
           .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
            .addComponent(jTextField1) 
            .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE))) 
          .addGroup(layout.createSequentialGroup() 
           .addGap(51, 51, 51) 
           .addComponent(jButton1) 
           .addGap(28, 28, 28) 
           .addComponent(jButton2))))) 
       .addContainerGap(52, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel1) 
        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jLabel2) 
        .addComponent(jPasswordField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGap(18, 18, 18) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jButton1) 
        .addComponent(jButton2)) 
       .addGap(29, 29, 29)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 

     //str = JOptionPane.showInputDialog(this, "Enter id number: "); 
     user = jTextField1.getText(); 
     pass = jPasswordField1.getPassword(); 
     login(); 
    }           

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(System.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(System.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(System.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(System.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new System().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    private javax.swing.JButton jButton2; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JLabel jLabel3; 
    private javax.swing.JPasswordField jPasswordField1; 
    private javax.swing.JTextField jTextField1; 
    // End of variables declaration     
} 
+0

Какое из диалогов показано? Если это уловка, которая является сообщением? – SJuan76

+1

вы вызываете 'rs.next()', не проверяя значение вообще! Кроме того, вы должны использовать 'PreparedStatement' или подготовиться к встрече [Little Bobby Tables] (http://xkcd.com/327/). – jlordo

+2

Вы предоставили почти * 200 * строки кода, подавляющее большинство которых будет неактуальным.Если вы сократили это до короткого, но полного консольного приложения, демонстрирующего проблему (и * только * проблему), я подозреваю, что это может быть около 30 строк, если это произойдет. –

ответ

0

Вы вызываете rs.next в вакууме. Вы не проверяете результат или не используете данные набора результатов.

1

Вы не проверять возвращаемое значение из rs.next()

попробовать:

  if (rs.next()) { 
       JOptionPane.showMessageDialog(null, "You are now logon!"); 
      } else { 
       JOptionPane.showMessageDialog(null, "damn!", "alert", JOptionPane.ERROR_MESSAGE); 
      } 

см: http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#next%28%29

+0

все еще получает JOptionPane.showMessageDialog (null, "damn!", "Alert", JOptionPane.ERROR_MESSAGE); даже правильные учетные данные – Gian7

+0

Ок, извините, PLS см. мое редактирование сейчас. – vikingsteve

-1

Я думаю, что ваш код должен быть что-то подобное,

rs.next(); 
      if ((user.equals(rs.getString("username"))) && (pass.equals(rs.getString("password")))) { 
       JOptionPane.showMessageDialog(null, "You are now logon!"); 
      } 
+0

, что 'if' всегда будет' истинным'. Посмотрите на его инструкцию SQL. – jlordo

+0

@jlordo - Я почтительно не согласен. Это правда, что только эти имя пользователя и пароль находятся в базе данных. Если результаты запроса не возвращаются, то результат «if» возвращает false. – Slowcoder

+0

Если они существуют в базе данных, 'rs.next()' будет 'true' (если он исправляет свой оператор, потому что' pass' является 'char []', и он не может использовать '+' для его вставки в свою строку) ** и ** ваш 'if' будет' истинным'. Если они не существуют в базе данных, то 'rs.next()' будет false и ваш 'if' также. Поэтому лучше использовать 'if (rs.next())' и избавиться от 'if' в вашем коде. – jlordo

1

Вы определяете, но никогда не присваиваете значение:

String username; 
String password; 

Чтобы проверить это функционирование.

if ((user.equals(username)) && (pass.equals(password))) { 

Вы должны, прежде чем устанавливать значения для username и password

this.username = rs.getString("username"); 
this.password = rs.getString("password"); 

Во всяком случае, не требуется. Поскольку оба эти значения в вас WHERE положение, если вы получаете любой результат на все это означает, что вы получили удар, так что вы можете просто изменить if к

if (rs.next()) {    

ПРИМЕЧАНИЕ: Вы должны удалить предыдущую rs.next() (вы получите только одну строку для запроса).

Тем не менее, несколько намеков:

1) Не храните незашифрованные пароли. Сохраните хеш-версию (MD-5, SHA-1). Если это важно, используйте соль. Таким образом, кто-то, кто может читать таблицу, не сможет угадать пароли. Сначала вы можете протестировать с помощью неинкретизированной таблицы, когда она работает, добавляет шифрование.

2) Как сказал кто-то другой, вам лучше с PreparedStatement.

3) Если вы не используете его часто, не делайте соединение переменной экземпляра. Сделайте его локальной переменной метода, который его использует. И close() это правильно. Таким образом, вы не будете болеть за ресурсы сервера.

+0

Не могу сделать пароль строкой, иначе я не смог бы использовать jPasswordField: | – Gian7

+0

Вы получаете из него char [], преобразование его в String тривиально. – SJuan76

Смежные вопросы