codeigniter foreach $ row,error尝试获取非对象的属性

时间:2013-06-16 10:26:48

标签: php codeigniter foreach

这是我的控制器

if ( $training_code == null || $batch_no == null)
        {
            $data = $this->_public_data();
            $no_reg = $this->sys_model->get_registration($this->session->userdata('admin'))->no_reg;
            $data['trainingl_list']= $this->sys_model->list_training_by_user($no_reg);
        }

这是在我的模型中

function list_training_by_user($no_reg)
{
    $this->db->where('no_reg', $no_reg);
    return $this->db->get('tbl_peserta_training')->row(); 
}

这是我的观点

<?php foreach($trainingl_list as $row){
echo $row->kd_training; //<-- this is 13th line
echo $row->no_batch; //<-- this is 19th line
?>

它得到了

Severity: Notice
Message: Trying to get property of non-object
Line Number: 13, 19

如果我只是在我的视图中回显$ noreg(通过将其放入$ data ['noreg'] = $ no_reg),它没有错误,但是使用$ training_list数组,并将其放入foreach中,在我看来,我得到了那些错误 我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

$training_list来自list_training_by_user()吗?如果是这样,list_training_by_user()只返回一行,而不是行列表。因此,迭代该行无效。您可能需要尝试这样的事情:

function list_training_by_user($no_reg)
{
    $this->db->where('no_reg', $no_reg);
    $result = $this->db->get('tbl_peserta_training');
    $results = array();
    while ($row = $result->row()) {
      $results[] = $row;
    }
    return $results;
}

修改

更好的是,您应该返回result(),这似乎是Iterator的一个实例:

function list_training_by_user($no_reg)
{
    $this->db->where('no_reg', $no_reg);
    return $this->db->get('tbl_peserta_training')->result(); 
}

编辑2

由于我的第一个示例和result()方法(请参阅注释)存在内存问题,我们一次只能加载一个结果。您必须返回查询并从该对象一次获取一行。

function list_training_by_user($no_reg)
{
    $this->db->where('no_reg', $no_reg);
    return $this->db->get('tbl_peserta_training'); 
}

然后在你看来:

$results = $this->sys_model->list_training_by_user($no_reg);
while ($row = $results->row()) {
  echo $row->kd_training; //<-- this is 13th line
  echo $row->no_batch; //<-- this is 19th line
}

不幸的是,CodeIgnitor result()方法将所有结果加载到单个数组中,就像我的第一个解决方案一样。当然,如果你有大量的结果,这不是内存效率。每行都需要延迟加载。如果你想要一个漂亮的替代品,你可以编写一个实现Iterator interface到自动延迟加载结果行的类,同时在foreach循环中迭代结果,我可以告诉你看起来像什么如果你愿意的话。

答案 1 :(得分:0)

模特:

function list_training_by_user($no_reg)
{
   $this->db->where('no_reg', $no_reg);
   $result=$this->db->get('tbl_peserta_training'); 
   return $result->$result_array();

}

控制器

$data=$this->model_name->list_training_by_user($no_reg);
$this->load->view("your_view_name",array('trainingl_list'=>$data));

并在视图中使用它

<?php
foreach($trainingl_list as $row){
   echo $row['kd_training']; //<-- this is 13th line
   echo $row['no_batch']; //<-- this is 19th line
}
?>

In model :

function list_training_by_user($no_reg)
{
   $this->db->where('no_reg', $no_reg);
   $result=$this->db->get('tbl_peserta_training'); 
   return $result->result();

}

控制器:与earliar相同;

并在视图中使用它

foreach($trainingl_list as $row){
   echo $row->kd_training; //<-- this is 13th line
   echo $row->no_batch; //<-- this is 19th line
}
?>