2016-09-27 65 views
0

我有MySql數據庫,其中包含有關保存的文件和文件夾結構的信息。PHP MySql循環遍歷所有子代碼

有一個名爲「Folder」的表,其中包含「ID」,「Name」和「ParentID」。

基本上我需要做的是循環所有的子文件夾和子文件夾的子文件夾,並收集他們的ID,直到沒有更多的子文件夾離開。

目前我有PHP腳本,其中包含函數GetChilds($parentId)。 函數運行SQL查詢,收集所有文件夾ID的ParentID爲$parentID。之後,有foreach循環再次使用找到的ID調用相同的函數。

這個按預期工作,但其速度非常慢,而且我讀過的內容不推薦在PHP中的循環內部進行查詢。

所以我正在尋找的是另一種方式來使用SQL腳本或PHP更有效地執行相同的功能。

編輯:

這裏是我的代碼:

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'字段來解決類似的問題,例如文件夾測試中的文件foo.jpg將具有'test/foo.jpg'路徑。類似你的描述的查詢是遞歸的,但有一條路徑變得微不足道。對於文件夾'test'的所有子文件夾和文件:'WHERE path LIKE'test /%'ORDER BY path ASC' – jedifans

回答

0

如果您使用的是PHP,一個備選方案(以及許多其他)是批量查詢保存到一個數組。然後你可以儘可能多地操縱它。 速度要快得多。

+0

問題是:在從數據庫獲取第一個結果之前,他不知道哪個parent_id將不得不使用該查詢。也許一個好的選擇是使用準備好的語句,但我懷疑它會提高你的性能,因爲最大的時間可能在連接到數據庫服務器而不是運行自己的查詢。 – Melanef

+0

也許如果他顯示了一段代碼,它會更清晰 – TSR