PHP无法获取动态生成的表单的名称

时间:2016-03-12 03:07:49

标签: php forms post dynamic undefined

我正在尝试根据文本框中的值更新我的数据库。第一个foreach循环工作正常($ emails从另一个类中获取),但在第二个循环中,我无法获取每个表单的名称(“form_UD”)而不会得到未定义的索引错误。我也很确定我在第二个foreach循环中的语法是错误的。我要做的是检查每个表单,如果用户单击其对应的“btn_update”按钮,然后调用$ RUD类的updateEmail方法并插入此按钮的值,以及来自此按钮的值表单的相应“input_email”值。

foreach ($emails as $email) {
            echo "<li>
                    <form action='' method='POST' id='form_email' name='form_UD'>
                        <input type='text' value='" . $email['news_email'] . "' name='input_email'/>
                        <button type='submit' class='btn_update' name='btn_update' value='" . $email['news_id'] . "'>Update</button>
                    </form>
                </li>";
        }
        foreach (($_POST['form_UD']) as $form) {
            if ((isset($form->$_POST['btn_update']))) {
            $RUD->updateEmail($form->$_POST['btn_update'], $form->$_POST['input_email']);
        }

编辑: 新想法:

        <form action='' method='POST' id='form_email'>
        <ul>
        <?php
            foreach ($emails as $email) {
                echo "<li>
                        <input type='text' value='" . $email['news_email'] . "' name='input_email" . $email['news_id'] . "'/>
                        <button type='submit' class='btn_update' name='btn_update" . $email['news_id'] . "' value='" . $email['news_id'] . "'>Update</button>
                    </li>";
            }

            foreach ($emails as $email) {
                if (isset($_POST['btn_update' . $email['news_id']])) {
                    echo $_POST['btn_update' . $email['news_id']];
                    echo $_POST['input_email' . $email['news_id']];
                    $RUD->updateEmail(($_POST['btn_update' . $email['news_id']]), ($_POST['input_email' . $email['news_id']]));
                }
            }
        ?>
        </ul>
    </form>

echo语句在点击时获得正确的值。顺便说一下,$ RUD在同一个文件的其他地方被实例化。这让我相信我的方法可能存在处理更新的问题?这是:

public function updateEmail($id, $email){

    $db = Dbclass::getDB();
    $query = "UPDATE newsletter
            SET news_email = :email,
            WHERE id = :id ";
    $statement = $db->prepare($query);
    $statement->bindParam(':id', $id);
    $statement->bindParam(':email', $email, PDO::PARAM_STR, 100);
    $statement->execute();
}

Dbclass:getDB()确实有效。我用其他方法证实了这一点。

2 个答案:

答案 0 :(得分:0)

我可能错了 - 但除非你通过XHR提交,否则我不相信这是可能的。原因是您有1个提交按钮到1个表单提交该表单 - 您不能从提交表单中提交多个表单,它只会提交表单提交按钮作为子元素存在并且它将到达你的$ _POST。

没有能够通过1个按钮提交所有表单而没有客户端脚本,并且将语句准备为$ _GET请求或XHR post(get也可以通过XHR使用)。通常,当您希望输入作为数组值到达时,您可以使用名称中的[]命名输入,以将其表示为表单上的数组。

您似乎正在尝试将表单用作数组,并假设它作为一个对象数组到达,并将所有输入元素作为以表单命名的属性的数组元素 - 这不是它的工作原理。也许有一些黑暗的艺术现在可用于PHP,我还没有看到或接触过但我对此表示怀疑,自从我用这种方法处理表格以来已经有一段时间了。

请查看:Submit Multiple Forms With One Button了解如何通过XHR执行此操作。

有关XHR的更多详情:http://www.w3schools.com/ajax/ajax_xmlhttprequest_create.asp

请查看HTML5表单标准的此链接:https://www.w3.org/TR/html5/forms.html

可以在此处找到更简单的写作:http://www.w3schools.com/html/html_forms.asp

进一步阅读本文如何使用PHP: http://www.w3schools.com/php/php_forms.asp

最后阅读本文了解$ _POST的工作原理: http://php.net/manual/en/reserved.variables.post.php

同样,我可能错了,但这是值得怀疑的。

从以下评论中添加了调试代码的示例:

if (isset($_POST) && count($_POST) > 0) {
    print_r($_POST);
    die();
}

答案 1 :(得分:0)

这是工作代码:

主要PHP文件:

<form action="" method="POST" id="form_email">
        <ul>
        <?php
            foreach ($emails as $email) {
                echo "<li>
                        <input type='text' value='" . $email['news_email'] . "' name='input_email" . $email['news_id'] . "'/>
                        <button type='submit' class='btn_update' name='btn_update" . $email['news_id'] . "' value='" . $email['news_id'] . "'>Update</button>
                    </li>";
            }

            foreach ($emails as $email) {
                if (isset($_POST['btn_update' . $email['news_id']])) {
                    $RUD->updateEmail(($_POST['btn_update' . $email['news_id']]), ($_POST['input_email' . $email['news_id']]));
                }
            }
        ?>
        </ul>
    </form>

RUD类中的方法:

  public function updateEmail($id, $email){

    $db = Dbclass::getDB();
    $query = "UPDATE newsletter
            SET news_email = :email
            WHERE news_id = :id ";
    $statement = $db->prepare($query);
    $statement->bindParam(':id', $id);
    $statement->bindParam(':email', $email, PDO::PARAM_STR, 100);
    $statement->execute();
}

我的SQL语句中有一些愚蠢的拼写错误/错误...删除了一个逗号&#34;:email&#34;在WHERE子句中,并更新&#34; id&#34;成为正确的&#34; news_id&#34;从表中。哈!