Escape single quotes in JDBC (getting error: You have an error in your SQL syntax ...)
Escape single quotes in JDBC (getting error: You have an error in your SQL syntax ...)
我正在尝试使用 jdbc 将数据插入 mysql。我有这样的东西:
Connection conn = DriverManager.getConnection(urlDB, userDB, passwordDB);
String postTitle = "Post title";
String postContent = "A Linux's distributions";
String sql = "INSERT INTO posts VALUES ( '"+postTitle+"', '"+postContent+"')";
PreparedStatement statement = conn.prepareStatement(sql);
statement.executeUpdate();
conn.close();
但是我收到一个错误:
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 's
据我所知,prepareStatement 方法应该转义单引号(也许我错了)。我很乐意提出任何建议。
您不应使用连接在 SQL 查询中插入参数值。使用问号和 set* 方法。这将确保转义。
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
查看文档:https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html
替换
String sql = "INSERT INTO posts VALUES ( '"+postTitle+"', '"+postContent+"')";
和
String sql = "INSERT INTO posts VALUES ( '"+postTitle.replace("'","''")+"', '"+postContent.replace("'","''")+"')";
要正确使用预准备语句,您需要使用参数占位符 (?
) 并在语句中设置值。这将自动为您提供针对 SQL 注入的保护。
您需要将代码更改为:
String sql = "INSERT INTO posts VALUES (?, ?)";
try (PreparedStatement statement = conn.prepareStatement(sql)) {
statement.setString(1, postTitle);
statement.setString(2, postContent);
statement.executeUpdate();
}
有关如何使用 PreparedStatement
的示例,另请参阅 JDBC Basics - Using Prepared Statements。
我还更改了您的代码以使用 try-with-resources,因为这将始终正确关闭语句(即使发生异常),而您问题中的代码不会。
请注意,如果您明确指定要插入的列会更好。这可以保护您的代码免受列更改顺序或新添加的 - 可选 - 列的影响:
INSERT INTO posts(title, content) VALUES (?, ?)
我正在尝试使用 jdbc 将数据插入 mysql。我有这样的东西:
Connection conn = DriverManager.getConnection(urlDB, userDB, passwordDB);
String postTitle = "Post title";
String postContent = "A Linux's distributions";
String sql = "INSERT INTO posts VALUES ( '"+postTitle+"', '"+postContent+"')";
PreparedStatement statement = conn.prepareStatement(sql);
statement.executeUpdate();
conn.close();
但是我收到一个错误:
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 's
据我所知,prepareStatement 方法应该转义单引号(也许我错了)。我很乐意提出任何建议。
您不应使用连接在 SQL 查询中插入参数值。使用问号和 set* 方法。这将确保转义。
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
查看文档:https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html
替换
String sql = "INSERT INTO posts VALUES ( '"+postTitle+"', '"+postContent+"')";
和
String sql = "INSERT INTO posts VALUES ( '"+postTitle.replace("'","''")+"', '"+postContent.replace("'","''")+"')";
要正确使用预准备语句,您需要使用参数占位符 (?
) 并在语句中设置值。这将自动为您提供针对 SQL 注入的保护。
您需要将代码更改为:
String sql = "INSERT INTO posts VALUES (?, ?)";
try (PreparedStatement statement = conn.prepareStatement(sql)) {
statement.setString(1, postTitle);
statement.setString(2, postContent);
statement.executeUpdate();
}
有关如何使用 PreparedStatement
的示例,另请参阅 JDBC Basics - Using Prepared Statements。
我还更改了您的代码以使用 try-with-resources,因为这将始终正确关闭语句(即使发生异常),而您问题中的代码不会。
请注意,如果您明确指定要插入的列会更好。这可以保护您的代码免受列更改顺序或新添加的 - 可选 - 列的影响:
INSERT INTO posts(title, content) VALUES (?, ?)