PHP复选框Undefined offset问题:从MySQL获取值设置选中状态
解决复选框状态设置与Undefined Offset错误问题
首先,咱们先搞清楚你遇到的Undefined offset:1,2...错误原因:你的SQL查询只从表中获取了一行的Disabled字段值,所以$storeArray里只有一个元素(索引为0),但你尝试访问索引1、2,这就相当于去拿一个不存在的数组元素,自然会报错。
接下来给你两种常见场景的解决方案,你可以根据你的数据库结构来选:
场景1:每个复选框对应表中不同字段
假设你的表中有AddDisabled、ViewDisabled这类字段,分别存储对应复选框的禁用状态(0/1),那可以这么改:
// 先修正SQL,查询对应每个复选框的状态字段 $rsAppPage = $rs->SelectQuery("SELECT AddDisabled, ViewDisabled FROM table"); $row = mysqli_fetch_assoc($rsAppPage); $str_out .= ' <div class="row"> <div class="form-group col-md-2">'; // 处理Add复选框:当字段值为1时添加checked属性,否则不添加 $addChecked = $row['AddDisabled'] == 1 ? 'checked' : ''; $str_out .= '<input type="checkbox" name="Add" id="chk_add" data-contact_avl="val" value="1" '.$addChecked.'>Add '; // 处理View复选框 $viewChecked = $row['ViewDisabled'] == 1 ? 'checked' : ''; $str_out .= '<input type="checkbox" name="View" id="chk_view" data-contact_avl="val" value="2" '.$viewChecked.'>View '; $str_out .= '</div></div>';
场景2:每条记录对应一个权限状态
如果你的表是用多条记录存储不同权限的状态(比如有PermissionName和Disabled字段,其中PermissionName值为"Add"、"View"),那可以用循环把状态存到关联数组里:
$rsAppPage = $rs->SelectQuery("SELECT PermissionName, Disabled FROM table WHERE PermissionName IN ('Add', 'View')"); $permissionStatus = []; // 循环取出所有权限状态,存在关联数组里 while ($row = mysqli_fetch_assoc($rsAppPage)) { $permissionStatus[$row['PermissionName']] = $row['Disabled']; } $str_out .= ' <div class="row"> <div class="form-group col-md-2">'; // Add复选框:先检查状态是否存在且为1 $addChecked = isset($permissionStatus['Add']) && $permissionStatus['Add'] == 1 ? 'checked' : ''; $str_out .= '<input type="checkbox" name="Add" id="chk_add" data-contact_avl="val" value="1" '.$addChecked.'>Add '; // View复选框同理 $viewChecked = isset($permissionStatus['View']) && $permissionStatus['View'] == 1 ? 'checked' : ''; $str_out .= '<input type="checkbox" name="View" id="chk_view" data-contact_avl="val" value="2" '.$viewChecked.'>View '; $str_out .= '</div></div>';
额外注意点:
- 不要给多个复选框用相同的
id(你现在都用id="chk"),这不符合HTML规范,会导致DOM操作出问题,改成chk_add、chk_view这类唯一ID。 - HTML中复选框的
checked属性只要存在就会选中,所以不用写checked=0,直接当值为1时输出checked即可,值为0时不输出该属性。
内容的提问来源于stack exchange,提问作者NoClue
相关产品推荐
相关产品推荐

