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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:54:29