Php 如何将任意数量的表单元素中的数据保存到SQL表中?

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">

我正在WordPress插件中制作一个表单生成器,我不知道如何从用户制作的表单中保存表单数据,这些表单可以通过多种不同的方式创建

我想将这些数据保存到一个MySQL表中,在这个站点和www的其他部分都有大量的工作指南,但是这些工作都是基于“接收”端知道表单是如何设置的假设

我没有这个选择

示例代码可以是任何类型的表单:

<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表示输入字段类型

  • 或-
另一种方法是存储它们,一种非常简单的方法是使用json编码将整个数组转换为json,并存储整个字符串,然后在需要时使用json解码


演示

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
}