CodeIgniter中多数组存入数据库单行及生成指定JSON结构方法
问题解答:表单提交与JSON存储优化
嘿,我来帮你梳理下这两个问题:
一、现有实现是否合理?
你的思路整体是可行的,尤其是如果核心需求只是存储一组关联数据并在后续页面展示的话,这种把多组数据打包成JSON存储在valuation字段的方式完全没问题。
优点:
- 实现简单,不需要额外创建关联表,能快速满足需求
- 后续展示时,用
json_decode($valuation, true)把JSON转成数组,再通过foreach循环遍历输出,完全能达到你想要的展示效果,代码逻辑清晰
需要注意的潜在问题:
- 如果未来需要基于
score或variable做数据库查询/筛选(比如找出所有score=3的记录),JSON字段的查询效率会比拆分到单独字段低很多,而且语法更复杂(不同数据库对JSON的查询支持不一样) - 你当前的表单验证规则
'val[]'和表单里的var[<?php echo $i; ?>][]不匹配,这会导致验证失效,需要修正
二、如何生成带键名的JSON结构?
要得到你想要的[{"variable": "...", "score": "...", "description": "..."}]格式,需要修改两个核心部分:表单字段的命名,以及控制器里的POST数据处理逻辑。
1. 修改视图页面的表单字段name属性
把原来的匿名数组改成带明确键名的结构,让提交后的数组天然具备键值对应关系:
<form action="insert.php" method="post"> <?php $i = 0; ?> <?php foreach ($significance as $data): ?> <!-- 绑定variable键 --> <input type="text" name="var[<?php echo $i; ?>][variable]" value="<?php echo $data->category; ?>"> <!-- 绑定score键 --> <select name="var[<?php echo $i; ?>][score]"> <option value="0"> 0 </option> <option value="1"> 1 </option> <option value="2"> 2 </option> <option value="3"> 3 </option> </select> <!-- 绑定description键 --> <input type="text" name="var[<?php echo $i; ?>][description]"> <?php $i++; ?> <?php endforeach; ?> <button type="submit"> Submit </button> </form>
2. 修正控制器的验证与数据处理逻辑
调整表单验证规则匹配新字段名,然后直接处理POST过来的带键数组,转成JSON即可:
$collectionID = $this->input->get('coll_id'); //get from url // 针对每个字段做精准验证 $this->form_validation->set_rules('var[][variable]', 'Variable Name', 'required'); $this->form_validation->set_rules('var[][score]', 'Score', 'required|integer|min_length[1]|max_length[1]'); $this->form_validation->set_rules('var[][description]', 'Description', 'required'); // 注意:run()需要加括号,你之前漏了 if ($this->form_validation->run() == FALSE) { $data = array( 'page_title' => 'Some Title', 'part' => 'input-data', 'detail' => $this->collection_db->get_collection_data($collectionID), 'significance' => $this->significance_db->get_significance_list() ); $this->load->view('form-registration', $data); } else { // 直接获取POST的var数组,已经是带键名的结构 $valuationData = $this->input->post('var'); $db_data = array( 'collection_ID' => $collectionID, 'valuation' => json_encode($valuationData), // 直接编码即可得到目标格式 'post_by' => $this->session->userdata('user_ID'), 'post_datetime' => get_datetime_format() // 你之前漏了引号闭合,已修正 ); if ($this->significance_db->save_data($db_data) == TRUE) { // 成功后的逻辑,比如跳转提示页 redirect('success'); } else { // 失败后的逻辑,比如返回表单并提示错误 $this->session->set_flashdata('error', '保存失败,请重试'); redirect('input-data'); } }
3. 后续展示时的处理
从数据库取出valuation字段后,转成关联数组遍历即可:
$valuationArr = json_decode($row->valuation, true); foreach ($valuationArr as $item) { echo "Variable : {$item['variable']}<br>"; echo "Score: {$item['score']}<br>"; echo "Description: {$item['description']}<br><br>"; }
内容的提问来源于stack exchange,提问作者Sigit D Red Hat
相关产品推荐
相关产品推荐

