Druckversion des Themas

Hier klicken um das Topic im Orginalformat anzusehen

HTML-Editor phase 5 Support _ HTML _ Bild einfügen mit PHP-Script

Geschrieben von: Conny 03.02.2008 - 9:28

Moin Gemeinde,

ist es möglich beim laden einer Seite jedesmal wenn die Seite erneut aufgerufen wird ein anderes Titelbild zu laden?

Ich stelle mich das also so vor, daß es einen Ordner mit -sagen wir mal- 20 verschiedene, aber gleich große Bilder gibt.
Jedes mal wenn eine Seite aufgerufen wird sucht sich das Script wahllos -oder nach einem bestimmten Muster- ein Bild aus diesem Ordner aus, welches dann mit geladen wird.

Es geht hier reell um einem Bild im Header-Bereich einer Seite. Der Header ist auf allen Seiten dieser Webseite gleich und wird durch einen PHP-Include in der jeweiligen Seite geladen.
Nun soll sich also in diesem Header das Titelbild beim Aufruf einer nächsten Seite ändern...

Die Seite ist noch in der Entwicklung, eine erste Probe ist dennoch online: http://www.reitschule-beck.de/web-verein/home.php

cu
Conny

Geschrieben von: Andreas 03.02.2008 - 10:09

ZITAT(Conny @ 03.02.2008 - 9:28) *
ist es möglich beim laden einer Seite jedesmal wenn die Seite erneut aufgerufen wird ein anderes Titelbild zu laden?
*g* Wollte ich für meine Seite auch desöfteren schon mal basteln, war aber immer zu bquem.

Im Prinzip ist das sogar einfach. Du legst die Bilder in einen Ordner, liest dieses Verzeichnis in ein Array ein und wählst per Zufall ein Bild aus. Wenn ich nachher noch Lust habe, versuche ich das mal.

[edit] Kurz gesucht: Hier http://www.mediengestalter.info/forum/10/bilder-wechseln-bei-erneutem-seitenaufruf-shuffle-79656-1.html sind anscheinend brauchbare Lösungsansätze zu finden.

Gruß

Andreas

Geschrieben von: Conny 03.02.2008 - 20:57

Hi,

habe auch mal ein Wenig gesucht, habe auch einiges gefunden, meistens alles zu viel, zu groß, zu viele Features.

Habe dann aber ein Script zusammen 'gestript' bis zur winzig Größe.
Das Ergebnis ist wie folgt:
Ordner anlegen in der die Bilder die gewechselt werden liegen.
Diese Bilder durchnummerieren ( 1.jpg, 2.jpg usw.)
Das Script im gleichen Ordner ablegen und auf der Seite per include aufrufen.

Scriptinhalt ist wie folgt:

QUELLTEXT
<?php

// Zahl der Bilder die sich im Ordner befinden
$total = "3";
$file_type = ".jpg";

// Pfad zum Ordner
$image_folder = "pics/headers";
$start = "1";
$random = mt_rand($start, $total);
$image_name = $random . $file_type;
echo "<IMG SRC=\"$image_folder/$image_name\" ALT=\"$image_name\" />";
?>


Lokal funktioniert es schon mal smile.gif

cu
Conny

Geschrieben von: Thomas 03.02.2008 - 21:48

Die einzige Optimierung wäre noch, den Verzeichnisinhalt dynamisch einzulesen, dann könntest du die möglichen Bilder einfach durch die Dateien im Verzeichnis festlegen und müsstest nicht zusätzlich das Skript ändern, wenn du z. B. ein weiteres Bild anzeigen möchtest. Auch wären die Dateinamen wahlfrei.

So wie du es jetzt machst, ist es übrigens egal, wo das Skript liegt, da der Bilderpfad unabhängig vom Skriptpfad festgelegt wird.

Um noch eine neue Idee in den Ring zu werfen: Du könntest das Skript auch das Bild selbst zurückliefern lassen (mittels Dateiauslesen und header()).

Geschrieben von: Conny 03.02.2008 - 23:29

