2016-11-01 3 views
1

geting 500ループ内で再帰が呼び出されたときに内部サーバーエラーが発生しました!私は500エラーを取得するよりも。再帰ルーピング500内部サーバーエラー

public function getRecrusiveReferals($userID) 
    { 
     $sql = "SELECT user_id, username, refered_by FROM users WHERE refered_by = ?"; 

     $referals = $this->db->query($sql, $userID); 

     $list = $this->buildReferalsTree($referals->result_array()); 

     return $list; 
    } 


    private function buildReferalsTree(array $referals, $parentID = 0) 
    { 
     $data = array(); 

     foreach ($referals as $item) 
     { 
      if($item['refered_by']) 
      { 
       $children = $this->buildReferalsTree($referals, $parentID); 

       if($children) { 
        $item['children'] = array(); 
       } 

      } 
      $data[] = $item; 

     } 

     return $data; 
    } 
+0

ログには何が表示されますか?それはサーバーエラーです –

+0

ログを見ることはできません! – Ivan

+0

は、エラー報告を使用してキャッチして表示します。 –

答えて

0

Jay Rajput氏によると、そこには無限の再帰があります。私は、コール

$children = $this->buildReferalsTree($referals, $parentID); 

$referalsが、$itemの「refered_by」要素に基づいて構築された別の配列を、ない渡すべきだと思います。 したがって、基本的に新しい$referalsを抽出する別のプライベートメソッドを作成する必要があります。 このコードはerrorproneではなく、2つのアイテムが互いに参照しても無限再帰で終了することに注意する必要があります。

あなたが達成しようとしていることは、特にリレーショナルデータベースを使用している場合は非常に難しいことです。あなたは間違いなくリレーショナルデータベースの 'ネストセット'の概念を見たいと思います。

0

あなたのコード無限再帰ループは再帰が上限に達したときにスクリプトがPHPによって殺される原因となっています

は私のコードをチェックしてください:私は良い仕事ループすべてにrecusiveを削除

再帰の深さのためにPHPによって設定されます。このコードは、引数の同じセットで何度も何度も呼ばれ

:終了し

$children = $this->buildReferalsTree($referals, $parentID); 

再帰関数の場合、再帰が終了したとき、私はそれを見ていない定義する必要があります条件があるはずですあなたのコード。

0

あなたは新しい引数を親引数に渡したいと思います。何度も何度も繰り返します。このように:

$children = $this->buildReferalsTree($referals, $item['user_id']); 

その後のループであなたも親IDでフィルタリングする必要があります。

if($item['refered_by'] = $parentID) 

...あなただけのそのIDの「子」である項目をリンクするようにします。

さらに、あなたのテーブルの唯一の特定referred_byサブセットを選択することからも、PARENTIDを指定する必要があり、あなたの元のコールは:あなただけのレコードを選択したので

$list = $this->buildReferalsTree($referals->result_array(), $userID); 

、これは、興味のない結果が得られます同じreferred_byの値であるため、ツリーを構築することはあまりありません。代わりに、そのテーブルからすべてのレコードを選択してから$userIDbuildReferalsTreeに引き渡して、参照チェーンに従うために利用可能な他のすべてのレコードを取得することができます。だからここにすべてのレコードを選択するためのコードは次のとおりです。

$sql = "SELECT user_id, username, refered_by FROM users"; 
$referals = $this->db->query($sql); 

は最後に、エラーは、現在$item['children']に空の配列を割り当てる内部ifブロックでもあります。代わりに、このように、再帰呼び出しから結果を割り当てる必要があります。

if($children) { 
    $item['children'] = $children; 
} 

すべて一緒にこれを取ると、コードは次のようになります。

public function getRecrusiveReferals($userID) { 
    $sql = "SELECT user_id, username, refered_by FROM users"; 
    $referals = $this->db->query($sql); 
    $list = $this->buildReferalsTree($referals->result_array(), $userID); 
    return $list; 
} 

private function buildReferalsTree(array $referals, $parentID = 0) { 
    $data = array(); 
    foreach ($referals as $item) { 
     if ($item['refered_by'] == $parentID) { 
      $children = $this->buildReferalsTree($referals, $item['user_id']); 
      if($children) { 
       $item['children'] = $children; 
      } 
     } 
     $data[] = $item; 
    } 
    return $data; 
} 

データ場合、これはまだ無限再帰を与えることができます紹介の面でサイクルがあります。紹介の意味を考えると、これは当てはまりません。

+0

リピートをありがとう! '$ parentID'を' $ item ['refere_by'] ' – Ivan

+0

@Ivanに変更すると、何らかのエラーが出ます。 'refered_by'の中身は何ですか? – Mikz

+0

内部は '2066'整数 – Ivan

関連する問題