jQuery/PHP 动态表单提交

Posted

技术标签:

【中文标题】jQuery/PHP 动态表单提交【英文标题】:jQuery/PHP dynamic form submission 【发布时间】:2021-01-26 06:31:24 【问题描述】:

我正在寻找一种在一次提交中提交多个动态表单字段的方法。 提交时的每一行数据将共享某些属性:工作 ID、客户、工作类型。 同时还保留自己的自变量:角色、姓名、tvl、开始日期、结束日期、开始时间、结束时间。

我认为我的解决方案要么需要一个 for 循环,要么需要使用多维数组(可能两者兼而有之?),但我不知道在我的代码中的哪个位置或如何实现。

目前 - 我的数据库中只显示了 1 个“员工” - 通常是“详细信息” div 中的最后一个条目。

代码如下:

HTML index.php


<?php
  session_start();
?>

<!DOCTYPE html>
  <head>
  </head>
    <body>
        <form method="POST" action="include/ajax.inc.php" class="ajax">
                  <h2>Job Details</h2>
                  <br>
                  <div class="form-group row">
                    <label class="col-sm-2 col-form-label">Job ID</label>
                    <div class="col-sm-10">
                      <input type="text" class="form-control" name="a" id="a">
                    </div>
                  </div>

                  <div class="hr-line-dashed"></div>

                  <div class="form-group row">
                    <label class="col-sm-2 col-form-label">Client</label>
                    <div class="col-sm-10">
                      <select type="text" class="form-control" name="b" id="b">
                        <option value="" disabled selected>Select</option>
                        <option value="OPTION1" name="OPTION1">OPTION1</option>
                        <option value="OPTION2" name="OPTION2">OPTION2</option>
                        
                     
                      </select>
                    </div>
                  </div>

                  <div class="hr-line-dashed"></div>

                  <div class="form-group row">
                    <label class="col-sm-2 col-form-label">Type of Work</label>
                    <div class="col-sm-10">
                      <select type="text" class="form-control" name="c" id="c">
                        <option value="" disabled selected>Select</option>
                        <option value="OPTION1" name="OPTION1">OPTION1</option>
                        <option value="OPTION2" name="OPTION2">OPTION2</option>
                      
                      </select>
                    </div>
                  </div>

                  <div class="hr-line-dashed"></div>

                  <h2>Employee Details</h2>
                  <button class="btn btn-lg btn-primary btn-rounded m-sm" id="add">
                    <small>ADD EMPLOYEE</small>
                  </button>
                  <!--- ADD EMPLOYEES --->
                  <div class="ibox" id="details" name="details[]">
                    <div class="ibox-content">
                      <div class="container">
                        <div class="row">
                          <div class="col">
                            <label class="form-label">Position</label>
                            <select class="form-control" type="text" name="d" id="d">
                              <option value="" disabled selected>Select</option>
                              <option value="ROLE1" name="SPV">ROLE1</option>
                              <option value="ROLE2" name="REG">ROLE2</option>
                            </select>
                          </div>

                          <div class="col">
                            <label class="form-label">Name</label>
                            <input type="text" class="form-control" name="e" id="e">
                          </div>

                          <div class="col">
                            <label class="form-label">TVL</label>
                            <input type="text" class="form-control" name="f" id="f">
                          </div>

                          <div class="col">
                            <label class="form-label">Start Date</label>
                            <input type="date" class="form-control" name="g" id="g">
                          </div>

                          <div class="col">
                            <label class="form-label">End Date</label>
                            <input type="date" class="form-control" name="h" id="h">
                          </div>

                          <div class="col">
                            <label class="form-label">Start Time</label>
                            <input type="time" class="form-control" name="i" id="i">
                          </div>

                          <div class="col">
                            <label class="form-label">End Time</label>
                            <input type="time" class="form-control" name="j" id="j">
                          </div>
                          <div class="col text-right m-t-lg">
                          </div>

                        </div>
                      </div>
                    </div>
                  </div>
                  <!--- ADD EMPLOYEES END --->
                  <div class="hr-line-dashed"></div>
                  <button type="submit" class="btn btn-primary btn-med" name="submit">Submit</button>
                </form>
<!-- SCCRIPT-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="js/main.js"></script>
  </body>
  </html>

JS main.js

