通过jsp页面将表单数据插入到数据库的两个不同表中

时间:2016-05-16 14:07:24

标签: java html mysql database jsp

我有以下代码,它没有在数据库中添加任何插入,但如果我删除第二个“myStatement.executeUpdate(插入)”,它需要我第一次插入(sqlstring)...我怎么能运行两个插入并保存两个表的数据????更具体地说,我需要从用户表单中获取数据并将其保存到数据库中,但这里有一点...在复选框中,用户可以检查两个以及更少...所以如果表格和形成它们,你能帮助我吗?是正确的,如果它的权利,我可以做什么,以采取复选框的两个值,并将它们插入一个表...

 <%@page import="java.sql.*" %> 
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>create dest code</title>
        </head>
        <body>
             <%


       String id8=request.getParameter("id8");
       String id9=request.getParameter("id9");
       String id10=request.getParameter("id10");
       String ch1=request.getParameter("dest1");

       String empty= "";
       boolean flag=false;
       if (!(id8.equals(empty) | id9.equals(empty) | id10.equals(empty) )) {
           try {
                 Class.forName("com.mysql.jdbc.Driver"); 
                 String myDatabase = "jdbc:mysql://localhost:3306/project_app?user=root&password=1234"; 
                 Connection myConnection = DriverManager.getConnection(myDatabase);
                Statement myStatement = myConnection.createStatement();  
               String sqlString = "INSERT INTO dest(Country,City,URL) VALUES ('"+id8+"', '"+id9+"','"+id10+"')";
               String  insert= "INSERT INTO dest_has_categories(Categories_idCategories) VALUES ('"+ch1+"')";

             try{
                            myStatement.executeUpdate(sqlString);
                            myStatement.executeUpdate(insert);                        

                        }catch(SQLException sqlException) { 
            %>       

            <%
                            flag = true;
                        }
                        if(flag == false ){



                        }

                        // Close the connection to the database
                        myStatement.close();
                        myConnection.close();
                   }catch(Exception e){
                         e.printStackTrace();  
                   } 
                }else{        
            %>

            <%
                }
            %>

PS:您可以看到有两个不同的插入表...

html页面:

  <form name="createdest" method="get" action="../jsp/create-dest-code.jsp">
        Country: <input type="text"  required  name="id8" /> <br>
        City: <input type="text"  required  name="id9" /> <br>
        URL Video: <input type="url"  required  name="id10" /> <br> <br>
        <i><ins>Categorize the destination (max 2): </ins></i>  <br> <br>
        <input type="checkbox" name="dest1" value="2" onClick="return KeepCount()" >Christmas<br>
        <input type="checkbox" name="dest2" value="1" onClick="return KeepCount()" >Winter <br>
        <input type="checkbox" name="dest3" value="3" onClick="return KeepCount()" >Summer <br> <br>

        <input type="submit" class="button" value="CREATE DESTINATION" /> 


        <br>


        </form>
       <SCRIPT LANGUAGE="javascript">

function KeepCount() {

var NewCount = 0;

if (document.createdest.dest1.checked)
{NewCount = NewCount + 1;}

if (document.createdest.dest2.checked)
{NewCount = NewCount + 1;}

if (document.createdest.dest3.checked)
{NewCount = NewCount + 1;}

if (NewCount == 3)
{
alert('Pick Just Two Please');
document.createdest; return false;
}
} 
</SCRIPT>

mysql表:

CREATE TABLE IF NOT EXISTS `project_app`.`Dest` (
  `idDest` INT NOT NULL AUTO_INCREMENT,
  `Country` VARCHAR(45) NULL,
  `City` VARCHAR(45) NULL,
  `URL` VARCHAR(45) NULL,
  PRIMARY KEY (`idDest`))
CREATE TABLE IF NOT EXISTS `project_app`.`Categories` (
  `idCategories` INT NOT NULL,
  `Categories` VARCHAR(45) NULL,
  PRIMARY KEY (`idCategories`))
CREATE TABLE IF NOT EXISTS `project_app`.`Dest_has_Categories` (
  `Dest_idDest` INT NOT NULL ,
  `Categories_idCategories` INT NOT NULL,
  PRIMARY KEY (`Dest_idDest`, `Categories_idCategories`),
  INDEX `fk_Dest_has_Categories_Categories1_idx` (`Categories_idCategories` ASC),
  INDEX `fk_Dest_has_Categories_Dest_idx` (`Dest_idDest` ASC),
  CONSTRAINT `fk_Dest_has_Categories_Dest`
    FOREIGN KEY (`Dest_idDest`)
    REFERENCES `mydb`.`Dest` (`idDest`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Dest_has_Categories_Categories1`
    FOREIGN KEY (`Categories_idCategories`)
    REFERENCES `mydb`.`Categories` (`idCategories`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
INSERT INTO categories(idCategories,Categories) VALUES (1,'Winter');
INSERT INTO categories(idCategories,Categories) VALUES (2,'Christmas');
INSERT INTO categories(idCategories,Categories) VALUES (3,'Summer');

1 个答案:

答案 0 :(得分:3)

解决方案1 ​​

为两个插入操作创建两个不同的Statement实例。

解决方案2

如果要重用一个Statement实例,请关闭最终块中的资源。实际上,将close语句放在 finally 块中或者只是使用jdk7 +必须提供的 try-catch-resource 总是一个好主意。

与您的具体问题无关

  • 强烈建议您避免在jsp文件中使用java代码。搜索术语&#34; jsp servlet mvc&#34;。
  • 使用PreparedStatement而不是Statement来避免sql注入攻击。

解决方案1的编辑:

在你的第一个尝试块中:
Statement myStatement = myConnection.createStatement();下 添加Statement myStatementTwo = myConnection.createStatement();

在你的第二个尝试块中:
改变myStatement.executeUpdate(sqlString);
myStatementTwo.executeUpdate(sqlString);

为您的第一个尝试块添加最后一个块并关闭所有资源。编辑你的代码与从头开始重写所有代码几乎相同,如果你自己可以做到这一点,它将最有利于你。

OP提供HTML代码和数据库

后编辑

您的 Dest_has_Categories Dest_idDest auto_increment 列,但它也是引用目的地的外键的主键 idDest 。参考表(联合表)的外键不应为auto_increment。如果引用表中不存在DBMS生成的自动递增值,则会出现问题。

请将外键设为auto_increment,当您插入参考表 Dest_has_Categories 时,请插入现有的类别的ID和 Dest < / strong>&#39; id。

此外,当您更改代码时,请务必使用我的解决方案2进行最佳实践。