PHP新手求助:CodeIgniter中Trying to get property of non-object报错
解决 "Trying to get property 'sale_rate' of non-object" 报错问题
你遇到的这个报错,核心原因其实很直白:你的Model返回的是数组格式的查询结果,但你在Controller里却用对象访问的语法(->)去获取字段值,自然会触发这个错误啦。
问题根源拆解
先看你的Model代码:
function get_productDet($item) { $this->db->select('*'); $this->db->from('product'); $this->db->where('id',$item); $res=$this->db->get()->result_array(); // 这里返回的是二维数组 return $res; }
result_array()方法会返回一个包裹着查询结果的二维数组——哪怕你根据id查询只会得到一条数据,它也会放在一个数组里返回。但你在Controller里却直接用$product_det->sale_rate这种对象访问的方式去取值,这就导致了"获取非对象属性"的报错。
两种可行解决方案
方案一:把Model返回改成对象格式
如果你更习惯用对象语法访问字段,只需要把Model里的result_array()改成row()就行(因为你是根据主键查询,必然只有一条数据,row()专门用来返回单条数据的对象):
function get_productDet($item) { $this->db->select('*'); $this->db->from('product'); $this->db->where('id',$item); $res=$this->db->get()->row(); // 返回单条数据的对象 return $res; }
这样你Controller里原来的$product_det->sale_rate就能正常工作,不需要修改Controller的其他代码。
方案二:保持数组返回,修改Controller的取值方式
如果想继续用数组格式,那Controller里要调整成数组的访问语法,注意先取出数组里的第一条数据:
function product_det() { $item=$this->input->post('item_id'); $quantity=$this->input->post('quantity'); $rate=$this->input->post('rate'); $amount=""; $cgst=""; $sgst=""; $igst=""; $product_det=$this->sale_model->get_productDet($item); if(!empty($product_det)) { // 先取出数组里的第一条数据 $product = $product_det[0]; if($rate=="" || $rate==0) { $rate=$product['sale_rate']; // 数组用[]访问字段 } $amount=$rate*$quantity; $cgst_per=$product['CGST']; // 这里也要改成数组语法 $sgst_per=$product['SGST']; $igst=0; } echo $rate."-".$amount."-".$cgst."-".$sgst."-".$igst.""; }
另外提个小细节:你代码里的$cgst和$sgst变量只声明了但没赋值,最后输出会是空的,记得后续补上对应的计算逻辑哦。
额外小建议
- 针对根据主键查询单条数据的场景,用
row()返回对象比result_array()更合适,代码更简洁,也不容易出错。 - 用
row()的时候,可以在Controller里先判断$product_det是否为null,避免空对象报错,比如:
if($product_det !== null) { // 执行你的业务逻辑 }
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

