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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:32:52