Problem mit einem Löschenscript

ruNN0r

Erfahrenes Mitglied
hi,
ich arbeite gerade an einem Uploadtool und irgendwie bekomme ich mein Löschenscript nicht hin!

Erstmal habe ich 2 datenbanktabellen.
Eine für die Ordner:
folder.jpg
Eine für die Dateien:
files.jpg

Die ordner können verschachtelt werden. id_folder ist der Premiärkey und folder_id in welchem ordner sich dieser Ordner befindet

Bei den Dateien ist es so dass id_folder der Ordner ist wo sich die Datei befindet. Alle mit Betreff sind Kathegorien und die ohne sind die Dateien dazu! (siehe zuordnung)

Nun will ich mit einem Klick den Hauptordner löschen und alle Unterordner und deren Dateien sollen auch verschwinden! Also "F1" ist der Oberste Ordner mit der ID 1
die anderen sind Unterordner.

Nun zu meinem Script. Dazu will ich nicht mehr viel sagen denn die Bemerkungen sprechen für sich denke ich mal.
Nur eines noch: der $count soll später verschwinden den habe ich nur drin weil das script sonst unendlich laufen würde da es ja nicht funktioniert ^^
Resultat wenn ich es ausführe: Der Ordner F1 wird gelöscht der rest bleibt!
Wenn das script gestartet wird steht in $del eine 1 also der Ordner "F1"

Hier das script:
PHP:
if(isset($del)){
    $i=1;
    $count=1;
    //Arrays
    $del_folder=array(); //Löschenarray der Ordner
    $folder=array();  //Verlaufsarray
    $del_file=array(); //Löschenarray der Dateien

    $folder[]=$del; //Verlaufsarray füllen

    while($i>0){
        //Durchgang 1: Ersten Ordner in Löschenarray
        //Durchgang 2: Ordner des Verlaufsarray in den Löschenarray
        foreach($folder as $fol1){
            $del_folder[]=$fol1;
        }

        //Durchgang 1: Kathegorien und deren Dateien, vom ersten Ordner in den Löschenarray
        //Durchgang 2: Kathegorien und deren Dateien, aus dem Verlaufsarray in den Löschenarray
        foreach($folder as $fol2){
            $anfrage_fi1=mysql_query("SELECT * FROM $_db_files WHERE id_folder='$fol2'");
            while($row_fi1=mysql_fetch_array($anfrage_fi1)){
                $del_file[]=$row_fi1['id_file'];

                $anfrage_fi2=mysql_query("SELECT * FROM $_db_files WHERE zuordnung='".$row_fi1['id_file']."'");
                while($row_fi2=mysql_fetch_array($anfrage_fi2)){
                    $del_file[]=$row_fi2['id_file'];
               }
            }
        }

        //Durchgang 1: Verlaufsarray leeren und die Unterordner des ersten Ordners in den Verlaufarray
        //Durchgang 2: Verlaufsarray leeren und weitere Unterordner in den Verlaufsarray legen
        $folder2=$folder;
        $folder=array();
        foreach($folder2 as $fol1){
            //$folder=array();
            $anfrage_fo3=mysql_query("SELECT * FROM $_db_folder WHERE folder_id='$fol3'");
            while($row_fo3=mysql_fetch_array($anfrage_fo3)){
                $folder[]=$row_fo3['id_folder'];
            }
        }
        $count++;
        if(empty($folder) || $count==10){
            $i=0;
        }
    }
    
    foreach($del_folder as $dfo){
        mysql_query("DELETE FROM $_db_folder WHERE id_folder='$dfo'");
    }

    foreach($del_files as $dfi){
        $anfrage_fi3=mysql_query("SELECT * FROM $_db_files WHERE id_file='$dfi'");
        while($row_fi3=mysql_fetch_array($anfrage_fi3)){
            $anfrage_fi4=mysql_query("SELECT * FROM $_db_files WHERE zuordnung='".$row_fi3['id_file']."'");
            while($row_fi4=mysql_fetch_array($anfrage_fi4)){
                @unlink("../upload/".$row_fi4['id_file']."_".$row_fi4['filename']);
                mysql_query("DELETE FROM $_db_files WHERE id_file='".$row_fi4['id_file']."'");
            }
            mysql_query("DELETE FROM $_db_files WHERE id_file='".$row_fi3['id_file']."'");
        }
    }
    
}

Ich bedanke mich schonmal! Komme echt nicht mehr weiter
 
Ich habe mich mal mit Hirarchien und MySQL beschäftigt
http://wiki.yaslaw.info/wikka/MySQLTree

Wenn man das eine 2te Beisopiel davon etwas abwandelt, kriegt man ein einfaches SQL um alle ID's zu ermitteln die betroffen sind.
Dieses kann dann als Bedinung für ein Delete-SQL hinhalten.
nav: Meien Tabelle
id: ID des Datensatzes
parentid: Id der Mutter

SQL:
SELECT
	id
FROM 
	(
		SELECT
		    id,
		    GROUP_CONCAT(pathid ORDER BY rownum DESC SEPARATOR ',') AS path
		FROM
		    (
		        SELECT
		            -- Zeilennummer. Wird später für die Sortierung des GROUP_CONCAT verwednet
		            @rownum := @rownum+1 AS rownum,
		            -- id die für den Pfad verwendet wird
		            IF(@lastid <> mylist.id, @id := mylist.id, @id) AS pathid,
		            -- Die Start-Id.
		            @lastid := mylist.id AS id,
		            -- bestimmen der nächsten id im Path
		            @id := (SELECT parentID FROM nav  WHERE id = @id) AS parentID
		        FROM
		            -- Variablen initialisieren
		            (SELECT @id := 0, @lastid := 0, @rownum := 0) AS vars,
		            -- Die Tabelle mit sich selber multiplizieren umd genügend
		            -- Zeilen zur Verfügung zu haben
		            (SELECT id FROM nav) AS myloop,
		            (SELECT id FROM nav) AS mylist
		    ) AS t
		WHERE
		    pathid IS NOT NULL  
		GROUP BY
		    id
	) AS pathlist
