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

PHP无法获取动态生成表单的名称,php,forms,post,dynamic,undefined,Php,Forms,Post,Dynamic,Undefined,我正在尝试根据文本框中的值更新我的数据库。第一个foreach循环工作正常(从另一个类抓取电子邮件),但在第二个循环中,如果没有未定义的索引错误,我无法抓取每个表单的名称(“form_UD”)。我也很确定我在第二个foreach循环中的语法是错误的。我试图做的是检查每一个表单,如果用户单击其相应的“btn_更新”按钮,然后调用$RUD类的updateEmail方法并插入此按钮中的值,以及表单对应的“input_email”值中的值 Dbclass:getDB()可以工作。我用其他方法证实了这一点

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


Dbclass:getDB()可以工作。我用其他方法证实了这一点。

我可能错了——但我认为这是不可能的,除非您通过XHR提交。原因是您有一个提交按钮,一个表单可以提交该表单-您不能在一个表单中提交多个带有提交的表单,它将只提交该表单。提交按钮作为的子元素存在,它将到达您的$\u帖子

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

您似乎试图将表单用作数组,并假设它是一个对象数组,所有输入元素都是以表单命名的属性的数组元素——这不是它的工作方式。也许有一些更黑暗的艺术现在可用于PHP,我没有见过或接触过,但我怀疑它,它已经有一段时间以来,我处理的形式,在这种方法

查看:了解如何通过XHR执行此操作

有关XHR的更多详细信息:

查看HTML5表单标准的链接:

可以在此处找到更简单的总结:

进一步阅读以下内容,了解如何使用PHP:

最后,请阅读本文了解$u POST的工作原理:

再说一次,我可能错了,但这是值得怀疑的

添加了下面注释中的调试代码示例:

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>

我的SQL语句中有一些愚蠢的输入错误……在WHERE子句中删除了“:email”之后的逗号,并将“id”更新为表中正确的“news_id”。哈!

我不想一次提交所有表格。我创建多个表单的唯一原因是试图将输入按钮与其各自的输入文本字段分组。我有其他选择。我需要一种方式说“当点击一个按钮时,发送它的值,以及它旁边文本输入字段的值,作为我的方法中的参数”。好的,那么你很好-你只是错误地处理了$\u帖子。执行此操作以查看您得到的信息:print\u r($\u POST);模具();查看您收到的输入-您应该只收到通过父表单中输入元素集合的提交按钮提交的表单和字段。print_r和var_dump将让您深入了解PHP脚本中正在使用的内容,从而了解所获得的内容和格式。希望有帮助!我应该把这个代码放在哪里?我不能把它放在if块中,因为它甚至不能读取动态生成的'form_UD'。在处理表单的地方,你甚至可以这样做:if(isset($_POST)&&count($_POST)>0{print_r($_POST);die();}这样,它只有在设置了$_POST时才会运行。这仅用于调试,以便深入了解代码中到达或正在使用的数据。当您不需要调试时,请将其注释掉或删除。学会使用print_r和var_dump进行调试,您的生活就会更轻松。(这是调试,特别是“穴居人”调试)。查看我对注释的编辑,以获得更清晰的调试代码示例。谢谢。我真的想出了一个新主意。我想这已经接近成功了。你能检查一下我关于新编辑部分的原始问题吗?foreach$key和$value在哪里?@unixmiah foreach不需要输出到key-value。当仅提供单个var时,它将是值。foreach($var as$key=>$val)或foreach($var as$val)都是PHP中foreach的有效语法。表单中的表单部分需要像$array['form\u UD'一样读取--
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();
}
if (isset($_POST) && count($_POST) > 0) {
    print_r($_POST);
    die();
}
<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>
  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();
}