Dynamischer Button [PHP]

Steichner

◄► Wuuuh ◄►
26 August 2012
362
8
Moin,

gibt es bereits ein fertiges Skript welches ich für hier benutzen kann?
Möchte gerne ein paar "Ref-Buttons" in meiner Signatur (natürlich nur 1 pro Anzeige) anzeigen.

Habe mir ein stark vereinfachtest Skript gebastelt. Leider wird das so nicht in der Signatur angezeigt.

PHP:
<?php

$button[] = '<a href="#1" title="Lorem">
                 <img src="gfx/button-xyz.gif" alt="xyz-Button">
             </a>';
$button[] = '<a href="#2" title="Lorem ipsum">
                 <img src="gfx/button-abc.gif" alt="abc-Button">
             </a>';


echo  $button[rand(0, count($button)-1)];

?>

Bin noch ziemlich frisch was PHP angeht.
Ich denke es liegt daran, dass ich es via. example.com/btn/index.php hier in meiner Signatur eingebunden habe. Gibt es hierfür eine Möglichkeit dem Server vorzugaukeln, dass es sich hierbei um eine gif handelt?

Bitte reißt mir nicht den Kopf ab. :mrgreen:
 
Sicherlich, aber das muss dann aber der ausliefernde Webserver machen, per content-mime direktive,
sprich anstatt dem Browser mitzuteilen, jetzt kommt Text (txt/html) bei aufruf der index.php zurück, achtung jetzt kommt Binärdaten (application/gif) allerdings gehört noch eventuell ein zu übermittelter Dateiname und Typ dazu, da .php kein Bild-format ist.

j2c,

jiw
 
Das scheint meinen Wissenshorizont doch etwas zu übersteigen.
Hast du für diesen konkreten Fall ein bisschen Lesestoff für mich?
Oder gar ein Beispiel? :p
 
<?php

// Bilder müssen alle in einem Ordner liege
// alle die selbe Endung haben
// in das Array werden nur die Namen der Bilder geschrieben ohne Endung!
$bilder = array('bild1','bild2','bild3');
$anzahl_der_bilder = count($bilder); // wieviele Bilder im Array sind
$anzeige = rand(0,$anzahl_der_bilder); // zufällig wird ein Bild gezogen, ein ARRAY beginnt bei 0

echo '<img src="BILDERORDNER/'.$anzeige.'.jpg" />'; // Ausgabe des Bildes



?>


Probier das mal aus, sollte genau das machen was du willst.
Sollen die Bilder on-the-fly, sprich erst noch erzeugt werden oder zum Beispiel noch dynamischer Text drauf erscheinen musst du dich weiter einlesen was jiw anschnitt, hast du die Bilder alles fertig gespeichert und willst nur anzeigen reicht das Script oben.

Ist ungetestet.
 
Ja, dass ist doch so ziemlich das selbe wie ich oben habe?!
Allerdings besteht das Problem weiter, dass ich sie nicht beispielsweise so einbinden kann.


[img*]https://www.example.org/pfad/zur.gif[/img]
 
Ja, dass ist doch so ziemlich das selbe wie ich oben habe?!
Allerdings besteht das Problem weiter, dass ich sie nicht beispielsweise so einbinden kann.


[img*]https://www.example.org/pfad/zur.gif[/img]

Dann schreib eine ReWrite-Rule für den Indianer, das er automatisch "https://www.example.org/pfad/zur.gif" auf deine php Datei mappt.

Dein Webserver sucht halt nach der gif-Datei haben tust Du aber nur eine (index.)php-Datei, ergo ein "File not found"-Fehler
 
Auch das habe ich schon veruscht. Allerdings steigt der "Indianer" mit 500 aus.

Code:
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /btn/
RewriteRule ^x.gif$ index.php [R=301,L]

Die .htaccess liegt im Ordner /btn.
 
Im error.log sollte stehen, weshalb die Datei nicht ausgeführt wird ..

typische Fehler: Berechtigungsfehler, falscher User ...
 
Also in der error.log steht nichts besonderes drin.
Hatte noch auf den falschen Ordner gelinkt (/btn/) daraus resultieren stand in der Log, dass der Ordner nicht existiert.

Jetzt wenn ich das Lokal teste, leitet der mich bei dem Aufruf: example.org/lorem/ipsum/x.gif auf example.org/lorem um.


@Hiltwin: Wieso muss ich irgendjemand fragen, wenn ich meine Signatur ändern will?! :p


Ich glaube ich lasse es einfach. :D
 
