2012-08-17 2 views
1

재귀 함수가있는 다중 레벨 메뉴에서 범주를 삭제하고 싶습니다. 더 신중하게 상황을 이해하기 위해서, MySQL의 테이블 구조를 먼저 살펴 수 있습니다 여기,다단계 메뉴 항목 삭제 재귀 함수

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 스크립트를 작성했습니다가되어 검색 할 때 그것은 다음과 같습니다

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, 
); 

=>

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의 접속 대상물이며 $idid이다.

1 | 0 | 1 | root1 |과 같이 하나의 행 (카테고리에 하위, 하위 카테고리가없는 경우)을 삭제할 때 잘 작동하지만 예를 들어 4 | 2 | 1 | sub of "sub of root1"을 삭제하려는 경우 카테고리를 삭제하지 않습니다. 하위 카테고리가 있습니다. 어떤 아이디어가이 문제를 해결하는 방법? 덕분에

+0

계단식 삭제가있는 해당 테이블에서 외래 키 관계가있는 경우 mysql이 하위 레코드 삭제를 처리합니다. –

+0

@MarcB 외래 키를 사용하고 있지 않습니다. – tnanoba

+0

@MarcB 이것은 정확히 제가이 작업을하려고하는 테이블입니다. – tnanoba

답변

1

삭제는 오직 else에만 있으므로 부모 카테고리는 절대 삭제하지 마십시오. 나는 당신이 다음과 같은 것을 필요로한다고 생각한다 :

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

그런데 ID 입력을 피해야한다.

+0

당신이 옳았습니다. :) – tnanoba