插入挤奶数据后Jumlah Hasil Perah列显示0,刷新才正常如何解决
问题根因
代码逻辑存在3个硬伤,直接导致刚插入的记录总产奶量显示为0:
- 执行顺序完全颠倒:总产奶量的计算逻辑跑在本次提交的早晚奶量数据入库之前,计算所用的是数据库里留存的旧历史值,和本次新提交的挤奶数据无关
- 模型方法返回值永久错误:
jumlahPerahSapi无论计算流程是否走完,固定返回false,控制器会把这个假值直接存入数据库,PHP里false转成数值类型就是0,和观察到的初始显示为0的现象完全匹配 - 数据更新逻辑错位:本该随新挤奶记录一起存储的总产奶量值,被替换成了对旧历史记录的批量更新操作,和本次新增的记录没有关联
之前观察到「手动刷新后值就正确」,本质是刷新触发了错位的更新逻辑,把新插入那条记录存的0值给覆盖成了实际的计算值,并不是初始插入流程就正确。
修复步骤
1. 调整控制器新增逻辑的计算流程
直接在控制器里基于本次提交的表单值计算总产奶量,替换掉原来错误调用模型的代码,不要在插入新记录前执行无关的旧数据更新:
public function tambahHasilPerah(){ $idSapi = $this->input->post('idSapi'); $tglPerah = $this->input->post('tglPerah'); $hasilPerahPagi = (float)$this->input->post('hasilPerahPagi'); $hasilPerahSore = (float)$this->input->post('hasilPerahSore'); // 直接基于提交的数值计算总产奶量,不要调用旧的错位方法 $jumlahPerah = $hasilPerahPagi + $hasilPerahSore; $data = [ 'idSapi' => $idSapi, 'tglPerah' => $tglPerah, 'hasilPerahPagi' => $hasilPerahPagi, 'hasilPerahSore' => $hasilPerahSore, 'jumlahPerah' => $jumlahPerah ]; $insert = $this->m_hasilperah->tambahHasilPerahModel($data, $idSapi); if ($insert) { redirect('C_hasilperah/tampilHasilPerah/' . $idSapi, 'refresh'); } else { echo 'gagal'; } }
2. 移除错位的模型方法
删掉m_hasilperah里的jumlahPerahSapi方法——这个方法不带日期维度的更新逻辑,会把同一只牛所有历史记录的总产奶量都改成同一个错误值,本身就存在逻辑漏洞,不应该放在单条新增的业务流程里。
如果后续需要批量修正历史存错的总产奶量数据,可以直接执行一次SQL批量更新:
UPDATE tb_hasilperah SET jumlahPerah = hasilPerahPagi + hasilPerahSore WHERE jumlahPerah = 0;
3. 存量错误数据修正
对于已经因为逻辑错位存入的jumlahPerah=0的历史记录,执行上面的批量更新语句就能一次性把所有值修正为早晚奶量的真实总和。
内容的提问来源于stack exchange,提问作者Adhitama
相关产品推荐
相关产品推荐

