2015-04-28 71 views
0

工作,我有一个网页,它允许用户输入一个词,这个词被提交时,它会从MySQL数据库中删除。但问题是该声明没有被执行。MYSQL Delete语句不与Java Servlet的

我的形式:

<form id="rem1" action="removeGER" method="GET"> 
     <input type="text" name="wordToRemoveGER" placeholder="Entry (GER)"> 
     <input type="submit" id="removeBtnGER" value="Remove Entry"> 
</form> 

我的servlet:

@WebServlet(name = "removeGER", urlPatterns = {"/removeGER"}) 
public class removeGER extends HttpServlet { 

/** 
* Handles the HTTP <code>POST</code> method. 
* 
* @param request servlet request 
* @param response servlet response 
* @throws ServletException if a servlet-specific error occurs 
* @throws IOException if an I/O error occurs 
*/ 
@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    response.setContentType("text/html"); 
    String wordGER = request.getParameter("wordToRemoveGER"); 
    PrintWriter out = response.getWriter(); 

    out.println("<!DOCTYPE html>"); 
    out.println("<html>"); 
    out.println("<head>"); 
    out.println("<title>Remove Word</title>"); 
    out.println("</head>"); 
    out.println("<body>"); 
    Connection conn = null; 

    try { 
     // Database Checking Area 
     SimpleDataSource.init("/database.properties"); 
    } catch (ClassNotFoundException ex) { 
     Logger.getLogger(Register.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    try { 
     conn = SimpleDataSource.getConnection(); 
     Statement stat = conn.createStatement(); 
     //ResultSet result = 
     stat.executeQuery(" DELETE FROM `word` WHERE `word` = \""+wordGER+"\""); 
     out.println("<h2>You have successfully removed the word " + wordGER + "!</h2>"); 
    } catch (SQLException ex) { 
     Logger.getLogger(removeID.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    out.println("</body>"); 
    out.println("</html>"); 
} 

} 

我知道该字符串被正确地从表单中检索,我知道正在执行try块。这个问题似乎与mysql语句本身有关。

+0

每个'executeQuery()'命令只能使用一个查询。你有两个('SET'和'DELETE'命令)。 – maja

+1

您已经成功创建了一个可能的* SQL注入*!你应该使用准备好的语句.. – maja

回答

-1

使用

executeUpdate('') 

,而不是

executeQuery('') 

你也应该确保你关闭语句和连接,当你与他们完成

+0

我曾尝试使用executeUpdate而不是executeQuery,但它没有工作,但现在正在工作。 – hjalpmig

+0

@hjalpmig这是因为你现在使用的是单个语句。 –

4

您有以下问题:

  1. ÿ你正在执行多个语句,可能你的连接不允许它。
  2. 当执行多个语句,你应该使用Statement#execute,不Statement#executeUpdate
  3. 如果你需要传递参数给您的查询,不直接在SQL追加它,这是SQL Injection攻击的原因。改为使用PreparedStatement

为了做到这一点,请确保您连接允许多个语句的执行加入这个参数到你的连接网址:allowMultiQueries=true

的connnection URL应该如何看实例:

jdbc:mysql://<server>:<port>/<database>?allowMultiQueries=true 

代码是如何将看起来像如果你使用PreparedStatement

conn = SimpleDataSource.getConnection(); 
String sql = "SET SQL_SAFE_UPDATES = 0; DELETE FROM `word` WHERE `word` = ?"; 
PreparedStatement stat = conn.prepareStatement(sql); 
stat.setString(1, wordGER); 
stat.execute(); 

现在你使用一个delete语句,那么你只需要使用PreparedStatement#executeUpdate而非executeQuery

+0

也是事实,他们干脆直接倾倒不安全串到查询,而不是使用合适的参数 – JonK

+0

@JonK是正确的,特别是因为声明中已经包含了SQL注入的问题 – maja

+0

目前只是想获得基本加安全工作之前措施。 – hjalpmig