Rekursives Löschen von DB Inhalten mittels Schleife

xtramen01

Erfahrenes Mitglied
Hallo,

ich habe eine Navigation gebastelt mittels eines Tutorials von hier.
Nun geht es mir darum eine Kategorie und sämtliche Unterkategorien zu löschen.

Dies klappt auch eigentlich. Allerdings sind die möglichen Unterkategorien mit meinem Code begrenzt und vielleicht gibt es ja eine Idee zu einer sauberen Lösung welche keine Begrenzung der Unterkategorien erfordert.

Momentan werden 5 Unterkategorien mitgelöscht:

PHP:
....... $del_sub_navi1 = function_dbQuery("select mid from menu WHERE parent_id ='".$_GET['cID']."'");

          while ($sub_navi1 = function_dbFetchArray($del_sub_navi1)) {
          $del_sub_navi2 = function_dbQuery("select mid from menu WHERE parent_id ='".$sub_navi1['mid']."'");
          function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi1['mid']."'");


          while ($sub_navi2 = function_dbFetchArray($del_sub_navi2)) {
          $del_sub_navi3 = function_dbQuery("select mid from menu WHERE parent_id ='".$sub_navi2['mid']."'");
          function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi2['mid']."'");


          while ($sub_navi3 = function_dbFetchArray($del_sub_navi3)) {
          $del_sub_navi4 = function_dbQuery("select mid from menu WHERE parent_id ='".$sub_navi3['mid']."'");
          function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi3['mid']."'");


          while ($sub_navi4 = function_dbFetchArray($del_sub_navi4)) {
          $del_sub_navi5 = function_dbQuery("select mid from menu WHERE parent_id ='".$sub_navi4['mid']."'");
          function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi4['mid']."'");

          while ($sub_navi5 = function_dbFetchArray($del_sub_navi5)) {
       // $del_sub_navi6 = function_dbQuery("select mid from menu WHERE parent_id ='".$sub_navi5['mid']."'");
          function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi5['mid']."'");

          }
          }
          }
          }
          }

		  function_dbQuery("delete from menu WHERE parent_id ='".$_GET['cID']."'");
		  function_dbQuery("delete from menu WHERE mid ='".$_GET['cID']."'");


          header('Location: hauptnavigation.php');........

Hoffe mir kann jemand helfen.
Meine Kentnise reichen leider nicht ganz aus .:-(

Gruss an alle!
 
Ich gebe dir keinen fertigen Code, sondern einen Denkansatz.
Du musst hier, wie in der Überschrift beschrieben rekursiv löschen, also so:
Code:
function delete_kat(id)
{
   Wenn (Hat die Kategorie Unterpunkte)
   dann 
   {
      delete_kat(mit den ganzen Kategorien, die Unterpunkte haben)
   }
   ansonsten
   {
      //Die Kategorie hat keine Unterpunkte, also nur Kategorie löschen
   }
}
 
Danke für den Tip.
Das Problem is nich die Bedingung zu setzen, sondern eher wie ich das in eine einfache Schleife unterbringe. Bzw. wie ich die jeweiligen Unterkategorien rausbekomme.

Hab es mal so versucht. Hier ist zwar wieder eine Begrenzung von 5 Unterkategorien drinne aber wenn ich das so lösen könnte, kann ich damit Leben.

Allerdings läuft die Schleife ins Endlose.

PHP:
  $count = 1;
           $count2 = 2;
           $begrenzung = 5;
  while($count < $begrenzung)
    {
          $sub_navi.$count = function_dbFetchArray($del_sub_navi.$count);
          $del_sub_navi.$count2 = function_dbQuery("select mid from menu WHERE parent_id ='".$sub_navi.$count['mid']."'");
          function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi.$count['mid']."'");
        
    $count++;
    $count2++;
    }

So müsste es doch gehen ?! Finde aber das Problem einfach nich.

Gruss
 
Zuletzt bearbeitet:
Ich habe mir deinen Code nicht genau angeguckt, aber ich schreibe dir mal eine Lösung hin:
PHP:
function delete_kat($id)
{
   $result = function_dbQuery("select mid from menu WHERE parent_id = ".$id);
   
   if (mysql_num_rows($result) >= 1)
   {
      //Einer oder mehr Datensätze, also alle löschen
      while ($row  = mysql_fetch_assoc($result))
      {
         delete_kat($row['mid']);
      }
   }
   else
   {
      function_dbQuery("delete from menu WHERE mid = ".$id);
   }
}