Also um Grafiken in der Signatur anzuzeigen, musst du diese ja über einbinden. In dem IMG-BBCode kannst du auch nur die URL zu einer Grafik verwenden.
Hier nimmst du dann die URL zu deinem PHP-Script. Und dein PHP-Script gibt die GRAFIK (nicht irgendeinen Text) aus. Also perfekt hierfür wäre z.B. [FONT="Courier New"][url=https://de.php.net/readfile]readfile()[/url][/FONT].
Nun gibt es vermutlich das Problem, dass dann die Ausgabe der PHP-Datei (also die GIF-Grafik) als Text bzw. HTML vom Browser verstanden wird und somit würde man die Binärdaten in Textform sehen und kein Bild.
Hierfür muss man dann - wie es hier auch schon geschrieben wurde - dem Browser sagen, dass sich die Ausgabe nicht um Text handelt, sondern um ein Bild.
Dies funktioniert mit der Funktion [FONT="Courier New"][url=https://de.php.net/header]header()[/url][/FONT], z.B. so: [FONT="Courier New"]header('Content-Type: image/gif')[/FONT].

Also sieht dein Script eher so aus:

[php]
<?php
$button = array();
$button[] = 'gfx/button-xyz.gif';
$button[] = 'gfx/button-abc.gif';

header('Content-Type: image/gif');
readfile($button[rand(0, count($button)-1)]);
?> [/php]
(dies setzt voraus, dass dein PHP-Script in einem Ordner liegt, in dem der [FONT="Courier New"]gfx/[/FONT]-Ordner liegt, sollte alles im gleichen Ordner liegen einfach den Pfad bei dem [FONT="Courier New"]$button[/FONT]-Array anpassen)

Wenn du nun noch möchtest, dass in dem IMG-Tag hier im Forum nicht die PHP-Datei angegeben wird, sondern der Anschein erweckt werden soll, dass es sich um ein GIF-Bild handelt, dann kannst du dies über mod_rewrite beim Apache-Server lösen. Dein Ansatz sah ja schon mal gut aus.
 
Danke chrissel, hab mit ein bisschen hin und her Doktoren, dem Apachen beigebracht (?), was er mit dem Aufruf einer .gif machen soll.

Das wird wahrscheinlich nicht die sauberste Lösung sein, aber es funktioniert zunächst.

PHP:
<?php
    $button = array();
    $button[] = 'a.gif';
    $button[] = 'b.gif';

    header('Content-Type: image/gif');
    readfile($button[rand(0, count($button)-1)]);

?>

Code:
RewriteEngine On
RewriteRule ^(.*).gif$ index.php [NC]

Mit Aufruf via: example.org/btn/lorem.gif

Allerdings stehe ich jetzt vor dem Problem, die passenden Links für die Buttons auszugeben. Konnte ja wie in meinem oberen Versuch, passend zum Button den Link ausgeben.

Wenn ich innerhalb des Arrays die Tags für img und a mit angebe, haut das natürlich nicht hin.

Kannst du mir vielleicht da auch nochmal einen Schubs in die Richtige Richtung geben? :)
 
Technisch keine Chance!

Du kannst zwar so Mätzchen machen, wie dir die IP des Aufrufer zu merken, allersdings bleibt dein Grundproblem bestehen: Du hast zwei separate Request (einen, der das Bild anfordert; einen, der nach dem Klick das Ziel anfordert). Zwischen diesen Requests können Stunden an Zeit vergangen sein und du musst dennoch richtig zuordnen.

Mit Cookies könnte es evtl. klappen, aber da bleibt das Sicherheitsproblem, weil du mit dem Bild ja Kekse streuen willst dann.

Am einfachsten und besten wird wohl eine zeitliche Synchronsiation von Bild und Ziel-URL sein. So bist du unabhängig vom Aufrufer. (Problem, wenn wirklich mal 2 Stunden zwischen View und Click liegen und du jede Stunde wechselt, bleibt natürlich bestehen)
 
Du verwirrst mich etwas.

Wenn ich in der Ausgabe stehen habe. (beispielhaft)

<a href="#"><img src="lorem.gif" alt=""></a> ist es doch egal ob der User sich den Button 1 Minute, 1 Stunde oder einen Tag anguckt oder irre ich mich da etwa?! :think:
 
Durch das readfile() gibst du aber mit deiner PHP-Datei nicht mehr Text aus, sondern direkt das Bild, also genau den Inhalt deiner GIF-Dateien.

Es ist nicht möglich in einer Signatur irgendwelche BBCodes oder auch HTML-Tags dynamisch nachzuladen. Wäre auch ein riesiges Sicherheitsrisiko ;)
Dein IMG-BBCode will nun mal ein Bild anzeigen und versucht halt jegliche Datei die du dort angibst als Bild zu interpretieren.. und wenn du da nun ganz normalen Text schreibst ist das nun mal kein Bild und es kann nichts angezeigt werden.

Ich glaube du verstehst noch nicht so wirklich, was nun
> macht ;)
 
Mhh, gibt es denn noch eine anderen Möglichkeit, den Button darzustellen, ohne es mit readfile() zu tun?
Wie machen denn das diese Signatur anbieter? Dort wird doch bei jedem Neuland eine andere Grafik mit anderem Link angezeigt.
 
Mhh, gibt es denn noch eine anderen Möglichkeit, den Button darzustellen, ohne es mit readfile() zu tun?
Wie machen denn das diese Signatur anbieter? Dort wird doch bei jedem Neuland eine andere Grafik mit anderem Link angezeigt.

Ne, der Link ist immer der gleiche. Es gibt nur z.B. bei größeren Werbeanbietern wo man dann auf seiner eigenen Seite die Werbung packt die Möglichkeit, mittels iFrames (oder auch JavaScript-Code) diese anzuzeigen. Da hat man dann viel mehr Möglichkeiten.
Aber bei Signaturen musst du das am ehesten so machen, wie theHacker erläutert hat.
 
Achso, jetzt wo du es sagst, stimmt. Ist immer nur ein Link (gleicher).

Ja, dass ganze ist mir dann doch zu viel Aufwand für ein kleines Gimmick in meiner Signatur. Vielleicht eines Tages, wenn ich mal zum Profi motiert (falls :D) bin, dann werde ich mich damit dann nochmal beschäftigen.

Anyways, danke für deine Hilfe. :yes: