【问题标题】:java sql syntax error insert intojava sql语法错误插入
【发布时间】:2012-05-18 16:16:37
【问题描述】:

我在运行这个 sql 语句时遇到问题。如果我在 mysql 中运行它可以正常工作,但在 java 中我收到此错误:

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 '' at line 1

数据库有一个id(pk)自动生成,varchar,int,varchar;

有人可以帮助我吗?

int i = statement.executeUpdate("INSERT INTO sala values('','"+ nume.getText() + "', "+ Integer.parseInt(capacitate.getText())+ ", '" + sunet.getText()+"'");

【问题讨论】:

  • 请阅读并注意:sommarskog.se/dynamic_sql.html#SQL_injection。通常,您最好在单独的变量中创建查询,然后将该变量传递给 ExecuteUpdate。这样您就可以在尝试运行之前查看语句的全部内容,并且可能能够发现语法错误。
  • 你传递的文本是什么?我的意思是在 nume.getText(), capacitate.getText() 中传递了什么文本??
  • 嘿,谢谢,我会调查的!
  • @FahimParkar 这些是 JTextField
  • 我不是那个意思.. 作为输入传递的文本是什么?前任。 nume.getText() 将数据作为“第一个输入”

标签: java sql insert


【解决方案1】:

不要按照 adarshr 的回答尝试通过调整 SQL 来修复此代码。您在这里遇到了一个基本的安全问题,您应该立即解决。由于将用户数据直接包含在 SQL 中,因此您对 SQL injection attacks 持开放态度。

您应该使用PreparedStatement,将参数声明为SQL 中的占位符,然后分别给出值。 确切地你将如何做这将取决于你的 JDBC 提供者,但它看起来像这样某事

// TODO: Fix the column names, and close the statement in a try/finally block
PreparedStatement pst = conn.prepareStatement(
    "INSERT INTO sala (nume, capacitate, sunet) VALUES (?, ?, ?)");
pst.setString(1, nume.getText());
pst.setInt(2, Integer.parseInt(capacitate.getText()));
pst.setString(3, sunet.getText());
pst.executeUpdate();

请注意,如果您可以通过不需要整数解析的方式获得capacite,那就太好了。否则,请考虑使用对语言环境更友好的NumberFormat。另请注意,我已将列名添加到 SQL 中,以使其在架构更改时更加健壮。

【讨论】:

  • 我有 try/catch 块,没有发布。将用户 PreparedStatement。感谢您教我正确编码!
【解决方案2】:

您尚未关闭查询。

int i = statement.executeUpdate("INSERT INTO sala values('','"+ nume.getText() + "', "+ Integer.parseInt(capacitate.getText())+ ", '" + sunet.getText()+"')");
                                                                                                                                                          ^

但更重要的是,您必须使用PreparedStatement,正如下面建议的Jon

【讨论】:

  • ... 我们仍然有 SQL 注入攻击的机会。这是解决最紧迫问题的糟糕方法。
  • @Jon 你等不及我把你的答案链接了,对吗? :)
  • 哇,我太马虎了,非常感谢,找了这个错误大约一个小时。
  • @adarshr:问题在于,通过展示不安全的方式,OP 很可能只是接受它,而不是解决更大的问题。
  • 我将使用 PreparedStatement,以正确的方式编码。谢谢大家的时间!
猜你喜欢
  • 2014-05-25
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多