$(document).ready(function()

  var html = ' <div class="ibox" id="details" name="details[i]"> <div class="ibox-content"> <div class="container"> <div class="row"> <div class="col"> <label class="form-label">Position</label> <select class="form-control" type="text" name="d" id="d"> <option value="" disabled selected>Select</option> <option value="SPV" name="SPV">SPV</option> <option value="REG" name="REG">REG</option> </select> </div> <div class="col"> <label class="form-label">Name</label> <input type="text" class="form-control" name="e" id="e"> </div> <div class="col"> <label class="form-label">TVL</label> <input type="text" class="form-control" name="f" id="f"> </div> <div class="col"> <label class="form-label">Start Date</label> <input type="date" class="form-control" name="g" id="g"> </div> <div class="col"> <label class="form-label">End Date</label> <input type="date" class="form-control" name="h" id="h"> </div> <div class="col"> <label class="form-label">Start Time</label> <input type="time" class="form-control" name="i" id="i"> </div> <div class="col"> <label class="form-label">End Time</label> <input type="time" class="form-control" name="j" id="j"> </div> <div class="col text-right m-t-lg"> </div> <div class="col text-right m-t-lg"> <button class="btn btn-sm btn-rounded btn-danger" id="remove"> <i class="fa fa-times"></i> </button> </div></div> </div> </div> </div>'

  // Add rows to the form
    $(function() 
    $('#add').click(function(e) 
      $('#details').append(html);
      e.preventDefault();
      );

   // Remove rows from the form 
    $(this).on('click', '#remove', function(e) 
    $(this).closest('#details').remove();
    );

  );


);


$('form.ajax').on('submit', function() 

  var that = $(this),
    url = that.attr('action'),
    type = that.attr('method'),
    data = ;

    that.find('[id]').each(function(index, value)
      var that = $(this),
      name = that.attr('id'),
      value = that.val();
      data[name] = value;

    );

  $.ajax (
    url: url,
    type: method,
    data: data,
    success: function(response) 
    console.log(response);
    


  );

  return false;

);

PHP ajax.inc.php

<?php
    include 'form.dbh.php'; 

    
    $jobid = mysqli_real_escape_string($conn,$_POST['a']);
    $client = mysqli_real_escape_string($conn,$_POST['b']);
    $type = mysqli_real_escape_string($conn,$_POST['c']);
    $role = mysqli_real_escape_string($conn,$_POST['d']);
    $name = mysqli_real_escape_string($conn,$_POST['e']);
    $tvl = mysqli_real_escape_string($conn,$_POST['f']);
    $sdate = mysqli_real_escape_string($conn,$_POST['g']);
    $edate = mysqli_real_escape_string($conn,$_POST['h']);
    $stime = mysqli_real_escape_string($conn,$_POST['i']);
    $etime = mysqli_real_escape_string($conn,$_POST['j']);



    $sql = "INSERT INTO timesheets(jobid, client, type, role, name, tvl, sdate, edate, stime, etime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql))
      echo "SQL error";
     else 
      mysqli_stmt_bind_param($stmt, 'ssssssssss', $jobid, $client, $type, $role, $name, $tvl, $sdate, $edate, $stime, $etime);
      mysqli_stmt_execute($stmt);

  

  header("Location:../index.php?success");
  

 ?>

有人有想法吗?或者有什么建议?

【问题讨论】:

欢迎来到 Stack Overflow。使用表单提交,您将希望在执行 AJAX 调用时阻止默认操作。最好添加一个事件变量e,然后在回调中调用.preventDefault() 我还看到您在同一个回调中使用了两次that。它应该被分开,但它可能不够明确以至于它会覆盖原来的that。根据经验,尽可能使用唯一的变量名。 请提供更多见解 - 您的应用程序的哪一部分未按预期工作?您的问题不太可能一次性涵盖 javascript、PHP、HTML、jQuery SQL 我希望在一个提交函数中提交多个附加条目 - 目前只有一个条目(最后一个子项)正在提交,而其他附加条目(包括父条目)未提交已提交。 【参考方案1】:

考虑以下内容。

