2014-06-21 1 views
1

Я пытаюсь проверить, есть ли «Имя пользователя» и «Email» аргументы в моем конструкторе существуют в таблице SQL.Java SQL (JDBC): как перейти к следующему столбцу?

это мой код:

public DB(String usr, String eml, String pwd) { 
    this.usr = usr; 
    this.eml = eml; 
    this.pwd = pwd; 

    String jdbcUrl = "jdbc:mysql://localhost:3306/registered"; 
    String jdbcUser = "...."; 
    String jdbcPassword = "...."; 

    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     connection = DriverManager.getConnection(jdbcUrl, jdbcUser, 
       jdbcPassword); 
     statement = connection.createStatement(); 

теперь, если я использую ВЫБРАТЬ с двумя столбцами, например:

String command = "SELECT UserName,Email FROM users WHERE UserName LIKE '" + this.usr.toString() + "';"; 
     resultSet = statement.executeQuery(command); 

, а затем сделать мой цикл для Resultset ... как это :

while (resultSet.next()) { 

      if (usr.equalsIgnoreCase(resultSet.getString("UserName"))) { 
       System.out.println("UserName : " + this.usr + " is taken!"); 

      } 

      else if (eml.equalsIgnoreCase(resultSet.getString("Email"))) { 
       System.out.println("Email : " + this.eml + " is taken!"); 

      } 
      else { 
       System.out.println("Email : " + this.eml + " and UserName : " + this.usr + " are AVAILABLE!"); 
       command = "INSERT users SET UserName = '" + this.usr.toString() + "',Email = '" + this.eml.toString() + "',Password = '" + this.pwd.toString() + "',Status = '0' ,Connected = '1';";   
       statement.executeUpdate(command); 
    } 
     } 
    } catch (SQLException e) { 
     System.out.println("SQLException: " + e.getMessage()); 
     System.out.println("Vendor error: " + e.getErrorCode()); 

    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

resultSet.next()

работает только через колонку «FIRST», что означает если «USR» существует в таблице она работает, , но если «USR» не существует в таблица, две другие, если утверждения не работают.

, ... я хочу проверить как первый столбец, так и второй, .. и, возможно, третий или более скоро .., любая помощь?

ответ

1

Ваш запрос WHERE проверяет только имя пользователя, поэтому, если UserName не соответствует this.usr.toString(), resultSet будет пустым, поэтому цикл while не будет введен.

Вы должны изменить запрос, чтобы соответствовать всем полям, которые вы заботитесь о - что-то вроде - "SELECT UserName,Email FROM users WHERE UserName = ... OR Email = ..."

Если Resultset пуст, вы будете знать, что вы можете вставить новую запись. В противном случае вы можете проверить, какое из полей (UserName, Email) уже выполнено.

Еще одна вещь, о которой вам следует знать - выполнение инструкции SQL без PreparedStatement делает ваш код уязвимым для атак SQL-инъекций.

Вы должны изменить свой код, чтобы что-то вроде этого:

PreparedStatement pstmt = con.prepareStatement("SELECT UserName,Email FROM users WHERE UserName = ? OR Email = ?"); 
    pstmt.setString(1, this.usr); 
    pstmt.setString(2, this.eml); 
    resultSet = pstmt.executeQuery(); 

Вы должны изменить INSERT заявление аналогично использовать PreparedStatement.

+0

Что делает pstmt.setString (,); делать ? , если я использую prepareStatement, тогда мне нужно удалить ** \t statement = connection.createStatement(); ** ??? – amjazzed

+0

@ user3651124 'setString' устанавливает значение параметра (помечено символом'? '). Я настоятельно рекомендую вам проверить документацию по API и прочитать базовый учебник JDBC, чтобы лучше узнать JDBC. –