You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:54:17