【问题标题】:PHP Form Insert Array of Data with Dynamic InputsPHP 表单使用动态输入插入数据数组
【发布时间】:2019-01-24 06:47:40
【问题描述】:

我正在使用 PHP 构建一个 web 表单,它允许人们提交注册到他们的网络设备的详细信息,这些详细信息保存在 mysql 数据库中。我想允许用户在同一个表单上提交多个设备。

我需要收集的详细信息是;

  • 制作
  • 型号
  • mac地址

用户可能需要注册 20 个相同的设备,即相同的品牌和型号,唯一会改变的字段是 mac 地址。而不是要求用户提交 20 个单独的表单,我有一个按钮“添加类似设备”,使用 JQuery 这会创建一个 new mac 地址输入(数组类型)。

一切都按预期工作,但我不确定我是否以“正确的方式”做这件事,所以我希望得到一些建议 - 我的代码如下;

HTML

<form id="myForm" method="POST" action="">
    <input id="make" name="make" type="text">
    <input id="model" name="model" type="text">
    <input id="mac[]" name="mac[]" type="text">
    <!-- example of two dynamically added mac inputs
    <input id="mac[]" name="mac[]" type="text">
    <input id="mac[]" name="mac[]" type="text">
    -->
    <input id="submit" name="submit" type="submit">
</form>
<button class="add-similar" id="add-similar" type="button"></button>

JQuery

<script> 
$(document).ready(function() {
    var maxField = 10; 
    var addButton = $('.add-similar'); 
    var html = '<input id="mac[]" name="mac[]" type="text">';
    var x = 1;
    $(addButton).on('click', function(e) {
        if (x < maxField) {
            x++;
            $(wrapper).append(html); 
        }
    });
}); 
</script>

PHP

if(isset($_REQUEST["submit"])){
    $make = $_POST['make'];
    $model = $_POST['model'];
    $mac = $_POST['mac'];
    for ($i = 0; $i < count($mac); $i++) {
        // insert data into db
    }
}

对于动态添加的每个额外的 mac 地址输入,我需要在 db 中创建一个新的、唯一的记录。如果添加两个动态mac地址,db表应该是这样的;

+----+-------+---------+--------------+
| id | make  | model   | mac          |
+----+-------+---------+--------------+
| 1  | Apple | Macbook | 112233445566 |
+----+-------+---------+--------------+
| 2  | Apple | Macbook | 998877665544 |
+----+-------+---------+--------------+
| 3  | Apple | Macbook | 887766225533 |
+----+-------+---------+--------------+

我的方法正确吗?

【问题讨论】:

  • 您应该删除 id:id="mac[]",因为 id 必须是唯一的,并且自动依赖 id 的任何功能都会被破坏。
  • 使用批量插入,向数据库发送一个请求而不是 N 个请求是一种很好的做法。您可以使用循环来构建批量插入查询。 Bulk Insert
  • 如果一个设备有多个 MAC 怎么办?
  • 在下面查看我的答案,您可以从中得到一个想法。 @TheOrdinaryGeek

标签: php jquery mysql arrays forms


【解决方案1】:

关于批量插入:您需要构建 sql 语句,如 INSERT INTO table(make, model, mac) VALUES("Apple", "Macbook", 123456),("Apple", "Macbook", 245678),("Apple", "Macbook", 345678); 您可以从下面的代码块中获得构建语句的想法。 注意:还要确保清理 $make、$model、$mac 变量 Might help

$make = $_POST['make'];
$model = $_POST['model'];
$mac = $_POST['mac'];


$length = count($mac);
$values = [];
for ($i = 0; $i < $length; $i++) {
    $values[] = '("' . $make . '","' . $model . '",' . $mac[$i] .')';
}

$query = "INSERT INTO table(make, model, mac) VALUES". implode(",", $values);

【讨论】:

【解决方案2】:

我有一个解决方案。请使用 Ajax 和 FormData。

首先,将类型提交更改为按钮并将id放入此按钮。

第二

$(id).on('click', function() {
  var fd = new FromData();

  var count_mac = $('input[name="mac[]"]').length;
  fd.append('count_mac', count_mac);

  $('input[name="mac[]"]').each(function(index){
     var data = $(this).val();

     //Pass to PHP file with $_POST['mac0'],$_POST['mac1'],...
     fd.append('mac'+ index, data);
  });

  //Ajax code here
  jQuery.ajax({
     url: 'example_file.php',
     type: 'post',
     data: fd,
     contentType: false,
     processData: false,
     success: function( results ) {
       location.reload();
     }
  });
});

【讨论】:

  • 感谢您的回答,但我不想使用 AJAX。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多