2013-03-11 6 views
1

Я пытаюсь выполнить следующую инструкцию:SQL Синтаксис Exception Error

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

Вам не хватает котировок вокруг ваших данных. Как вы его написали, вы имеете в виду имена столбцов.

Rewrite, как это:

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.

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

Вместо проверять полученную sql строку:

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

Вы должны быть в состоянии видеть более легко, когда вы смотрите на SQL, что ваш fooURL не имеет кавычки вокруг него. Поэтому он интерпретируется как выражение, а не простое значение скалярной строки. Выражение одного слова считается только именем столбца, но такой столбец не существует по этому имени в таблице объявлений.

Было бы намного лучше избегать интерполяции строк в ваш оператор 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(); 

Вам не нужно цитировать или избежать параметров запроса. Намного проще использовать параметры, чем помнить, где находятся ваши сбалансированные кавычки. И по этой причине это более безопасно, потому что вы с большей вероятностью сделаете это правильно.

Смежные вопросы