$(function() 

  var html = ' <div class="ibox" id="details" name="details[i]"> <div class="ibox-content"> <div class="container"> <div class="row"> <div class="col"> <label class="form-label">Position</label> <select class="form-control" type="text" name="d" id="d"> <option value="" disabled selected>Select</option> <option value="SPV" name="SPV">SPV</option> <option value="REG" name="REG">REG</option> </select> </div> <div class="col"> <label class="form-label">Name</label> <input type="text" class="form-control" name="e" id="e"> </div> <div class="col"> <label class="form-label">TVL</label> <input type="text" class="form-control" name="f" id="f"> </div> <div class="col"> <label class="form-label">Start Date</label> <input type="date" class="form-control" name="g" id="g"> </div> <div class="col"> <label class="form-label">End Date</label> <input type="date" class="form-control" name="h" id="h"> </div> <div class="col"> <label class="form-label">Start Time</label> <input type="time" class="form-control" name="i" id="i"> </div> <div class="col"> <label class="form-label">End Time</label> <input type="time" class="form-control" name="j" id="j"> </div> <div class="col text-right m-t-lg"> </div> <div class="col text-right m-t-lg"> <button class="btn btn-sm btn-rounded btn-danger" id="remove"> <i class="fa fa-times"></i> </button> </div></div> </div> </div> </div>'


  $('#add').click(function(e) 
    $('#details').append(html);
    e.preventDefault();
  );

  // Remove rows from the form 
  $(this).on('click', '#remove', function(e) 
    $(this).closest('#details').remove();
  );

  $('form.ajax').on('submit', function(e) 
    e.preventDefault();

    var that = $(this),
      u = that.attr('action'),
      t = that.attr('method'),
      d = ;

    that.find('[id]').each(function(i, el) 
      d[$(el).attr("id")] = $(el).val();
    );

    $.ajax(
      url: u,
      type: t,
      data: d,
      success: function(response) 
        console.log(response);
      
    );

    return false;
  );
);

这可以解决您遇到的一些问题。使用.each() 时,您将拥有一个索引和元素,而不是一个值。

更新

上面的代码将根据form.ajax选择器提交所有数据。当表单中只有一部分详细信息时,这就是将要提交的所有数据。如果添加 HTML,则会导致元素的 ID 属性不再唯一的 HTML/JS 问题。所有 ID 都必须是唯一的。

考虑忽略 ID 并改用 name 属性。当您收集数据时,对于 dj,这些数据需要是数组,因为这些是重复的项目。

考虑以下内容。

