日期:2014-05-17  浏览次数:20840 次

一进来就看见两个表单问题,其实我也是冲着表单问题来的呀
有如下数据表

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取值.
请问还有没有其它办法?最终我其实就是想要一个这样的数组:描述了表单里所有选项的勾选状态.现在我只能获取到已勾选的,没勾选的居然不传变量过来我晕死了.

------解决方案--------------------
只有选中的checkbox才会提交 第一种是合理的
------解决方案--------------------
可以将所有checkbox的name值连成一个字符串,如:"type1,type2……",将其传到后台,php用explode将其分割,将获得的数组和接收过来的post按键名取差集,得到的就是未勾选的
------解决方案--------------------
其实两种办法是差不多的:

第一种: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]]