MuGo: Zufälliges Bild einbinden klappt nicht wirklich...

Hallo,

ich bin Noob und habe ein Problem, Zufallsbilder einzubinden.

Nachdem ich mich im Forum ein bisschen umgesehen habe, habe ich mich entschlossen, das Random Image Script von Matt Mullenweg zu benutzen. Allerdings habe ich keinerlei Ahnung von PHP und kann daher nur Dank rudimentärer C-Kenntnisse ungefähr erahnen, was da wohl vor sich geht.

Deswegen habe ich den Skript einfach 1:1 in ein txt-Dokument eingefügt, das ganze in ein .php-Dokument umgewandelt und dieses wie empfohlen in den Ordner mit den Bildern eingefügt. Um auch wirklich ganz sicher zu gehen, habe ich nicht einmal die Kommentare entfernt, um dabei nicht aus Versehen doch etwas entscheidendes zu löschen.

Nur leider hat das ganze bei mir keinerlei Effekt. Außer einem schönen Default-Rahmen mit Alternativ-Text ist auf der Website nichts zu sehen. Ich schätze jetzt einfach mal, dass irgendwas an der PHP-Datei oder im Skript nicht stimmt. An den Bildern sollte es nicht liegen, das sind GIFs.

Leider habe ich dazu im Forum nichts gefunden, was mir wirklich weitergeholfen hätte, da ich immer nur alternative Skripte gefunden habe. Aber an den Skripten selber scheint es nicht zu liegen...

Sollte es allerdingd schon eine tolle Step-by-Step-Anfänger-Erklärung gibt, wie man Zufallsbilder einbinden kann (und wo man welchen Skript einfügt), würde ich mich auch über diesen Link freuen!

Hier ist das Skript, wie es in der PHP-Datei steht:

<?php  
/*  
By Matt Mullenweg > http://photomatt.net  
Inspired by Dan Benjamin > http://hiveware.com/imagerotator.php  
Latest version always at:  
http://photomatt.net/scripts/randomimage  
*/// Make this the relative path to the images, like "../img" or "random/images/".  
// If the images are in the same directory, leave it blank.  
$folder = '';  
  
// Space seperated list of extensions, you probably won't have to change this.  
$exts = 'jpg jpeg png gif';  
  
$files = array(); $i = -1; // Initialize some variables  
if ('' == $folder) $folder = './';  
  
$handle = opendir($folder);  
$exts = explode(' ', $exts);  
while (false !== ($file = readdir($handle))) {  
foreach($exts as $ext) { // for each extension check the extension  
if (preg_match('/\.'.$ext.'$/i', $file, $test)) { // faster than ereg, case insensitive  
$files[] = $file; // it’s good  
++$i;  
}  
}  
}  
closedir($handle); // We’re not using it anymore  
mt_srand((double)microtime()*1000000); // seed for PHP < 4.2  
$rand = mt_rand(0, $i); // $i was incremented as we went along  
  
header('Location: '.$folder.$files[$rand]); // Voila!  
?>

Die Ordnerstruktur auf der Website ist so aufgebaut, dass die Seite mit den Zufallsbildern zwei Ebenen über dem Ordner ist, der die Bilder und rotate.php enthält. Der von mir gesetzte Link lautet:

<img src="./assets/Partner/rotate.php" alt="Unsere Partner">

