2013-03-11 4 views
1

오류 예외 :SQL 구문 나는 다음과 같은 성명을 실행하려고

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (" + a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , " + a.getIdx() + ");"; 

을하지만 오류가 점점 오전 :

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'fooUrl' in 'field list' 

그러나 fooUrl이 값 중 하나입니다 - 그것의 결과입니다 전화 a.getImgUrl().

저는 데이터베이스 작업에 익숙하지 않으며 간단한 구문 오류로 인해이 문제가 발생합니다.

답변

3

당신은 이런 종류의 문제를 피할 수 있으며 준비된 진술을 사용하면 더 안전한 코드를 작성하게됩니다.

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (?, ?, ?, ?)"; 
final PreparedStatement statement = conn.prepareStatement(sql); 
statement.setString(1, a.getImgURL()) ; 
statement.setString(2, a.getLinkURL()) ; 
statement.setString(3, a.getClient()) ; 
statement.setString(4, a.getIdx()); 
final ResultSet results = statement.executeQuery(); 
+0

다시 한번 감사드립니다. @Perception – drewmoore

2

데이터 주위에 인용 부호가 없습니다. 당신이 쓴 방법, 당신은 열 이름을 언급하고 있습니다. 이 같은

재 작성 :

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) 
     VALUES ('" + a.getImgURL() + "' , '" + a.getLinkURL() + "' , '" + 
       a.getClient() + "' , '" + a.getIdx() + "');"; 

물론, 당신은 당신이 데이터베이스에 넣어 전에 데이터를 탈출해야합니다.

0

모든 문자열 값을 큰 따옴표로 묶습니다. 당신도 그들을 탈출해야합니다.

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (\"" + a.getImgURL() + "\" , "\" + a.getLinkURL() + \"" , \"" + a.getClient() + "\" , " + a.getIdx() + ");"; 

필수는 작은 따옴표 발언에 대한 귀하의 의견을 소독하는 것을 잊지 마세요.

0

SQL을 작성하는 코드를보고 SQL을 디버그하려고 시도하기가 어렵습니다.

INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (fooURL, ...); 

당신은 당신이 당신의 fooURL이 주위에 따옴표가없는 SQL 볼 때 더 쉽게 볼 수 있어야합니다 :

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (" 
    + a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , " 
    + a.getIdx() + ");"; 

대신, 결과 sql 문자열을 검사합니다. 따라서 이것은 단순한 스칼라 문자열 값이 아니라 표현식으로 해석됩니다. 한 단어의 표현식은 단지 열 이름으로 간주되지만 광고 표의 해당 이름으로 그런 열은 없습니다.

문자열을 SQL 문에 삽입하는 것을 피하는 것이 훨씬 더 좋습니다. Learn how to use prepared queries and query parameters instead.

String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) " 
    + " VALUES (?, ?, ?, ?)"; 
PreparedStatement insertAd = con.prepareStatement(sql); 
insertAd.setString(1, a.getImgUrl); 
insertAd.setString(2, a.getLinkUrl); 
insertAd.setInt(3, a.getClient); 
insertAd.setInt(4, a.getIdx); 
insertAd.executeUpdate(); 

당신은 인용 또는 쿼리 매개 변수를 탈출 할 필요가 없습니다. 균형 잡힌 따옴표가 어디에 있는지 기억하는 것보다 매개 변수를 사용하는 것이 훨씬 쉽습니다. 그리고 그 이유 때문에, 당신이 그것을 올바르게 할 가능성이 더 많으니까 더 안전합니다.

관련 문제