ZITAT(Thomas @ 03.02.2008 - 21:48) *
Die einzige Optimierung wäre noch, den Verzeichnisinhalt dynamisch einzulesen, dann könntest du die möglichen Bilder einfach durch die Dateien im Verzeichnis festlegen und müsstest nicht zusätzlich das Skript ändern, wenn du z. B. ein weiteres Bild anzeigen möchtest. Auch wären die Dateinamen wahlfrei.

DAS wäre sicherlich eine Optimierung!
Aber da setzt Du bei mir vllt. zuviel voraus blush.gif

ZITAT(Thomas @ 03.02.2008 - 21:48) *
So wie du es jetzt machst, ist es übrigens egal, wo das Skript liegt, da der Bilderpfad unabhängig vom Skriptpfad festgelegt wird.

Ja, ist es auch, der Übersichtlichkeit halber habe ich das für mich so festgelegt, um alles beisammen zu haben.

ZITAT(Thomas @ 03.02.2008 - 21:48) *
Um noch eine neue Idee in den Ring zu werfen: Du könntest das Skript auch das Bild selbst zurückliefern lassen (mittels Dateiauslesen und header()).

huh.gif ?

cu
Conny

Geschrieben von: Thomas 04.02.2008 - 9:17

ZITAT(Conny @ 03.02.2008 - 23:29) *
ZITAT(Thomas @ 03.02.2008 - 21:48) *
Die einzige Optimierung wäre noch, den Verzeichnisinhalt dynamisch einzulesen, dann könntest du die möglichen Bilder einfach durch die Dateien im Verzeichnis festlegen und müsstest nicht zusätzlich das Skript ändern, wenn du z. B. ein weiteres Bild anzeigen möchtest. Auch wären die Dateinamen wahlfrei.
DAS wäre sicherlich eine Optimierung!
Aber da setzt Du bei mir vllt. zuviel voraus blush.gif

Also auf die Schnelle:
QUELLTEXT
<script language="php">
  $pth = 'absoluter/Pfad/zu/den/Bildern';
  $img_names = array();
  if ($handle = opendir($pth)) {
    while (FALSE !== ($file = readdir($handle))) {
      if ($file != "." && $file != ".." && !is_dir($pth.'/'.$file) && preg_match('/\\.jpg$/',$file)) {
        $img_names[] = $file;
      }
    }
    closedir($handle);
  }
</script>
So müsstest du alle Dateien aus dem Verzeichnis $pth, die die Endung '.jpg' besitzen, im Array $img_names haben. Du kannst auch mal prüfen, ob die Funktion http://de3.php.net/manual/de/function.glob.php auf deinen Systemen verfügbar ist, dann ginge es noch einfacher.

ZITAT(Conny @ 03.02.2008 - 23:29) *
ZITAT(Thomas @ 03.02.2008 - 21:48) *
Um noch eine neue Idee in den Ring zu werfen: Du könntest das Skript auch das Bild selbst zurückliefern lassen (mittels Dateiauslesen und header()).
huh.gif ?

Auch auf die Schnelle:
QUELLTEXT
<script language="php">
  $img = [zufällig erzeugter Dateiname];
  header('Content-type: image/jpeg');
  readfile(path_loc($img));
</script>

Dieses Skript kannst du dann direkt im IMG-Tag einbinden:
QUELLTEXT
<img src="pfad/zum/skript/skript.php" alt="Zufallsbild" border="0">

Den Code habe ich mir jetzt mal spontan von der Seele geschrieben wink.gif, es könnten also eventuell noch kleinere Macken drin sein, aber ich denke, die grundsätzlichen Ideen kann man erkennen.

Geschrieben von: Auge 04.02.2008 - 21:17

ZITAT(Thomas @ 04.02.2008 - 9:17) *
QUELLTEXT
<script language="php">
   $img = [zufällig erzeugter Dateiname];
   header('Content-type: image/jpeg');
   readfile(path_loc($img));
</script>

Den Code habe ich mir jetzt mal spontan von der Seele geschrieben wink.gif , es könnten also eventuell noch kleinere Macken drin sein ...

Die größte dürfte sein, dass der Code wegen deiner Umfassung mit <script>...</script> ohne Anpassungen auf den wenigsten Servern laufen wird. Die kompatibelste Angabe, die höchstwahrscheinlich überall funktioniert, ist <?php ... ?>. Benutzt du <script type="text/php">...</script> wirklich im produktiven Einsatz?

