Unterpunkte beim Löschen von Elternelementen einbeziehen.

xtratz

Gesperrt
Hallo Leute,

habe folgendes Problem.
Ich habe eine dynamische Navigation mit beliebig vielen Untermenüs.

Alles funktioniert Prima.

Nur wie bekomme ich es hin das beim LÖschen eines Navigationspunktes der z.b. so verschachtelt ist:

1. Hauptpunkt
1_1. Unterpunkt von Hauptpunkt
1_1_1 Unterpunkt von Unterpunkt

Alle Unterpunkte automatisch mit gelöscht werden.
Ich fionde keine Lösung. Für mich also unmöglich.
Aber irgendwie muss es doch gehen.

DB Struktur sieht so aus:

PHP:
mid        eintrag          parent_id     
-----     ----------     -------------
31         1_1            29
29         1              0
32         1_1_1          31
--------------------------------------


Das löschen von einem Eintrag ist wie gesagt kein Problem.

PHP:
function_dbQuery("delete from menu where mid = '" . $_GET['cID'] . "'");

Ich wäre sehr dankbar wenn mir einer helfen könnte.

Gruss
 
Zuletzt bearbeitet:
Probier mal Folgendes:
PHP:
"DELETE FROM menu WHERE mid = '" . $_GET['cID'] . "' OR mid LIKE '".$_GET['cID']."\_%'"
 
Danke Dir, aber geht leider leider auch nicht.
Wird trotzdem nur der Hauptnavigationspunkt gelöscht.

Noch jemand einen Vorschlag?

Gruss
 
Tach!
Such mal nach Nested-Sets. Erstellen solch einer Verschachtelung ist recht einfach, aber die Pflege:rolleyes:

Hab mich mal damit beschäftigt, aber nie zuende gebracht.
 
Danke aber die Struktur jetzt zu ändern geht leider nicht mehr.
Müsste ja alles komplett ändern dann.

Geht das nicht auch so irgendwie?
Is doch ne ganz normale verschachtelte Navigation.

Vielleicht könnte ich noch eine relevante Info in die Tabelle also den Unterpunkten mitgeben, die wichtig wäre um festzustellen welche Elternteile dazu gehören?! Mir fällt momentan leider nix mehr ein ;-(

Gruss
 
Zuletzt bearbeitet:
Habs jetzt mal so versucht.
Ich suche erst einen Eintrag der die parent_id vom ausgewählten Punkt hat. Also quasi ein Child.
Nun habe ich die mid des ersten Childs, und somit auch das Kindeskind.

Bis hierher gehts eigentlich.
Da meine Navigation aber mehr als 3 Ebenen, sprich unendlich viele zulässt, ist das nicht ganz optimal.

Gibt es denn keine Möglichkeit das man das mit beliebig vielen Ebenen machen kann?

Ich bin leider am Ende meines Wissens.

PHP:
 $r_sub_navi = function_dbQuery("select mid from menu WHERE parent_id ='".$_GET['cID']."'");
         
         while ($sub_navi = function_dbFetchArray($r_sub_navi)) {
			$r_del_sub_sub_navi =  function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi['mid']."'");
		}
		
		$r_del_sub_navi = function_dbQuery("delete from menu WHERE parent_id ='".$_GET['cID']."'");
		$r_del_navi = function_dbQuery("delete from menu WHERE mid ='".$_GET['cID']."'");
 
Zuletzt bearbeitet:
hab ich schon gelesen Danke.
Ich steig da ehrlich gesagt nich richtig durch.

Ich habe da ein Codebeispiel gefunden für rekursives Löschen, hier ausm Forum.
Das müsste eigentlich genau auf mein Beispiel anwendbar sein.

Ich bekomme es aber leider leider nicht hin.

Ich frage mich warum meine Schleife nur 2 Durchläufe macht.

Eigentlich sollte Sie ja durchlaufen bis keine Daten mehr zutreffen.

Also mit der ersten Abfrage stelle bekomme ich das erste Child heraus:

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

Und mit der Schleife bekomme ich das Kindeskind heraus. Alles Prima.

PHP:
  while ($sub_navi = function_dbFetchArray($r_sub_navi)) {
			function_dbQuery("delete from menu WHERE parent_id ='".$sub_navi['mid']."'");

		}

Aber die Schleife läuft einfach nicht durch.

Das müsste ja wiederholt werden bis es keine Einträge mehr gibt.

Der Code den ich gefunden habe ist folgender.
Ist aber nur ein dummycode.

Ich kann das leider nicht so recht anwenden. Kann mir den niemand weiterhelfen bitte?
Ich mach sicherlich irgendwo nur einen kleinen Fehler und seh ihn nicht.

PHP:
funktion loescheKategorieRekursiv( $kategoriename )
{
    $ergebnis = query("SELECT kategoriename FROM kategorien WHERE vater = $kategoriename");
    solange($ergebnis als $kategorie) {
        loescheKategorieRekursiv($kategorie);
    }
    query("DELETE FROM kategorien WHERE kategoriename = $kategoriename");
}
 
Hallo,

das was du möchtest, lässt sich mit kaskadierenden Löschungen realisieren
Zuerst musst du die Datenbank dafür anpassen, falls nicht schon geschehen:

1. Primärschlüssel und Fremdschlüssel anlegen:
SQL:
ALTER TABLE menu 
  ADD CONSTRAINT pk_menu_id 
    PRIMARY KEY (mid);

ALTER TABLE menu 
  ADD CONSTRAINT fk_parent_id 
    FOREIGN KEY (parent_id) REFERENCES menu (mid) ON DELETE CASCADE;

Dazu ein Hinweis:
Ich hab in deiner Tabelle gesehn, dass du als "Root"-Element bei mid=29 eine "0" eingetragen hast. Damit würde das Anlegen des Foreign Keys nicht funktionieren.
Empfehlen würde ich Dir deswegen "NULL" anstelle von "0", da wir das erlauben. Ansonsten müsstest du ein Datensatz mit mid=0 haben.

Jetzt ist die Datenbank selbst dazu in der Lage (aufgrund der Constraints die wir ihr mitgeteilt haben), die Datensätze, die mit dem zu löschenden Datensatz über die Fremdschlüsselbeziehung verbunden sind automatisch mit zu löschen.

D.h. jetzt reicht tatsächlich ein einfaches:

SQL:
DELETE FROM menu WHERE mid=29

und die Datenbank erledigt den Rest.
 
Zuletzt bearbeitet:
Danke Dir erstmal für Deine Hilfe aber leider bekomme ich beim Eintragen einen SQL Fehler:

#1068 - Multiple primary key defined

Und wie muss ich dann meine DB Abfrage abändern zum Löschen der Einträge?
Und was muss in die zusätzlichen Spalten an Werte rein?

Sorry für die Fragen aber habe davon noch nie gehört.

Gruss
 

Neue Beiträge

Zurück