Обрабатывать несколько входов формы в php - PullRequest
3 голосов
/ 07 декабря 2011

Я хочу знать, как обрабатывать несколько входов из формы с несколькими атрибутами. Этот код генерирует мои поля:

<form method="POST" action="test5.php" id="1">
            <?
            if($_SESSION["peoplecount"] != 0){
            for ($i = 0; $i <= $_SESSION["peoplecount"]; $i++) {
             echo ' Name<input type="text" name="'.$i.'">  Adult<input type="radio" name="'.$i.'" value="adult" /> Minor<input type="radio" name="'.$i.'" value="minor" /> <br/>';
            }           }
            ?>
            <input class="button" type="submit" value="I/We Agree" style="width:200px;"/>
            </form>

после отправки - или test5.php, как указано в части «action»,

foreach ($_POST as $key => $value) {
  print "{$key}: {$value}<br />";
}

и вывод

0: adult
1: adult
2: adult
3: adult

Обратите внимание, что у него 0, 1, 2 ... а затем взрослая. Он даже не упоминает имя человека из текстового ввода. Я могу изменить форму:

        </blockquote>
        <form method="POST" action="test5.php" id="1">
        <?
        if($_SESSION["peoplecount"] != 0){
        for ($i = 0; $i <= $_SESSION["peoplecount"]; $i++) {
         echo ' Name<input type="text" name="usersname" id="usersname">  Adult<input type="radio" name="age" value="adult" id="age"/> Minor<input type="radio" name="age" value="minor" id="age"/> <br/>';
        }           }
        ?>
        <input class="button" type="submit" value="I/We Agree" style="width:200px;"/>
        </form>

Используя тот же test5.php, я получаю

usersname:
age: adult

Значение age не публикуется, и цикл foreach в test5.php заканчивается, поэтому строка возвращается, прежде чем она полностью пройдет через одну полную публикацию.

Надеюсь, я достаточно хорошо объяснил. Я хочу, чтобы мой вывод был:

SomeName Adult

SomeOtherName Minor ....

Ответы [ 5 ]

6 голосов
/ 07 декабря 2011

Ваша проблема в том, что вы создаете два ввода формы с name='$i', а второй (переключатель) перезаписывает первый. Вместо этого я бы предложил использовать строку, включающую $i, для построения атрибутов имени:

for ($i = 0; $i <= $_SESSION["peoplecount"]; $i++) {
    echo ' Name<input type="text" name="name-'.$i.'">  Adult<input type="radio" name="age-'.$i.'" value="adult" /> Minor<input type="radio" name="'.$i.'" value="minor" /> <br/>';
}

Теперь ваш массив $_POST будет выглядеть так:

name-0: somename age-0: Adult
name-1: othername age-1: Minor
...

Еще лучший способ справиться с этим - использовать массивы в качестве атрибутов имени формы с [] (обратите внимание, что здесь я переключился на двойные кавычки, чтобы избежать лишних конкатенаций и сложных кавычек.)

for ($i = 0; $i <= $_SESSION["peoplecount"]; $i++) {
   echo " Name<input type='text' name='name[$i]'>  Adult<input type='radio' name='age[$i]' value='adult' /> Minor<input type='radio' name='age[$i]' value='minor' /> <br/>";
}

В этом случае ваш $_POST выглядит так:

name: Array(
 0: somename,
 1: othername
),
age: Array (
 0: adult,
 1: minor
)

Чтобы получить к ним доступ, вы можете использовать цикл foreach следующим образом:

foreach ($_POST['name'] as $key=>$name) {
  echo "Name: $name  Age: {$_POST['age'][$key]}";
}
2 голосов
/ 07 декабря 2011

PHP имеет специальную возможность - если вы называете входные данные, используя синтаксис массива, PHP будет анализировать входные данные в массивы .

Также:

  • donне используйте короткие теги,
  • не используйте <br/> non- семантически ;вместо этого используйте абзацы, списки или все, что наиболее семантически уместно,
  • всегда дают метки ввода,
  • идентификаторы должны быть уникальными

В качестве примера применениявыше:

