php
  • mysql
  • function
  • recursion
  • stack-overflow
  • 2010-10-21 56 views 8 likes 
    8

    我的MySQL是這樣的:(該表的名稱是類別)PHP遞歸函數刪除所有子節點的原因計算器

    'id', 'content', 'parent' 
    

    其中:

    • ID =類別的ID
    • 內容= 一些文本 - 我們 - 不要 - 護理 - 約
    • 父=父 類別
    • 的ID

    這就是我想現在:

    function remrecurs($id) { 
        $qlist=mysql_query("SELECT * FROM category WHERE parent='$id'"); 
        if (mysql_num_rows($qlist)>0) { 
         while($curitem=mysql_fetch_array($qlist)) { 
           remrecurs($curitem['parent']); 
         } 
        } 
        mysql_query("DELETE FROM category WHERE id='$id'"); 
    } 
    

    由於某種原因不工作和崩潰.. 任何想法,我做錯了嗎?

    回答

    11

    的問題是在遞歸調用:

    remrecurs($curitem['parent']); 
    

    它應該是:

    remrecurs($curitem['id']); 
    

    爲什麼?

    您的目標是刪除給定ID的行。首先檢查是否有任何孩子。如果是的話,你需要調用遞歸刪除兒童的每一個都不在父母身上。你再次在父對象上遞歸地調用函數。這會導致無限遞歸調用,你會崩潰堆棧並崩潰。

    +0

    謝謝!現在工作的很好 - 我討厭它,當這樣的事情讓我放慢腳步 - 我想對某些事情需要另一種觀點:) – DreamWave 2010-10-21 09:23:06

    5

    另外,你可以讓數據庫處理這個。在MySQL中,InnoDB ON DELETE CASCADE將自動執行此操作。

    CREATE TABLE category (
        id INT PRIMARY KEY AUTO_INCREMENT, 
        parent_id INT NULL, 
        FOREIGN KEY (parent_id) REFERENCES category (id) ON DELETE CASCADE 
    ) ENGINE=InnoDB 
    

    根節點應該有NULL父(不0一些人似乎聘請Adjancency名單表)。

    相關問題