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