我有一堆默认选中的复选框。我的用户可能会取消选中一些复选框(如果有的话),并选中其余的复选框。

是否有任何方法使表单POST未选中的复选框,而不是选中的复选框?


当前回答

因此,对于这个问题,这个解决方案是多余的,但当我在一个表的不同行中多次出现相同的复选框时,它帮助了我。我需要知道复选框代表的行,也知道复选框的状态(选中/未选中)。

我所做的是将name属性从复选框输入中删除,将它们全部赋予相同的类,并创建一个隐藏输入,该输入将保存与数据等效的JSON。

HTML

<表id = "权限表" > < tr > < td > <input type="checkbox" class="has-permission-cb" value="Jim"> <input type="checkbox" class="has-permission-cb" value="Bob"> <input type="checkbox" class="has-permission-cb" value="Suzy"> < / td > < / tr > 表> < / <input type="hidden" id="has-permissions-values" name="has-permissions-values" value=""> .

Javascript在表单提交上运行

var perms = {}; $ (" .has-permission-checkbox .each(功能)”(){ var userName = this.value; var val = ($(this).prop("checked")) ?1:0 perms[userName] = {"hasPermission": val}; }); $ (" # has-permissions-values ") (.val JSON.stringify perms));

json字符串将作为$_POST["has-permissions-values"]与表单一起传递。在PHP中,将字符串解码为一个数组,您将得到一个关联数组,其中包含每行和每个对应复选框的true/false值。然后很容易遍历并与当前数据库值进行比较。

其他回答

“我采用了服务器方法。似乎工作得很好-谢谢。- reach4lasasers 12月1日'09 at 15:19“我想从所有者那里推荐它。引用:javascript解决方案取决于服务器处理程序(我没有检查它)

if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something";

我们可以检查$_POST/Request元素是否有它。然后将它赋值给一个变量。

$value = (null !== $_POST['checkboxname']) ?“是”:“不是”;

这与isset()函数非常相似。但是isset()函数不能用于表达式的结果。我们可以用null检查它的结果,并达到相同的效果。

最后的值只是虚数。如果所需字段为布尔类型,我们可以将“YES”更改为1,将“NO”更改为0。

到目前为止,我最喜欢的解决方案是放置一个与可能不被选中的复选框同名的隐藏输入。我认为它的工作原理是,如果复选框没有被选中,隐藏输入仍然是成功的,并发送到服务器,但如果复选框被选中,它将覆盖之前的隐藏输入。这样,您就不必跟踪已发布数据中的哪些值应该来自复选框。

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

我实际上会这样做。

有我的隐藏输入字段与复选框输入相同的名称

<input type="hidden" name="checkbox_name[]" value="0" />
<input type="checkbox" name="checkbox_name[]" value="1" />

然后当我post时,我首先删除在$_POST数组中拾取的重复值,然后显示每个唯一的值。

  $posted = array_unique($_POST['checkbox_name']);
  foreach($posted as $value){
    print $value;
  }

我从一个帖子中得到了这个,从数组中删除重复值

我先试了山姆的版本。 好主意,但它会导致表单中有多个具有相同名称的元素。如果您使用任何基于名称查找元素的javascript,它现在将返回一个元素数组。

我已经在PHP中解决了Shailesh的想法,它为我工作。 这是我的代码:

/* Delete '.hidden' fields if the original is present, use '.hidden' value if not. */
foreach ($_POST['frmmain'] as $field_name => $value)
{
    // Only look at elements ending with '.hidden'
    if ( !substr($field_name, -strlen('.hidden')) ) {
        break;
    }

    // get the name without '.hidden'
    $real_name = substr($key, strlen($field_name) - strlen('.hidden'));

    // Create a 'fake' original field with the value in '.hidden' if an original does not exist
    if ( !array_key_exists( $real_name, $POST_copy ) ) {
        $_POST[$real_name] = $value;
    }

    // Delete the '.hidden' element
    unset($_POST[$field_name]);
}