Dateien automatisch löschen

Alice

Erfahrenes Mitglied
Hallo. :)

Bevor ich meine Frage stelle, möchte ich erst einmal erklären was ich vor habe.

Mit einem Generator wird eine Grafik erstellt (Avatar-Grafik). Nach dem generieren, wird die Grafik in einem Verzeichniss (Custom-Avatare) gespeichert. Wenn man das Avatar benutzen möchte, wird es in das Verzeichniss (Avatare) verschoben.

Wenn man das Avatar benutzt, wird ein Teil der URL in der Datenbank gespeichert.

Beispiel:
PHP:
URL:
www.meine-seite.de/avatare/avatar-bl5000.png

Code in der Datenbank:
bl5000

Ist es möglich irgendwie zu prüfen ob die Avatare im Verzeichniss "aktiv" sind? Es kommt öfter vor das ein Avatar gar nicht mehr verwendet wird und es trotzdem im Verzeichniss (Avatare) ist. Die Avatare manuell zu löschen ist praktisch unmöglich. Daher suche ich eine Möglichkeit die Avatare per Knopdruck prüfen und löschen zu lassen.
 
Hallo bl5000,
das ist eigentlich ganz einfach, zurerst schreibst du alle Bilder die es gibt aus der Datenbank in ein Array-> und danach löschst du über eine if-bedingung einfach die .. die in der false Schleife landen ;)
PHP:
$sql_pic = mysql_query("SELECT userpic FROM table")OR die (mysql_error()); ## Tabelle wählen
	while ($pic = mysql_fetch_array($sql_pic)){ ## beginne While
		if(!empty($pic["userpic"])){  ## Nur Zeilen wo spalte userpic nicht leer ist
		$pics[] = $pic["userpic"]; ## schreibe Daten in Array $pics
		}
	}
	
	$verz = opendir ('userpic');  ## Öffne verzeichniss "userpic" ggf. /ordner -> und schriebe in $verz
	while ($file = readdir ($verz)) {   ## beginne while und lies $verz aus -> Datein.
	if(!empty($pics)){ ## ist $pics nicht leer dann ->
		if($file != "rl" && $file != "." && $file != ".." && $file != "thumb"){
			 if(!in_array($file,$pics)){
				 @unlink("userpic/".$file); ## hier dann wird die Löschung vorgenommen.
		  }
		}
	}
Achtung :
PHP:
if($file != "rl" && $file != "." && $file != ".." && $file != "thumb"){
Hier ist zu beachten das es noch weitere Ordner geben kann die natürlich nicht geprüft werden sollen also ordner "rl" und natürlich auch nicht die ordner darunter "." -> und auch nicht die Ordner noch weiter dahinter "..".
So in etwa :) ist aber ungetestet.
Mfg Splater
 
Zuletzt bearbeitet:
@Splater:

Ich habe jetzt deinen Code nur überflogen, aber könnte man nicht schon im MySQL-Query überprüfen, ob das Feld "userpic" leer ist:
SQL:
SELECT userpic FROM table WHERE userpic!=''
 
Hallo Comfreek,
ja Definitiv kann man das auch tun. Hab ich jetzt nicht so schnell geschaltet ;) Danke für deine Verbesserung.
mfg splater
 
Hallo. :)

Erst einmal vielen Dank für die Antworten.

Leider komme ich gerade mit dem PHP-Code nicht klar.

Ich habe ihn mal versucht an meine Seite anzupassen aber der PHP-Code ergibt für mich keinen Sinn.

PHP:
   $avatar = "http://www.meine.seite.de/avatare/";

   $sql_pic = mysql_query("SELECT field5 FROM userfield")OR die (mysql_error());
              while ($pic = mysql_fetch_array($sql_pic)) {
                  if(!empty($pic["field5"])) {
                  $pics[] = $pic["field5"];
                  }
              }

   $verz   = opendir($avatar);
             while ($file = readdir ($verz)) {
                 if(!empty($pics)) {
                 if($file != "rl" && $file != "." && $file != ".." && $file != "thumb") {
                 if(!in_array($file,$pics)){
                 @unlink("userpic/".$file);
                 }
                 }
                 }
             }

