【问题标题】:How can I save data from a random amout of form elements into a SQL table?如何将随机数量的表单元素中的数据保存到 SQL 表中?
【发布时间】:2019-08-20 10:44:05
【问题描述】:

我正在 WordPress 插件中制作表单构建器,但我不知道如何从用户制作的表单中保存表单数据,该表单可以通过多种不同方式创建。

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

我没有那个选项。

示例代码可以是任何类型的形式:

<form action= "insert.php" method= POST">
    <input type ="text" name"name">
    <input type ="number" name"phone">
    <input type="submit">
</form>

一个示例问题是突然添加更多输入字段,例如:

<form action= "insert.php" method= POST">
    <input type ="text" name"name">
    <input type ="text" name"lastname">
    <input type ="email" name"email">
    <input type ="text" name"town">
    <input type ="number" name"zip">
    <input type ="tel" name"phone">
    <input type="submit">
</form>

然后在 insert.php 中(连接到 DB 后)

if(isset($_POST['submit])){
    $name=$_POST['name'];
    $number =$_POST['phone'];
}

$query= "INSERT INTO formdata(name,phone) VALUES('$name','$number');

我想要一种几乎能够从任何类型的表单接收任何类型的数据的方法,从最简单的评论和联系表单到包含 50 多个部分的大型表单。

我目前唯一的想法是添加对每种类型的许多许多许多元素的支持,但这看起来既不好也不感觉好。

现在,如果我要在表单构建器中添加更多表单元素,我还必须直接进入代码并更改“接收”部分,以匹配会破坏发布/保存功能的单个表单其余的表格。

【问题讨论】:

  • 所以你想要一种方法插入到输入名称代表列的列中,而只是insertAllForm($_POST)?
  • 一个明显的选择是在数据库中创建一个“data”文本列,然后将整个 $_POST 对象存储为 JSON 或 php 序列化字符串。
  • 我并没有真正看到必须将其添加到表单中并手动将其添加到查询中的问题。您不是经常更改表单的输入吗?
  • @Qirel 他想要一个通用的函数和数据库模式,可以处理任何形式,无论字段如何。
  • @USDMatt 刷新我的答案,我给了他他需要的东西,并详细介绍了如何实现这一点。他有两个选择。

标签: php html mysql wordpress forms


【解决方案1】:

在数组示例中创建表单元素:

<input type="text" name="elements[samplename]">
<input type="text" name="elements[samplename1]">
<input type="text" name="elements[samplename2]">

如果您像这样创建它们,它们将作为数组发布在 php 中,然后您可以非常轻松地分解并存储在数据库中。

如果您没有复选框,这几乎可以处理任何用例,您也可以使用复选框,但需要做更多工作。

也就是说,当数据发布时,您将使用 $_POST 或 $_GET 检索它,结果将是一个如下所示的关联数组:

array (size=12)
  'samplename' => string 'sample' (length=6)
  'samplename1' => string 'sample 2' (length=8)
  'samplename2' => string 'sample 3' (length=8)

使用此方法,您可以按数组名称对输入类型进行分组,因此文本类型将是 text[name],电话号码将是 phone[name],然后使用该方法您可以遍历发布数据并按类型将它们分开。使用这些类型,您可以为每个可以存储结果的输入类型创建单独的关系表,这些表通过用户 ID 与用户相关。

文本框表格: 身份证 |用户ID |表单_ID |价值

您也可以在一个表中完成所有操作,只需一个类型变量,其中 type 表示输入字段类型。

  • 或者-

还有另一种关于存储它们的方法,一种非常简单的方法是获取整个数组并使用 json 编码将其转换为 json 并存储整个字符串,然后当你需要使用它时使用它进行解码json_decode。


演示

HTML:

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

PHP:

$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.

使用此示例,您可以保存任意数量的元素、添加无限的必需参数等等。发挥创意! :)

【讨论】:

  • 是的,但我的观点是,如果他不打算使用 json 或其他任何情况将它们存储为数据块,那么使用名称中的数组按类型对它们进行分组是存储的最佳选择。然后,您可以为不同的表单元素类型创建不同的表,这些表可以按 ID 存储,并使用您知道它们属于哪个表的数组。
  • $_POST['elements'] 数组中的所有元素与您的建议一起使用,或者直接将$_POST 与普通表结构一起使用不会有任何区别。我没看明白。
  • elements 是一个示例名称,它更像是 $_POST['textboxes'] 和 $_POST['email'],这样可以将元素分组,使用它您可以拥有一个可以获取 form_id、element_type 和元素中的数据。每个输入类型都有一个 id,它可以关联回未来的编辑和表单的构建。这是存储数据的可靠选项,并跟踪它最初来自什么类型的元素,以使其根据插件的点保持可编辑。如果将其存储为一个 JSON blob,则无法跟踪它的来源。
【解决方案2】:

我会选择这样的。

if(isset($_POST['submit'])){
    if(isset($_POST['name'])){
        $name=$_POST['name'];
    }else{
        $name = '';
    }
//your code here
}

对可能存在的每个字段重复。

然后是一个包含表中所有可以插入的字段的查询。无论是否发布,它们都将具有价值。

【讨论】:

  • 输入不能硬编码,表单构建器中可以有任意数量的元素,他不能硬编码 20 个文本框、3 个选择、3 个电子邮件和一个复选框。他的代码库将非常庞大,并且必须考虑到阳光下的每一个名字。它是 word press 中的表单构建器插件,用户可以添加任意数量的输入,单击保存并显示。
  • 那么他还应该考虑到他将保存数据的表没有存储用户选择的数据的字段。听起来有点奇怪……
  • 实际上,如果您阅读我的答案并且它下面的 cmets 会解释原因。
  • 然后重新读取并跟踪 cmets,这是您存储数据的最合乎逻辑的方式,同时跟踪元素类型以供将来编辑和修改。
猜你喜欢
  • 1970-01-01
  • 2010-11-20
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多