2012-03-21 6 views
0

У меня есть ниже рекурсивная функция в моей модели с CI, работая. В моем контроллере, мне нужно проверить, если функция работала правильно, как:Как вернуть true с рекурсивной функцией

if($this->my_model->level_corrector($id_page,$level)) echo 'Levels are corrected'; 

Но как функция всегда возвращает ложь (до конца рекурсии), я не мог понять, как достичь своей цели.

function level_corrector($id_page_of_parent,$level_of_parent) 
    { 
    $sql = " 
    SELECT id_page, id_parent, level 
    FROM page 
    WHERE id_parent = $id_page_of_parent"; 
    $query = $this->db->query($sql); 

    if($query->num_rows() > 0) 
    { 
     $result = $query->result_array();   
     foreach ($result as $r) 
     { 
     $data = array('level'=>$level_of_parent+1); 
     $this->db->where('id_page', $r['id_page']); 
     if($this->db->update('page', $data)) 
     { 
      $this->level_corrector($r['id_page'],$level_of_parent+1); 
     } 
     else 
     { 
      // let me handle it what to do 
      return false; 
     } 
     } 
    } 
    else 
    { // again let me handle it to log a message or sth 
     return false; // (2) 
    } 
    return true; // (3) means it all gone right, so I can move on. 
    } 
+3

Осторожнее с этой строки: 'если ($ this-> db-> обновление (» page ', $ data)); '. Либо удалите условное, либо удалите точку с запятой :) – Cam

+1

@Cam, я вызываю эту функцию внутри '$ this-> db-> trans_start()'. Поэтому я думаю, что мне просто нужно получить обратную связь от функции для 3 возможных условий. если ошибка, верните false; если, запрос пустой в последнем цикле, верните false, чтобы остановить рекурсию; если не все из них означают, что все пошло правильно, верните истину. Дайте мне знать, если я ошибаюсь в любом аспекте. –

ответ

1

Вы должны сделать две вещи:

  • Если есть ошибка, возвращение ложным. В противном случае, в конце функции, верните true по умолчанию

  • Если при вызове функции рекурсивно произошла ошибка, верните значение false.

Изменить: на основе ваших ответов на мои вопросы в комментариях, что вы хотите, это:

function level_corrector($id_page_of_parent,$level_of_parent) 
{ 
    $sql = " 
    SELECT id_page, id_parent, level 
    FROM page 
    WHERE id_parent = $id_page_of_parent"; 
    $query = $this->db->query($sql); 

    if($query->num_rows() > 0) 
    { 
    $result = $query->result_array();   
    foreach ($result as $r) 
    { 
     $data = array('level'=>$level_of_parent+1); 
     $this->db->where('id_page', $r['id_page']); 
     if($this->db->update('page', $data)) 
     { 
     // no error. return error code from recursive call 
     return $this->level_corrector($r['id_page'],$level_of_parent+1); 
     } 
     else 
     { 
     // error occured 
     return false; 
     } 
    } 
    } 

    // $query->num_rows <= 0. This is not an error, so return true: 
    return true; 
} 
+0

Добавил комментарий выше, я думаю, говоря то же самое. Можете ли вы продемонстрировать это, когда я начал видеть знаки $ везде. –

+0

@yahyaE: Можете ли вы точно указать условие внутри своей функции, которое должно приводить к возврату «return false» вплоть до исходного вызова? – Cam

+0

Я обновил вопрос. Я думаю, что это все возможные сцены для обработки этой функции. Это ответ на вопрос yr? Тем не менее, по-прежнему кажется, что третье возвращение верно в неправильном месте из-за рекурсии. –

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