Tschö, Auge

Geschrieben von: Thomas 04.02.2008 - 22:08

ZITAT(Auge @ 04.02.2008 - 21:17) *
Benutzt du <script type="text/php">...</script> wirklich im produktiven Einsatz?

Nö - ich benutze <script language="php">...</script>. Und nur wenn ich kleine Code-Schnipsel einbinde, auch mal <?php ... ?>. Beides ohne Probleme. Was spricht gegen die erste Variante?

Geschrieben von: Conny 05.02.2008 - 9:27

Moin,

mich hat <script language="php">...</script> auch etwas überrascht;
benutze selbst ausschließlich <?php ... ?> sowohl bei ausgelagerte Dateien, als auch bei eingebundenen Schnipsel.

Habe aber dennoch erfolglos beides ausprobiert...
Ich bekam weder ein Bild noch eine Fehlermeldung; bin also erst mal bei meiner 'simple' Variante geblieben.

cu
Conny

Geschrieben von: Thomas 05.02.2008 - 9:56

ZITAT(Conny @ 05.02.2008 - 9:27) *
mich hat <script language="php">...</script> auch etwas überrascht;
benutze selbst ausschließlich <?php ... ?> sowohl bei ausgelagerte Dateien, als auch bei eingebundenen Schnipsel.

Wie du der http://www.php.net/manual/de/language.basic-syntax.php entnehmen kannst, sind beide Varianten gültig und ich wüsste auch nicht, was gegen die Verwendung der einen oder anderen sprechen sollte. Vielleicht kann Auge noch erhellendes beitragen, aber bis dahin lege ich mich einmal fest, dass es keinerlei Grund gibt, wegen dieser beiden Tags beunruhigt zu sein. Sie funktionieren beide. Zumindest in sämtlichen mir bekannten Umgebungen.

ZITAT(Conny @ 05.02.2008 - 9:27) *
Ich bekam weder ein Bild noch eine Fehlermeldung; bin also erst mal bei meiner 'simple' Variante geblieben.

Da war dann tatsächlich noch eine kleine Macke im Beispielskript, die man eventuell übersehen konnte. Da ich unter verschiedensten Umgebungen und auch mit virtuellen Servern arbeite, habe ich unter anderem einige Funktionen, die mir Pfade verarbeiten. path_loc() aus dem Beispiel z. B. erzeugt mir den aktuellen lokalen Pfad aus einem Web-Pfad und war in dem Skript, aus dem ich den Schnipsel rauskopiert habe, angebracht. Diese Funktion gibt es aber bei dir nicht und sofern du den Code eins zu eins übernommen hast, kann er nicht funktionieren. Auch eine Fehlermeldung wirst du nicht erhalten, da das Skript dann einfach eine ungültige Grafik zurückliefert. Erzeuge also eine Datei bild.php und schreibe da rein:

QUELLTEXT
<script language="php">
  header('Content-type: image/gif');
  readfile('/absoluter/lokaler/pfad/zu/einem.gif');
</script>

Statt des absoluten Pfades zur Grafik kannst du auch den Pfad relativ zu diesem PHP-Skript verwenden. Dann ruf das Skript über deinen lokalen Webserver im Browser auf und du wirst ein Bild sehen. Habe es gerade nochmal ausprobiert, es funktioniert definitiv.

Geschrieben von: Conny 05.02.2008 - 12:40

ZITAT(Thomas @ 05.02.2008 - 9:56) *
... ich wüsste auch nicht, was gegen die Verwendung der einen oder anderen sprechen sollte.

Ich auch nicht! smile.gif Ich bin nur nicht mit dieser Art PHP zu notieren vertraut gewesen, that's all.

ZITAT(Thomas @ 05.02.2008 - 9:56) *
... path_loc() aus dem Beispiel z. B. erzeugt mir den aktuellen lokalen Pfad aus einem Web-Pfad und war in dem Skript, aus dem ich den Schnipsel rauskopiert habe, angebracht. Diese Funktion gibt es aber bei dir nicht und sofern du den Code eins zu eins übernommen hast, kann er nicht funktionieren. Auch eine Fehlermeldung wirst du nicht erhalten, da das Skript dann einfach eine ungültige Grafik zurückliefert.


