【问题标题】:Unchecked checkboxes in an array数组中未选中的复选框
【发布时间】:2011-07-27 00:19:55
【问题描述】:

我正在构建一个可以添加更多字段组的表单,为了处理它们,我在 for 循环中读出了数组

脚本:

<?php
foreach ($_POST as $key => $value) {
  $$key = $value;
}
$count = count($name);
for ($i=0; $i<$count; $i++){
?>
  <strong><?php echo $name[$i]; ?></strong>  (<?php echo $check[$i]; ?>)<br /><?php echo $select[$i]; ?><br /><br />
<?php
}
?>
<form method="post">
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<div class="group">
 <input type="text" name="name[]" /><br />
 <input type="checkbox" name="check[]" value="true" /><br />
 <select name="select[]"><option>1</option><option>2</option><option>3</option></select>
</div>
<button>Add another group</button>
<input type="submit" />
</form>

如果所有复选框都被选中,则没有问题,但如果仅选中最后一个复选框,则仅计算数组中的一个复选框,然后将 name[0] 与 check[0] 组合,但 check[0] 确实是 check[ 2]。英语不是我的母语,所以我不知道正确的单词。

【问题讨论】:

  • 这是因为未选中的复选框未注册。考虑为您的字段命名,例如 name1check1
  • 它们是动态添加和随机排序的,所以我正在寻找另一个解决方案
  • 祝你好运。不存在这样的解决方法。您需要使用name1name[1] - 或使用复选框以外的其他内容。您也许可以添加一个名为 checkValue 的隐藏输入(默认设置为 0 或 1,具体取决于复选框状态。然后,当您单击复选框时,也可以更改隐藏字段的值。这样您将始终拥有checkValue 项目的数量与您的 name 项目数量相同

标签: php arrays forms checkbox


【解决方案1】:

实际上,Sam 在 Stack Overflow 上的这个答案中提出了一个不错的解决方法:

Post the checkboxes that are unchecked

它对我有用,我怀疑你和我有一个类似的问题(我的问题是我在类似(ish)组中拥有/拥有超过 300 个输入字段,并且不想为每个组编写验证规则这些单独的字段,只是针对每个输入类型系列的规则,例如电子邮件地址或邮政编码。简而言之,该技术是您在复选框字段之前放置一个具有相同名称的隐藏输入字段。设置值隐藏字段 (type='hidden') 到 '0' 将确保至少一个键/值出现在您的 POST 数组中,只有在选中该框时,'0'才会被后来的'1'取代。我需要“0”值来允许人们“取消设置”他们之前“设置”的选项,例如他们愿意显示他们的联系数据。这种技术允许我向用户呈现几乎相同的更新表单就像他们在第一次注册时会得到的一样。感谢 Sam!

【讨论】:

    【解决方案2】:

    这是正常的 PHP 行为,当未选中复选框时,它不会将其包含在 $_POST 变量中...

    【讨论】:

      【解决方案3】:

      是的。这就是来龙去脉。没有解决方法。使用field[] 标识符仅适用于非结构化输入字段。如果您依赖于排序和关系,则未设置的字段将阻止此操作。

      您别无选择,只能设置显式索引。你应该咬一口酸苹果,为name[0]check[1]select[2] 这样做。使用 PHP 循环来简化它:

      foreach (range(0,2) as $i)
      echo <<< END
      <div class="group">
       <input type="text" name="name[$i]" /><br />
       <input type="checkbox" name="check[$i]" value="true" /><br />
       <select name="select[$i]"><option>1</option><option>2</option><option>3</option></select>
      </div>
      END
      

      【讨论】:

        【解决方案4】:

        我在表单的某些部分遇到了同样的问题,可以根据用户的意愿添加。我使用基本的javascript找到了这个非常简单的解决方法:

        在您的复选框之后添加一个隐藏类型输入,将其值分配给复选框的状态,并且将在您的 $_POST 中报告的隐藏输入将是 true错误

        <input type="checkbox" onchange="this.nextSibling.value = this.checked">
        <input type="hidden" name="state[]" value="false">
        

        如果您的复选框默认为checked="checked",只需将值更改为true

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多