首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从两个HTML /SubForms向MySql数据库插入数据

如何从两个HTML /SubForms向MySql数据库插入数据
EN

Stack Overflow用户
提问于 2015-09-01 13:15:28
回答 1查看 4.3K关注 0票数 1

我有两个HTML表单: 1。注册/登录2。用户获得登录后,他经常更新他的详细信息。

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

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

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

登录Servlet:

代码语言:javascript
复制
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();
}

}

这段代码是要说的.我希望这个服务器得到纠正,因为你的suggestions..Here是第二个SubForm。在用户登录后,这个代码帮助用户存储他的个人信息。但是我被困在这里了。

代码语言:javascript
复制
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();
}

}

EN

回答 1

Stack Overflow用户

发布于 2015-09-02 03:49:24

Class.forName("com.mysql.jdbc.Driver");//创建与数据库连接con=DriverManager.getConnection的连接(“jdbc:mysql://localhost:3306/com.mysql.jdbc.Driver”、"root“、"");

为了池的缘故,您相信共享对象吗?更糟糕的是,您没有关闭ConnectionStatements、ResultSets!

ResultSet rs =statement.executeQuery(“name=‘+ name +’‘”);

太危险了(Sql),使用PreparedStement代替您对其余部分的使用。

代码语言:javascript
复制
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");
       }
    }

可能是这样的

代码语言:javascript
复制
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方法更新页面,如下所示

代码语言:javascript
复制
response.redirect("/update__info");return;

Awesomeness:

select一条记录,如果第一条记录不存在,则insert一条记录!

C'mon这种逻辑是什么!整个记录插入(持久化新用户)应该通过一个外部/SQL调用来完成。

您的代码有很好的数据不一致性潜力(据我所知,sql数据结构中发生了什么),因为它不是线程安全的。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32332678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档