java - 如何解决java.sql.SQLException : Parameter index out of range?

标签 java mysql sql servlets prepared-statement

我是新手开发人员。在我的代码中,html 页面在浏览器中正确显示,但在提交数据后,它没有调用 post 方法,因此没有将数据存储在我的 mysql workbence 数据库中。数据库中的模式名称是registration,表名称是reg_details。我使用的是apache tomcat服务器。

HTML 文件:

<!DOCTYPE html>
    <html>
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="Registration" method="post" autocomplete="on">
    <fieldset>
    <legend>Registration Details:</legend>
    First Name &nbsp <input type="text" name="firstname" autofocus> &nbsp Middle name &nbsp <input type="text" name="middlename"> &nbsp Last Name &nbsp <input type="text" name="lastname"><br><br>
    Address &nbsp <br> <textarea name="address" rows="2" cols="25"></textarea>
    <br><br>
    Gender &nbsp <input type="radio" name="gender" value="male"> Male <input type="radio" name="gender" value="female"> Female<br><br>
    Mobile No. &nbsp <input type="text" name="mobileno"> <br><br>
    Email Id &nbsp <input type="email" name="emailid"> <br><br> 
    Birth Date &nbsp <input type="date" name="birthday"><br><br>
    Username &nbsp <input type="text" name="username"><br><br>
    Password &nbsp <input type="password" name="password"><br><br>
    <input type="submit" value="Submit">
    </fieldset>
    </form>
    </body>
    </html>

registration.java 文件

    import java.io.IOException;
        import java.io.PrintWriter;
        import java.sql.*;
        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;

        /**
         * Servlet implementation class Registration
         */
        @WebServlet("/Registration")
        public class Registration extends HttpServlet {

            private static final long serialVersionUID = 1L;
            /**
             * @see HttpServlet#HttpServlet()
             */
            public Registration() {
                super();
                // TODO Auto-generated constructor stub
            }

            /**
             * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
             */
            public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO Auto-generated method stub

                //http://localhost:12093
                try {
                    String firstname=request.getParameter("firstname");
                    PrintWriter print = response.getWriter();
                    print.println(firstname);
                    Class.forName("com.mysql.jdbc.Driver");
                    java.sql.Connection connection;

                    connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/registration","root","rohan");
                    PreparedStatement ps=connection.prepareStatement("INSERT INTO reg_details (name) values ('rk');");
                    //Statement stmt = connection.createStatement();
                //  ResultSet result = stmt.executeQuery("INSERT INTO reg_details (name) values ('rohan');");
                    ps.setString(1, firstname);
                    ps.executeUpdate();
        //          while(result.next())
        //          {
        //              PrintWriter print = response.getWriter();
        //              print.println(result.getString("name"));
        //          }
connection.close();
            ps.close();
                } catch (SQLException | ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

For writing connection con = DriverManager.getconnection(); its telling me to write like this java.sql.Connection connection; or connection con = (connection)DriverManager.getconnection();  

我根据您的建议更新了。我在最后关闭了连接并删除了服务方法,但在执行相同的错误后退出。我正在附上我的控制台,以便它可以帮助您。我使用 mysql-connector-java-5.1.44-bin.jar 进行数据库连接。

这是来自服务器控制台的堆栈跟踪:

org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Hospital Queue Management' did not find a matching property. org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          
org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         8.0.48.0
org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8085"]
 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8019"]
 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1512 ms
 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3327)
    at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3312)
    at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4027)
    at Registration.doPost(Registration.java:44)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

最佳答案

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

您没有任何用于准备语句的占位符(参数数量为 0)

INSERT INTO reg_details (name) values ('rk')

但是,您正在尝试设置

ps.setString(1, firstname);

这就是你遇到异常的原因。您需要更改 SQL 以接受一个参数

INSERT INTO reg_details (name) values (?)

关于java - 如何解决java.sql.SQLException : Parameter index out of range?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48444310/

相关文章:

java - 初学编程练习(Java): recursively counting instances of substring in string (. equals()?)

java - Selenium WebDriver - Appium - Android 自动化期间出现 NoClassDefFound 错误?

mysql - mqtt 代理 1.4.1 带有 auth 插件,后端 mysql,无法 sub/pub,用户名或密码错误

mysql - 同一列上的多个条件

sql - CLP和SQL是什么关系?

mysql - 带计数和日期的双 GroupBy 返回错误的日期

java - 如何在 HashSet 中保留插入顺序?

java - Struts 2中validation概念的理解

php - 那么检查一行是否存在的最佳方法是什么? EXISTS、COUNT 或 num_rows?

sql - 使用for循环在oracle sql中更新多行