2014-06-21 3 views
1

내 생성자의 "사용자 이름"및 "전자 메일"인수가 SQL 테이블에 있는지 확인하려고합니다. 이 같은 ...으로 결과 집합 내 루프를 수행 한 후Java SQL (JDBC) : 다음 열로 이동하는 방법?

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

과 :이 같은 두 개의 열이을 선택 사용하는 경우, 지금

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(); 

:

내 코드입니다 :

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는()

단지 "USR은"이, 작동 표에 있지만, "USR"이 존재하지 않는 경우가있는 경우 을 의미한다 "FIRST"열 통해 실행 테이블, 다른 두 문이 작동하지 않습니다 ..

, ... 나는 첫 번째 열과 두 번째를 모두 확인하려고합니다. .. 그리고 아마도 세 번째 또는 더 빨리 ..., 도움이 필요합니까?

답변

1

WHERE 절은 UserName 만 테스트하므로 UserName이 this.usr.toString()과 일치하지 않으면 resultSet이 비어 있기 때문에 while 루프는 입력되지 않습니다. 같은 - -

당신은 당신이 걱정하는 모든 필드에 맞게 쿼리를 변경해야 결과 집합이 비어있는 경우 "SELECT UserName,Email FROM users WHERE UserName = ... OR Email = ..."

을, 당신은 당신이 새로운 레코드를 삽입 할 수 있음을 알 수 있습니다. 그렇지 않으면 어떤 필드 (UserName, Email)가 이미 사용되었는지 확인할 수 있습니다.

또 하나주의해야 할 점은 PreparedStatement없이 SQL 문을 실행하면 코드가 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(); 

당신은 PreparedStatement를 사용하는 유사하여 INSERT 문을 변경해야합니다.

+0

무엇이 pstmt.setString (,)입니까? 그래? prepareStatement를 사용하면 제거해야합니다 ** \t \t \t statement = connection.createStatement(); ** ??? – amjazzed

+0

@ user3651124'setString'은 매개 변수 값을 설정합니다 ('? '로 표시). API 문서를 확인하고 JDBC에 익숙해지기 위해 기본 JDBC 자습서를 읽는 것이 좋습니다. –