CodeIgniter控制器传数组变量出现非法字符串偏移警告的解决与原因
解决CodeIgniter传递数组参数时的非法字符串偏移与非对象警告
咱们先拆解你遇到的这几个警告的本质原因,再给出对应的解决办法:
一、警告产生的原因
1. Illegal string offset 警告
你手动调用$this->check_inputqty($passdataqty)时确实传了数组,但如果这个方法是作为表单验证的回调规则被框架触发的,CodeIgniter会默认把当前验证字段的字符串值作为第一个参数传给它,而不是你手动传的数组。这就导致方法里的$passdataqty变成了字符串,你再用数组偏移(比如$passdataqty['id_sedia'])去访问自然会报错。
2. Trying to get property 'stock_rincian' of non-object 警告
当你的数据库查询$this->db->get()->row()没有找到匹配的记录时,它会返回null而不是对象。这时候你直接访问->stock_rincian就相当于对空值调用属性,触发这个警告。
二、解决方法
步骤1:调整参数传递方式(用控制器临时属性存储数组)
不要依赖表单验证回调的参数传递,而是把需要的数组存在控制器的临时属性里,让回调方法从这里取数据:
修改inputstokkeluarSedia()方法:
public function inputstokkeluarSedia() { // 把需要的参数存在控制器临时属性中 $this->temp_stock_data = array( 'id_sedia' => $this->input->post('id_sedia'), 'stock_keluar' => $this->input->post('qtyinput'), 'jenis_dok' => $this->input->post('jenisdok'), ); // 设置表单验证规则,注意回调的写法(不需要传参数) $this->form_validation->set_rules('qtyinput', 'Kuantitas', 'required|callback_check_inputqty'); if ($this->form_validation->run() === FALSE) { // 验证失败的逻辑,比如返回表单页面 $this->load->view('your_form_view'); } else { // 验证成功的逻辑,比如执行出库操作 $this->do_stock_out(); } }
步骤2:修改回调方法,处理空查询与参数校验
更新check_inputqty()方法,先校验数据有效性,再处理查询为空的情况:
public function check_inputqty() { // 从临时属性获取数据 $passdataqty = $this->temp_stock_data; // 先校验数组是否有效,避免非法偏移 if (!is_array($passdataqty) || !isset($passdataqty['id_sedia'], $passdataqty['jenis_dok'], $passdataqty['stock_keluar'])) { $this->form_validation->set_message('check_inputqty', 'Data stok tidak valid'); return FALSE; } $id_sedia = $passdataqty['id_sedia']; $jenis_dok = $passdataqty['jenis_dok']; $stock_keluar = $passdataqty['stock_keluar']; // 执行查询并判断是否有结果 $stock_record = $this->db->select('stock_rincian') ->from('persediaan_stock_rincian') ->where('id_sedia', $id_sedia) ->where('jenis_dok', $jenis_dok) ->get()->row(); // 处理查询为空的情况 if (!$stock_record) { $this->form_validation->set_message('check_inputqty', 'Tidak ditemukan data stok untuk barang ini'); return FALSE; } // 校验出库数量 if ($stock_keluar > $stock_record->stock_rincian) { $this->form_validation->set_message('check_inputqty', 'Kuantitas barang yang ingin dikeluarkan melebihi jumlah stok yg ada!'); return FALSE; } return TRUE; }
可选优化:兼容手动调用与回调调用
如果需要这个方法既能被表单验证回调调用,又能手动调用,可以加个参数判断:
public function check_inputqty($passdataqty = null) { // 如果没有传参数,就用临时属性;否则用传入的参数 if ($passdataqty === null) { $passdataqty = $this->temp_stock_data; } // 后续校验逻辑同上 }
内容的提问来源于stack exchange,提问作者GstiAld
相关产品推荐
相关产品推荐

