2013-08-02 2 views
0

select where 문을 사용하여 특정 데이터를 가져 오려고합니다. 제대로 작동하는 데이터베이스가 있습니다.자바 데이터베이스에서 select 문 사용

String queryPass= "select password from userdata where username="+username2; 

해야한다 : 무엇 내가 지금까지 했어하면이

while (rs.next()){ 

      String username2=rs.getString("username"); 
      if(puname.equals(username2)) { 
       System.out.println(puname); 
       String queryPass= "select password from userdata where username="+username2; 
       rs2 = st.executeQuery(queryPass); 
       String passdb=rs2.getString("password"); 
       System.out.println("pass"+passdb); 

끝은 내가 알 수없는 열 '존'은 'where 절'내가 볼

+3

이것을 읽으면 : http://xkcd.com/327/ 당신은'PreparedStatement'를 사용하게 될 것입니다. – jlordo

답변

1

다른 2 개의 대답에서 지적한 것처럼 잘못된 형식의 SQL 문이 생성됩니다. 이것이 SQL을 생성해서는 안되는 이유 중 하나입니다. 준비된 문을 사용하여

:

//statement is a global\cached statement 
if(statement == null) { 
    String sql = "select password from userdata where username=?"; 
    statement = connection.prepareStatement(sql); 
} 
statement.setString(1, "John"); 
ResultSet rs = statement.executeQuery(selectSQL); 

데이터베이스는 (비용이 많이 드는 운동이다) 한 번 문에 대한 실행 계획을 일해야하고 SQL 주입에서 면역 있습니다. 당신의 예에서

, 내가 값을 전달하는 경우 : 'stu' or 1=1을 나는 문을 실행할 수있을 것입니다 :

select password from userdata where username='Stu' or 1=1 

데이터베이스의 모든 암호를 반환.

1

한 가지 문제는이에 얻을 오류입니다 (String 매개 변수는 따옴표에 넣어 때) 수 :

String queryPass= "select password from userdata where username= '"+username2+"'"; 

참고 : 일반 SQL 문 대신 PreparedStatments을 사용하여 SQL 삽입을 방지하는 것이 좋습니다.

2

이것은 당신의 결과 SQL 문자열입니다 : 데이터베이스가 열 이름의 생각, 그래서 그것은 인용 아니에요

select password from userdata where username=John 

.

PreparedStatement을 사용하고 값이 있어야하는 곳에 ? 문자를 배치 할 수 있습니다. 그런 다음 쿼리를 실행하기 전에 setString 값을 제공 할 수 있습니다. 이 기술 (바인드 변수)을 사용하면 SQL 삽입을 방지 할 수 있지만 문자열에 값을 직접 인용하는 것은 쉽지 않습니다.