2012-05-20 18 views
0

mysql 데이터베이스에 데이터를 삽입하려고하는데 오류가 발생하여 코드에서 오류를 찾을 수 없습니다. 나는 mysql이 좋지 않다.JDBC MySQL 쿼리 오류?

String insertQuery = "insert into books(title, author, description, prize)values(" 
      + title 
      + "," 
      + author 
      + "," 
      + desc 
      + ", " 
      + prize 
      + ");"; 

mysql> describe books; 
+-------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-------------+--------------+------+-----+---------+-------+ 
| book_id  | int(11)  | NO | PRI | NULL |  | 
| title  | varchar(64) | YES |  | NULL |  | 
| author  | varchar(64) | YES |  | NULL |  | 
| description | varchar(500) | YES |  | NULL |  | 
| prize  | float  | YES |  | NULL |  | 
| added  | datetime  | YES |  | NULL |  | 
+-------------+--------------+------+-----+---------+-------+ 
6 rows in set (0.01 sec) 

I가 얻을 오류,

Query: insert into books(title, author, description, prize)values(sfdfdf,fdfdf,Please limiasasaat your response to 500 characters., 78.9); 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limiasasaat your response to 500 characters., 78.9)' at line 1 

답변

4

당신의 문자열 값은 작은 따옴표로 묶여 있지 않습니다.

String insertQuery = "insert into books(title, author, description, prize)values('" 
      + title 
      + "','" 
      + author 
      + "','" 
      + desc 
      + "', " 
      + prize 
      + ");"; 

Example of Prepared Statement at RoseIndia

UPDATE PreparedStatement의 1

샘플 :이 시도

//other codes here 
String iSQL = "Insert into books(title, author, description, prize) values (?,?,?,?)"; 
// con is your active connection object 
PreparedStatement pstmt = con.prepareStatement(iSQL); 
pstmt.setString(1, title); 
pstmt.setString(2, author); 
pstmt.setString(3, desc); 
pstmt.setFloat(4, prize); 
pstmt.executeUpdate(); 
//other codes here 

하지만 클래스의 상단이 문을 잊지 마세요 : import java.sql.*;

+5

RoseIndia에 링크하지 마십시오. http://balusc.blogspot.in/2008/06/what-is-it-with-roseindia.html. –

+0

참조 bro에 대한 링크를 추가 했으므로 OP의 질문을 기반으로 준비된 문으로 답변을 업데이트 한 것입니다. –

+0

+1 예를 들어. –

3

문제는 내가 생각하는 당신의 varchar 매개 변수에 따옴표가없는 것입니다.

String insertQuery = "insert into books(title, author, description, prize)values('" 
      + title 
      + "','" 
      + author 
      + "','" 
      + desc 
      + "', " 
      + prize 
      + ");"; 

그러나이 여전히 하나를 포함하는 모든 입력을 처리 할 수 ​​없으므로 여전히 좋은 해결책이 아니다 :

당신은 단순히 그들을 필요로하는 PARAMATERS 따옴표를 포함하여이 문제를 해결할 수 인용합니다 (desc 매개 변수는 문자열 Don't try this 포함 된 경우 쿼리가 다음 실패의 don't'desc 매개 변수를 종료 할 것이며, 파서가 다음 , 기대하지만 t try this가 발생하는 것처럼)와 SQL injection attack 열려 있습니다.

준비된 문장을 사용해야합니다. 이것은 안전하고 당신은 그때 당신을 위해 모두 처리됩니다 이스케이프 문제에 대해 걱정할 필요가 없습니다. 위에 표시된대로 작동하도록 해킹 할 수 있습니다. 그러나 자신의 온건함을 위해, 그리고 여러분의 코드를 다루어야하는 모든 사람들을 위해, 준비된 문장을 배우고 사용하는 데 약간의 시간을 할애하십시오. 미래는 당신에게 감사 할 것입니다.

prepared statement tutorial on the oracle java website이 있습니다.

색인 기반 준비 문을 사용하면 항상 나에게 약간 깨지기 쉬운 것처럼 보입니다. 이 읽기 쉽게자는 PreparedStatements 조금 할 수있는 example of how you can bind parameters by name, 그래서 그들은 이런 식으로 끝낼 수 있습니다 :

String iSQL = "Insert into books(title, author, description, prize) values (:title,:author,:description,:prize)"; 

NamedParameterStatement pstmt =new NamedParameterStatement(connection,iSQL); 
pstmt.setString("title", title); 
pstmt.setString("author", author); 
pstmt.setString("description", desc); 
pstmt.setFloat("prize", prize); 
pstmt.executeUpdate(); 
+1

그리고 그는 그들을 도피하거나 준비된 진술을 사용해야합니다. – Corbin

+0

@Corbin 절대적으로, 당신이 게시했을 때 내 대답을 외면하고있었습니다 :) –

1

Prepared Statement를 사용하는 것이 좋겠지 만 여전히 가지고있는 방식으로 가고 싶다면 MYSQL에 이것이 문자 항목이고 이것이 정수 항목이라는 것을 알게됩니다.

문자 항목과 정수 항목의 차이를 정의하려면 문자 항목 주위에 작은 따옴표를 추가해야합니다.

1

preparedStatement를 사용하십시오. 가치가 변하는 곳에서 성명서를 사용하면 분명히 그러한 결론을 이끌어 낼 것입니다. johntotetwoo가 아주 좋은 예를 제시합니다. 그것을보십시오.