<?php if ($_SESSION["peoplecount"]) { ?>
  <ol>
    <?php for ($i = 0; $i <= $_SESSION["peoplecount"]; ++$i) { ?>
      <label for="name_<?php echo $i ?>">Name</label>
      <input type="text" name="name[]" id="name_<?php echo $i ?>" /> 

      <label for="adult_<?php echo $i ?>">Adult</label>
      <input type="radio" name="age[]" value="adult" id="adult_<?php echo $i ?>" selected />

      <label for="minor_<?php echo $i ?>">Minor</label>
      <input type="radio" name="age[]" value="minor" id="minor_<?php echo $i ?>" />
    <?php } ?>
  </ol>
<?php } ?>

Обратите внимание, что вы должны быть осторожны с использованием пустых скобок массива с определенными входами - а именно, флажками и переключателями - поскольку неустановленные входные данные не будут отправлены, в результате чего индексы массива дляодин набор входных данных не соответствует индексам любых других массивов.В приведенном выше примере установка переключателя по умолчанию означает, что всегда будет установлен только один.Вы можете явно установить индексы для предотвращения этого:

      <label for="name_<?php echo $i ?>">Name</label>
      <input type="text" name="person[<?php echo $i ?>][name]" id="name_<?php echo $i ?>" /> 

      <label for="adult_<?php echo $i ?>">Adult</label>
      <input type="radio" name="person[<?php echo $i ?>][age]" value="adult" id="adult_<?php echo $i ?>" selected />

      <label for="minor_<?php echo $i ?>">Minor</label>
      <input type="radio" name="person[<?php echo $i ?>][age]" value="minor" id="minor_<?php echo $i ?>" />

Этот же метод также позволяет создавать многомерные массивы ключевых слов.

1 голос
/ 07 декабря 2011

Вы должны использовать массив:

 // [...]
 echo ' Name<input type="text" name="usersname[' . $i . ']" id="usersname" />';
 echo 'Adult<input type="radio" name="age[' . $i . ']" value="adult" id="adult" />';
 echo 'Minor<input type="radio" name="age[' . $i . ']" value="minor" id="minor"/> <br/>';
 // [...]

 for($i = 0, $count = $count($_POST['username']); $i < $count; $i++) {
      echo 'name: ' . $_POST['username'][$i]. '<br />';
      echo 'age: ' . $_POST['age'][$i]. '<br />';
 }

То есть $_POST['username'][0] и $_POST['age'][0] - первые пользовательские значения и т. Д.

1 голос
/ 07 декабря 2011

Попробуйте изменить форму на

<form method="POST" action="test5.php" id="1">
<?
if($_SESSION["peoplecount"] != 0){
    for ($i = 0; $i <= $_SESSION["peoplecount"]; $i++) {
     echo ' Name <input type="text" name="usersname['.$i.']" id="usersname">
            Adult <input type="radio" name="age['.$i.']" value="adult" id="age['.$i.']"/>
            Minor<input type="radio" name="age['.$i.']" value="minor" id="age['.$i.']"/>
            <br/> ';
    }
}
?>
<input class="button" type="submit" value="I/We Agree" style="width:200px;"/>
</form>
1 голос
/ 07 декабря 2011

Попробуйте это:

<code><?php if (count($_POST)): ?>
  <pre>
  <?php var_dump($_POST); ?>
  
для взрослыхНезначительный«;}}?>Я / мы согласны

Вывод может быть:

  array(13) {
  ["name_0"]=>
  string(5) "Marco"
  ["option_0"]=>
  array(1) {
    [0]=>
    string(5) "minor"
  }
  ["name_1"]=>
  string(4) "SomeOtherGuy"
  ["option_1"]=>
  array(1) {
    [0]=>
    string(5) "adult"
  }
  ["name_2"]=>
  string(0) ""
  ["name_3"]=>
  string(0) ""
  ["name_4"]=>
  string(0) ""
  ["name_5"]=>
  string(0) ""
  ["name_6"]=>
  string(0) ""
  ["name_7"]=>
  string(0) ""
  ["name_8"]=>
  string(0) ""
  ["name_9"]=>
  string(0) ""
  ["name_10"]=>
  string(0) ""
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...