1

我正在尝试将一些数据插入到 mysql 数据库中,但是我收到一个错误,并且我找不到代码的错误。我不擅长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)

我得到的错误是,

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

4 回答 4

4

您的字符串值没有用单引号括起来。试试这个:

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

RoseIndia 准备好的声明示例

更新 1

PreparedStatement 示例:

//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.*;

于 2012-05-20T10:06:55.223 回答
3

varchar您的问题是我认为您的参数周围没有引号。

您可以通过简单地在需要它们的参数周围包含引号来解决此问题:

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

但是,这仍然不是一个好的解决方案,因为您仍然无法处理任何包含单引号的输入(如果desc参数包含字符串Don't try this,则查询将失败,因为'indon't将终止desc参数并且解析器将然后期望,但会遇到t try this)并且容易受到SQL 注入攻击

你应该做的是使用准备好的语句。这使其安全,您无需担心转义问题,因为这一切都已为您处理。您可以破解它以如上所述工作。但是为了您自己的理智,以及所有在您之后必须处理您的代码的人,请花一点时间来学习准备好的语句并使用它们。未来的你会感谢现在的你。

oracle java网站上有一个prepared statement tutorial 。

使用基于索引的预处理语句对我来说总是有点脆弱。有一个示例说明如何按名称绑定参数,这可以使 PreparedStatements 更易于阅读,因此它们最终可能是这样的:

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();
于 2012-05-20T10:03:34.113 回答
1

我建议使用Prepared Statement,但如果你仍然想按照你的方式进行,那么你将不得不以某种方式告诉MYSQL这是一个字符条目,这是一个整数条目。

要定义字符条目和整数条目之间的区别,您必须在字符条目周围添加单引号。

于 2012-05-20T10:11:28.637 回答
1

使用preparedStatement。在值会发生变化的地方使用语句肯定会导致您得出这样的结论。johntotetwoo 给出了一个很好的例子。看看它。

于 2012-05-20T12:01:13.763 回答