Ich bin über jeden Hinweis dankbar!

  1. Hallo

    soweit kann ich keinen Fehler erkennen.
    Tipp doch mal

      
    echo ($folder.$files[$rand]);exit;  
    
    

    in die Zeile vor der Zeile mit "header....".

    Das Skript sollte den Ordnernamen und den Namen des auszugebenden Bildes anzeigen und dann abbrechen.
    Was erhältst Du für eine Ausgabe?

    Gruß vom foomaker

    --
    Natürlich glaube ich an die Existenz von Ausserirdischen. Schliesslich gibt es ja auch das PERFEKTE SCRIPT.
    1. Das Skript sollte den Ordnernamen und den Namen des auszugebenden Bildes anzeigen und dann abbrechen.
      Was erhältst Du für eine Ausgabe?

      Hm, höchst Interessant: Da steht gar nichts! Nur der schöne Rahmen mit dem roten Kreuz... Da gehe ich doch bestimmt richtig in der Annahme, dass das Skript überhaupt nicht ausgeführt wird, oder?

      (Sofern ich das jetzt richtig verstanden habe: Ich habe das PHP-Skript entsprechend geändert und dann die Seite, in die es eingebunden ist, aktualisiert. Alt-Text hab ich rausgeschmissen)

      1. Hi,

        Das Skript sollte den Ordnernamen und den Namen des auszugebenden Bildes anzeigen und dann abbrechen.
        Was erhältst Du für eine Ausgabe?

        Hm, höchst Interessant: Da steht gar nichts! Nur der schöne Rahmen mit dem roten Kreuz...

        Das deutet darauf hin, dass die Daten vom Browser nicht als Bilddaten interpretiert werden können - zum Beispiel, weil PHP-Fehlermeldungen drinstehen.

        Da gehe ich doch bestimmt richtig in der Annahme, dass das Skript überhaupt nicht ausgeführt wird, oder?

        Nein.

        Sofern ich das jetzt richtig verstanden habe: Ich habe das PHP-Skript entsprechend geändert und dann die Seite, in die es eingebunden ist, aktualisiert.

        Kommentierte den Aufruf der Funktion header aus, und rufe dann das Script auf, in dem du seine Adresse direkt in die Adresszeile deines Browsers eingibst.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
  2. Hallo MuGo,

    ... logo Bilder sind Soft(weich)ware und können gar nicht klappern!

    Weiterhin hat das vorgestellte Script eine Unschönheit:

    • es gibt keine Daten aus, sondern sendet einen Redirekt
    • verschiedene Browser reagieren darauf unterschiedlich

    Es geht auch einfacher (und in deutsch):

    <?php /* Zufallsbild Typ "Aschenputtel" (c) 2009 by Rolf */  
    $FS = array();  /*------------------------ das Töpfchen */  
    $handle = opendir('./');  /*-------------- öffne den eigenen Ordner */  
    while($file = readdir($handle)) {  /*----- lese solange es was zu lesen gibt */  
        $AA = @getimagesize($file);  /*------- teste gelesenes auf Image */  
        if (isset($AA[3])) {  
            $FS[] = $file;  /*---------------- die Guten ins Töpchen */  
        }  
    }  
    closedir($handle); /*--------------------- schliesse Ordner */  
    $rand = mt_rand(0, (count($FS) - 1)); /*-- ermittle Zufallszahl */  
    $AA = getimagesize($FS[$rand]);  /*------- MimeType ermitteln */  
    header('Content-Type: '.$AA['mime']);  
    header('Content-Length: '.filesize($FS[$rand]));  
    readfile($FS[$rand]);  
    ?>
    

    Dieses Script kannst Du so wie ein Bild einbinden.
    Es sendet alle notwendigen Header und Daten an den Browser.

    schönen Abend noch

    Gruss Rolf

    1. Hello,

      ich habe das mal für etwas modernere PHPs umgeschrieben:

      <?php   #### zufallsbild.php ####

      $_files = glob('*.{jpg,png,gif}', GLOB_BRACE);
        if (count($_files) == 0) exit;
        shuffle($_files);

      foreach( $_files as $filename )
        {
            if (false !== ($_imginfo = getimagesize($filename)))
            {
                header('Content-Type: '.$_imginfo['mime']);
                readfile($filename);
                exit;
            }
        }

      ?>

      Und so funktioniert es:

      $_files = glob('*.{jpg,png,gif}',GLOB_BRACE);

      Mit der glob()-Funktion werden im der Variable $_files alle Dateinamen[1] gesammelt, auf die das angegebene Muster passt. Duch die Variante GLOB_BRACE werden hier alle Files mit den Endungen '.jpg', '.png' und '.gif' gesucht.

      Wenn keine passenden Files vorhanden waren, wird das Script abgebrochen. Man sollte dann ggf. noch einen passenden Header zurückgegen, das für die Response kein Inhalt vorhanden ist.

      Mit shuffle() wird das Array mit den Dateinamen gemischt.

      In der foreach()-Scheife wird Eintrag für Eintrag mit getimagesize() geprüft, ob sich hinter dem gefundenen Dateinamen wirklich ein Bild verbirgt. Wenn es ein Bild ist, wird der passende Mime-Header dafür ausgegeben und der dateiinhalt ausgelesen. Das Script wird dann beendet.
      Hat es sich nicht um ein Bild gehandelt, oder ist dieses nicht lesbar, wird der nächste Name ausprobiert. Dies geht solange, bis der Dateiname zu einem Bild gehört, oder kein Name mehr in der Liste vorhanden ist.

      Glob findet hier allerdings nur die Files mit den Endungen, genauso wie sie hier geschrieben wurden, ist also casesensitive.

      [1] Dateinamen, Verzeichnisnamen, Links, ...

      Liebe Grüße aus Syburg

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hai Tom,

        ich habe das mal für etwas modernere PHPs umgeschrieben:

        dankeschön,
        werde ich sofort archivieren,
        und wenn die Provider das "modernere PHP" dann mal verwenden sollten,
        hole ich Dein inzwischen "veraltetes Script" aus der Ablage ... ;-)

        Du hast aber noch vergessen, dem Blümchen zu erzählen, dass glob();
        so modern ist, dass es auf einigen Systemen noch gar nicht funktioniert.
        Es ist IMHO nicht hilfreich, diese Information einem Noob vorzuenthalten.

        m.b.G. Rolf

        1. [latex]Mae  govannen![/latex]

          werde ich sofort archivieren,
          und wenn die Provider das "modernere PHP" dann mal verwenden sollten,

          Das tun sie schon, ausnahmslos. Anbieter, die immer noch nicht auf PHP 5 umgestellt haben, obwohl der Support für PHP 4 bereits seit einiger Zeit eingestellt ist, haben keinerlei Relevanz und dürfen ignoriert werden. Dies wiederum bestätigt die Gültigkeit des ersten Satzes ;)

          Du hast aber noch vergessen, dem Blümchen zu erzählen, dass glob();
          so modern ist, [...]

          Jo. Dezember 2002. Wirklich *außerordentlich* modern.

          Ob es noch öffentlich zugängliche (im Sinne von Hoster) und relevante Systeme gibt, die glob() nicht kennen?

          Cü,

          Kai

          --
          „It's 106 miles to Chicago, we got a full tank of gas, half a pack of cigarettes, it's dark, and we're wearing sunglasses“.
          „Hit it!“
          Selfzeugs
          SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
      2. Vielen Dank für Funktion und ausführliche Erklärung. Allerdings funzen weder deine noch Rolfs Version. Ich war zwischendurch sogar schon am Zweifeln, ob überhaupt PHP auf dem Server installiert ist, aber die Infodatei sagt, dass dem so ist.

        Was habe ich gemacht? Ich habe die Funktion genommen, anstatt der Zeile mit dem Imageaufruf in meine HTML-Datei eingesetzt und aktualisiert. Testweise habe ich das ganze in einem Unterverzeichnis nur mit der Seite und einigen Bildern gemacht. Trotzdem ist die Reaktion gleich Null. Gibt es noch etwas, was man bei PHP beachten muss, so eine ganz elementare Sache, wie die, dass PHP nicht lokal getestet werden kann? Es ist doch seltsam, dass gar keine Funktion funktionieren will...

        1. Hello,

          Vielen Dank für Funktion und ausführliche Erklärung. Allerdings funzen weder deine noch Rolfs Version. Ich war zwischendurch sogar schon am Zweifeln, ob überhaupt PHP auf dem Server installiert ist, aber die Infodatei sagt, dass dem so ist.

          Was habe ich gemacht? Ich habe die Funktion genommen, anstatt der Zeile mit dem Imageaufruf in meine HTML-Datei eingesetzt und aktualisiert.

          also so?

          <img src="zufallsbild.php" alt="eine zufällige Bildauswahl" />

          Sonst klappt es natürlich nicht besonders gut.

          Und denke daran, dass glob() leider nur casesensitive arbeitet. Also muss die Suchzeile ggf.

          $_files = glob('*.{jpg,Jpg,JPG,png,Png,PNG,gif,Gif,GIF}',GLOB_BRACE);

          so lauten.

          Liebe Grüße aus Syburg

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. also so?

            <img src="zufallsbild.php" alt="eine zufällige Bildauswahl" />

            Sonst klappt es natürlich nicht besonders gut.

            Nein, nicht so - das war mein Fehler! Ich habe da frisch, fromm, fröhlich, frei einfach den Code in die html-Datei geklatscht. Jetzt habe ich das ganze nochmal ausprobiert und alles funktioniert einwandfrei!

            Vielen herzlichen Dank, jetzt habe ich das ganze durchblickt. Ich wusste doch, dass ich irgendwo einen ganz kapitalen Bock geschossen habe, der so offensichtlich ist, dass ihn kein Experte jemals vermuten würde!^^

            Wieder was gelernt! Ganz herzlichen Dank für eure Mühe!