【问题标题】:PHP unable to grab name of dynamically generated formsPHP 无法获取动态生成的表单的名称
【发布时间】:2016-06-27 11:15:36
【问题描述】:

我正在尝试根据文本框中的值更新我的数据库。第一个 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>

回声语句在点击时获得正确的值。顺便说一句,$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() 确实有效。我用其他方法确认了。

【问题讨论】:

  • foreach $key 和 $value 在哪里?
  • @unixmiah Foreach 不需要输出到键值。当仅提供一个 var 时,它将是值。 foreach($var as $key => $val) 或 foreach($var as $val) 都是 PHP 中 foreach 的有效语法。
  • 表单中的 form_UD 部分需要像 $array['form_UD'] 一样读取 --

标签: php forms post dynamic undefined


【解决方案1】:

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

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

您似乎正在尝试将表单用作数组并假设它作为对象数组到达,其中所有输入元素都是以表单命名的属性的数组元素 - 这不是它的工作原理。也许现在有一些更黑暗的艺术可用于 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();
}

【讨论】:

  • 我不想一次提交所有表格。我创建多个表单的唯一原因是试图将输入按钮与其各自的输入文本字段分组。我对其他选择持开放态度。我需要一种方式来表示“当单击按钮时,发送它的值,以及它旁边的文本输入字段的值,作为我方法中的参数”。
  • 好的,那你很好 - 你只是错误地处理了 $_POST。这样做看看你得到了什么: print_r($_POST);死();查看您收到的输入 - 您应该只收到您通过父表单中输入元素集合的提交按钮提交的表单和字段。 print_r 和 var_dump 将让您深入了解您在 PHP 脚本中使用的内容,以便您了解正在获取的内容和格式。希望有帮助!
  • 我应该把这段代码放在哪里?我不能把它放在 if 块中,因为它甚至无法读取动态生成的“form_UD”。
  • 您在哪里处理表单 - 您甚至可以这样做: if (isset($_POST) && count($_POST) > 0) { print_r($_POST);死();这样它只有在设置了 $_POST 时才会运行。这仅用于调试,以便您深入了解到达或在代码中使用的数据。当您不需要调试时 - 将其注释掉或将其删除。学习使用 print_r 和 var_dump 进行调试,你的生活会更轻松。 (这是调试,特殊风格是“穴居人”调试)。检查我对评论的编辑以获得更清晰的调试代码示例。
  • 谢谢。我实际上想出了一个新的想法。我认为它接近工作。您能否查看我对新编辑部分的原始问题?
【解决方案2】:

这是工作代码:

主 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"。哈!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-11
    • 2018-01-28
    • 2018-08-09
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多