Um meine Idee etwas verständlicher zu erklären hier ein Beispiel:

Datenbank (Tabelle "userfield" Zeile "field2")
PHP:
field2 = 123456
field2 = abcdef
field2 = aaaaa
field2 = 010101

Verzeichniss (Avatare)
PHP:
www.meine-seite.de/avatare/123456.png
www.meine-seite.de/avatare/abcdef.png
www.meine-seite.de/avatare/aaaaa.png
www.meine-seite.de/avatare/010101.png
www.meine-seite.de/avatare/bl5000.png
www.meine-seite.de/avatare/lollol.png

Wie man sehen kann sind die letzten beiden Grafiken nicht mehr aktiv. Sprich: Sie werden von keinem User verwendet. Also sollen die gelöscht werden.
 
Hallo, ja, genau das macht der Script an sich.
PHP:
<?php
$avatar = "http://www.meine.seite.de/avatare";
$sql_pic = mysql_query("SELECT field5 FROM userfield")OR die (mysql_error());
while ($pic = mysql_fetch_array($sql_pic)) {
   if(!empty($pic["field5"])) {
   		$pics[] = $pic["field5"]; ## Trage alle VORHANDENE Bilder ein.
   }
}
$verz   = opendir($avatar);
	while ($file = readdir ($verz)) {
       if(!empty($pics)) {
            if($file != "rl" && $file != "." && $file != ".." && $file != "thumb") {
                 if(!in_array($file,$pics)){ ## Prüfe hier ob Bild NICHT! in Array ist -> Dann löschen
                 	@unlink($avatar."/".$file);
               	 }
           	}
       }
   }

Kommt bei dir ein Fehler? wenn ja was. Versuch es mal ohne das @ vor unlink, dann kann man mit der Fehlermeldeung evt. etwas anfangen.

mfg splater
 
Ich teste das PHP-Skript sofort aber ich glaube dann wird auch meine index.html und meine .htaccess-Datei mit gelöscht?
 
Hi,
befinden die sich im selben Ordner? Mach vorher definitiv ein Backup davon. ;)
Wenn nicht dann ->
PHP:
if($file != "rl" && $file != "." && $file != ".." && $file != "thumb")
sollte damit schon alles geregelt werden können.. hier trägst du alle Ordner und auch unterordner aus.. also ".." und "." somit ist gewähleistet das nur aus dem Aktuellen Ordner gelöscht wird, bzw auch nicht die Ordner die noch im jetzigen Ordner sind, musst du natürlich noch ergänzen.

Wenn die im selben Ordner sind, kannst du nach der endung filtern.
Sprich .php .css etc aus der Suche entfallen. bsp.:
PHP:
function getExtension($str) {
		$i = strrpos($str,".");
		if (!$i) { return ""; }
		$l = strlen($str) - $i;
		$ext = substr($str,$i+1,$l);
		return $ext;
	}
$filename = stripslashes($file);
$extension = getExtension($filename);
$extension = strtolower($extension);
	if (($extension == ".gif") && ($extension == ".png")){ ## jpg etc.
			##Löschen
	}else{
                      ## Fehlermeldung oder soetwas :)
       }
So stell ich mir das dann vor. Bitte Berichtigen wenn ich Falsch liegt ;)

mfg splater
 
Ja sind im selben Ordner.

PHP:
if($file != "rl" && $file != "." && $file != ".." && $file != "thumb" && $file != "index" && $file != ".htaccess")

So?
 
Wenn es wirklich nur die beiden Datein sind, kann man es wohl so machen, dann aber genaue bezeichnung. Also
PHP:
if($file != "rl" && $file != "." && $file != ".." && $file != "thumb" && $file != "index.html" && $file != ".htaccess")
Bin mir nicht sicher ob die .htaccess nun auch wirklich aus der Bedingung ausgeschlossen ist.
mfg splater
 
Zurück