如何在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
相关产品推荐
相关产品推荐

