PHP如何获取所有问题作答结果 未作答项自动设为null存入数据库
实现方案
核心原理
浏览器默认不会提交未选中的单选框字段,所以仅遍历$_POST无法拿到未作答的题目。你需要先拿到全量的题目ID列表,先给所有题目设置默认值null,再用用户提交的答案覆盖已作答的项即可。
具体实现步骤
- 后端先获取和前端渲染表单时完全一致的全量问题列表(一般是从数据库查询得到,和你前端循环输出题目用的
$questions数据源相同) - 初始化结果数组,给所有题目对应的字段默认赋值为
null - 遍历用户提交的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
相关产品推荐
相关产品推荐

