2012-03-21 11 views
0

以下の再帰関数がCIで動作しています。再帰関数でtrueを返す方法

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

しかし関数として常に(再帰を終了する)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)) 
     { 
      $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->更新(」ページ '、$データ)); '。条件付きを削除するか、セミコロンを削除してください:) – Cam

+1

@Cam、私は '$ this-> db-> trans_start()'の中でこの関数を呼び出しています。だから私は3つの条件のために関数からフィードバックを得る必要があると思う。エラーの場合はfalseを返します。最後のループでクエリが空の場合はfalseを返し、再帰を停止します。それらのすべてが正しくなくなったというわけではないなら、真実に戻ってください。私が何らかの面で間違っているかどうかを教えてください。 –

答えて

1

は、次の2つのことを実行する必要があります。エラーが発生した場合

  • は、falseを返します。それ以外の場合は、関数の最後に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の質問の答えですか?しかし、まだ3回目の復帰が再帰のために間違った場所にあるようです。 –