PHP $ _POST来自动态生成的表单

时间:2012-06-02 23:35:27

标签: php arrays forms post multidimensional-array

我正在根据用户选择的$ node_number创建一个表单...所以表单如下:

function createForm($node_number) {
            echo "<form id=\"form\" name=\"form\" action=\"molecule_display.php\" method=\"post\">";
           for ($n = 1; $n <= $node_number; $n++) {
                echo "<fieldset class=\"step\">
                            <input id=\"node_title" . $n . "\" name=\"node_title" . $n . "\" />
                            <input id=\"node_comment" . $n . "\" name=\"node_comment" . $n . "\" type=\"textarea\"  />
                     </fieldset>";
                            }
            echo "<input type=\"hidden\" name=\"node_number\" value=\"" . $node_number . "\">
                    <button id=\"submit_node\" type=\"submit\">Submit</button>"
            echo "</form>";
            }

这将创建该表单元素的$ node_number版本。我的问题是如何动态命名表单元素,以便在处理它们时更容易管理它们。通过在name属性中添加$ n迭代器,我现在正在这样做的方式并不理想。

据我所知,我可以将name =“”属性声明为类似name [] =“”...的数组,以便为​​较大形式的每个子元素赋予唯一名称。

我猜我想要一个单独表单段的多维数组...只是不确定如何最好地处理表单内和$ _POST变量中的那些。

有人有任何建议吗?

3 个答案:

答案 0 :(得分:2)

我认为你可以这样做:

function createForm($node_number) {
    echo '<form id="form" name="form" action="molecule_display.php" method="post">';
    for ($n = 1; $n <= $node_number; $n++) {
        echo '<fieldset class="step">
        <input id="node_title'.$n.'" name="nodes['.$n.'][node_title]" />
        <input id="node_comment'.$n.'" name="nodes['.$n.'][node_comment]" type="textarea"  />
        <button id="submit_node" type="submit">Submit</button></p>
        </fieldset>';
    }
    echo '</form>';
}

然后获取$_POST['nodes']这将是多维数组,您可以使用foreach进行迭代。您将获得$_POST['nodes'][1] = array('node_title'=>... , 'node_comment'=>...);等等。

答案 1 :(得分:2)

如果你像在帖子中说的那样使用数组,那么你应该可以很容易地访问它们。

function createForm($node_number) {
    echo "<form id=\"form\" name=\"form\" action=\"molecule_display.php\" method=\"post\">";
    for ($n = 1; $n <= $node_number; $n++) {
        echo "<fieldset class=\"step\">
                  <input id=\"node_title_" . $n . "\" name=\"node_title[" . $n . "]\" />
                  <input id=\"node_comment_" . $n . "\" name=\"node_comment[" . $n . "]\" type=\"textarea\"  />
                  <button name=\"submit_node[" . $n . "]\" type=\"submit\">Submit</button></p>
              </fieldset>";
     }
     echo "</form>";
}

我还将submit_node更改为名称,并为其指定了一个数组值,因为ID必须是唯一的,如果您在某处引用它,将导致错误。

你可以像这样循环结果:

foreach ($_POST['node_title'] as $key => $response) {
    $title = $response;
    $comment = (!empty($_POST['node_comment'][$key])) ? $_POST['node_comment'][$key] : "";
    // Save title / comment here.
}

答案 2 :(得分:0)

由于每个表单都有自己的提交按钮,因此不会阻止您在所有表单中使用name="node_title"。如果你现在添加<input type="hidden" name="index" value="$n">并首先阅读,你的逻辑变得非常容易。