Dateien auf Server löschen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Dateien auf Server löschen

    Guten Tag,

    Ich speichere den Namen von Bildern von meinem Server in einer MySQL-Datenbank ab. Ich möchte gerne die Dateien (Bilder) auf meinem Server löschen, sobald auch der Name der Datei aus meiner MySQL-Tabelle verschwunden ist. Hat jemand eine Idee, wie man das umsetzen kann?

    Das hier müsste ein kleiner Anfang sein. Ich muss auch noch irgendwie das
    unlink() einbauen

    PHP-Code:
    require("verb.inc.php");
    $sqlbefehl "select bild from zbasar_buecher";
    $resultat mysql_db_query($mysqldbname$sqlbefehl$verbindungsnummer);
    $anzahl mysql_num_rows $resultat );


    for ( 
    $i=$i $anzahl $i++ )
    {
    $eintrag mysql_fetch_array $resultat );
    if(
    $eintrag['bild']...

    }
    ?> 
    Ah, wobei so kann man es ja doch nicht machen. Ich müsste also quasi eine Schleife für die Bilder auf dem Server laufen lassen und die Bilder jeweils mit meiner SQL-Tabelle vergleichen und gegebenenfalls löschen, falls der Bildname in der MySQL-Tabelle nicht mehr existiert. Also da weiß
    ich leider nicht mehr weiter...

  • #2
    Lese alle Bildnamen aus der Datenbank in ein Array

    Lese alle Bildnamen aus dem entsprechenden Ordner im Dateisystem.

    Arbeite mit array_diff
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Hallo mrhappiness,

      vielen Dank. Du hast mir sehr weitergeholfen. Zuerst lese ich jetzt die Bildnamen meiner SQL-Datenbank und speichere sie in einem Array:

      PHP-Code:
      $sqlbefehl "select bild from zbasar_buecher";
      $resultat mysql_db_query($mysqldbname$sqlbefehl$verbindungsnummer);
      $anzahl = @mysql_num_rows $resultat );
      for ( 
      $i=$i $anzahl $i++ )
      {
      if(
      $eintrag['bild']!='standart.gif')
      {
      $eintrag mysql_fetch_array ($resultat);
      $array1 = array("verzeichnisname1" => $eintrag['bild']);
      echo 
      $array1['verzeichnisname1']."<br>";
      }


      So, jetzt mach ich das Gleiche mit den Bildnamen in meinem Verzeichnis:

      PHP-Code:
      $verzeichnis dir("bilder");
      while(
      $dateinamen $verzeichnis->read())
      {
      if(
      $dateinamen!='standart.gif')
      {
      $array2 = array("verzeichnisname2" => $dateinamen);
      echo 
      $array2['verzeichnisname2']."<br>";
      }
      }
      $verzeichnis->close(); 
      Das mit dem array_diff klappt nicht so ganz. Eigentlich sollen ja die Namen übrig bleiben, die in meinem Verzeichnis zu viel sind. Und die Dateien muss ich dann irgendwie mit einer Schleife und unset() löschen. Kannst du mir nochmal eine Hilfestellung geben?

      Kommentar


      • #4
        Original geschrieben von LOLLe
        Das mit dem array_diff klappt nicht so ganz.
        In deinem Code rufst du's ja auch noch nicht auf...

        Schau dir mal die Seite im Manual an, ich hab sie dir extra verlinkt.
        Du rufst array_diff mit zwei Parametern auf und bekommst ein Array mit den Einträgen zurück, die im ersten, aber nicht im zweiten Array sind.
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          $result = array_diff($array1, $array2);

          so müsste ich's ja aufrufen. Aber wie zeige ich diese Inhalte jetzt an bzw. kann sie dann von meinem Verzeichnis löschen? Ich weiß absolut nicht weiter...

          Kommentar


          • #6
            PHP-Code:
            $result array_diff($array1$array2); 
            Wenn array1 die Folder Daten und array2 die DB Daten sind, dann sollte dir $result ein Array geben mit den Namen, die noch auf der Platte sind, aber nicht mehr in der DB.
            Dann geh einfach mittels einer Schleife über das Array
            PHP-Code:
            foreach($result as $wert){
                
            unlink('pfad/zum/folder/'.$wert);

            Gruss

            tobi
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              Okey vielen Dank! Hab es jetzt so hinbekommen:

              PHP-Code:
              $sqlbefehl "select bild from zbasar_buecher";
              $resultat mysql_db_query($mysqldbname$sqlbefehl$verbindungsnummer);
              $anzahl = @mysql_num_rows $resultat );
              for ( 
              $i=$i $anzahl $i++ )
              {
              $zahl $zahl+1;
              $eintrag mysql_fetch_array ($resultat);
              $array1 = array($eintrag['bild']);
              }

              $verzeichnis dir("bilder");
              while(
              $dateinamen $verzeichnis->read())
              {
              $array2 = array($dateinamen);
              }
              $verzeichnis->close();


              if((
              $dateinamen!='standart.gif') && ($zahl!=0))
              {
              $result array_diff($array2,$array1);


              foreach(
              $result as $dateinamen){
                  
              unlink('bilder'.'/'.$dateinamen);
              }

              Ich musste aber noch die $zahl-Variable einführen. Wenn die Datenbank leer ist, dann funktioniert das nicht und es kommt ein Fehler. Liegt das daran, dass array_diff nicht mehr ausgeführt werden kann? Klingt das Programm ansonsten so logisch? Ich bin mir noch ein bisschen unsicher. Aber ansonsten funktioniert es so wie ich will...

              Kommentar


              • #8
                Wieso noch $zahl ? Du hast ja bereits eine Kontrollvar --> $anzahl

                Wieviele Elemente hat bei Dir array2 ? Nicht zufällig immer eines ?
                PHP-Code:
                while($dateinamen $verzeichnis->read())
                {
                $array2[] = $dateinamen;
                }
                $verzeichnis->close(); 
                könnte dem Abhilfe schaffen.

                Gruss

                tobi
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  Wenn ich das umändere und $zahl streiche, dann gibt er folgende Fehlermeldung aus:

                  Warning: unlink(bilder/.): Is a directory in /home/www/kunden/ausgehungert.de/basar/userframe.php on line 43

                  Warning: unlink(bilder/..): Is a directory in /home/www/kunden/ausgehungert.de/basar/userframe.php on line 43


                  Wahrscheinlich sucht er etwas zu löschen und findet aber nichts!

                  Kommentar


                  • #10
                    Hallo,

                    ich habe jetzt noch folgendes Problem. Dieses Problem tritt auf, sobald die Datenbank leer ist. Dann kommt folgende Fehlermeldung

                    Warning: array_diff(): Argument #2 is not an array in /home/www/kunden/ausgehungert.de/basar/userframe.php on line 47

                    Warning: Invalid argument supplied for foreach() in /home/www/kunden/ausgehungert.de/basar/userframe.php on line 48

                    Hier ist nochmal mein zusammenhängender Quelltext:

                    PHP-Code:
                    $sqlbefehl "select bild from zbasar_buecher";
                    $resultat mysql_db_query($mysqldbname$sqlbefehl$verbindungsnummer);
                    $anzahl = @mysql_num_rows $resultat );
                    for ( 
                    $i=$i $anzahl $i++ )
                    {
                    $eintrag mysql_fetch_array ($resultat);
                    if(
                    $eintrag['bild']!='standart.gif')
                    {
                    $array1 = array($eintrag['bild']);
                    }
                    }

                    $verzeichnis dir("bilder");
                    while(
                    $dateinamen $verzeichnis->read())
                    {
                    $array2 = array($dateinamen);
                    }
                    $verzeichnis->close();


                    $result array_diff($array2,$array1);
                    foreach(
                    $result as $dateinamen)
                    {
                    unlink('bilder'.'/'.$dateinamen);

                    Es gibt also Probleme ab dem array_diff. Mein $array2 is ja das Array des Verzeichnisses und $array1 das Array der Datenbank. Also eigentlich dürfte es doch keine Probleme geben, wenn die Datenbank leer ist. Übrig bleiben im array_diff müsste dann noch eine Datei, die zur Zeit noch auf dem Server im Verzeichnis liegt und die müsste dann noch gelöscht werden.
                    Aber leider kommen ja dann die beiden obigen Fehlermeldungen. Hat jemand eine Idee, an was das liegen könnte? Vielen Dank! Gruß! Lorenz

                    Kommentar


                    • #11
                      Du liest aus dem Verzeichnis ja auch alles aus. Da gehören '.' und '..' eben auch dazu. Entweder du fängst diese ab (eine if-Bedingung) oder du verwendest eine andere Fkt um das Verzeichnis auszulesen z.B. glob()
                      PHP-Code:
                      $array2 = array();
                      while(
                      $dateinamen $verzeichnis->read())
                      {
                          if (
                      $dateinamen != "." && $dateinamen != "..") {
                              
                      $array2[] = $dateinamen;
                         }
                      }
                      $verzeichnis->close(); 
                      Das Problem ist nicht das leere DB Array, das gäbe eine andere Fehlermeldung bei array_diff()

                      Und die DB kannst du so einfacher lesen
                      PHP-Code:
                      $array1 = array();
                      while(
                      $eintrag mysql_fetch_array($resultat)){
                          if(
                      $eintrag['bild']!='standart.gif'){
                              
                      $array1[] = $eintrag['bild'];
                          }

                      Wenn du die Arrays erst mittels $array = array() initialisierst stellst du sicher, dass array_diff() keinen Fehler bringt, da die Arrays exisitieren. Sie haben dann schlimmstenfalls einfach keine Elemente.

                      Gruss

                      tobi
                      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                      Kommentar


                      • #12
                        Hallo tobi,

                        du kannst dir gar nicht vorstellen, wie ich mich jetzt freue: Ich hab's dank deiner Hilfe hinbekommen!!!!!!

                        Hier nochmal mein gesamter Quelltext und vielen Dank für deine Hilfe!

                        PHP-Code:
                        $sqlbefehl "select bild from zbasar_buecher";
                        $resultat mysql_db_query($mysqldbname$sqlbefehl$verbindungsnummer);
                        $array1 = array();
                        while(
                        $eintrag mysql_fetch_array($resultat)){
                        $array1[] = $eintrag['bild'];
                        }

                        $verzeichnis dir("bilder");
                        $array2 = array();
                        while(
                        $dateinamen $verzeichnis->read())
                        {
                            if (
                        $dateinamen != "." && $dateinamen != ".." && $dateinamen != "standart.gif") {
                                
                        $array2[] = $dateinamen;
                           }
                        }
                        $verzeichnis->close();


                        $result array_diff($array2,$array1);
                        foreach(
                        $result as $dateinamen)
                        {
                        unlink('bilder'.'/'.$dateinamen);

                        Kommentar

                        Lädt...
                        X