gpt4 book ai didi

java - 如何从两个 HTML 表单/子表单向 MySql 数据库插入数据

转载 作者:行者123 更新时间:2023-11-30 22:36:45 24 4
gpt4 key购买 nike

我有 2 个 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();
}

}

此代码是受影响的代码...我希望此服务根据您的建议得到更正...这是第二个子表单。用户登录后,此代码可帮助用户存储其个人详细信息., 但我被这个困住了。

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();
}

最佳答案

  Class.forName("com.mysql.jdbc.Driver");

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

为了池的缘故,你相信池化对象吗!?,更糟糕的是你不关闭 Connection , 既不Statement s,都不是ResultSet !

 ResultSet rs = statement.executeQuery("SELECT * from singer where
name='" + name + "'");

太危险了(sql注入(inject)),使用PreparedStement相反,就像你对其他人所做的那样。

这个

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;
}
}

成功注册用户后,使用 redirect(path:String):void 将他重定向到更新页面方法,如下所示

response.redirect("/update__info");return;


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

但是请首先要有一个数据库连接池,使用 PreparedStatementStatement (如果你需要设置一些东西),有一些后端 sql 函数来检查和插入用户(而不是多次调用),相信关闭 Closeables (简单地使用 try(<<closeable>>){} )

关于java - 如何从两个 HTML 表单/子表单向 MySql 数据库插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com