Codeigniter如何将多组单选按钮选中值以数组形式提交至控制器
调研表单多题答案数组传递方案
你当前的代码核心逻辑已经接近正确,不需要额外引入Javascript、URL传参等复杂方案,按照以下步骤调整即可正常传递所有答案:
1. 修正现有代码的三处基础问题
- 首先调整HTML结构合法性:
<form>标签不能直接嵌套在<table>和<tr>之间,否则浏览器会自动移位form标签导致提交失效,需要把form标签移动到table外层,包裹整个表格。 - 修复单选框name属性的PHP输出问题:你当前写的
name="indikator[$value->id]"不会解析PHP变量$value->id,必须改成name="indikator[<?= $value->id ?>]"的形式用PHP短标签输出变量,否则所有单选框的name都会变成固定字符串,无法按问题ID区分答案。 - form的action属性直接填写后端处理提交的控制器路由/处理文件地址即可,比如原生PHP写
action="submit_survey.php",使用CodeIgniter等框架可以写对应控制器方法的路由地址。
2. 表单数组传递原理
HTML原生表单支持数组格式的字段命名:只要同组字段的name按照数组名[自定义键名]的格式书写,表单提交时后端会自动将其解析为数组结构。你用的indikator[问题ID]命名方式完全符合这个规则:
- 提交后后端通过POST获取
indikator字段,就能直接拿到以问题ID为键、用户选中的评分值为值的关联答案数组 - 举个例子,如果有ID为2、4、6的3道题,用户分别选了Very Good(1)、Decent(3)、Very Bad(5),后端拿到的数组结构为:
[ 2 => "1", 4 => "3", 6 => "5" ]
不需要额外做数据拼接处理。
3. 其他方案的适用场景说明
你提到的几种方案都不是当前场景的必选项,各有适用范围:
- Javascript实现:仅用于异步无刷新提交、提交前自定义校验/加工数据的场景,普通同步表单提交完全不需要
- URL传参:属于GET请求传参方式,调研答案放在URL中既不安全也有长度限制,不适合POST提交的调研场景
form_radio()辅助函数:是部分框架封装的单选框生成方法,本质和你手写input标签的提交逻辑一致,只是简化了前端书写代码的工作量,不会改变数据传递的规则。
修正后的完整视图代码
<!-- form移到table外层,action替换为你自己的提交地址 --> <form action="填写你的控制器/处理文件地址" method="post"> <table class="table"> <?php $numbering = 1; foreach ($dataQuestion as $key => $value) : ?> <tr> <td width="1%"><?= $numbering++; ?></td> <td><?= $value->question ?> <div class="form-check mt-1"> <!-- 注意这里给$value->id加上PHP输出标签 --> <input class="form-check-input" type="radio" name="indikator[<?= $value->id ?>]" value="1"> Very Good <br> <input class="form-check-input" type="radio" name="indikator[<?= $value->id ?>]" value="2"> Good <br> <input class="form-check-input" type="radio" name="indikator[<?= $value->id ?>]" value="3"> Decent <br> <input class="form-check-input" type="radio" name="indikator[<?= $value->id ?>]" value="4"> Bad <br> <input class="form-check-input" type="radio" name="indikator[<?= $value->id ?>]" value="5"> Very Bad </div> </td> </tr> <?php endforeach; ?> <tr> <td colspan="2"><button type="submit" class="btn btn-info btn-lg btn-block">Submit</button></td> </tr> </table> </form>
后端接收示例
原生PHP环境直接通过全局POST变量获取即可:
// 直接获取所有问题的答案数组 $answerList = $_POST['indikator']; // 后续可增加校验:比如判断答案数量和总题数是否一致,避免漏答
如果是CodeIgniter等框架,用框架封装的POST获取方法拿indikator字段即可,拿到的结构和原生PHP完全一致。
内容的提问来源于stack exchange,提问作者Ariel Gemilang
相关产品推荐
相关产品推荐