€dit: Ich habe versucht deinen Quelltext zu verstehen, aber davon bekomme ich Kopfschmerzen ;)
 
Zuletzt bearbeitet:
Hi Chumper,

erstmal danke für deine Mühe.
Ich komme der Lösung immer näher :-).

Leider ist es jetzt so, das zwar die "Kinder" eines Elternelements gelöscht werden aber sobald es "Kindeskinder" gibt werden auch nur diese gelöscht und sonst nix mehr.

1. Mutter (wird zum löschen angeklickt)
1.1 Kind (hier passiert nichts wenn die Mutter gelöscht wird...sollte aber auch weg sein)
1.1.1 Kindeskind (wird als einzigstes Element gelöscht)

Wie gesagt, eigentlich sollte das Kind UND das Kindeskind gelöscht werden.
Die Mutter bekomm ich scho weg ;-) aber mit den Kindern hab ich halt Probleme.

Und so funktioniert dein Code:

1. Mutter (wird zum Löschen angeklickt)
1.1 Kind (wird richtigerweise gelöscht)
1.2 Kind (wird richtigerweise gelöscht)
1.3 Kind (wird richtigerweise gelöscht)

Ich schaue auch nochmal wie ich das eventuell abändern kann, aber vielleicht geht es ja doch nicht so einfach wie ich mir das gedacht habe :-(

Gruss
 
Da war ein kleiner Fehler von mir drinne, sry, und zwar fehlt eine Zeile;)
Richtig muss es so lauten:

PHP:
function delete_kat($id)
{
   $result = function_dbQuery("select mid from menu WHERE parent_id = ".$id);
   
   if (mysql_num_rows($result) >= 1)
   {
      //Einer oder mehr Datensätze, also alle löschen
      while ($row  = mysql_fetch_assoc($result))
      {
         delete_kat($row['mid']);
      }
   }
   //Nachdem alle Kinder gelöscht wurden, nun auch diese Kategorie löschen
   function_dbQuery("delete from menu WHERE mid = ".$id);
}
 
Zuletzt bearbeitet:
Vielen Vielen dank!

Das funktioniert endlich!!

Allerdings kapier ich einfach nicht wie diese Funktion, die verschiedenen EInträge durchläuft und die parent_id jedes Eintrages findet.
Genau das hab ich nämlich mit meinem Code, den ich als erstes gepostet habe, gemacht.
Ich bin jede Kategorie einzeln durchlaufen und musste mühselig jeweils die mid des Elternelemtes rausfinden, dann Löschen.

Das es so simpel ist hätt ich nich gedacht.

Warum bekommt man mit einer einzigen Abfrage:
PHP:
$result = function_dbQuery("select mid from menu WHERE parent_id = ".$id);
Alle zusammenhängenden Ergebnisse geliefert. Woher weis die Abfrage denn welche Elemente zusammenhängen.
Genau das versteh ich nich ganz.

Naja werd mich versuchen schlau zu machen.

Danke, hat mir sehr sehr geholfen.

Viele Grüße



Werde versuchen dahinter zu kommen
 
Eigentlich ist es ganz einfach:
PHP:
function delete_kat($id)
{
   $result = function_dbQuery("select mid from menu WHERE parent_id = ".$id);
   
   if (mysql_num_rows($result) >= 1)
   {
      //Einer oder mehr Datensätze, also alle löschen
      while ($row  = mysql_fetch_assoc($result))
      {
         delete_kat($row['mid']);
      }
   }
   //Nachdem alle Kinder gelöscht wurden, nun auch diese Kategorie löschen
   function_dbQuery("delete from menu WHERE mid = ".$id);
}

Die Funktion bekommt die ID der zu löschenden Kategorie.
Nun wird zuerst geguckt, ob es noch weitere Unterkategorien gibt, eben mit Hilfe dieser Abfrage.
Das Ergebnis sind alle Unterkategorien, die diese Kategorie als Oberkategorie haben.
Nun können wir nicht einfach die Kategorie löschen, da die Kinder ja ewig in der Datenbank bleiben, also rufen wir die Ganze Funktion nochmal auf für jede Unterkategorie der zu löschenden Kategorie.

Und dann geht das alles wieder von vorne los. Es wird nur der Speicher des Rechners kurzfristig beansprucht.

Um mehr über Rekursion zu erfahren, empfehle ich dir für den Kurzeinstieg das hier und anschließend den Wikipediaartikel
 
Zurück