Java 不能';t在数据库中插入值

Java 不能';t在数据库中插入值,java,jsp,servlets,Java,Jsp,Servlets,我已经创建了注册Jsp和Servlet。当我使用表单插入值时,Apache日志中会出现未插入的值以及一些异常。有人能帮我找到实际错误吗。在我的查询或连接中 Jul 27, 2012 9:00:30 PM com.asiahospital.db.DataPersistor registerUser SEVERE: null java.sql.SQLException: Column count doesn't match value count at row 1 at com.mysql.

我已经创建了注册Jsp和Servlet。当我使用表单插入值时,Apache日志中会出现未插入的值以及一些异常。有人能帮我找到实际错误吗。在我的查询或连接中

Jul 27, 2012 9:00:30 PM com.asiahospital.db.DataPersistor registerUser
SEVERE: null
java.sql.SQLException: Column count doesn't match value count at row 1
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2618)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:842)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:681)
    at com.example.db.DataPersistor.registerUser(DataPersistor.java:29)
    at com.example.servlet.RegistrationServlet.doPost(RegistrationServlet.java:40)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at [...]
冒犯的方法:

public void registerUser(User user) { 
    try { 
        Statement stmt = con.createStatement(); 
        String query = "INSERT INTO user VALUES ('" + user.getUserName()+ "','" 
            + user.getPassword() + "','" + user.getFirstName() + "','"
            + user.getLastName() + "','" + user.getEmail() + "','false')"; 
        stmt.execute(query); 
    } catch (SQLException ex) { 
        Logger.getLogger(DataPersistor.class.getName()).log(Level.SEVERE, null, ex); 
    } 
}

在insert语句中,提供的列数与指定的值数不同

e、 g

在表1(A、B、C)中插入值(1001001001001004)


=>3列!=4个值。

您的查询很可能如下所示:

INSERT INTO my_table(A, B, C) VALUES ('a', 'b')
或者像这样(我的_表仍然有三列)


很明显,这是行不通的,因为您必须提供与列一样多的值。从你的评论来看,我怀疑这是第二起案件。您有一条预先存在的SQL语句,有人从您的
user
表中添加/删除了一列,导致此SQL语句无效

发布正在执行的SQL查询以及相关数据库表的定义。让我们看看
registerUser
methodpublic void registerUser(用户)中的代码{try{Statement stmt=con.createStatement();String query=“插入到用户值中”(“+user.getUserName()+”,“+user.getPassword()+”,“+user.getFirstName()+”,“+user.getLastName()+”,“+user.getEmail()+”,“false”);stmt.execute(查询);}catch(SQLException ex){Logger.getLogger(DataPersistor.class.getName()).log(Level.SEVERE,null,ex);}}并且还使用preparesStatements而不是字符串查询concatation,因为这是sql注入的主题这就是为什么我总是指定
插入表(field1,field2,field3)值(foo,bar,baz)
-当我更改架构时,没有任何内容会中断。如果我需要插入中的额外字段,那么在测试过程中可以很容易地找到它-通常,您不需要到处添加该字段。
INSERT INTO my_table VALUES ('a', 'b')