PHP项目调用getObjectBool获取checkbox勾选状态始终为空的问题咨询
问题根因
- 浏览器表单提交规则限制:未勾选的
checkbox控件不会被作为参数发送到服务端,你传入类构造函数的表单数组中,只要EmailMandatory未勾选,这个键名根本不存在于$classData属性中。 - 现有
getObjectBool函数的返回值表现问题:你调用时传入第二个参数为false,函数会返回布尔值,而PHP中直接输出布尔值false时会被转换为空字符串,这就是你看到“返回值始终为空”的表象:- 复选框勾选时:
$classData中存在EmailMandatory=1,函数返回true,输出结果为1 - 复选框未勾选时:
$classData中不存在对应键,函数返回false,输出结果为空
- 复选框勾选时:
- 额外注意:原函数中被注释的
$bool = intval(isset($this->classData[$key]) ? 1 : 0);才是匹配复选框提交逻辑的代码,当前启用的逻辑实际是兼容其他场景的写法,并不适配复选框的特性。
解决方案
以下三种方案任选其一即可:
方案1:修复getObjectBool逻辑(最推荐)
直接恢复函数中被注释的代码,适配复选框提交规则:
protected function getObjectBool($key,$toString=false,$trueVal="yes",$falseVal="no") { // 只要键存在就代表勾选,和复选框提交逻辑完全匹配 $bool = intval(isset($this->classData[$key]) ? 1 : 0); if($toString == true) { return $bool > 0 ? $trueVal : $falseVal; } return $bool > 0; }
方案2:表单增加隐藏域(无需修改后台代码)
在复选框前增加同name的隐藏域,默认值设为0,这样无论是否勾选都会提交对应参数:
<div class="row"> <div class="col-lg-3 formlabel">Mandatory</div> <div class="col-lg-9"> <label style="font-weight: normal;"> <input type="hidden" name="EmailMandatory" value="0"> <input type="checkbox" name="EmailMandatory" value="1" checked> Use of mail address is mandatory </label> </div> </div>
浏览器提交时,如果复选框勾选,后面的值会覆盖前面隐藏域的0,得到1;未勾选则直接提交隐藏域的0,原有后台逻辑无需修改即可正常取值。
方案3:接收表单时补全默认值
将表单数据传入类构造函数前,手动给所有复选框字段设置默认值:
// 假设接收的表单数据为$_POST $postData = $_POST; // 给复选框字段设置默认值,不存在则赋值0 $postData['EmailMandatory'] = isset($postData['EmailMandatory']) ? $postData['EmailMandatory'] : 0; // 再将$postData传入类构造函数 $yourObj = new YourClass($postData, $tableName, $primaryIDName);
内容的提问来源于stack exchange,提问作者Albert van Harten
相关产品推荐
相关产品推荐

