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 表单使用动态输入插入数据数组的主要内容,如果未能解决你的问题,请参考以下文章