有如下数据表id----name----show
1-----AA------1
2-----BB------0
4-----DD------0
33----FF------1
读取后输出的操作表单如下:
<span class="type"><input id="type1" name="type[]" value="1" type="checkbox" checked="checked" /> AA</span>
<span class="type"><input id="type2" name="type[]" value="2" type="checkbox" /> BB</span>
<span class="type"><input id="type4" name="type[]" value="4" type="checkbox" /> DD</span>
<span class="type"><input id="type33" name="type[]" value="33" type="checkbox" checked="checked" /> FF</span>
<input type="submit" name="submit" value="提交" />
程序目的:提交后,根据勾选状态重置表里面的所有字段的show值,比如AA没勾选,提交后将它设置为0,而DD被勾选了,提交后将它设置为1
但这里有一个问题,post过来的type数组只带有勾选元素,如本身AA的show是1,输出控制器在输出时将它默认设置为 checked="checked",即勾选,这时候我想将AA的show设置为0,所以关闭勾选,并且将本身没勾选的DD进行勾选(想把DD的show设置为1),提交表单,传来的type数组如下:
Array
(
    [0] => 4
    [1] => 33
)即数据只传来了勾选的两个元素,第0个元素其实就是DD,第1个元素就是FF,前面的AA,BB没勾选就没传来,得到这个数组后,
就要根据数组值去找对应id的记录设置为1,但是没有传来的就设置为0,怎么弄?===============
另一个方案,表单的name值用id命名,而不是数组,即如下表单(这是我的笨方法,加了个hidden记录最大的id值)
<span class="type"><input id="type1" name="type1" value="1" type="checkbox" checked="checked" /> AA</span>
<span class="type"><input id="type2" name="type2" value="2" type="checkbox" /> BB</span>
<span class="type"><input id="type4" name="type4 value="4" type="checkbox" /> DD</span>
<span class="type"><input id="type33" name="type33" value="33" type="checkbox" checked="checked" /> FF</span>
<input type="submit" name="submit" value="提交" />提交后,勾选的就提交上来了,我用CI框架的,这样来弄..
$maxid = 从数据库得到最大id;
$types = array();
for($i = 1; $i <= $maxid; $i++){
    $types[$i] = ($this->input->post('type'.$i)==false)?0:1;
    //没有勾选的话,比如post('type2')会返回false,因为type2这个表单表量压根没有传过来..而传过来的都是勾选的,所以非false的就返回1
}问题这样for循环就添加了很多个不存在的间断id,当然,解决办法就是从数组中获取存在的id组foreach一个个id取值.
请问还有没有其它办法?最终我其实就是想要一个这样的数组:描述了表单里所有选项的勾选状态.现在我只能获取到已勾选的,没勾选的居然不传变量过来我晕死了.

解决方案 »

  1.   

    只有选中的checkbox才会提交  第一种是合理的
      

  2.   

    可以将所有checkbox的name值连成一个字符串,如:"type1,type2……",将其传到后台,php用explode将其分割,将获得的数组和接收过来的post按键名取差集,得到的就是未勾选的
      

  3.   

    其实两种办法是差不多的:第一种:php里准备一个数组,array(1, 2, 4, 33); 遍历这个array, 检查array[i]是否在$_POST['type']内,可以使用isset或者in_array。第二种:和第一种是一样的.. 只不过用了一下字符串拼接.. array(1, 2, 4, 33), 遍历这个array,检查array[i]是否存在$_POST['type' . $array[i]]