Java 如何从两个HTML表单/子表单将数据插入MySql数据库

Java 如何从两个HTML表单/子表单将数据插入MySql数据库,java,html,mysql,servlets,jdbc,Java,Html,Mysql,Servlets,Jdbc,我有两个HTML表单: 1.注册/登录 2.用户登录后,他会更新自己的详细信息 我使用MySql数据库来保存用户的登录详细信息。另外,我还有一个表格,用于在他登录后更新他的详细信息 我在注册/登录过程中获得了成功,但这里出现了问题。,,我不知道如何继续。在他登录后,用户应该能够更新其各自表中的详细信息 这是我的登录Servlet,它在用户登录后从第一个主登录表单获取信息。然后还有另一个HTML表单,用户在其中输入他的个人详细信息。它存储在另一个表中。出现了问题。我无法处理第二个表中用户的详细信息

我有两个HTML表单: 1.注册/登录 2.用户登录后,他会更新自己的详细信息

我使用MySql数据库来保存用户的登录详细信息。另外,我还有一个表格,用于在他登录后更新他的详细信息

我在注册/登录过程中获得了成功,但这里出现了问题。,,我不知道如何继续。在他登录后,用户应该能够更新其各自表中的详细信息

这是我的登录Servlet,它在用户登录后从第一个主登录表单获取信息。然后还有另一个HTML表单,用户在其中输入他的个人详细信息。它存储在另一个表中。出现了问题。我无法处理第二个表中用户的详细信息

登录Servlet:

package com.ea.servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class Register extends HttpServlet {

 protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

String name = request.getParameter("name");
String pass = request.getParameter("pass");
String mem = request.getParameter("mem");
try{

 //loading drivers for mysql
 Class.forName("com.mysql.jdbc.Driver");

 //creating connection with the database 
  Connection  con=DriverManager.getConnection
             ("jdbc:mysql://localhost:3306/EATWO","root","");

Statement statement = (Statement) con.createStatement();
ResultSet rs = statement.executeQuery("SELECT * from singer where name='" + name + "'");
String duplicate = null;
while(rs.next()){
    duplicate = rs.getString(1);
    }
if(duplicate == null){
    PreparedStatement ps=con.prepareStatement
            ("insert into Singer(name,password,member) values(?,?,?)");
     ps.setString(1, name);
     ps.setString(2, pass);
     ps.setString(3, mem);
     int i=ps.executeUpdate();

       if(i>0)
       {
         out.println("You are sucessfully registered");
       }
    }
    else{
        //request.getRequestDispatcher("/register.html").forward(request, response);
        //request.setAttribute("error","Invalid Username/password");
               request.getRequestDispatcher("/register_err.html").forward(request, response);
    }
}
catch(Exception se)
{
    se.printStackTrace();
}

}
这段代码的意思是…我希望这个servelt能够根据您的建议得到更正..这是第二个子表单,在用户登录后,这段代码可以帮助用户存储他的个人详细信息,但我被这段代码卡住了

import java.io.*;
import javax.servlet.*; 
import javax.servlet.http.*;
import java.sql.*;

public class Register extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

String name = request.getParameter("name");
String pass = request.getParameter("pass");
String mem = request.getParameter("mem");
try{

//loading drivers for mysql
Class.forName("com.mysql.jdbc.Driver");

//creating connection with the database 
  Connection  con=DriverManager.getConnection
             ("jdbc:mysql://localhost:3306/EATWO","root","");

Statement statement = (Statement) con.createStatement();
ResultSet rs = statement.executeQuery("SELECT * from singer where name='" + name + "'");
String duplicate = null;
while(rs.next()){
    duplicate = rs.getString(1);
    }
if(duplicate == null){
    PreparedStatement ps=con.prepareStatement
            ("insert into Singer(name,password,member) values(?,?,?)");
     ps.setString(1, name);
     ps.setString(2, pass);
     ps.setString(3, mem);
     int i=ps.executeUpdate();

       if(i>0)
       {
         out.println("You are sucessfully registered");
       }
    }
    else{
        //request.getRequestDispatcher("/register.html").forward(request, response);
        //request.setAttribute("error","Invalid Username/password");
               request.getRequestDispatcher("/register_err.html").forward(request, response);
    }
}
catch(Exception se)
{
    se.printStackTrace();
}
}

