【问题标题】:ResultSet#next() is returning false even though my query is correct即使我的查询是正确的,ResultSet#next() 也返回 false
【发布时间】:2015-05-17 19:51:59
【问题描述】:

我在 jsp 文件中编写了以下代码。基本上它的作用是检查是否有任何具有特定银行名称、卡号和密码的数据。为了检查这一点,我使用了选择查询。 .查询是正确的,但结果集返回false..我什至单独检查了查询..它工作正常..这段代码有问题吗??请帮助..我使用 netbeans 作为我的 IDE 和 Derby 数据库..

    String URL="jdbc:derby://localhost:1527/Bank Database";
    try{
        Connection cn=DriverManager.getConnection(URL,"Bank","Bank");
        String qry="SELECT * FROM DATABASE WHERE BANK='"+bname+"' AND CARD_NO='"+cname+"' AND PASWORD='"+pswrd+"'";
        Statement sq=cn.createStatement();
        ResultSet rs=sq.executeQuery(qry);
        if(rs.next()){
            if(rs.getString("PASWORD").equals(pswrd))
            {
                cn.close();
                out.println("<script>function redirect(){ window.location=\"scsfl.html\";} setTimeout('redirect()',3000);</script>");  //redirects to another page   
            }
        }
        else{
            cn.close();
            out.println("<script>function redirect(){ window.location=\"failed.html\";} setTimeout('redirect()',3000);</script>");
        }
    }catch(Exception e){ System.out.print(e);}

【问题讨论】:

  • 既然是JSP,我不知道System.out去哪里了,但是你检查过服务器日志吗?
  • ya.. 没有错误..
  • 你应该认识Little Bobby Tables
  • 你做错了。您应该使用PreparedStatement,并且 SQL 查询已经检查了密码,因此您无需自己执行此操作:您只关心是否有结果。
  • 但这很难相信。你真的拼错了PASWORD吗?两次?如果是这样,为什么列名在数据库中拼写错误?你确定到底发生了什么吗?有三种可能性,而不是两种:(a)ResultSet.next() 返回 false; (b) 比较密码返回错误;或 (c) ResultSet.next() 返回 true 并且比较密码也成功。您的代码没有记录所有三种可能性。

标签: java jsp jdbc resultset


【解决方案1】:

正如 cmets 中提到的,您的实际代码显示出许多问题:

  1. 您使用的是Statement而不是PreparedStatement,它更安全,可以防止一些黑客像SQL注入一样移动,您可以在JDBC Statement vs PreparedStatement – SQL Injection Example找到更多信息。
  2. 您正在检查 Java 代码中的密码,而该密码已在 SQL 查询中完成,因此查询会检查密码是否正确,否则将返回结果,否则结果将为空。
  3. if..else 语句中关闭连接是一种非常糟糕 的做法,您最好在finally 块中使用try..catch 语句来处理它,您将分别关闭@987654327 @、prepared statementconnexion

我试图改进你的代码,这是你应该做的:

    Connection con = null;
    String URL="jdbc:derby://localhost:1527/Bank Database";
    PreparedStatement ps = null;
    ResultSet rs = null;
    String qry="SELECT * FROM DATABASE WHERE BANK=? AND CARD_NO=? AND PASWORD=?";
    try {
        con = DriverManager.getConnection(URL,"Bank","Bank");
        ps = con.prepareStatement(qry);

        //set the parameter
        ps.setString(1, bname);
        ps.setString(2, cname);
        ps.setString(3, pswrd);
        rs = ps.executeQuery();

        if (rs.next()) {
            out.println("<script>function redirect(){ window.location=\"scsfl.html\";} setTimeout('redirect()',3000);</script>");  //redirects to another page 
        } else {
            out.println("<script>function redirect(){ window.location=\"failed.html\";} setTimeout('redirect()',3000);</script>");
        }
    } finally {
        if (rs != null)
            rs.close();
        ps.close();
        con.close();
    }

【讨论】:

  • VG 但它应该是if (rs.next()),如 OP 的代码中所示。确实不会有多个用户使用相同的用户名和密码,即使存在两次发送同一段 HTML 也是不正确的。而且您已经省略了 OP 提供的失败案例。
  • @EJP 好点,是的,你是对的,我正在改变它。
  • 你改了一半;-)
  • 是的,感谢您的改进。
【解决方案2】:

确保您在正确的数据库中,我犯了几次这个错误。 查询正确,错误的数据库。

【讨论】:

    【解决方案3】:

    一般来说,关闭连接应该会自动关闭与该连接关联的所有语句和结果集。

    在这段代码中,我关闭了 rs.next() 方法中的连接接口引用。这就是 JSP Engine 无法将其转换为 java 文件的原因。它显示错误消息。请找到代码和相应的错误消息。

    jsp代码:

    Class.forName("oracle.jdbc.driver.OracleDriver");
       Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "test", "test");
       
       String username = "Anil3";
       String password = "123";
      
      
       PreparedStatement pst = con.prepareStatement("select * from User_Login where userID='"+ username +"'");
       ResultSet rs = pst.executeQuery();
    	while(rs.next())
    	{
    	  if (password.equals(rs.getString("password"))) 
    	   {
    		 con.close();
    		out.print("inside if loop");
    	   }
    	  
    	  else{
    		  
    		  con.close();
    		  out.print("Inside else loop");
    	  }
    	}

    错误信息:

    org.apache.jasper.JasperException: An exception occurred processing JSP page /test.jsp at line 28
    
    25:   
    26:    PreparedStatement pst = con.prepareStatement("select * from User_Login where userID='"+ username +"'");
    27:    ResultSet rs = pst.executeQuery();
    28: 	while(rs.next())
    29: 	{
    30: 	  if (password.equals(rs.getString("password"))) 
    31: 	   {
    
    
    Stacktrace:
    	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
    	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
    	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    
    
    root cause 
    
    javax.servlet.ServletException: java.sql.SQLException: Closed Connection: next
    	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:912)
    	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:841)
    	org.apache.jsp.test_jsp._jspService(test_jsp.java:124)
    	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    
    
    root cause 
    
    java.sql.SQLException: Closed Connection: next
    	oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    	oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    	oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:181)
    	org.apache.jsp.test_jsp._jspService(test_jsp.java:97)
    	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

    您不应该关闭 ResultSet 内的连接。请删除代码中的 con.close() 语句并尝试一下。它会起作用的。

    【讨论】:

    • 为什么你要检查 Java 代码中的密码,而 SQL 正在为你做。
    • 他没有使用while (rs.next():他使用的是if (rs.next())。至少据我们所知,他没有收到java.sql.SQLException: Closed Connection: next。根据 OP,这都不是“JSP 引擎无法将其转换为 java 文件的原因”,因为它确实 '转换它' 执行它。随意重写问题以适应先入为主的答案实际上并不能解决问题。
    • @chsdk,我没有在我的查询中检索密码。我只检索用户名,之后我在我的 java 代码中检查了密码。
    • 是的,我知道,这就是我想说的,你为什么要检查查询中的name 并检索结果,然后检查Java 代码中的password,而你可以简单地在查询中检索想要的结果并检查这两个值。
    • @AnilReddy 您似乎不了解自己的代码。您的 SQL 查询已包含对 PASWORD 的匹配项。因此,再次检查它是 100% 多余的。您不会得到任何不匹配的行。您所做的只是另一个可能的错误站点。这是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2020-07-24
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多