$(function() 
  function getData(f) 
    var myData = 
      a: $("[name='a']", f).val(),
      b: $("[name='b']", f).val(),
      c: $("[name='c']", f).val(),
      d: [],
      e: [],
      f: [],
      g: [],
      h: [],
      i: [],
      j: []
    ;
    var k, v;
    $("[name]", f).each(function(i, el) 
      k = $(el).attr("name");
      v = $(el).val();
      if (i > 2) 
        myData[k].push(v);
      
    );
    console.log(myData);
    return myData;
  

  $('#add').click(function(e) 
    var html = $("#details > .ibox-content:eq(0)").clone(true);
    $(".col:last", html).html("<button class='btn btn-sm btn-rounded btn-danger remove' id='remove-" + $(".ibox-content").length + "'> <i class='fa fa-times'></i> </button>");
    $(".ibox-content:last").after(html);
    e.preventDefault();
  );

  $("#details").on('click', '.remove', function(e) 
    $(this).closest('.ibox-content').remove();
  );

  $("form.ajax").submit(function(e) 
    e.preventDefault();
    $.ajax(
      url: $(this).attr("action"),
      type: "POST",
      data: getData(this),
      success: function(response) 
        console.log(response);
      
    );
  );
);
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form method="POST" action="include/ajax.inc.php" class="ajax">
  <h2>Job Details</h2>
  <br>
  <div class="form-group row">
    <label class="col-sm-2 col-form-label">Job ID</label>
    <div class="col-sm-10">
      <input type="text" class="form-control" name="a" id="a">
    </div>
  </div>

  <div class="hr-line-dashed"></div>

  <div class="form-group row">
    <label class="col-sm-2 col-form-label">Client</label>
    <div class="col-sm-10">
      <select type="text" class="form-control" name="b" id="b">
        <option value="" disabled selected>Select</option>
        <option value="OPTION1">OPTION1</option>
        <option value="OPTION2">OPTION2</option>
      </select>
    </div>
  </div>

  <div class="hr-line-dashed"></div>

  <div class="form-group row">
    <label class="col-sm-2 col-form-label">Type of Work</label>
    <div class="col-sm-10">
      <select type="text" class="form-control" name="c" id="c">
        <option value="" disabled selected>Select</option>
        <option value="OPTION1">OPTION1</option>
        <option value="OPTION2">OPTION2</option>
      </select>
    </div>
  </div>

  <div class="hr-line-dashed"></div>

  <h2>Employee Details</h2>
  <button class="btn btn-lg btn-primary btn-rounded m-sm" id="add"><small>ADD EMPLOYEE</small></button>
  <!--- ADD EMPLOYEES --->
  <div id="details" class="ibox">
    <div class="ibox-content">
      <div class="container">
        <div class="row">
          <div class="col">
            <label class="form-label">Position</label>
            <select class="form-control" type="text" name="d" id="d">
              <option value="" disabled selected>Select</option>
              <option value="ROLE1">ROLE1</option>
              <option value="ROLE2">ROLE2</option>
            </select>
          </div>

          <div class="col">
            <label class="form-label">Name</label>
            <input type="text" class="form-control" name="e" id="e">
          </div>

          <div class="col">
            <label class="form-label">TVL</label>
            <input type="text" class="form-control" name="f" id="f">
          </div>

          <div class="col">
            <label class="form-label">Start Date</label>
            <input type="date" class="form-control" name="g" id="g">
          </div>

          <div class="col">
            <label class="form-label">End Date</label>
            <input type="date" class="form-control" name="h" id="h">
          </div>

          <div class="col">
            <label class="form-label">Start Time</label>
            <input type="time" class="form-control" name="i" id="i">
          </div>

          <div class="col">
            <label class="form-label">End Time</label>
            <input type="time" class="form-control" name="j" id="j">
          </div>
          <div class="col text-right m-t-lg">
          </div>

        </div>
      </div>
    </div>
  </div>
  <!--- ADD EMPLOYEES END --->
  <div class="hr-line-dashed"></div>
  <button type="submit" class="btn btn-primary btn-med">Submit</button>
</form>

您可能会注意到,现在只有特定元素具有name 属性。 DIV 元素不应使用name,OPTION 也是如此。 DIV 不是表格的一部分。 OPTION 是 SELECT 的一个元素部分,它是父容器和表单元素,它应该有name

您的 PHP 将获得复杂的数据负载。例如:


  "a": "2020",
  "b": "OPTION1",
  "c": "OPTION2",
  "d": [
    "ROLE1",
    "ROLE2"
  ],
  "e": [
    "Bob",
    "Nancy"
  ],
  "f": [
    "1",
    "2"
  ],
  "g": [
    "2020-10-12",
    "2020-10-12"
  ],
  "h": [
    "2020-10-16",
    "2020-10-16"
  ],
  "i": [
    "08:00",
    "08:00"
  ],
  "j": [
    "12:00",
    "12:00"
  ]

您需要调整您的 PHP 以处理这种新的数据格式。

【讨论】:

谢谢!这很好地清理了它,但我仍然遇到只有 1 个条目被提交到数据库的问题。我想在提交点击时提交多个条目,是否应该使用 forloop 来完成? 编辑:澄清一下——这个编辑允许我“提交”下一个条目,这是一个巨大的改进,但我相信我想要做的是一次“提交”所有条目而不是一个接一个的 @jadew 我很高兴它做到了。如果它回答了您的问题,我希望您将其标记为答案以及支持。 会的!最后一个问题 - 当我在 var myData 添加一个新元素/变量时,我遇到了一个错误。例如,我想在 a: $("[name='a']", f).val(), 上方添加另一个名为 id: $("[name='id']", f).val(), 的变量(遵循与变量 a、b、c 相同的规则)当我这样做时,myData[k].push(v);var k,v; 变得无法识别。您能否提出原因以及解决方案可能是什么?

以上是关于jQuery/PHP 动态表单提交的主要内容,如果未能解决你的问题,请参考以下文章

Javascript未从动态生成的表单提交数据

多次动态添加(append)一个表单到一个模态框以后,如何解决多次提交?

vue通过后端返回值动态生成表单及动态表单的数据提交

vue通过后端返回值动态生成表单及动态表单的数据提交

角度的多个动态提交按钮表单

动态创建并提交表单