chimon: Prüfen ob Grafik existiert -> dann ausgeben

Hallo alle PHPler hier,
ich will eine Sammlung an Cartoons anzeigen lassen. Die Cartoons werden auf einer Webseite veröffentlicht. Dort wird jede Woche ein weiteres geuploaded:

cartoon_0001.jpg
...
cartoon_0110.jpg
cartoon_0111.jpg
cartoon_0112.jpg
cartoon_0113.jpg
...

Ich will jetzt alle Cartoons anzeigen lassen, die existieren. Deshalb suche ich nach einer Funktion, die prüft ob ein Bild existiert. Ich würde dann so abfragen:

while (startwert = 0001, cartoon_(i)jpg existiert, i++) {
printf("<img border="0" src="http://www.link.de/cartoon$i.jpg"><br>\n);}

Welche Funktion kann ich dafür verwenden und wie würde meine Abfrage damit ausshen?

chimon

  1. hi chimon,

    es gibt bei PHP Funktionen des Filesystems und da dürfte für dich diefile_exists
    ganz interessant sein.

    Bei deinem while-Konstrukt gibt es noch einen Fehler.
    Die Zählvariabel $i ist vom Typ Integer und wird
    somit nie den Wert "0001" annehmen, sondern nur die 1.

    1. gut, danke mark,

      klar den integer 0001 gibts nicht, ich zähle ab 1 los, versuche dann aber immer mit restlichen nullen vorne aufzufüllen. geht sowas? Über die zeichenlänge des wertes oder so? eine autovervollständigung müsste doch irgendwie zu schaffen sein.

      chimon

      1. Hi,

        klar den integer 0001 gibts nicht, ich zähle ab 1 los, versuche dann aber immer mit restlichen nullen vorne aufzufüllen. geht sowas? Über die zeichenlänge des wertes oder so? eine autovervollständigung müsste doch irgendwie zu schaffen sein.

        Wie wäre es wenn du diese cartoons in einen extra ordner machst? wo du sonst nichts anderes reinmachst? dann brauchst du dir wegen dem dateinamen keine sorgen zu machen. dui machst dann einfach sowas:

          
        $dir = "./cartoons";  
        $dh  = opendir($dir);  
        while ($datei = readdir($dh))  
        {  
          if(is_file("./cartoons/$datei"))  
          {  
            // ueberpruefe evt. auf endung .jpg  
            // ausgabe der Datei  
          }  
        }  
        
        

        MfG

        1. naja, ein fehler fällt mir da noch auf:
          du wirst bei dem script 2 unnötige dateien bekommen
          => . und .. muss man doch noch ausschließen, oder!?!

          lg
          Joe

          1. Danke, nicht ganz so schnell, ich muss erst mal testen.

            danke für die hilfe.

            chimon

            1. Gibt leider eine leere seite aus...

              <?
              function addZero($nr) {
              if($nr <= 9) {
              $str = '000';
              } elseif($nr <= 99) {
              $str = '00';
              } elseif($nr <= 999) {
              $str = '0';
              }
              return $str;
              }

              $i = 1;

              while(file_exists('http://www.ruthe.de/strip/img/strip_0001.jpg')) {
                  echo "<img src="http://www.ruthe.de/strip/img/strip_".addZero($i).$i.".jpg" />\n";
                  $i++;
              }
              ?>

              chimon

              1. Mit dieser whils-Schleife klappts schon mal, leider muss ich da von hand eingeben wieviele durchläufe (cartoons) abgefragt werden sollen.
                gibts da nicht eine exists abfrage die geht?

                while($i <= 120) {
                echo "<img src="http://www.ruthe.de/strip/img/strip_".addZero($i).$i.".jpg" />\n";
                    $i++;
                }

                noch ne frage:
                klasse wäre es die ältesten zuerst zu listen. aber da musste php ja hellsehen können, denn bei welcher zahl i soll es losgehen? die höchste, dann rechnet php viel zu viel, bis das erste letzte bild angezeigt wird. könnt ihr mir folgen?

                chimon

                1. Hi,

                  Mit dieser whils-Schleife klappts schon mal, leider muss ich da von hand eingeben wieviele durchläufe (cartoons) abgefragt werden sollen.

                  ein grund meine lösung zu nehmen

                  noch ne frage:
                  klasse wäre es die ältesten zuerst zu listen. aber da musste php ja hellsehen können, denn bei welcher zahl i soll es losgehen? die höchste, dann rechnet php viel zu viel, bis das erste letzte bild angezeigt wird. könnt ihr mir folgen?

                  und noch ein grund meine lösung zu nehmen da diese erweitert werden kann auf:

                    
                  $dir = "./cartoons";  
                  $dh  = opendir($dir);  
                  while ($datei = readdir($dh))  
                  {  
                    if(is_file("./cartoons/$datei"))  
                    {  
                      // ueberpruefe evt. auf endung .jpg  
                      $cartoon_array[$datei] = filemtime ("./cartoons/$datei");  
                    }  
                  }  
                  // asort($cartoon_array); oder arsort($cartoon_array);  
                  foreach($cartoon_array as $bildname => $timestamp)  
                  {  
                    $erstellt_datum = strftime("%Y-%m-%d %H:%M:%S", $timestamp);  
                    echo "vom $erstellt_datum:<br>";  
                    echo "<img src='cartoons/$bildname'>";  
                  }  
                  
                  

                  MfG

                  1. geht nicht ist nicht mein server.
                    chimon

                    1. Hi,

                      geht nicht ist nicht mein server.

                      wie geht nicht? ist nicht dein server? kannst jawohl nen unterordner
                      anlegen, oder nicht? schließlich lädst du auch ständig neue cartoons
                      hoch. wenn nicht, dann gib den dateien allen eben den anfang 'cartoon'
                      und die endung '.jpg' was dazwischen steht ist egal. musst das nur for
                      dem hinzufügen in das dateiarray überprüfen.

                      MfG

                      1. ähh? nein ich habe nie was hochgeladen, die cartoons sind ruthes cartoons und ich will sie auf einmal angezeigt beommen. verstehst du jetzt?

                        chimaon

                        1. Hi,

                          ähh? nein ich habe nie was hochgeladen,

                          du hast doch gesagt das jede woche oder so ein neuer hinzukommt.

                          die cartoons sind ruthes cartoons und ich will sie auf einmal angezeigt beommen. verstehst du jetzt?

                          das heißt du hast eigentlich garnicht das recht sie anzuzeigen?

                          MfG

                          1. bestimmt´habe ich kein recht sie anderen zugänglich zu machen. für mich kann ich alle anzeicgen lassen. ich will sie am stück ausdrucken.

                            chimon

                            1. Hi,

                              bestimmt´habe ich kein recht sie anderen zugänglich zu machen. für mich kann ich alle anzeicgen lassen. ich will sie am stück ausdrucken.

                              Jede Woche neu? Ich hoffe, Du nimmst wenigstens Umweltpapier? :-) *SCNR*

                              Gruß, Cybaer

                              --
                              Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                2. das sollte funktioniert (hab aber leider derzeit kein php zum testen)

                  <?php
                  function addZero($nr) {
                  if($nr <= 9) {
                  $str = '000';
                  } elseif($nr <= 99) {
                  $str = '00';
                  } elseif($nr <= 999) {
                  $str = '0';
                  }
                  return $str;
                  }

                  $i = 1;

                  while(file_exists('http://www.ruthe.de/strip/img/strip'.addZero(($i-1)).($i-1).'.jpg')) {
                      $img[$i]="<img src="http://www.ruthe.de/strip/img/strip_".addZero($i).$i.".jpg" />\n";
                      $i++;
                  }
                  while($i>1) {
                       $i=$i-1;
                       echo $img[$i];
                  }
                  ?>

                  lg
                  Joe

              2. Gibt leider eine leere seite aus...

                ...

                while(file_exists('http://www.ruthe.de/strip/img/strip_0001.jpg')) {

                ...
                ein fehler:
                du musst
                while(file_exists('http://www.ruthe.de/strip/img/strip_'.addZero($i).$i.'.jpg')) {
                schreiben

                musst du bei <? vielleicht <?php schreiben?
                schreibt oben mal echo "Hallo" dazu & schau, was dann in der datei steht, dann wissen wir schon mehr ...

                lg
                Joe

                1. danke für den tipp. es wird leider nichts ausgegeben. seite bleibt leer.
                  so werden prima alle 214 cartoons ausgegeben:

                  while($i <= 214) {

                  chimaon

              3. Hi!

                <?

                [...]

                while(file_exists('http://www.ruthe.de/strip/img/strip_0001.jpg')) {
                    echo "<img src="http://www.ruthe.de/strip/img/strip_".addZero($i).$i.".jpg" />\n";
                    $i++;
                }
                ?>

                  
                Für file\_exist() kann nur dann eine URL-Resource angegeben werden, wenn du a) PHP 5 verwendest und b) allow\_url\_fopen in der php.ini auf On steht, was man jedoch aufgrund der dadurch entstehenden Sicherheitslöcher vermeiden sollte. Treffen jedoch beide Bedigungen zu, würde eine Endlosschleife entstehen, da der Ausdruck dann immer TRUE ergeben würde.  
                Da es jedoch gar keine Ausgabe gibt, verwendest du anscheinend PHP 4, da in diesem Fall file\_exists() mit fehlender URL-Wrapper-Unterstützung immer FALSE herausgeben wird.  
                  
                Darüber hinaus lässt sich - wie Anonymous gezeigt hat - gänzlich auf meine addZero()-Funktion verzichten, wenn du es so machst:  
                  
                ~~~php
                  
                  
                $i = 1;  
                  
                while(file_exists('cartoon_'.sprintf('%03d', $i).'jpg')) {  
                    echo "<img src=\"cartoon_".sprintf('%03d', $i).".jpg\" />\n";  
                    $i++;  
                }  
                  
                
                

                Das «%03d» bezeichnet hierbei den sog. Formatierungsstring für sprintf(). Im vorliegenden Beispiel bedeutet das «d», dass der zweite übergebene Parameter $i als Integer behandelt werden soll und das «%03» gibt, an, dass hier mit bis zu drei führenden Nullen aufgefüllt werden soll.

                Grüße,
                Fabian St.

          2. Hi,

            naja, ein fehler fällt mir da noch auf:
            du wirst bei dem script 2 unnötige dateien bekommen
            => . und .. muss man doch noch ausschließen, oder!?!

            . und .. werden AFAIK durch is_file() ausgeschlossen.

            MfG

  2. puts "Hallo " + gets.chomp + "."

    ?> chimon
    => Hallo chimon.

    Welche Funktion kann ich dafür verwenden und wie würde meine Abfrage damit ausshen?

    Dafür eignet sich file_exists() bestens. Der Rest erklärt sich selbst.

    Deine Abfrage (in etwa):

    for($i=1; file_exists("cartoon_".$i.".jpg"); i++)  
    {  
      echo "...";  
    }
    

    Einen schönen Dienstag noch.

    Gruß, Ashura

    --
    Selfcode: sh:( fo:) ch:? rl:( br:^ n4:& ie:{ mo:) va:) de:> zu:) fl:( ss:| ls:[ js:|
    30 Days to becoming an Opera8 Lover -- Day 20: search.ini
    Meine Browser: Opera 8.01 | Firefox 1.0.4 | Lynx 2.8.3 | Netscape 4.7 | IE 6.0
    [Deshalb frei! - Argumente pro freie Software]
    1. Hi Ashura!

      Welche Funktion kann ich dafür verwenden und wie würde meine Abfrage damit ausshen?

      Dafür eignet sich file_exists() bestens. Der Rest erklärt sich selbst.

      Deine Abfrage (in etwa):

      for($i=1; file_exists("cartoon_".$i.".jpg"); i++)

      {
        echo "...";
      }

        
        
      So einfach, wie du es vorgeschlagen hast, funktioniert dies nicht, da die Datei ja cartoon\_0001.jpg und nicht cartoon\_1.jpg heißt, wodurch file\_exists natürlich FALSE zurückliefern würde.  
      Darüber hinaus halte ich while() für angebrachter, da es um eine Iteration geht, deren Ende nicht absehbar ist; dein Konstrukt ginge zwar wahrscheinlich auch, ist aber IMHO vom Stil schlechter.  
        
      Eine Möglichkeit wäre so:  
        
      ~~~php
        
        
      function addZero($nr) {  
          if($nr < 9) {  
              $str = '000';  
          } elseif($nr < 99) {  
              $str = '00';  
          } elseif($nr < 999) {  
              $str = '0';  
          }  
        
          return $str;  
      }  
        
      $i = 1;  
        
      while(file_exists('cartoon_'.addZero($i).$i.'jpg')) {  
          echo "<img src=\"datei_".addZero($i).$i.".jpg\" />\n";  
          $i++;  
      }  
        
      
      

      Zu sagen wäre jedoch noch, dass obiges Beispiel davon ausgeht, dass es keine Lücken zwischen den einzelnen Zahlen gibt.

      Grüße,
      Fabian St.

      1. Hi!

        Kleine Verbesserung:

          
        
        > function addZero($nr) {  
        
              if($nr <= 9) {  
        
        >         $str = '000';  
        
              } elseif($nr <= 99) {  
        
        >         $str = '00';  
        
              } elseif($nr <= 999) {  
        
        >         $str = '0';  
        >    }  
        >   
        >     return $str;  
        > }  
          
        
        

        Grüße,
        Fabian St.

        1. Hi,

          function addZero($nr) {
                if($nr <= 9) {
                  $str = '000';
                } elseif($nr <= 99) {
                  $str = '00';
                } elseif($nr <= 999) {
                  $str = '0';
             }

          else
                   {
                        $str = '';
                   }

          return $str;
          }

            
          alles klar?  
            
          MfG
          
      2. function addZero($nr) {
            if($nr < 9) {
                $str = '000';
            } elseif($nr < 99) {
                $str = '00';
            } elseif($nr < 999) {
                $str = '0';
            }

        return $str;
        }

          
        Du meinst also `sprintf("%03d",$i)`{:.language-php}?  
        
        
        1. Hi!

          Du meinst also sprintf("%03d",$i)?

          Ja, genau :-) Ich sollte mir die ganzen *prinf()-Funktionen mal genauer anschauen... :-/

          Grüße,
          Fabian St.

      3. function addZero($nr) {
            if($nr < 9) {
                $str = '000';
            } elseif($nr < 99) {
                $str = '00';
            } elseif($nr < 999) {
                $str = '0';
            }

        return $str;
        }

        $i = 1;

        warum <9, <99 und <999
        du meinst <=, oder *g*

        lg
        Joe

  3. Hello,

    wie wäre es ggf. mit glob()?

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau