SQL操作数/未指定值错误,认为是语法,但不确定,可能还有其他问题吗?

时间:2019-04-15 21:41:52

标签: java mysql sql

我正在开发一个使用servlet,mysql数据库和tomcat的项目。所需的功能之一是用户登录页面。我的用户LoginPage servlet(Nea.Servlets.LoginPage)以格式输入电子邮件和密码,并将其传递给Login servlet(Nea.Servlets.Login)。

Login servlet使用另一个类SQLConnection(Nea.SQLConnection)中的一个函数来查询数据库,并检查是否存在具有该电子邮件和密码的用户(这也是包含所有与SQL相关的函数的类在)。

Login servlet的主要部分:

        SQLConnection sqlconnection = new SQLConnection();
        String Email = (String)request.getParameter("Email");
        String Password = (String)request.getParameter("Password");
if(sqlconnection.checkValidLogin(Email, Password) == false)//If the login details are incorrect:
        {
            PrintWriter out = response.getWriter();
            out.println("<meta http-equiv='refresh' content='3;URL='>");//redirects after 3 seconds
            out.println("<p style='color:red;'>Login unsuccessful! Please check your details and try again.</p>");      
            response.sendRedirect("/NEA/");
        }
        else//If the login details are correct:
        {
            PrintWriter out = response.getWriter();
            out.println("<meta http-equiv='refresh' content='3;URL=studenthome'>");//redirects after 3 seconds
            out.println("<p style='color:green;'>Login successful!</p>");
            response.sendRedirect("/NEA/studenthome");
        }

SQLConnection.checkValidLogin()的主要查询部分:

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url, username, this.password);
            System.out.println("Database connected!");      
            PreparedStatement ps = connection.prepareStatement("SELECT `Email`, `Password` FROM `users` WHERE `Email`=? AND `Password`=?;");//As the emails and passwords stored in the database are hashed, search for the hashed version of the input.

            System.out.println(ps);

            ps.setString(1, email);
            ps.setString(2, hashedPassword);

            System.out.println(ps);

            ResultSet rs = ps.executeQuery();
            returnedEmail=rs.getString(1);
            returnedPassword=rs.getString(2);

对于checkValidLogin()中的SQL查询,

当我使用时:

PreparedStatement ps = connection.prepareStatement("SELECT `Email`, `Password` FROM `users` WHERE `Email`=? AND `Password`=?;");

我收到错误:java.sql.SQLException:没有为参数2指定值

另一方面,当我使用时:

PreparedStatement ps = connection.prepareStatement("SELECT `Email`, `Password` FROM `users` WHERE (`Email`=?, `Password`=?);");

我最终收到错误:java.sql.SQLException:操作数应包含1列

我在做什么错了?


编辑:使用第一个PreparedStatement(使用'AND'的那个),我放入了一些虚拟值,并且我可以确认hashedPassword不为NULL,因此问题不在于散列算法。

令人讨厌的是,我得到了一个新错误:Nea.SQLConnection.checkValidLogin():java.sql.SQLException:在结果集开始之前。 我真的不明白为什么我写了这样的结果集错误:

returnedEmail=rs.getString(1);
returnedEmail=rs.getString(2);

如果您有兴趣,这是在设置参数之前和之后输出电子邮件,hashedPassword和ps所得到的Tomcat输出:

email=leg
hashedPassword=c7c8fc91abb8ed76c29a883381b92612dcd8235d6e7ddca8d81f6e87d5fab417
Database connected!
com.mysql.jdbc.JDBC4PreparedStatement@60719c1c: SELECT `Email`, `Password` FROM `users` WHERE `Email`=** NOT SPECIFIED ** AND `Password`=** NOT SPECIFIED **;
com.mysql.jdbc.JDBC4PreparedStatement@60719c1c: SELECT `Email`, `Password` FROM `users` WHERE `Email`='leg' AND `Password`='c7c8fc91abb8ed76c29a883381b92612dcd8235d6e7ddca8d81f6e87d5fab417';

0 个答案:

没有答案