Ja, so war's, ich habe es eins zu eins übernommen, der Grund warum es nicht geht/ging ist nun verstanden, Danke

ZITAT(Thomas @ 05.02.2008 - 9:56) *
.....es funktioniert definitiv....

Ja, mit dieser Code geht es problemlos.

cu
Conny

Geschrieben von: Auge 05.02.2008 - 16:27

ZITAT(Thomas @ 04.02.2008 - 22:08) *
ZITAT(Auge @ 04.02.2008 - 21:17) *
Benutzt du <script type="text/php">...</script> wirklich im produktiven Einsatz?

Nö - ich benutze <script language="php">...</script>. Und nur wenn ich kleine Code-Schnipsel einbinde, auch mal <?php ... ?>. Beides ohne Probleme. Was spricht gegen die erste Variante?

Ich habe die Einbindung mit <script>...</script> mit der Variante mit ASP-Tags <% ... %> verwechselt. Die Letztere ist auf Shared-Hosting-Servern oft (fast immer) abgeschaltet. Da du der erste bist, der die <script></schript>-Schreibweise praktisch einsetzt und ich der Verwechslung mit <% ... %> anheimfiel, fragte ich nach.

Öfter bekommt man die Kurz- bzw. SGML-Schreibweise <? ... ?> zu sehen, die spätestens bei XHTML wegfällt. Die letzte, die XML-Variante <?php ... ?>, ist, meiner Erfahrung nach, praktisch immer an. Weshalb ich sie auch ausschließlich verwende.

Tschö, Auge

Geschrieben von: Thomas 05.02.2008 - 17:25

ZITAT(Auge @ 05.02.2008 - 16:27) *
Da du der erste bist, der die <script></schript>-Schreibweise praktisch einsetzt und ich der Verwechslung mit <% ... %> anheimfiel, fragte ich nach.

Öfter bekommt man die Kurz- bzw. SGML-Schreibweise <? ... ?> zu sehen, die spätestens bei XHTML wegfällt. Die letzte, die XML-Variante <?php ... ?>, ist, meiner Erfahrung nach, praktisch immer an.

Hängt eventuell damit zusammen, dass ich PHP schon verwendet habe als es noch PHP/FI hieß, da gab es die <?php ... ?>-Form glaube ich noch nicht wink.gif. Dennoch sollten beide Versionen überall funktionieren, denn normalerweise wird doch der PHP-Parser anhand der Dateiendung auf das Skript losgelassen. Und der Parser erkennt definitiv immer beide Versionen. Und solange der Parser nicht drübergelaufen ist, muss es kein gültiges HTML/XHTML/XML oder sonstwas sein. Immer erst nachher. Und dann sind die Tags eh weg. Oder versteh ich da was falsch?

Geschrieben von: db 05.02.2008 - 17:57

ZITAT(Thomas @ 05.02.2008 - 17:25) *
...
Und der Parser erkennt definitiv immer beide Versionen.
...


Tut er nicht Thomas - und das ist gut so.

Die "Sprach Option Short-Tags" <? ?> ist tatsächlich eine solche. Und man kann sich das zunutze machen. Auf meinem lokalen Server werden die Short-Tags <? ?> nicht als PHP interpretiert. So ist es leicht möglich, Funktionen die lokal eben nicht ausgeführt werden sollen, einfach zu excluden.

Konstrukte wie
<?PHP if (!$go) { ?>
html
<?PHP } ?>

sind mit Short-Tags nicht möglich!

Deine Notationsweise mit &lt;script hat auch einen Vorteil: Keine kryptischen Anzeigen im Browser, wenn php nicht eingebunden ist.

Geschrieben von: Thomas 05.02.2008 - 18:15

ZITAT(db @ 05.02.2008 - 17:57) *
ZITAT(Thomas @ 05.02.2008 - 17:25) *
... Und der Parser erkennt definitiv immer beide Versionen. ...
Tut er nicht Thomas - und das ist gut so.

