Php $ _POST在foreach循环中具有多个变量输入

时间:2017-08-23 13:46:58

标签: php arrays forms post foreach

我有一个在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或者其他东西来做这件事,但我只是搞砸了它而且我必须承认,数组不是我的强项!

2 个答案:

答案 0 :(得分:1)

如果您要提交具有相同名称的多个输入,则必须将其声明为array<input type="hidden" name="entry_id[]" value="<?=$entry->user_id; ?>">。然后,您可以迭代您的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,
           )
        );

    }
}
?>

答案 1 :(得分:0)

正如@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    }?>
相关问题