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


PHP unable to grab name of dynamically generated forms

我正在尝试根据文本框中的值更新我的数据库。第一个 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() 确实有效。我用其他方法确认了它。

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

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

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

退房: 一键提交多个表单 了解如何通过 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();
}

这是工作代码:

主 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 语句中有一些愚蠢的错别字/错误......删除了 WHERE 子句中":email"后面的逗号,并将"id"更新为表中正确的"news_id"。医 管 局!