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

PHP unable to grab name of dynamically generated forms

我正在尝试根据文本框中的值更新我的数据库。第一个 foreach 循环工作正常($emails 是从另一个 class 获取的),但在第二个循环中,我无法获取每个表单的名称 ("form_UD") 而不会出现未定义的索引错误。我也很确定我在第二个 foreach 循环中的语法是错误的。我想要做的是检查每个表单,如果用户单击其相应的 "btn_update" 按钮,然后调用 $RUD class' 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 post(get 也可以通过 XHR 使用),则无法通过 1 个按钮提交所有表单。通常,当您希望输入作为数组值到达时,您会在名称中使用 [] 来命名输入,以将其表示为表单上的数组。

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

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

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

查看 link 的 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>

class 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 语句中有一些愚蠢的 typos/errors...删除了 WHERE 子句中“:email”后的逗号,并将 "id" 更新为正确的 "news_id" 来自 table。哈!