WHERE
	FIND_IN_SET(2, path);

PS: Die Komentarzeile ggf. zum testen herauslöschen. Nicht alle MySQL-Clients können mit Kommentaren umgehen....
 
Zuletzt bearbeitet von einem Moderator:
wow. das Ist erst mal sehr interessant aber auch richtig neuland...
Also ich muss mich da erstmal richtig reinlesen und weiter damit befassen.
Also ist meine Lösung zwar nicht die Eleganteste aber sollte trotz allem seinen Zweck erfüllen.
Ich hätte schon gern das mein Script funktioniert. Trotz allem vielen Dank an dich das werde ich mir gerne mal aneignen!
 
hi nochmal.
Habe mir das von dir (yaslaw) nochmal angesehen und teilweise schon eingebaut. Also z.B. also Pfadanzeige in welchem Ordner ich mich befinde. (1 Beispiel auf der Seite).
Die Abfrage habe ich auch verstanden. bis auf eine kleinigkeit:

was sollen die @s da?
SQL:
SELECT  
            @id AS id,

Aber mit meinem Löschentool bin ich noch nicht weiter.
Die Abfrage habe ich soweit gemacht nun habe ich auch den Pfad von jedem Ordner. Angefangen bei 0 (Hauptordner) jedoch wie kann ich nun den Anfang beeinfluss? z.B. will ich ab F1a (id 2) alles auswählen...

Hoffe du kannst mir da nochmal eine hilfestellung geben ;)
 
Zuletzt bearbeitet von einem Moderator:
hi,
ich habe mein Problem zum Teil gelöst!
habe die anfrage nun umgestellt:
SQL:
SELECT
    id_folder,
    GROUP_CONCAT(pathid ORDER BY rownum DESC SEPARATOR '>') AS path
FROM
    (
        SELECT
            @rownum := @rownum+1 AS rownum,
            IF(@lastid <> mylist.id_folder, @id_folder := mylist.id_folder, @id_folder) AS pathid,
            @lastid := mylist.id_folder AS id_folder,
            @id_folder := (SELECT folder_id FROM ".$_db_folder."  WHERE id_folder = @id_folder) AS folder_id
        FROM
            (SELECT @id_folder := 0, @lastid := 0, @rownum := 0) AS vars,
            (SELECT id_folder FROM ".$_db_folder.") AS myloop,
            (SELECT id_folder FROM ".$_db_folder.") AS mylist
    ) AS t
WHERE
    pathid IS NOT NULL
GROUP BY
    id_folder ORDER BY path;
die Ausgabe sieht nun so aus:
(Ordnernamen haben sich geändert)
[nicht löschen]
-A
--A1
--A2
-B
--B1
---B1II
---B1I

damit kann ich nun arbeiten.
das ganze mit PHP:
PHP:
$a=@mysql_query("
SELECT
    id_folder,
    GROUP_CONCAT(pathid ORDER BY rownum DESC SEPARATOR '>') AS path
FROM
    (
        SELECT
            @rownum := @rownum+1 AS rownum,
            IF(@lastid <> mylist.id_folder, @id_folder := mylist.id_folder, @id_folder) AS pathid,
            @lastid := mylist.id_folder AS id_folder,
            @id_folder := (SELECT folder_id FROM ".$_db_folder."  WHERE id_folder = @id_folder) AS folder_id
        FROM
            (SELECT @id_folder := 0, @lastid := 0, @rownum := 0) AS vars,
            (SELECT id_folder FROM ".$_db_folder.") AS myloop,
            (SELECT id_folder FROM ".$_db_folder.") AS mylist
    ) AS t
WHERE
    pathid IS NOT NULL
GROUP BY
    id_folder ORDER BY path;
");
//print_result_table($a);

while($rowa=mysql_fetch_row($a)){
    for($i=1;$i<=dbabfrage($_db_folder,'id_folder',$rowa[0],'lvl',1);$i++){echo"-";}
    echo dbabfrage($_db_folder,'id_folder',$rowa[0],'betreff',1)."<br>";
}
die funktion dbabfrage ist nur eine ganz normale Datenbankabfrage um platz zu sparen.
Zusätzlich habe ich noch in meiner Tabelle einen Tupel namens: lvl (für level) hinzugefügt. der zeigt in welcher ebene sich der Ordner befindet.
0 = Befindet sich im Root
1 = einen Tiefer (A und B)
2 = A1,A2,B1
3 = B1I,B1II

so kann ich die Hirachie besser sichtbar machen... hoffe ich komme damit weiter. Aber erstmal vielen vielen dank für den Tip. Der hat mich echt weiter gebracht auch wenn die Mysql abfrage noch nicht 100%ig verstanden habe.

Beim Löschen bringt es mich immer noch nicht weiter da ich es nicht hin bekomme eine Startid zu setzen... also z.B. sollen A und A1,A2 gelöscht werden. (Startid von A). Naja da darauf bisher noch keiner geantwortet hat und ich nicht weiter komme gilt dies als erledigt.
 
Zuletzt bearbeitet von einem Moderator:
Zurück