29

我有一个如下表格:

<form action="" method="post">
    <input type="checkbox" id="status_1" name="status_1" value="1" />
    <input type="checkbox" id="status_2" name="status_2" value="1" />
    <input type="checkbox" id="status_3" name="status_3" value="1" />
</form>

当我选中所有复选框并发布表单时,结果如下:

Array ([status_3] => 1 [status_2] => 1 [status_1] => 1 ) 

然后我取消选中第二个复选框并发布表单,结果是这样的:

Array ( [status_3] => 1 [status_1] => 1 ) 

当我取消选中第二个复选框时,是否可以得到如下结果:

Array ( [status_3] => 1 [status_2] => 0 [status_1] => 1 ) 

有想法去做吗?

4

11 回答 11

50

第一种方式 - 隐藏字段(缺点:用户可以操纵字段的值(但也可以操纵复选框的值,所以如果您只期望 1 或 0,这不是真正的问题))

<form action="" method="post">
<input type="hidden" name="status_1" value="0" />
<input type="checkbox" id="status_1" name="status_1" value="1" />
<input type="hidden" name="status_2" value="0" />
<input type="checkbox" id="status_2" name="status_2" value="1" />
<input type="hidden" name="status_3" value="0" />
<input type="checkbox" id="status_3" name="status_3" value="1" />
<input type="submit" />
</form>
<?php
var_dump($_POST);
/*
 * checking only the second box outputs:
 * 
 * array (size=3)
  'status_1' => string '0' (length=1)
  'status_2' => string '1' (length=1)
  'status_3' => string '0' (length=1)
 */

第二种方式 - 为未设置的索引分配默认值:

<form action="" method="post">
<input type="checkbox" id="status_1" name="status_1" value="1" />
<input type="checkbox" id="status_2" name="status_2" value="1" />
<input type="checkbox" id="status_3" name="status_3" value="1" />
<input type="submit" />
</form>
<?php
for($i = 1; $i<=count($_POST); $i++) {
    $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0;
}
var_dump($_POST);

/**
 * Here we will be checking only the third checkbox:
 * 
 * array (size=3)
  'status_3' => string '1' (length=1)
  'status_1' => int 0
  'status_2' => int 0
 */
于 2013-10-08T05:33:32.337 回答
9

我认为添加这样的隐藏字段会起作用

<input type="hidden" id="status_1_" name="status_1"  value="0">
<input type="checkbox" id="status_1" name="status_1" value="1" />

<input type="hidden" id="status_2_" name="status_2" value="0">
<input type="checkbox" id="status_2" name="status_2" value="1" />

<input type="hidden" id="status_3_" name="status_3" value="0">
<input type="checkbox" id="status_3" name="status_3" value="1" />
于 2013-10-08T05:30:14.690 回答
2

尝试这个。如果未选中该复选框,则将传递具有相同名称的隐藏字段。

<form action="" method="post">
  <input type="hidden" id="hidden_status_1" name="status_1" value="0" />
  <input type="checkbox" id="status_1" name="status_1" value="1" />
  <input type="hidden" id="hidden_status_2" name="status_2" value="0" />
  <input type="checkbox" id="status_2" name="status_2" value="1" />
  <input type="hidden" id="hidden_status_3" name="status_3" value="0" />
  <input type="checkbox" id="status_3" name="status_3" value="1" />
</form>
于 2013-10-08T05:28:14.460 回答
2

我认为不可能从 html 表单中获得像您想要的那样的数组。但是可以使用一些技巧:

$defaultForm = array(
'status_1' => 0,
'status_2' => 0,
'status_3' => 0, 
);

// example array from $_POST
$form = array(
'status_1' => 1,
'status_3' => 1, 
);

$form = array_merge($defaultForm, $form);

结果:

数组(3){

'status_1' => int(1)
'status_2' => int(0)
'status_3' => int(1)

}

于 2013-10-08T05:25:35.030 回答
1

谢谢大家。感谢@RoyalBg 给我解决方案。像这样 :

<input type="hidden" name="status_1" value="0" />
<input type="checkbox" id="status_1" name="status_1" value="1" /> Check 1 <br />
<input type="hidden" name="status_2" value="0" /> 
<input type="checkbox" id="status_2" name="status_2" value="1" /> Check 2 <br />
<input type="hidden" name="status_3" value="0" />
<input type="checkbox" id="status_3" name="status_3" value="1" /> Check 3 <br />

它工作得很好.. :)

于 2013-10-08T05:30:26.883 回答
1

这个问题可能已经得到回答,但我只是想试一试......服务器端唯一的解决方案:

$p = $_POST;
$a = array();
$a['status_3'] = (int) ($p['status_3'] === 1);
$a['status_2'] = (int) ($p['status_2'] === 1);
$a['status_1'] = (int) ($p['status_1'] === 1);

测试

 // if input is Array("status_1"=>1) output will be
 Array ( [status_1] => 1 [status_3] => 0 [status_2] => 0 )

 // if input is Array("status_1"=>1, "status_2"=>1) output will be
 Array ( [status_1] => 1 [status_3] => 0 [status_2] => 1)
于 2013-10-08T05:40:54.263 回答
1
<!--html code-->                                                                  
<input type="checkbox" name="correct" value="1">Option 1
<input type="checkbox" name="correct" value="2">Option 2
<input type="checkbox" name="correct" value="3">Option 3
<input type="checkbox" name="correct" value="4">Option 4                                   

//php code in function called on form submit       
  public function addOptions(Request $request)
   {
    $option = array('1' => 0,'2'=>0,'3'=>0,'4'=>0 );
    $option[$request->correct] = 1;
    return $option;
   }
于 2019-03-21T03:10:01.407 回答
0

Try this one:

for ($i = 1; $i<=3; $i++) {
    $_POST["status_$i"] = isset($_POST["status_$i"]) ? $_POST["status_$i"] : 0; // 0 if not set
}

var_dump($_POST);
于 2015-03-31T10:37:11.383 回答
0

你为什么把它放在一个数组里?您可以使用“isset”将未选中的框设为 0

    if(!isset($_POST['status_2'])
    {
      //Set status_2 parameter as 0
    }
于 2013-10-08T05:24:49.333 回答
0

试试下面的代码

    $myresult = array();

    if(!isset($_POST['status_1'])){ 
        $myresult['status_1'] = 0;
    }
    if(!isset($_POST['status_2'])){ 
        $myresult['status_2'] = 0;
    }
    if(!isset($_POST['status_3'])){ 
        $myresult['status_3'] = 0;
    }

    echo "<pre>";
    print_r($myresult);
    echo "</pre>";
    exit;
于 2013-10-08T06:00:16.190 回答
0

假设我们使用带有零或一的复选框......

使用具有零值的隐藏复选框只是一种解决方法。另一种解决方法是在接收帖子或获取时将值添加 0。

例子:

$chkbx1 = $_POST['chckbx1']; $chkbx1 += 0;

这需要一个 NULL 值并将其变为零,但如果该值为 1,如在其检查中那样,则该值保持不变。

这里真正的问题不是发明一种变通方法。它理解为什么会发生这种情况。旧版本的 mySQL 采用空值并将它们转换为零。在较新的版本中,您必须禁用严格模式,然后就不需要解决方法。

于 2016-12-09T05:38:29.450 回答