opendir / readdir / unlink von files

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

  • opendir / readdir / unlink von files

    Hallo an alle,

    hab mal 2 kleine problemchen die das arbeiten mit datei handling auf dem ftp server zusammen hängen

    das erste ist,

    ich habe vor einem monat in mein upload script ein fehler eingebaut,
    bei hochladen wurden die erweiterungen nicht mit an die files gehängt

    wie kann ich z.b. mit nem php script evtl alle bild datein die keine erweiterung bekommen das jpg ans ende ran hängen,


    ( die bild datein wurden alle mit ner fortlaufenden ID die aus ner SQL tabelle gezogen wurde gespeichert,)

    sieht wie folgt aus

    1234.
    3124.
    23.
    435.
    123.

    uswm es steht immer nur der . dort, aber nicht die erweiterung, das sind nun leider etliche hundertevon files und per hand wollt ich das nicht unbedingt machen.

    evtl läst sich sowas ja auch via ftp programm oder ähnliches lösen.

    ---------------------------- 2ter punkt-------------------

    PHP-Code:
        //Bildleichen löschen


        
    if(isset ($action) && $action =='deleteold'){

                
    $ordner "../upload/thumbs";
        
        
    $befehl opendir("$ordner");
        
    $i=0;
        while (
    $datei=readdir($befehl))    {        

            if (
    file_exists($ordner."/".$datei)){
              
    $thispic$datei;

            
    $res_pics=mysql_query("SELECT * FROM niv_images WHERE  p_minipic='upload/thumbs/$thispic'") or error (mysql_error());
            
    $piccount=mysql_num_rows($res_pics);
            if(
    $piccount == 0){
                
    unlink("../upload/thumbs/$thispic");
            }
            
            }
            
    $i++;
        }
        

        
    closedir($befehl);


        
    $ordner2 "../upload";

        
    $befehl2 opendir("$ordner2");
        
    $j=0;
        while (
    $datei2=readdir($befehl2)){
            

            if (
    file_exists($ordner2."/".$datei2))    {
              
    $thispic2$datei2;

            
    $res_pics2=mysql_query("SELECT * FROM niv_images WHERE  p_minipic='upload/thumbs/$thispic2'") or error (mysql_error());
        
            
    $piccount2=mysql_num_rows($res_pics2);
            if(
    $piccount2 == 0)    {
                
    unlink("../upload/$thispic2");

                
    $thispic2 explode(".",$thispic);
                
    $pmg=$thispic2[0];

                
    $scom=mysql_query("SELECT c_id FROM niv_comments WHERE c_forpicid =$pmg") or error (mysql_error());
                while(
    $com=mysql_fetch_array($scom)){
                    
    mysql_query("DELETE FROM niv_comments WHERE c_id='$com[c_id]") or error (mysql_error());
                }
            }
            
            }
            
    $j++;
        }
        

        
    closedir($befehl2); 
    das ist ein php code der in meinem script mit drinne steht,
    dieser ermittelt bild leichen die auf de ftp server stehen, aber nicht mehr in der datenbank zu finden sind,
    da ich hier aber auch etliche hunderte von bildleichen habe (hab das schonmal anhand der SQL zahlen und der ftp client daten des ordners errechnet) möchte ich diese auch gerne ermitteln und löschen,
    aber dieses script arbeitet ziemlich umständliche und mein server arbeitet nie weiter, sprich. da es wohl zuviel daten zum verarbeiten sind, macht er nicht weite,r
    führe ich dieses script local auf meinem xampp aus, (AMD Athlon XP 2000+ 1GB DDR-RAM) hängt der sich selbst auf bzw arbeitet sehr sehr stockend)

    gibt s hierfür irgendwie ne andre möglichkeit die nicht so das system beansprucht aber trotzdem alle bildleichen löscht?

    was direkte datei dinge angeht in php bin ich nicht so der experte, mein gebiet geht eher auf umfangreiche mysql abfragen etc.

    ich danke für eure hilfe

  • #2
    Das dein Server nicht so gut arbeitet etc. hängt vllt. damit zusammen, dass du in den Schleifen mehrere Queries machst. Bei einigen hundert Files -> einige hundert Queries....
    Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
    var_dump(), print_r(), debug_backtrace und echo.
    Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
    Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
    Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

    Kommentar


    • #3
      das ist mir bekannt das dann dementsprechend die querys sind..

      aber es wird doch evtl eine möglichkeit geben,
      alle files die nich eine der ID's haben, die in der datenbank vorhanden sind, zu löschen?

      evt ja auf eine andre art,

      in einer sql abfrage werden alle datein ermittelt,
      und wie blich in ein array geschrieben,
      danach wird eine while schleife erstellt die alle dtein auflistet (anhand readdir) aber es sollen mir NUR die bilder aufgelistet werden die NICHT in der sql abfrage vorhanden sind und wenn möglich diese auch gleich löschen, ist das möglich?

      ___________________________________
      EDIT:

      PHP-Code:
      foreach (glob("*.jpg") as $filename) {
                     echo 
      $filename ." size " filesize($filename) . "\n";
                     
      unlink($filename);
              } 
      läst sich hiermit evtl was machen das die function alle files ignoriert, die die sql abfrage zurückgibt?
      Zuletzt geändert von ; 24.02.2005, 17:23.

      Kommentar


      • #4
        Re: opendir / readdir / unlink von files

        Original geschrieben von rEd1Z1_2K
        PHP-Code:
            $scom=mysql_query("SELECT c_id FROM niv_comments WHERE c_forpicid =$pmg") or error (mysql_error());
                    while(
        $com=mysql_fetch_array($scom)){
                        
        mysql_query("DELETE FROM niv_comments WHERE c_id='$com[c_id]") or error (mysql_error());
                    } 
        Warum machst du daraus nicht einfach
        PHP-Code:
        mysql_query('DELETE FROM niv_comments WHERE c_forpicid = ' $pmg)or die(mysql_error()) 
        Sollte funktionieren und spart dir schonmal die ggf. tausenden Querys für die Kommentare...

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          hat damit nix zu tun, dieser query ist überflüssig. das script ist ja da nicht von mir
          ich habsauch nocht nicht überarbeitet, werd ich aber gleich mal un dann die neuen code hier posten..

          das ist ja auch nicht das relevante, das sind ja nur bild commentare, ich will ja bild leichen löschen.. (und um überfglüssige kommentare zu löschen benutzt ich nen andren SQL befehl der mit LEFT JOIN arbeitet (ist noch einfacher)

          Kommentar


          • #6
            zu meinem erstem problem was die datein ohne erweiterung angeht hab ich die lösung gefunden.

            mir bleibt nur noch das mit dem bild leichen löschen ^^

            hellpp

            Kommentar


            • #7
              Original geschrieben von rEd1Z1_2K
              zu meinem erstem problem was die datein ohne erweiterung angeht hab ich die lösung gefunden.
              Dann poste sie hier bitte auch - manche Leute finden so einen Thread z.B. über ne Suchmaschine, und dann ist die Lösung sehr sehr hilfreich...
              Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
              var_dump(), print_r(), debug_backtrace und echo.
              Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
              Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
              Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

              Kommentar


              • #8
                nennt sich Total Commander das tool und hat unter dem Reiter "Datein" ein Mehrfachumbenennungstool..

                damit gings ohne probleme und sehr sehr schnell
                selbst direkt auf FTP antwendebar, muste nichtmal die datein erst runterladen oder so. konnte sie so direkt oben selectieren und die neue erweiterung angeben..

                un wer hilft mir jetzt bei meine 2ten problem?

                PHP-Code:
                // Bildleichen löschen (wenn GET deleteold übergeben wird //

                if($_GET['action'] == "deleteold"){

                    
                $ordner "../upload/thumbs";
                    
                    
                $befehl opendir($ordner);
                    
                    while(
                $datei readdir($befehl)) {
                            
                $res_pics mysql_result(mysql_query("SELECT * FROM niv_images WHERE p_minipic = 'upload/thumbs/".$datei."'"),0);
                            if( empty(
                $res_pics) ){
                                @
                unlink("../upload/thumbs/".$datei);
                                @
                unlink("../upload/".$datei);
                                echo 
                "<div style=\"border-bottom:1px solid #000000;\">../upload/thumbs/".$datei." <-(THUMBDNAIL)<br />\n | ../upload/".$datei." <-(ORGINAL)</div> <br />\n";
                            }
                    }
                    
                closedir($befehl);

                das ist die neue function die ich mir gebastelt habe.
                aber immer noch sehr speicher fresend und server belastend..

                Kommentar


                • #9
                  Original geschrieben von rEd1Z1_2K
                  aber immer noch sehr speicher fresend und server belastend..
                  natürlich.
                  das dürften queries innerhalb von schleifen fast immer sein.

                  PHP-Code:
                  $res_pics mysql_result(mysql_query("SELECT * FROM niv_images
                  WHERE p_minipic = 'upload/thumbs/"
                  .$datei."'"),0);
                  if( empty(
                  $res_pics) ){ 
                  m.E. sinnfrei, hier auf empty abzufragen - wenn die query nicht fehlgeschlagen ist, wird $res_pics immer eine resource ID enthalten.
                  bitte nicht "mysql_query liefert false" mit "query liefert keinen ergebnisdatensatz" verwechseln.


                  p.s.: bitte brich den code in deinem beitrag um, damit man bei gängier auflösung nicht so weit querscrollen muss.
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar

                  Lädt...
                  X