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

PHP如何获取所有问题作答结果 未作答项自动设为null存入数据库

实现方案

核心原理

浏览器默认不会提交未选中的单选框字段,所以仅遍历$_POST无法拿到未作答的题目。你需要先拿到全量的题目ID列表,先给所有题目设置默认值null,再用用户提交的答案覆盖已作答的项即可。

具体实现步骤

  1. 后端先获取和前端渲染表单时完全一致的全量问题列表(一般是从数据库查询得到,和你前端循环输出题目用的$questions数据源相同)
  2. 初始化结果数组,给所有题目对应的字段默认赋值为null
  3. 遍历用户提交的POST数据,覆盖已作答的题目的答案,可额外加合法性校验避免恶意提交

代码示例

// 1. 获取全量问题列表,替换为你实际的查询逻辑
$all_questions = 你获取全量问题列表的代码; // 结构和前端的$questions一致,每个元素包含id字段

// 2. 初始化结果数组,所有题目默认值为null
$answer_result = [];
foreach ($all_questions as $q) {
    $field_key = "radio_{$q['id']}";
    $answer_result[$field_key] = null;
}

// 3. 用用户提交的答案覆盖已作答项
foreach ($_POST as $key => $value) {
    if (strpos($key, 'radio_') !== false && isset($answer_result[$key])) {
        // 可选:答案合法性校验,避免用户提交非法值
        if (in_array($value, ['good', 'medium', 'weak'])) {
            $answer_result[$key] = $value;
        }
        // 提取问题ID写入数据库的逻辑直接写在这里即可
        $question_id = str_replace('radio_', '', $key);
        // 你的入库逻辑,$answer_result[$key]就是答案,未作答的为null
    }
}

// 最终得到的$answer_result就是你要求的结构
print_r($answer_result);

可选前端补充方案

如果不想后端额外查全量问题列表,也可以在前端每个单选组最前面加一个同name的隐藏输入框:

<?php foreach ($questions as $key => $question) : ?>
  <div class="row">
    <?= $question['question'] ?>
   </div>
   <!-- 加在单选框最前面,未选的话会提交这个空值 -->
   <input type="hidden" name="radio_<?= $question['id'] ?>" value="">
   <div class="form-check ">
     <input class="form-check-input" type="radio" name="radio_<?= $question['id'] ?>" 
            value="good">
     <label class="form-check-label"> good</label>
   </div>
   <!-- 剩下的单选框代码不变 -->
<?php endforeach ?>

后端拿到值后判断为空就转成null即可。这个方案不如后端方案稳妥,前端数据可被篡改,更推荐优先使用后端处理方案。

内容的提问来源于stack exchange,提问作者Moamen Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 21:33:03