【问题标题】:How to insert Data into MySql Database from Two HTML Forms/SubForms如何从两个 HTML 表单/子表单将数据插入 MySql 数据库
【发布时间】:2015-11-26 18:04:26
【问题描述】:

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

}

这段代码是要说的...我希望根据您的建议更正此服务。这是第二个子表单。用户登录后的位置。此代码帮助用户存储他的个人详细信息., 但我被这个卡住了。

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

}

【问题讨论】:

  • 请向我们展示一些您到目前为止所做的代码。
  • 是的。显示一些代码。
  • 等待您的建议!!!!
  • 只是为了确定我是否正确:您想登录,然后被重定向到更新页面。对吗?
  • 是的!!!确切地!!!用户登录并更新他的详细信息..这是确切的场景..你现在能帮我吗@Paulinho

标签: java html mysql servlets jdbc


【解决方案1】:
  Class.forName("com.mysql.jdbc.Driver");

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

为了池,你相信池对象吗!?更糟糕的是你不关闭Connection,既不关闭Statements,也不关闭ResultSets!

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

太危险(sql 注入),请改用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页面,只需从请求中获取参数(就像注册一样)并通过后端数据源更新用户数据。

但请先有一个数据库连接池,使用PreparedStatement而不是Statement(如果你需要设置一些东西),有一些后端sql函数来检查和插入用户(而不是多次调用),相信关闭Closeables(只需使用@987654337 @)

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多