2010-10-21 69 views
8

MySQL của tôi trông như thế này: (tên của bảng là loại)PHP hàm đệ quy để xóa tất cả các con các nút nguyên nhân stackoverflow

'id', 'content', 'parent' 

nơi:

  • id = id của thể loại
  • content = một số văn-chúng-dont-chăm sóc về
  • mẹ = id của phụ huynh loại

này là những gì tôi đang cố gắng ngay bây giờ:

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'"); 
} 

nào đối với một số công việc lý do doesnt và tai nạn .. Bất kỳ ý tưởng những gì tôi đang làm sai?

Trả lời

11

Vấn đề là trong các cuộc gọi đệ quy:

remrecurs($curitem['parent']); 

nó nên là:

remrecurs($curitem['id']); 

Tại sao?

Mục tiêu của bạn là xóa hàng có id đã cho. Trước tiên, bạn kiểm tra xem nó có con không. Nếu có, bạn cần phải gọi xóa đệ quy trên từng số trẻ em không còn lại trên phụ huynh. Bạn đang gọi chức năng đệ quy trên phụ huynh một lần nữa .. điều này dẫn đến các cuộc gọi đệ quy vô hạn, bạn đập vỡ ngăn xếp và sụp đổ.

+0

cảm ơn bạn! hoạt động tốt ngay bây giờ - Tôi ghét nó khi những thứ như thế làm chậm tôi xuống - tôi đoán người ta cần một quan điểm khác về một số thứ :) – DreamWave

5

Hoặc, bạn có thể để cơ sở dữ liệu xử lý việc này. Trong MySQL, InnoDB ON DELETE CASCADE sẽ tự động thực hiện việc này.

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 

gốc các nút nên có NULL như cha mẹ (không 0 như một số người dường như sử dụng trên bảng Adjancency trong danh sách).

Các vấn đề liên quan