Ordner und dessen Unterordner löschen

EddieG

Erfahrenes Mitglied
hi,
ich speichere alle meine Ordner in einer Datenbank die tiefe bestimme ich mit level und den darüber liegenden mit Main Directory
als Beispiel:
Ordner1 Main directory==1(Ordner1)
|---Ordner1.1 Main dirctory==1(Ordner1)
| |---Ordner1.2 Main directory ==2(Ordner1.1)
...

Wenn ich nun Ordner1 löschen möchte sollten auch alle darunter liegenden gelöscht werden, wenn ich Ordner1.1 lösche alle ihm untergeordneten Ordner ich denke es ist klar was ich versuche.
Mein ansatz der leider nicht funktioniert. Er löscht immer nur die ersten beiden wenn es z.b. 100 levels gibt sind nur 1 und 2 gelöscht
PHP:
$sql_lvl = mysql_query("SELECT directoryID, Main_Directory FROM directory WHERE Main_Directory='".$deleteID."' ");
while($ddir = mysql_fetch_array($sql_lvl))
{
$sql_d_lvl = "DELETE FROM directory WHERE Main_directory='".$ddir["directoryID"]."' OR directoryID='".$ddir["Main_Directory"]."'";
$sql_d_lvll = "DELETE FROM directory WHERE Main_directory='".$ddir["directoryID"]."' OR directoryID='".$ddir["Main_Directory"]."'";
$sql_d_lvl_l = mysql_query($sql_d_lvl);
echo $sql_d_lvll."<br />";
}
 
Zuletzt bearbeitet:
Hey,

du könntest eine rekursive Funktion schreiben und die dann aufrufen.
Habe gerade geguckt, obs welche gibt.
Du musst nur bei google danach suchen.

Dann brauchst du ja nur "delete_ordner($ordner_name);"


bo
 
ja rekrusion ist mir klar das ich das benötige deshalb dachte ich ich mach es einfach in eine while im prinzip müsste er doch durch gehen.
er hat ja imprinzip den letzten Main Directory wert und mit dem überprüfe ich ob eine weitere directoryID diese im Feld Main Directory stehen hat.
 
Aso,

jetzt habe ich es erst verstanden,
du speicherst deien Odnerstruktur virtuell und willst dies nur in der MySQL löschen?

Wenn dir das klar ist, dies mit einer rekursiven Funktion zu lösen,
wo ist dein Problem oder dein Ansatz?


PS: Achte bitte auf die Grammatik!
 
JA,
ich speichere die Ordner nur virtuell in der Datenbank.
Ja mir ist klar was ich benötige, aber ich habe keine Ahnung wie ich es umsetzen soll,
indirekt brauche ich mehrere schleifen.
PHP:
$sql_lvl = mysql_query("SELECT directoryID, Main_Directory FROM directory WHERE Main_Directory='".$deleteID."' ");
while($ddir = mysql_fetch_array($sql_lvl))
{
$sql_l=mysql_query("SELECT * FROM directory WHERE Main_Directory='".$ddir["directoryID"]."'");
while($dddir = mysql_fetch_array($sql_l))
{
$sql_d_lvll = "DELETE FROM directory WHERE directoryID='".$ddir["Main_Directory"]."'";

}

}echo $sql_d_lvll."<br />";
Aber dieser Ansatz ist Falsch!
 
Aber dieser Ansatz ist Falsch!

Ja...ich dachte du weißt, was rekursive Funktionen sind?!
Dann benutze sie doch!

Wenn deine eonzelnen Ordner eine genaue ID haben, dann brauchst du ja nur:

PHP:
function lösche($id){

$SQL_select = "SELECT id FROm directory WHERE Main_Directory = "'.$id.'";"
$result_select = mysql_query($SQL_select);
while($row = mysql_fetch_object($result_select)){
mysql_query("DELETE * FROM directory WHERE id= $row-id");
lösche($row-id);
}
}

Dies ist ein kleiner Ansatz ;)
Gut möglich, dass dieses Script nicht funktioniert.

bo
 
hm hab die Namen bisschen geändern "löschen" kommt im Code glaube ich nicht so gut ;)
fetch_object geht das bei Integer?
Naja ich habe die Namen so geändert
PHP:
function loesche($id){
$SQL_select = "SELECT directoryID FROM directory WHERE Main_Directory = '".$id."'";
$result_select = mysql_query($SQL_select);
while($row = mysql_fetch_array($result_select))
{
$bla = "SELECT * FROM directory WHERE directoryID='".$row["directoryID"]."'";
echo $bla."<br />";
loesche($row["directoryID"]);
}
} 
loesche($deleteID);
Ich bedanke mich für den Ansatz, jedoch ist das eine Endlosschleife...
SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE directoryID='1'SELECT * FROM directory WHERE
...
 
War ja nur nen Ansatz in wenigen Minuten hingeklatscht ;)

Du musst es jetzt nur mit dem erneuten Aufruf von loeschen() verbessern!
Dann solte es ja funktionieren ;)

bo

EDIT: Aso und du müsstest die erste sql anpassen
 
Zuletzt bearbeitet von einem Moderator:
Ne es war mein Fehler sorry war zu voreilig ;)
es Lag an der Select ausgabe, da hat es die loeschen Funktion nicht neu aufgerufen.
Es klappt aber nun.
Man muss jedoch den Root Ordner seperat löschen, werde mich auf jedenfall noch weiter mit der funktion beschäftigen, schwer zu verstehen ist Sie ja nicht und vielleicht kann ich dann auch noch den Root mit löschen und muss Ihn nicht seperat noch einmal aufrufen.
PHP:
function loesche($id){
$SQL_select = "SELECT directoryID FROM directory WHERE Main_Directory = '".$id."'";
$result_select = mysql_query($SQL_select);
while($row = mysql_fetch_object($result_select))
{
mysql_query("DELETE FROM directory WHERE directoryID='".$row->directoryID."'");

loesche($row->directoryID);
} 

} 
loesche($deleteID);
mysql_query("DELETE FROM directory WHERE directoryID='".$deleteID."'");
 
PHP:
function loesche($id){
$SQL_select = "SELECT directoryID FROM directory WHERE Main_Directory = '".$id."'";
$result_select = mysql_query($SQL_select);

while($row = mysql_fetch_object($result_select))
{
mysql_query("DELETE FROM directory WHERE directoryID='".$row->directoryID."'");

loesche($row->directoryID);
} 



$SQL_delete = "DELETE * FROM directory WHERE directoryID  = '".$id."'";
mysql_query($SQL_delete);

}

Bitte ;)
Thema dann bitte schließen.

bo


edit: so sollte es stimmer oder :P?
 
Zuletzt bearbeitet von einem Moderator:
Zurück