在php中处理表单的多个输入

时间:2011-12-07 13:57:59

标签: php html sql forms

我想知道如何处理来自具有多个属性的表单的多个输入。 此代码生成我的字段:

<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,如“行动”部分所述,

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的值,test5.php中的foreach循环结束,因此行返回,然后完全运行一个完整的帖子。

我希望我做得很好解释。 我希望我的输出是:

SomeName Adult

SomeOtherName Minor ....

5 个答案:

答案 0 :(得分:6)

您的问题是您正在使用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]}";
}

答案 1 :(得分:2)

PHP具有特殊功能 - 如果使用数组语法命名输入,PHP将解析input into arrays

此外:

  • 不要使用短标签,
  • 不要使用<br/>非 - semantically;相反,使用段落,列表或任何最符合语义的,
  • 始终提供输入标签,
  • ID必须是唯一的

作为应用上述内容的一个例子:

<?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 ?>" />

这种技术也可以让你创建多维关键字数组。

答案 2 :(得分:1)

试试这个:

<?php if (count($_POST)): ?>
  <pre>
  <?php var_dump($_POST); ?>
  </pre>
<?php endif; ?>

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

输出可以是:

  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) ""
}

答案 3 :(得分:1)

尝试将表单修改为

<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>

答案 4 :(得分:1)

你应该使用数组:

 // [...]
 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]是第一个用户值等。