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

如何在CodeIgniter中捕获并记录修改的产品表单字段

实现CodeIgniter产品编辑字段修改记录方案

完全可行,以下是具体实现步骤:

1. 创建操作日志数据表

首先在数据库中创建用于存储修改记录的表,示例SQL:

CREATE TABLE product_operation_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT NOT NULL COMMENT '关联产品ID',
    user_id INT NOT NULL COMMENT '操作用户ID',
    changed_field VARCHAR(50) NOT NULL COMMENT '修改的字段标识',
    old_value TEXT COMMENT '字段旧值',
    new_value TEXT COMMENT '字段新值',
    operation_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
    FOREIGN KEY (product_id) REFERENCES products(id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

2. 扩展产品Model获取原始数据

在你的产品Model(如Product_model)中添加方法,用于获取待编辑产品的原始数据:

public function get_product_by_id($product_id) {
    return $this->db->get_where('products', ['id' => $product_id])->row_array();
}

3. 在编辑Controller中对比新旧数据

在处理产品编辑提交的Controller方法(如Product_controller的update方法)中,先获取表单提交的新数据,再拉取原始数据,对比找出修改的字段:

public function update($product_id) {
    // 获取表单提交的新数据
    $new_data = $this->input->post();
    // 获取产品原始数据
    $old_data = $this->product_model->get_product_by_id($product_id);
    
    // 定义需要监控的字段列表
    $monitor_fields = ['product_code', 'product_name', 'price', 'stock'];
    $changed_records = [];
    
    // 遍历对比字段
    foreach ($monitor_fields as $field) {
        // 确保新旧数据都存在该字段且值不同
        if (isset($old_data[$field]) && isset($new_data[$field]) && $old_data[$field] !== $new_data[$field]) {
            $changed_records[] = [
                'field' => $field,
                'old_val' => $old_data[$field],
                'new_val' => $new_data[$field]
            ];
        }
    }
    
    // 先执行产品数据更新(原有逻辑)
    $this->product_model->update_product($product_id, $new_data);
    
    // 保存修改记录(如果有变更)
    if (!empty($changed_records)) {
        $user_id = $this->session->userdata('user_id'); // 假设当前用户ID存在session中
        foreach ($changed_records as $record) {
            $log_data = [
                'product_id' => $product_id,
                'user_id' => $user_id,
                'changed_field' => $record['field'],
                'old_value' => $record['old_val'],
                'new_value' => $record['new_val']
            ];
            $this->product_log_model->save_log($log_data);
        }
    }
    
    // 后续跳转或响应逻辑
    redirect('products');
}

4. 创建日志Model处理记录存储

新建Product_log_model,实现保存日志的方法:

class Product_log_model extends CI_Model {
    public function save_log($log_data) {
        $this->db->insert('product_operation_logs', $log_data);
        return $this->db->insert_id();
    }
}

可选优化:字段名友好化

如果需要在日志中显示中文字段名(如“产品编码”而非product_code),可以添加字段映射:

$field_name_map = [
    'product_code' => '产品编码',
    'product_name' => '产品名称',
    'price' => '产品价格',
    'stock' => '库存数量'
];
// 保存日志时可替换为友好名称
'changed_field' => $field_name_map[$record['field']]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:42