2012-08-17 36 views
1

我想從遞歸函數的多級菜單中刪除類別。爲了更仔細瞭解情況,讓我們在MySQL表結構先來看看多級菜單項刪除遞歸函數

CREATE TABLE IF NOT EXISTS menu(
id INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
p_id INT(5), 
sort_id INT(5) NOT NULL, 
title VARCHAR(50) CHARSET utf8 COLLATE 'utf8_unicode_ci' NOT NULL, 
); 

它看起來是這樣的,當它被檢索

id | p_id | sort_id | title | 

    1 | 0 |  1  | root1 | 
    2 | 1 |  1  | sub of root1 
    3 | 0 |  2  | root2 | 
    4 | 2 |  1  | sub of "sub of root1" 
    ... | ... | ... | .... 
etc ... 

我寫PHP腳本進行刪除類別,這=>

function del_cat($connection,$id){ 
     if (!$connection->connect_errno){ 
     if ($connection->set_charset("utf8")){ 
      if ($r = $connection->query("SELECT id FROM menu WHERE p_id=" . $id . "")){ 
      if ($r->num_rows>0){ 
       while ($row = $r->fetch_assoc()){ 
       del_cat($connection,$row['id']); 
       } 
      } else { 
       $connection->query("DELETE FROM menu WHERE id=" . $id . ""); 
      } 
      $r->free(); 
      } 
     } 
     } 
    } 

$connection變量是一個剛MySQL連接對象,並且$id是在表id

它工作得很好,當我刪除一行(我的意思是當類別沒有子,子類別),例如1 | 0 | 1 | root1 |,但是當我想刪除例如4 | 2 | 1 | sub of "sub of root1"它不會刪除類別與子類別。任何想法如何解決這個問題?謝謝

+0

如果你在該表中有級聯刪除的外鍵關係,mysql會負責爲你刪除子記錄。 – 2012-08-17 16:02:01

+0

@MarcB我不使用外鍵 – tnanoba 2012-08-17 16:02:42

+0

@MarcB這是完全相同的表,我試圖使這個行動 – tnanoba 2012-08-17 16:03:26

回答

1

該刪除僅在else,所以你從來沒有真正刪除父類別。我認爲你需要這樣的東西:

del_cat($connection, $row['id']); 
    $connection->query("DELETE ..."); 
} else { 
    $connection->query("DELETE ..."); 

順便說一句,你應該逃避ID輸入。

+0

你是對的,謝謝:) – tnanoba 2012-08-17 16:08:44