Ordner und dessen Unterordner löschen

Warum so umständlich?

SQL:
DELETE 
FROM 
	directory 
WHERE 
	Main_Directory = '{$id}' 
	OR directoryID='{$deleteID}'

Gibt auch nur ein Befehl an die DB -> sollte also schneller sein als zig mal einen Befehl schicken.
 
Zuletzt bearbeitet von einem Moderator:
Nicht getestet da ich es noch ertweitern möchte ;)
Die Ordner sind dann zwar weg, aber was ist mit den Dateien?
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."'");
mysql_query("DELETE FROM files WHERE dirID='".$row->directoryID."'");
$sql_delete_files=mysql_query("SELECT fileID FROM files WHERE dirID='".$row->directoryID."'");
while($delF = mysql_fetch_array($sql_delete_files));
{
$delFile= $delF["fileID"];
unlink("UPLOAD/".$delFile);
}
loesche($row->directoryID);
} 

} 
loesche($deleteID);
mysql_query("DELETE FROM directory WHERE directoryID='".$deleteID."'");
Es heißt
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\XAMPP\htdocs\test\del_dir.php on line 23

Warning: unlink(UPLOAD/) [function.unlink]: Permission denied in D:\XAMPP\htdocs\test\del_dir.php on line 26
 
Zuletzt bearbeitet:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\XAMPP\htdocs\test\del_dir.php on line 23

Warning: unlink(UPLOAD/) [function.unlink]: Permission denied in D:\XAMPP\htdocs\test\del_dir.php on line 26

Lass dir mal die SQL per echo ausgeben!

Der 2.Fehler ist ein "PermissionFehler", d.h.
Dein Script hat nicht die erforderlichen Rechte den Ordner zu löschen.
 
Ja da erscheinen alle Dateien welche in den Untergeordneten Ordnern liegen.
Die Datei welche im selben Ordner liegt der gelöscht werden soll wird bei dem echo nicht gezeigt.
Das Premission Denied liegt daran das Er die Datei nicht finden kann, ich have versucht es mit einem IF abzufangen nutzt mir jedoch nichts ;/
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."'");
$l="SELECT fileID,file_typ_s FROM files WHERE dirID='".$row->directoryID."'"."<br />";
$l_files=mysql_query("SELECT fileID,file_typ_s FROM files WHERE dirID='".$row->directoryID."'");
$l_l = mysql_fetch_object($l_files);
if($l_l->fileID!="")
{
unlink("UPLOAD/".$l_l->fileID.".".$l_l->file_typ_s);
}
else{
}
mysql_query("DELETE FROM files WHERE fileID='".$row->directoryID."'");
loesche($row->directoryID);
} 
mysql_query("DELETE FROM directory WHERE directoryID='".$id."'");
$l_lll=mysql_query("SELECT * FROM files WHERE dirID='".$id."'");
$l_ll=mysql_fetch_object($l_lll);
if($l_ll->fileID!="")
{
unlink("UPLOAD/".$l_ll->fileID.".".$l_ll->file_typ_s);
mysql_query("DELETE FROM files WHERE dirID='".$id."'");
}
else{
mysql_query("DELETE FROM files WHERE dirID='".$id."'");
}

} 
loesche($deleteID);
 
Du solltest die Variablen sinnvoll benamsen un den Code sauber formatiern. Dann wird er ev. auch lesbar

PHP:
function loesche($dirId){
	// Alle Unterverzeichnisse aus der DB auslesen
	$subDirListSql = "SELECT directoryID FROM directory WHERE Main_Directory = '{$dirId}'";
	$subDirListResult = mysql_query($subDirListSql);
	
	while($subDir = mysql_fetch_object($subDirListResult)){
		// Unterverzeichnisse im aktiven Unterverzeichniss löschen
		loesche($subDir->directoryID);
		
		// Alle Dateinamen im aktiven Unterverzeichniss auslesen
		$fileListSql = "SELECT CONCAT(fileID, '.' ,file_typ_s) AS fileName FROM files WHERE dirID='{$subDir->directoryID}'";
		$fileListResult = mysql_query($fileListSql);
		
		while($file = mysql_fetch_object($resultFileList)){
			// Dateipfad erstellen
			$filePath = "UPLOAD/{$file->fileName}";
			
			// prüfen ob die Datei exisitiert
			if(file_exists($filePath)) {
				// Datei löschen
				unlink($filePath);
			}	
			
			// Dateieintrag in der Datenbank löschen
			$fileDeleteSql = "DELETE FROM files WHERE dirID='{$subDir->directoryID}'";
			mysql_query($fileDeleteSql);
		}
		// Verzeichniss aus der Datenbank entfernen
		$dirDeleteSql = "DELETE FROM directory WHERE Main_Directory = '{$dirId}'";
		mysql_query($dirDeleteSql);
	}
}

Dies löscht jedoch auf dem FileSystem nicht die Ordner, da nicht garantiert ist, dass die Ordner leer sind.
 
Ganz ehrlich auch wenn jede Rekursion auch als Schleife ausdrückbar ist du tust dir damit wesentlich einfacher. Auch zukünftig. Einmal Rekursion verstanden und du tust dir so viel einfacher!
 
Zurück