Es ging da um <script language="php">...</script> und <?php ... ?>. Die werden immer erkannt.
<? ... ?> und <% ... %> hingegen kann man über die Konfigurationsdatei ein- bzw. ausschalten.

ZITAT(db @ 05.02.2008 - 17:57) *
Auf meinem lokalen Server werden die Short-Tags <? ?> nicht als PHP interpretiert. So ist es leicht möglich, Funktionen die lokal eben nicht ausgeführt werden sollen, einfach zu excluden.

Das kann man in dieser Richtung durchaus machen, sofern man sicher weiß, dass auf allen Produktivsystemen Short-Tags aktiviert sind - ich bin da vorsichtig, Provider machen oft die tollsten Sachen blink.gif. Ich persönlich stelle im Skript fest, auf welchem Server ich mich befinde und handle dann entsprechend, indem ich z. B. serverabhängige PHP-Skripte einbinde.

ZITAT(db @ 05.02.2008 - 17:57) *
Konstrukte wie
<?PHP if (!$go) { ?>
html
<?PHP } ?>

sind mit Short-Tags nicht möglich!

Wenn Short-Tags aktiviert sind, sollte auch
QUELLTEXT
<? if (!$go) { ?>
  html
<? } ?>
gehen. Zumindest bei mir funktionierts. Oder meinst du etwas anderes?

Geschrieben von: db 05.02.2008 - 18:32

ZITAT(Thomas @ 05.02.2008 - 18:15) *
...
Wenn Short-Tags aktiviert sind, sollte auch
QUELLTEXT
<? if (!$go) { ?>
  html
<? } ?>
gehen. Zumindest bei mir funktionierts. Oder meinst du etwas anderes?


Nee, ich meine das selbe wie du. Aber du schriebst ja bereits, wenn Short-Tags ....

So ist es eben, man muss wissen, ob der Hoster short_open_tag nicht auf false setzte, default = true.
(Auge wies bereits auf XML in diesem Zusammenhang hin.)

Ob auf dem Web-Server Short-Tags erlaubt sind ist mir egal. Das wird schon vorher vom Encoder erledigt.

Geschrieben von: Auge 11.02.2008 - 2:52

Hallo

ZITAT(Thomas @ 05.02.2008 - 17:25)
Hängt eventuell damit zusammen, dass ich PHP schon verwendet habe als es noch PHP/FI hieß, da gab es die <?php ... ?>-Form glaube ich noch nicht wink.gif . Dennoch sollten beide Versionen überall funktionieren, denn normalerweise wird doch der PHP-Parser anhand der Dateiendung auf das Skript losgelassen. Und der Parser erkennt definitiv immer beide Versionen. Und solange der Parser nicht drübergelaufen ist, muss es kein gültiges HTML/XHTML/XML oder sonstwas sein. Immer erst nachher. Und dann sind die Tags eh weg. Oder versteh ich da was falsch?

Die Deklaration einer XML-Datei sieht folgendermaßen aus: http://de.selfhtml.org/html/xhtml/unterschiede.htm#xml_deklaration. Wie man sieht, beginnt sie mit <?, was bei einer XML-Datei, die mit dem short-open-tag eröffnete PHP-Bereiche enthält, dazu führt, dass sich der PHP-Parser an dieser Stelle verschluckt. Er nimmt ja an, dass ein PHP-Block geöffnet wird, doch dessen erste "innenliegende" Zeichen (xml) lösen bereits einen Parse Error aus. Deshalb muss der open-tag weitere vereinbarte Zeichen enthalten, hier praktischerweise den Namen der Sprache (php).

Das Problem fiele natürlich weg, wenn das Skript keine fertigen XML-Bereiche enthielte, sondern diese auschließlich selbst erzeugte.

ZITAT(db @ 05.02.2008 - 18:32) *
Ob auf dem Web-Server Short-Tags erlaubt sind ist mir egal. Das wird schon vorher vom Encoder erledigt.

Man lasse der Einfachheit halber die Finger von ihnen und sich das Problem am Allerwertesten vorbeigehen. wink.gif

Tschö, Auge

Unterstützt von Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)