2016-09-27 7 views
0

私は保存されたファイルとフォルダの構造に関する情報を含むMySqlデータベースを持っています。PHP MySqlはすべての子IDをループします

「ID」、「名前」、「親のID」を含む「フォルダ」という表があります。

基本的には、すべての子フォルダと子フォルダの子フォルダをループして、子フォルダがなくなるまでIDを収集します。

現在、私はGetChilds($parentId)と呼ばれる機能を含むPHPスクリプトを持っています。 機能は、ParentIDが$parentIDのすべてのフォルダIDを収集するSQLクエリを実行します。その後、見つかったIDで同じ機能を呼び出すループがforeachループです。

これは期待どおり動作しますが、非常に遅く、私が読んだことはPHPのループ内にクエリを置くことは推奨されません。

私が探しているのは、SQLスクリプトやPHPを使用してより効率的な方法で同じ機能を実行する別の方法です。

EDIT:

ここでは私のコードです:

private function FetchData($query, $query_params, $dbConnection) 
{ 
    try 
    { 
     $stmt = $dbConnection->prepare($query); 

     if(count($query_params) > 0) 
      $stmt->execute($query_params); 
     else 
      $stmt->execute(); 

      return $stmt->fetchAll(); 
    } 
    catch(PDOException $e) 
    { 
     //Handle error 
    } 
} 

private function GetChilds($parentId, $connection) 
{ 
    $childFolders = $this->FetchData("select idFolder from Folder where ParentId = :parentId", array(":parentId" => $parentId), $connection); 

    //Save ID's 

    foreach($childFolders as $child) 
    { 
     $this->GetChilds($child['idFolder'], $connection); 
    } 
} 
+1

コードをお知らせください。 – cmorrissey

+0

私はこの投稿をdownvotedする必要はありませんが、コードの舐めが表示されていないとこの投稿upvotedされていません。何? –

+1

私は、同様の問題を、各エントリに格納された 'path'フィールドを持つことで解決しました。例えば、フォルダtest内のファイルfoo.jpgはパス' test/foo.jpg'を持ちます。あなたの説明のようなクエリは再帰的ですが、パスがあれば簡単になります。 'test'フォルダのすべてのサブフォルダとファイル:' WHERE path LIKE 'test /%' ORDER BY path ASC' – jedifans

答えて

0

あなたがPHPを使用している場合は、(他の多くの間で)一つの代替アレイに一括クエリを保存することです。それで、あなたはあなたが望むだけ操作することができます。 これはずっと高速です。

+0

問題:データベースから最初の結果を取得する前に、どのparent_idにクエリを使用する必要があるのか​​がわかりません。おそらく良い選択肢は、準備されたステートメントを使用するだろうが、私はそれが十分なあなたのパフォーマンスを向上させることは疑いの余地が最大時間は、クエリを実行する代わりにデータベースサーバーに接続することがあります。 – Melanef

+0

コードを表示すると、すべての – TSR

関連する問題