【问题标题】:Php $_POST form with multiple variable inputs in foreach loop在 foreach 循环中具有多个变量输入的 PHP $_POST 表单
【发布时间】:2018-02-01 03:38:23
【问题描述】:

我有一个表单,它在 foreach 循环中创建多个文本输入,如下所示:

    <?php $results = $wpdb->get_results( "SELECT * FROM wp_results WHERE event_id = '$event' AND div_id = '$division'" ); ?>
              <form action="" method="post">
                <?php foreach ($results as $entry) { ?>
                  <p>
                    <?php echo $entry_name;?>
                    <input type="hidden" name="entry_id" value="$entry->user_id">
                    <input type="text" name="position" value="">
                    <input type="text" name="points" value="">             
                  </p>
          <?php    }?>
      <input type="submit" name="submit" value="Save Changes" class="button">
    </form>
<?php
if ( isset( $_POST['submit'] ) ){

$entry_id = sanitize_text_field($_POST['entry_id']);
$position = sanitize_text_field($_POST['position']);
$points = sanitize_text_field($_POST['points']);

$wpdb->update('wp_results',
    array(
      'position'   => $position,
      'points'   => $points,
    ),
    array(
      'user_id' => $entry_id,
    )
);

}
?>

结果是一个看起来像这样的 html 表单:

<form action="" method="post">
    <p>Aiden Hopkins
      <input type="hidden" name="entry_id" value="98">
      <input type="text" name="position" value="">
      <input type="text" name="points" value="">
    </p>
    <p>Asha Sykes
      <input type="hidden" name="entry_id" value="75">
      <input type="text" name="position" value="">
      <input type="text" name="points" value="">
    </p>
    <p>Ffion Hughes
      <input type="hidden" name="entry_id" value="66">
      <input type="text" name="position" value="">
      <input type="text" name="points" value="">
  <input type="submit" name="submit" value="Save Changes" class="button">
</form>

我遇到的问题是,当我尝试提交表单并将每个用户的结果写入数据库时​​,它只输入循环的最后一个实例的详细信息而忽略其他实例。

我在这里查看了其他答案,例如How to loop through an array of inputs in a form?,但是当我尝试这样做时,我得到了所有数据库条目的“数组”。

我确信有一种使用 foreach 或其他东西的简单方法可以做到这一点,但我只是对它感到困惑,我必须承认,数组不是我的强项!

【问题讨论】:

  • 位置和点在 $_POST 中作为数组传入,在 `foreach($_POST['position'] as $key=>$val) { echo $key." ".$val 上使用 foreach };
  • 因为他们的name是一样的。使他们的名字在形式上不同,并在$_POST 中分别接收
  • @clearshot66 你能详细说明你的答案吗,我在 $_POST['entry_id'] 上尝试了 foreach 循环,但没有成功。
  • @TheSumo 那是因为它们不是数组。如果名称没有作为数组传入之后没有 []。您还编辑了您的问题,所以现在我以前的帖子无关紧要

标签: php arrays forms post foreach


【解决方案1】:

如果您想提交多个同名输入,您必须将其声明为array&lt;input type="hidden" name="entry_id[]" value="&lt;?=$entry-&gt;user_id; ?&gt;"&gt;。然后,您可以迭代您的 POST :

<?php $results = $wpdb->get_results( "SELECT * FROM wp_results WHERE event_id = '$event' AND div_id = '$division'" ); ?>
              <form action="" method="post">
                <?php foreach ($results as $entry) { ?>
                  <p>
                    <?php echo $entry_name;?>
                    <input type="hidden" name="entry_id[]" value="<?=$entry->user_id; ?>">
                    <input type="text" name="position[]" value="">
                    <input type="text" name="points[]" value="">             
                  </p>
          <?php    }?>
      <input type="submit" name="submit" value="Save Changes" class="button">
    </form>
<?php
if ( isset( $_POST['submit'] ) ){
    // Iterate over POST values
    foreach ($_POST['entry_id'] as $key => $val) {
        $entry_id = sanitize_text_field($_POST['entry_id'][$key]);
        $position = sanitize_text_field($_POST['position'][$key]);
        $points = sanitize_text_field($_POST['points'][$key]);

        $wpdb->update('wp_results',
           array(
              'position'   => $position,
              'points'   => $points,
           ),
           array(
              'user_id' => $entry_id,
           )
        );

    }
}
?>

【讨论】:

  • 哈!谢谢@LP154 我在尝试时错过了 [$key] 部分!我已将您的答案标记为正确,因为它是最完整的。
【解决方案2】:

正如@Anonymous 提到的,您的问题是您使用相同的名称进行输入。您应该使用唯一的名称。

您可以使用 [] 命名您的输入,以表示一组值。

例如:

<input type="text" name="array[]" value=1>
<input type="text" name="array[]" value=2>
<input type="text" name="array[]" value=3> 

发布上述输入将为您提供:

$_POST['array'][0] = 1
$_POST['array'][1] = 2
$_POST['array'][2] = 3

在您的情况下,您可能会发现将数据按 id 分组很有帮助,例如:

[
    98 => [
        'position' => 'value',
        'points' => 0
    ],
    75 => [
        'position' => 'value1',
        'points' => 11
    ],
    66 => [
        'position' => 'value2',
        'points' => 22
    ],
]

在这种情况下,您的 PHP 将如下所示:

<?php foreach ($results as $entry) { ?>
    <p>
        <?php echo $entry_name;?>
        <input type="text" name="person[$entry->user_id][position]" value="">
        <input type="text" name="person[$entry->user_id][points]" value="">             
    </p>
<?php    }?>

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多