从Java插入过程中的Mysql日期列错误

时间:2015-12-14 03:13:01

标签: java mysql runtime-error

我想使用JDBC插入数据,每当我执行程序时它会向我显示一些Mysql错误:

插入声明:

String sql = "INSERT into books(name, isbn, author, category, desc, published) VALUES('"+name+"','"+isbn+"','"+author+"','"+category+"', '"+desc+"','"+book_published+"')";

我正在尝试使用以下方法将字符串转换为日期:

String yr = year.getSelectedItem().toString();
String mn = month.getSelectedItem().toString();
String dy = day.getSelectedItem().toString();
String book_date = yr+"-"+mn+"-"+dy;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd",
                                            Locale.ENGLISH);
try{
Date book_published = df.parse(book_date);
}catch(...){...}

它显示我的错误:

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 'desc, published) VALUES('skd flakj','klsdjf askj','kl jasdklfj kl','kls djfklj f' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

请帮我弄清楚这里有什么问题。

3 个答案:

答案 0 :(得分:3)

由于使用了普通的查询语句,您的代码很容易受到SQL注入攻击。要保护您的查询,请使用preparedstatement。

根据您的查询问题,DESC是一个保留字。因此,您不能将其用作列名。请查看this以获取保留字的完整列表。

答案 1 :(得分:1)

desc是MySQL的保留字,这意味着你可以直接使用它。

要在没有MySQL错误的情况下使用它,你应该使用`环绕保留字。

Ps:如果使用用户输入的参数,SQL语句可能会遭受SQL注入,攻击者可以使用它来控制你的系统。也许你应该试着看看这个。

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

答案 2 :(得分:0)

desc不是一个特别好的列名,因为它是MySQL中的保留字。我不确定这是否是唯一的问题,但您可能想尝试使用刻度线围绕desc,如下所示:

String sql = "INSERT into books(`name`, `isbn`, `author`, `category`, `desc`, `published`) VALUES('"+name+"','"+isbn+"','"+author+"','"+category+"', '"+desc+"','"+book_published+"')";

无论如何,这是一种很好的做法。

编辑:正如其他人所提到的,在将不受信任的输入保存到数据库时,准备好的语句会更安全。