PHP 表单使用动态输入插入数据数组

Posted

技术标签:

【中文标题】PHP 表单使用动态输入插入数据数组【英文标题】:PHP Form Insert Array of Data with Dynamic Inputs 【发布时间】: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 【参考方案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);

【讨论】:

请阅读SQL Injection。此代码易受攻击。【参考方案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。

以上是关于PHP 表单使用动态输入插入数据数组的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历一组动态表单输入并将它们插入到多个表中?

Ajax 无法正常工作。 PHP 无法在 SQL 中插入数据

Laravel 验证动态表单输入数据?

使用 JavaScript 插入元素时无法接收表单输入数据

PHP / MYSQL 插入数组 Foreach 循环

JS数组到PHP并使用PDO更新MYSQL中的表