Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateien löschen
Hallo,
ich möchte Dateien aus einem Verzeichnis löschen, die sich nicht mehr in einer Datenbanktabelle befinden.
Dazu benutze ich folgenden Code:
mysql_select_db($db,$conn);
$sql="SELECT foto1, foto2, foto3, foto4, foto5 FROM tblfz";
$erg=mysql_query($sql,$conn);
$verz=opendir('../img/fz/gross/');
$zaehler=0;
while ($Datei=readdir($verz)) {
if ($Datei != "." && $Datei != "..") {
while($row=mysql_fetch_row($erg)){
if (true != in_array($Datei,$row)){
print_r($Datei);
//unlink($Datei);
$zaehler++;
}
}
}
}
echo "Es wurden insgesamt " . "$zaehler" . " Dateien gelöscht";
Das Problem ist jetzt wahrscheinlich die while-Schleife.
Bevor die erste while-Schleife zur nächsten Datei springt, muss erst die 2. Schleife mit in_array abgearbeitet werden, um zu püfen ob die Datei aus der ersten while-Schleife auch in der Tabelle enthalten ist ($row).
Die Werte in den Felder foto1,foto2,foto3,foto4,foto5 bestehen aus dem gleichen String wie die Datei im Verzeichnis,
also z.B.
Datei im Verzeichnis: "1543.jpg"
Feld "foto1" in Tabelle: "1543.jpg"
Kann mir einer weiterhelfen, wie man diese Schleife macht?
mrhappiness 10-08-2005, 15:14 Kannst du nicht die innere while-Schleife vor die äußere machen?
Du würdest damit erst alles aus der DB auslesen und danach das verzeichnis durchackern
imho ein doofer ansatz.
- lies die bilder aus dem ordner in ein array()
- lies die bilder aus der db in ein anderes array
- schau dir array_diff() und/oder array_intersect() an
es sollte ein array übrig bleiben, das die zu löschenden bilder beinhaltet.
penizillin 10-08-2005, 15:16 hab ich dir letztens glob() empfohlen?
mrhappiness 10-08-2005, 15:23 Original geschrieben von penizillin
hab ich dir letztens glob() empfohlen? hast du, aber den gewünschten Code hast du nicht nachgeleifert, sondern nur voll der Gehässigkeit was von 40-60 Zeilen Code erzählt und eigenes Denken verlangt.
Du Schuft...
Und dann auch noch zur Ferienzeit...
Hallo,
es geht mir nur darum, was an der Schleife nicht funktioniert.
Die anderen Funktionen habe ich schon geprüft.
Wenn ich z.B. $Datei="1345.jpg" als festen Wert nehme funktioniert es einwandfrei.
Kann mir denn jemand sagen, ob die erste while-Schleife wartet bis die 2. while-Schleife fertig ist.
Wenn das so wäre müsste es ja funktionieren.
Oder gibt es eine andere Möglichkeit.
wenn du es richtig formulierst:
die äußere schleife wartet mit dem zweiten durchlauf, bis der erste durchlauf (und damit auch die innere schleife) beendet ist.
alles andere wäre unsinn.
Hallo,
ja so muss es sein.
Aber warum funktioniert dann der oben angegebene Code nicht.
Wenn ich die erste Schleife weglasse und bei
in_array einen festen Wert eingebe z.B.
$Datei="1345.jpg";
if (true != in_array($Datei,$row)){
print_r($Datei);
funktioniert es einwandfrei.
Oder liegt es vielleicht doch an der Funktion readdir()
Vielleicht kannst du mir weiterhelfen.
Gruss Klaus
penizillin 10-08-2005, 18:24 lass dir mal $row mit print_r() am anfang der 2. schleife ausgeben und zeig mal hier.
Hallo,
mysql_select_db($db,$conn);
$sql="SELECT foto1, foto2, foto3, foto4, foto5 FROM tblfz";
$erg=mysql_query($sql,$conn);
$verz=opendir('../img/fz/gross/');
$Pfad='../img/fz/gross/';
$zaehler=0;
while ($Datei=readdir($verz)) {
if ($Datei != "." && $Datei != "..") {
//echo "$Datei<br>";
while($row=mysql_fetch_row($erg)){
print_r($row);
if (true == in_array($Datei,$row)){
//unlink(Pfad.$Datei);
$zaehler++;
}
}
}
}
echo "Es wurden insgesamt " . "$zaehler" . " Dateien gelöscht";
Ausgabe:
kannst du dir ansehen unter:
www.auto-mergen.de/test/loesch_foto.php (http://www.auto-mergen.de/test/testloesch_foto.php )
Gruss Klaus
penizillin 10-08-2005, 19:29 ich werde in der hölle schmoren.
$sql="SELECT foto1, foto2, foto3, foto4, foto5 FROM tblfz";
$erg=mysql_query($sql,$conn);
$i = 0;
$alle_fotos_aus_db = array();
while($row=mysql_fetch_row($erg))
{
foreach($row as $dateiname)
{
if(!in_array($dateiname, $alle_fotos_aus_db))
$alle_fotos_aus_db[] = $dateiname;
}
}
$alle_dateien_im_ordner = glob('../img/fz/gross/');
foreach($alle_dateien_im_ordner as $aktuelle_datei)
{
if(!in_array($aktuelle_datei, $alle_fotos_aus_db))
{
echo 'zu löschen: '.$aktuelle_datei.' <br />';
$i++;
}
}
echo "es wurden insgesamt " . $i . " dateien zum tode verurteilt";
ich werde in der hölle schmoren. Japp! :D
Hallo,
vielen Dank für deine echte Mühe.
Aber irgendwas funktioniert noch nicht.
Ich bekomme als Ausgabe:
zu löschen: ../img/fz/gross/
es wurden insgesamt 1 dateien zum tode verurteilt
Es müssten aber ca. 350 Dateien gelöscht werden.
Ich kann den Fehler nicht finden, da ich mich mit den Funktionen in deinem Script nicht so recht klar komme.
Kannst du mir nochmal Hilfestellung geben.
Gruss Klaus
Ps: Hab mir nochmal das glob(array) angesehen und festgeatellt das der Wert aus Dateipfad und Datei besteht.
Im db-Feld steht aber nur die Datei. Kann es daran liegen.
penizillin 10-08-2005, 21:46 ja.
Hallo,
ich bin jezt schon 2 Stunden am versuchen bekomme es aber nicht hin.
Kannst du mir helfen
Gruss Klaus
penizillin 10-08-2005, 22:10 http://de2.php.net/manual/en/function.basename.php
mrhappiness 11-08-2005, 08:44 @penizillin
Angst vor der Hölle bekommen? ;)
Hallo,
habe es jetzt folgendermassen gemacht und es klappt
mysql_select_db($db,$conn);
$sql="SELECT foto1, foto2, foto3, foto4, foto5 FROM tblfz";
$erg=mysql_query($sql,$conn);
$alle_fotos_aus_db = array();
while($row=mysql_fetch_row($erg))
{
foreach($row as $dateiname)
{
if($dateiname!='')
{
$alle_fotos_aus_db[] = $dateiname;
//echo $dateiname.' <br>';
}
}
}
mysql_free_result($erg);
$pfad='../img/fz/gross/';
$handle=opendir($pfad);
$alle_fotos_aus_ordner = array();
while ($datei=readdir($handle))
{
if ($datei != "." && $datei != "..")
{
$alle_fotos_aus_ordner[] = $datei;
//echo $datei.' <br>';
}
}
closedir($handle);
$zaehler=0;
$zu_loeschende_dateien=array_diff($alle_fotos_aus_ordner,$alle_fotos_aus_db);
print_r($zu_loeschende_dateien);
if(count($zu_loeschende_dateien))
{
foreach ($zu_loeschende_dateien as $geloeschte_datei)
{
$zaehler++;
echo $pfad.$geloeschte_datei.' wurde gelöscht.<br>';
//unlink($pfad.$geloeschte_datei);
}
echo 'Es wurden insgesamt '.$zaehler.' Dateien gelöscht.<br>';
}
else
{
echo '<br>Es befinden sich keine Dateien zum Löschen im Verzeichnis '.$pfad.'.';
}
?>
Wenn noch jemand einen Verbesserungsvorschlag hat bitte melden.
Besonderen Dank an "penizillin", der mir mit seinem Scriptvorschlag richtig weitergeholfen hat und deshalb sicher nicht in der Hölle schmoren wird.
Vielen Dank nochmal an alle.
Gruss Klaus
|
-
- |