2015-12-23 23 views
0

数据插入到MySQL数据库我想要做简单的注册表格,但我不能往前走,我已经尝试了一切,它仍然无法正常工作,这是我的代码:我坚持我无法从JDBC

protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException 
    { 
     StringBuilder builder= new StringBuilder(); 
     Reader reader=request.getReader(); 
     int c; 
     while ((c=reader.read())!=-1) 
     { 
      builder.append((char) c); 
     } 
     String signup=builder.toString(); 
     try { 
      JSONObject object= new JSONObject(signup); 
      String name=object.getString("username"); 
      String email=object.getString("email"); 
      String pass=object.getString("pass"); 
      String sql="INSERT INTO user_f VALUES("+email+","+name+","+pass+")"+";"; 

      statement.executeUpdate(sql); 
      //ResultSet set= statement.executeQuery("SELECT ") 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

我的错误堆栈我编辑的代码,所以很多时候,我有点感到沮丧这是我收到的错误:

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 '@gmail.com,dsf,sdfsd)' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 
    at com.mysql.jdbc.Util.getInstance(Util.java:387) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2547) 
    at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1541) 
    at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2605) 
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1469) 
    at com.herda.app.Servlet.doPost(Servlet.java:56) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+0

你需要在值附近加引号,或者使用PreparedStatement – sidgate

+0

感谢队友,现在正在工作 –

回答

2

你的MySQL查询没有一个有效的语法错误是说。你需要引用字符串文字。尝试这样的:

String sql = "INSERT INTO user_f VALUES(\"" + email + "\", \"" + name + "\", \"" + pass + "\");"; 

但是,请注意,此代码对SQL注入是开放的!要解决此安全问题,您可以使用预准备语句。这也解决了你的报价问题。

+0

谢谢大家,它的作用就像魅力。只是一个问题,斜杠代表什么? –

+0

@johndoe,\字符在您的字符串内转义引号。如果您不添加它们,它们将终止您的Java字符串,而不是在查询中添加为字符。 –

+0

好的人非常感谢你 –

1

你应该测试你的sql查询拳头。执行它在MySQL工作台

我觉得应该是

String sql="INSERT INTO user_f VALUES('"+email+"','"+name+"','"+pass+"')"+";"; 
+0

也可以。我很感谢你们的帮助 –

+0

你能否将我的答案标记为答案。你和我需要50声望做出评论:( –

+0

,我会投你的提问:( –

1

问题是你缺少围绕你的价值观的报价,但是你应该从未通过到查询字符串串联值构建这样的查询。它打开你的代码到SQL注入(例如,当你插入用户输入时),这是一个非常大的安全风险。相反,您应该使用带有参数占位符的准备语句。这将处理转义值,所以SQL注入不会成为问题。

在某些数据库系统上准备好的语句也具有提高性能的附加值,因为语句可以被重用。

举个例子:

try (PreparedStatement pstmt = connection.prepareStatement(
      "INSERT INTO user_f(email,name,pass) VALUES(?,?,?)")) { 
    pstmt.setString(1, email); 
    pstmt.setString(2, name); 
    pstmt.setString(3, pass); 
    pstmt.executeUpdate(); 
} 

在这个答案我也明确列出要插入的列,这使得你的代码更长远的保障(例如,当您添加或删除列)。

+0

这是精彩,并感谢@Mark –