2010-10-21 13 views
8

मेरे MySQL इस तरह दिखता है:पीएचपी पुनरावर्ती सभी बच्चे को नष्ट करने के समारोह नोड का कारण बनता है stackoverflow

'id', 'content', 'parent' 

(तालिका के नाम श्रेणी है) जहाँ:

  • आईडी = श्रेणी का आईडी
  • सामग्री = कुछ-पाठ-हम-न-केयर-के बारे में
  • माता पिता = माता पिता श्रेणी
  • +०१२३५१६४१०६ की आईडी

यह है कि क्या मैं अभी कोशिश कर रहा हूँ है:

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']); 

क्यों?

आपका उद्देश्य दिए गए आईडी के साथ पंक्ति को हटाना है। सबसे पहले आप यह देखने के लिए जांचें कि इसमें कोई बच्चा है या नहीं। यदि हां, तो आपको प्रत्येक बच्चों पर माता-पिता पर दोबारा रिकर्सिव डिलीट को कॉल करने की आवश्यकता है। आप फिर से पैरेंट पर फ़ंक्शन को कॉल कर रहे हैं..यह अनंत रिकर्सिव कॉल की ओर जाता है, तो आप स्टैक और क्रैश को फेंक देते हैं।

+0

धन्यवाद! अब बहुत अच्छा काम करता है - मुझे इससे नफरत है जब इस तरह की चीजें मुझे धीमा करती हैं - मुझे लगता है कि किसी चीज़ पर किसी और को देखने की ज़रूरत है :) – DreamWave

5

वैकल्पिक रूप से, आप डेटाबेस को इसे संभालने दे सकते हैं। MySQL में, InnoDB ON DELETE CASCADE स्वचालित रूप से ऐसा करेगा। (जैसा कि कुछ लोगों को Adjancency सूची टेबल पर काम ही नहीं 0)

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 अभिभावक के रूप में होना चाहिए।

संबंधित मुद्दे