2013-06-16 3 views
1

это внутри моего контроллера

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 

Если я просто echo $ noreg (помещая его в $ data ['noreg'] = $ no_reg) внутри моего представления, он не имеет ошибки, но с массивом $ training_list и помещает его в foreach на мой взгляд, я получил ту ошибку Я что-то упустил?

ответ

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; 
} 

EDIT

еще лучше, вы должны возвращаться result(), который, как представляется, является экземпляром Iterator:

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

EDIT 2

Из-за памяти iss с моим первым примером и методом 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, и я могу показать вам, как это будет выглядеть, если хотите.

+0

Кстати, если вы еще не сделали, проверьте [эта документация] (http://ellislab.com/codeigniter/user-guide/database/results. html) для большего количества методов. – kuujo

+0

первый получил «Неустранимая ошибка: разрешенный размер памяти 134217728 байт исчерпан (пытался выделить 36 байт) в C: \ Program Files \ xampp \ htdocs \ sys \ etraining \ models \ sys_model.php в строке 142', а второй получил ту же ошибку: s –

+0

Хм ... Я понимаю, почему вы получите это с первым, но со вторым я бы предположил, что библиотека CodeIgnitor лениво загружает результаты. Я удивлен. – kuujo

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(); 

} 

Контроллер: тот же, что и уха;

и с точки зрения использования его

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

Мы прошли через это (см. Комментарии к моему ответу). По-видимому, методы 'result()' и 'result_array() загружают * все * результаты в память, что вызывает ошибку ограничения памяти с большими наборами результатов. См. [Генерация результатов запроса] (http://ellislab.com/codeigniter/user-guide/database/results.html) из документации CodeIgnitor. _ Эта функция возвращает результат запроса как массив объектов ..._ (а не итератор, который, на мой взгляд, должен). В этой структуре может быть лучший способ сделать это без проблем с памятью, я просто не знаком с CodeIgnitor. – kuujo

Смежные вопросы