为了池的缘故,你相信池对象吗!?,更糟糕的是,您没有关闭
连接
,也没有关闭
语句
s,也没有关闭
结果集
s

太危险了(sql注入),请使用
PreparedStement
,而不要像对待其他语句一样

这个

可能是这样

if(!rs.next()){
    PreparedStatement ps=con.prepareStatement
            ("insert into Singer(name,password,member) values(?,?,?)");
     ps.setString(1,name);ps.setString(2,pass);ps.setString(3,mem);
     int i=ps.executeUpdate();
       if(i>0){
         response.redirect("<<update_cgi_path_here>>");return;
       }
}

魅力:
您可以选择一条记录,如果第一条记录不存在,则插入一条记录
C'mon
这是什么逻辑!,整个记录插入(持久化新用户)应该通过一个外部/SQL调用来完成。
您的代码很有可能出现数据不一致(据我所知,SQL数据结构中发生了什么),因为它不是线程安全的。
就像注册页面一样,您可能有一个html页面,用户可以提供其信息,只需从请求中获取参数(就像注册)并通过后端数据源更新用户数据。

但请首先拥有一个数据库连接池,使用
PreparedStatement
over
Statement
(如果您需要设置一些内容),使用一些后端sql函数来检查和插入用户(而不是多次调用),相信关闭
Closeables
(只需使用
try(){}

为了池的缘故,您相信池对象吗?更糟糕的是,您不关闭
连接
,也不关闭
语句
s,也不关闭
结果集
s

太危险了(sql注入),请使用
PreparedStement
,而不要像对待其他语句一样

这个

可能是这样

if(!rs.next()){
    PreparedStatement ps=con.prepareStatement
            ("insert into Singer(name,password,member) values(?,?,?)");
     ps.setString(1,name);ps.setString(2,pass);ps.setString(3,mem);
     int i=ps.executeUpdate();
       if(i>0){
         response.redirect("<<update_cgi_path_here>>");return;
       }
}

魅力:
选择一条记录,然后
插入一条记录(如果第一条记录不存在)
继续
这是什么样的逻辑!整个记录插入(持久化新用户)应该通过一个外部/SQL调用来完成。
您的代码很可能存在数据不一致性(据我所知,sql数据结构中发生了什么),因为它不是线程安全的。

就像注册页面一样,您可能有一个html页面,用户可以提供其信息,只需从请求中获取参数(就像注册)并通过后端数据源更新用户数据。

但请首先拥有一个数据库连接池,使用
PreparedStatement
over
Statement
(如果您需要设置一些内容),使用一些后端sql函数来检查和插入用户(而不是多次调用),相信关闭
Closeables
(只需使用
try(){}

请向我们展示一些您迄今为止所做工作的代码。是的。展示一些代码。等待您的建议!!!!只是为了确保我是否正确:您想登录,然后重定向到更新页面。是吗?是的!!!完全正确!!!用户登录并更新其详细信息。这就是确切的情况。@PaulinhoPlea.您现在可以帮助我吗se向我们展示您迄今为止所做的一些代码。是的。展示一些代码。等待您的建议!!!!只是为了确保我是否正确:您想登录,然后重定向到更新页面。是吗?是的!!!完全正确!!!用户登录并更新其详细信息。这就是确切的情况。@Paulinho.您现在可以帮助我吗
String duplicate = null;
while(rs.next()){
    duplicate = rs.getString(1);
    }
if(duplicate == null){
    PreparedStatement ps=con.prepareStatement
            ("insert into Singer(name,password,member) values(?,?,?)");
     ps.setString(1, name);
     ps.setString(2, pass);
     ps.setString(3, mem);
     int i=ps.executeUpdate();
       if(i>0){
         out.println("You are sucessfully registered");
       }
    }
if(!rs.next()){
    PreparedStatement ps=con.prepareStatement
            ("insert into Singer(name,password,member) values(?,?,?)");
     ps.setString(1,name);ps.setString(2,pass);ps.setString(3,mem);
     int i=ps.executeUpdate();
       if(i>0){
         response.redirect("<<update_cgi_path_here>>");return;
       }
}
response.redirect("/update__info");return;