Php 如何将任意数量的表单元素中的数据保存到SQL表中?
我正在WordPress插件中制作一个表单生成器,我不知道如何从用户制作的表单中保存表单数据,这些表单可以通过多种不同的方式创建 我想将这些数据保存到一个MySQL表中,在这个站点和www的其他部分都有大量的工作指南,但是这些工作都是基于“接收”端知道表单是如何设置的假设 我没有这个选择 示例代码可以是任何类型的表单:Php 如何将任意数量的表单元素中的数据保存到SQL表中?,php,html,mysql,wordpress,forms,Php,Html,Mysql,Wordpress,Forms,我正在WordPress插件中制作一个表单生成器,我不知道如何从用户制作的表单中保存表单数据,这些表单可以通过多种不同的方式创建 我想将这些数据保存到一个MySQL表中,在这个站点和www的其他部分都有大量的工作指南,但是这些工作都是基于“接收”端知道表单是如何设置的假设 我没有这个选择 示例代码可以是任何类型的表单: <form action= "insert.php" method= POST"> <input type ="text" name"name">
<form action= "insert.php" method= POST">
<input type ="text" name"name">
<input type ="number" name"phone">
<input type="submit">
</form>
我希望有一种方法能够从任何类型的表单接收任何类型的数据,从最简单的评论和联系表单到50多个部分的大表单
目前我唯一的想法是为每种类型的许多元素添加支持,但这样做既不好看也不舒服
现在,如果我要在表单生成器中添加更多表单元素,我还必须直接进入代码并更改“接收”部分,以匹配单个表单,这将破坏其余表单的post/save功能。在数组示例中创建表单元素:
<input type="text" name="elements[samplename]">
<input type="text" name="elements[samplename1]">
<input type="text" name="elements[samplename2]">
使用此方法,您可以按数组名称对输入类型进行分组,这样文本类型将是text[name]电话号码将是phone[name],然后使用此方法,您可以迭代post数据并按类型将它们分离出来。使用这些类型,您可以拥有单独的关系表,这些关系表通过每个输入类型的ID与用户相关,您可以在其中存储结果
文本框表格:
ID |用户ID |表单ID |值
您也可以在一个表中完成所有操作,只需使用一个type变量,其中type表示输入字段类型
- 或-
演示 HTML:
使用此示例,您可以保存任意数量的元素,添加无限多的必需参数以及更多内容。发挥创造力!:) 我喜欢这样的东西
if(isset($_POST['submit'])){
if(isset($_POST['name'])){
$name=$_POST['name'];
}else{
$name = '';
}
//your code here
}
对可能存在的每个字段重复
然后查询表中所有可插入的字段。无论是否发布,它们都将有一个值。因此,您需要一种方法,在输入名称表示列的列中插入,只需
insertAllForm($\u POST)
?一个明显的选择是在数据库中创建一个“data
”文本列,然后将整个$\u POST对象存储为JSON或php序列化字符串。我并不认为必须将其添加到表单中,然后手动将其添加到查询中有什么问题。你不是经常更改表单的输入吗?@Qirel他想要一个通用的函数和数据库模式,可以处理任何表单,不管字段是什么。@USDMatt刷新我的答案,我给了他他所需要的,并详细介绍了如何实现这一点。他有两个选择。是的,但我的观点是,如果他不打算使用json或任何情况将它们存储为数据块,那么使用名称中的数组将它们按类型分组是存储的最佳选择。然后,您可以为不同的表单元素类型使用不同的表,这些表可以通过ID存储,并使用您知道它们属于哪个表的数组。根据您的建议使用$\u POST['elements']
数组中的所有元素,或者直接使用$\u POST
与正常的表结构没有任何区别。我看不出要点。elements是一个示例名称,它更像$\u POST['TextBox']和$\u POST['email'],这将保持元素分组,使用它,您可以有一个表,可以采用表单id、元素类型和元素中的数据。每个输入类型都有一个id,该id可以关联回表单的未来编辑和构建。这是一个可靠的选项,用于存储数据,并跟踪它最初来自什么类型的元素,以根据插件的点保持其可编辑性。如果将其存储为一个JSON blob,则无法跟踪其来源。输入不能硬编码,表单生成器中可以有任意数量的元素,他不能硬编码20个文本框、3个选择、3封电子邮件和一个复选框。他的代码库将是巨大的,必须考虑到太阳底下的每一个名字。它是word press中的一个form builder插件,用户可以向其中添加任意数量的输入,单击“保存”并显示。然后,他还应该考虑到,他要保存数据的表中没有存储用户选择的数据的字段。听起来有点奇怪……事实上,如果你读了我的答案,下面的注释解释了原因,然后重新阅读并跟踪注释,这是存储数据、同时跟踪元素类型以备将来编辑和修改的最合乎逻辑的方式。
<input type="text" name="elements[samplename]">
<input type="text" name="elements[samplename1]">
<input type="text" name="elements[samplename2]">
array (size=12)
'samplename' => string 'sample' (length=6)
'samplename1' => string 'sample 2' (length=8)
'samplename2' => string 'sample 3' (length=8)
<div id="addItem">
<h2>Add New Element:</h2>
<input type="text" placeholder="name" id="elementName" required>
<select name="inputs" id="newInput">
<option value="text">text</option>
<option value="email">email</option>
<option value="phone">phone</option>
</select>
<input type="button" id="addElement" value="Add Item">
<strong>You can add a infinite amount of parameters required or optional here</strong>
</div>
<div class="myFormElemets">
<form id="myForm" action="submit.php" method="post">
<!-- Your elements will be populated here via jquery -->
</form>
</div>
<script>
$('#addElement').click(function () {
var selectValue = $('#newInput').find(":selected").text();
var nameValue = $('#elementName').val();
switch (selectValue) {
case "text":
$('#myForm').append('<input type="text" name="' + selectValue + "[" + nameValue + "]" + '">');
break;
case "email":
$('#myForm').append('<input type="email" name="' + selectValue + "[" + nameValue + "]" + '">');
break;
case "phone":
$('#myForm').append('<input type="tel" name="' + selectValue + "[" + nameValue + "]" + '">');
break;
}
});
</script>
$sql = null;
foreach($_POST as $array)
{
foreach($array as $key => $value) {
switch ($key) {
case "text":
$sql = "INSERT INTO `my_table` ('id', 'form_id', 'element_type', 'value') VALUES (NULL, '$formID', '0', '$value')";
break;
case "email":
$sql = "INSERT INTO `my_table` ('id', 'form_id', 'element_type', 'value') VALUES (NULL, '$formID', '1', '$value')";
break;
case "phone":
$sql = "INSERT INTO `my_table` ('id', 'form_id', 'element_type', 'value') VALUES (NULL, '$formID', '2', '$value')";
break;
}
}
}
//prepared sql insert statement here.
if(isset($_POST['submit'])){
if(isset($_POST['name'])){
$name=$_POST['name'];
}else{
$name = '';
}
//your code here
}