Трудно попытаться отладить 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();
Вам не нужно цитировать или избежать параметров запроса. Намного проще использовать параметры, чем помнить, где находятся ваши сбалансированные кавычки. И по этой причине это более безопасно, потому что вы с большей вероятностью сделаете это правильно.
еще раз спасибо @Perception – drewmoore