【发布时间】:2020-03-31 19:00:18
【问题描述】:
首先这是我第一次使用 JDBC。 我有一个名为 insertQuery 的方法和另一个名为 updateQuery 的方法,它们都接收一个字符串,以便在名为 Movies 的数据库中更新或插入新电影。因此,基于用户将通过基本 UI 输入的一些值,我的代码将执行一个查询或另一个查询。问题是我在更新时遇到语法错误,在插入时遇到错误 23000,我不知道为什么
try {
ResultSet rs = conn.selectQuery("SELECT title FROM movie WHERE title LIKE '" + title + "';");
if (rs != null) {
if (rs.next()) {
System.out.println("Updating db...");
conn.updateQuery("UPDATE movie SET title ='" + title
+ "', id_director = " + idDirector
+ ", year = " + year
+ ", duration = " + duration
+ ", country = '" + country
+ "', movie_facebook_likes = " + facebookLikes
+ ", imdb_score = "+ imdbScore
+ ", gross = " + gross
+ ", budget = " + budget
+ " WHERE title LIKE '" + title + "';");
} else {
System.out.println("Inserting into db...");
conn.insertQuery("INSERT INTO movie (title, id_director, year, duration,
country, movie_facebook_likes, imdb_score, gross, budget) " +
"VALUES ('" + title + "', " + idDirector + "," + year + ", "
+ duration + ", " + country + ", " + facebookLikes + ", "
+ ", " + imdbScore + ", " + gross + ", " + budget + ");");
}
}
} catch (SQLException e1) {
JOptionPane.showMessageDialog(mainView, "MySQL error", "ERROR", .ERROR_MESSAGE);
}
【问题讨论】:
-
不使用
PreparedStatement是个坏主意。堆栈跟踪会告诉您错误的详细信息。使用e1.printStackTrace();打印堆栈跟踪。 -
如上,请务必阅读SQL注入。如果堆栈跟踪仍然让您感到困惑并假设 conn 对象是您定义的类的实例,请共享堆栈跟踪和该类的源代码。
-
请为此使用准备好的语句,将值连接到查询字符串中会使您容易受到 SQL 注入的攻击。当询问有关错误的问题时,请在您的问题中发布完整的异常堆栈跟踪。然而,原因似乎是您的插入中缺少
country周围的引号(该错误是一种“相对良性”的 SQL 注入形式,表明您确实应该使用准备好的语句)。