Wowbagger: aufruf eines textcounters ohne SSI

Hallo Forumsgemeinde,

als Perl-anfänger versuche ich mich gerade an versch. 'Hallo-Welt-Programmen', momentan an einem einfachen textcounter. Ich habe an versch. stellen gelesen, daß man sowas ganz einfach über SSI-exec in eine HTML seite einbinden kann.
Ich frage mich nun aber, ob es generell eine andere möglichkeit der anbindung gibt. Geht sowas überhaupt, oder ist es ohne SSI völlig unmöglich?

Danke und bis denn dann...
/*,*/
Wowbagger

  1. Hallo Forumsgemeinde,

    als Perl-anfänger versuche ich mich gerade an versch. 'Hallo-Welt-Programmen', momentan an einem einfachen textcounter. Ich habe an versch. stellen gelesen, daß man sowas ganz einfach über SSI-exec in eine HTML seite einbinden kann.
    Ich frage mich nun aber, ob es generell eine andere möglichkeit der anbindung gibt. Geht sowas überhaupt, oder ist es ohne SSI völlig unmöglich?

    Danke und bis denn dann...
    /*,*/
    Wowbagger

    Mit Scripten wie Perl oder PHP3 gehts ganz easy. Einfach bei jedem Seitenaufruf den aktuellen Counterstand aus einer lokal auf dem Server liegenden Datei lesen, inkrementieren und wieder speichern.. fertig ;). Natürlich gäbe es da dann noch so Überlegungen wie einmalige IP und Reload-Sperre...

    Gruss,
      David

    1. Hallo David

      Mit Scripten wie Perl oder PHP3 gehts ganz easy. Einfach bei jedem Seitenaufruf den aktuellen Counterstand aus einer lokal auf dem Server liegenden Datei lesen, inkrementieren und wieder speichern.

      Aha, und wie rufst du das Script beim Laden der statischen HTML-Seite auf? Und wie kommt der aktuelle Counterstand zur Anzeige in der HTML-Datei an einer bestimmten Stelle? Mit PHP3 mag das gehen, weil es in HTML eingebettet ist. Aber mit einem herkoemmlichen Perlscript eben nicht, deswegen gibt es ja die SSI-Geschichten.

      viele Gruesse
        Stefan Muenz

      1. Oops, sorry Stefan und Wowbagger..

        da mich meine Unkenntnis über Perl wohl wieder in ein Fettnäpfchen treten lassen ;). Stefan, du hast Recht: mit PHP gehts in der Tat ganz fürchterlich einfach ;).

        Gruss,
          David

        PS: Beweis:  ;o)

        <HTML><HEAD><TITLE>Counter-Test</TITLE></HEAD><BODY>
        <?

        $counter = 1;
          // read
          if (file_exists("counter.txt")) {
            $fp = fopen("counter.txt", "r");
            $counter = intval(fgets($fp, 255)) + 1;
            fclose($fp);
          }

        // write
          $fp = fopen("counter.txt", "w");
          fputs($fp, $counter);
          fclose($fp);

        ?>
        <B>Schon <? echo $counter; ?> Besucher hier.</B>
        </BODY></HTML>

    2. Hi David,

      Mit Scripten wie Perl oder PHP3 gehts ganz easy. Einfach bei jedem Seitenaufruf den aktuellen Counterstand aus einer lokal auf dem Server liegenden Datei lesen, inkrementieren und wieder speichern.. fertig ;).

      ...
      oops, da hast du mich jetzt ein wenig mißverstanden...
      Ich hab' schon 'ne ziemlich konkrete vorstellung, wie ich das in Perl programmiere, nur wie ich dann dieses script _ohne_ die hilfe eines SSI-befehl aus einer HTML seite heraus aufrufen kann ist mir völlig unklar.

      Ich wollte nur wissen, ob jemand vielleicht eine alternative kennt ('mal abgesehen von PHP, was ja wieder 'ne völlig andere geschichte ist...)

      so long...
      /*,*/
      Wowbagger

      1. Hi,

        Ich hab' schon 'ne ziemlich konkrete vorstellung, wie ich das in Perl programmiere, nur wie ich dann dieses script _ohne_ die hilfe eines SSI-befehl aus einer HTML seite heraus aufrufen kann ist mir völlig unklar.

        logisch: Laß die Seite komplett vom CGI erstellen! :-)

        Mal ehrlich: Irgendwie muß das Script aufgerufen werden. Wenn das nicht serverseitig geschieht (SSI, PHP3...), muß der Client eine Datei vom Server anfordern. Entweder _ist_ das Dokument diese Datei, oder die Datei ist _im_ Dokument. Das ist (crossbrowser) wohl nur über ein <img> möglich. Naja, Du könntest auch <embed> benutzen, wobei ich nicht weiß, welche Browser damit Probleme haben könnten.

        Ein Text ist jedenfalls (crossbrowser) keine eingebundene Datei. Layer u.ä. lasse ich nicht zählen :-) Also wenn Du den Counterstand als Text dargestellt haben möchtest, muß dieser bereits vom Server ins Dokument eingebunden werden - durch SSI, PHP3, oder durch ein komplettes Erstellen der Seite durch CGI.

        Cheatah

        1. Hallo Cheatah,

          Mal ehrlich: Irgendwie muß das Script aufgerufen werden. Wenn das nicht serverseitig geschieht (SSI, PHP3...), muß der Client eine Datei vom Server anfordern. Entweder _ist_ das Dokument diese Datei, oder die Datei ist _im_ Dokument. Das ist (crossbrowser) wohl nur über ein <img> möglich. Naja, Du könntest auch <embed> benutzen, wobei ich nicht weiß, welche Browser damit Probleme haben könnten.

          Wenn die Browser richtig HTML koennten, muesste doch eigentlich auch so was gehen:

          <p>Sie sind der <object type="text/plain" src="/cgi-bin/counter.cgi"></object>. Besucher</p>

          Wobei counter.cgi einfach:
          print "Content-type:text/plain\n\n";
          print $Countervar
          enthalten muesste...

          viele Gruesse
            Stefan Muenz

          1. Wobei counter.cgi einfach:
            print "Content-type:text/plain\n\n";
            print $Countervar
            enthalten muesste...

            Das wäre endlich mal ein Counter, der bei mehrfachem Reload desselben Benutzers seinen Wert definitiv nicht ändert! ;-)

            1. Hi,

              print "Content-type:text/plain\n\n";
              print $Countervar

              Das wäre endlich mal ein Counter, der bei mehrfachem Reload desselben Benutzers seinen Wert definitiv nicht ändert! ;-)

              argh! Michael, tu mir das nicht an, tu mir das bitte nicht an... *rotfl* :-)))

              Aber mal ehrlich: Welche Browser unterstützen <object>?

              Cheatah

        2. Hi Cheatah,

          hab' ein wenig 'gebastelt' *g* ...so hat's bei mir funktioniert (x-browser):

          *** TEST.HTM: ***

          <SCRIPT LANGUAGE="JavaScript" type="text/javascript"><!--
          NN= (document.layers) ? 1 : 0; IE= (document.all) ? 1 : 0; ver= (NN IE) ? 1 : 0;

          function load(url,id,width) {
          if (NN) document.layers[id].load(url,width);
          //if (IE) if (window.frames.length>-1) window.frames[id].location.href= url;
          }
          //--></SCRIPT>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

          <html>
          <head>
          <title>Text-Counter</title>
          </head>

          <body onLoad="if (NN) load('counter.pl','myLayer',25);">

          <font face="Arial" size="1" color="teal">
          Counterstand:
          <iframe src="counter.pl" scrolling="No" width="50" height="25" id="myLayer" frameborder="No"></iframe>
          <layer id="myLayer" style="position:relative;width:50;height:25;">
          </layer>
          </font>

          <br><br>
          Bla bla, laber lall...

          </body>
          </html>

          *** COUNTER.PL: (nix dolles, bin halt anfänger) ***

          #!usr/bin/perl

          $Head= "\n<html><head><title></title></head><body><font face=Arial size=1>";
          $Tail="</font></body></html>";
          $Savepath= "counter.dat";
          $fail= 0;
          $Daten= 0;

          if (open(COUNTDAT, "<$Savepath")==false) {$fail= 1;}

          if ($fail==0) {
          while (<COUNTDAT>) {
            $Daten= $_;
          }
          close(COUNTDAT);
          $Daten++;
          open(COUNTDAT, ">$Savepath")
            die "Fehler beim Anlegen der Counter-Datei!";
          print COUNTDAT $Daten;
          close(COUNTDAT);
          print $Head,$Daten,$Tail;
          } else {
          open(COUNTDAT, ">$Savepath")
            die "Fehler beim Anlegen der Counter-Datei!";
          $Daten++;
          print COUNTDAT $Daten;
          close(COUNTDAT);
          print $Head,$Daten,$Tail;
          }

          ...sobald ich zeit hab', probier ich 'mal Stefan's ansatz...

          tschau...
          /*,*/
          Wowbagger

          1. Hi,

            hab' ein wenig 'gebastelt' *g* ...so hat's bei mir funktioniert (x-browser):

            das ist alles andere als crossbrowser, weil es erst mit den 4ern funktioniert, und auch nur, wenn JavaScript aktiv ist. Da habe ich eine bessere Lösung parat:

            <script language="JavaScript1.1" type="text/javascript" src="/cgi-bin/counter.pl">
              <!--
              var counter = "unbekannt";
              // -->
            </script>
            ...
            <script language="JavaScript" type="text/javascript">
              <!--
              document.write("Bisher <b>" + counter + "</b> Aufrufe.");
              // -->
            </script>

            Das Counter-Script liefert "Content-type: application/x-javascript" sowie den Text "var counter = xyz;" zurück, mit dem richtigen Counterstand natürlich. Das funktioniert schon bei ein paar Browsern mehr und macht keine DHTML-Aufstände.

            »»  while (<COUNTDAT>) {

            $Daten= $_;

            $Daten = <COUNTDAT> (oder mit while() drumherum) reicht schon ;-)

            »»  open(COUNTDAT, ">$Savepath")

            die "Fehler beim Anlegen der Counter-Datei!";

            Hey, jemand der das Resultat von open abfängt, nicht schlecht :-) Aber schreib die Variable $! da noch rein, dann erfährst Du im Zweifel noch den Grund.

            Cheatah

            1. Hi Cheatah,

              das ist alles andere als crossbrowser, weil es erst mit den 4ern funktioniert, und auch nur, wenn

              JavaScript aktiv ist. Da habe ich eine bessere Lösung parat:

              Na ja, für mich ist das eben bereits x-browser ;)
              Die alten 3er sind (mir) im grunde wurscht (wer hat die noch?) aber JavaScript ist natürlich oftmals abgeschaltet, deine alternative ist also schon ziemlich sinnvoll...nur sie läuft leider bei mir nicht :(

              NN: stellt _nur_ den zählerstand selbst dar, der rest der seite wird ignoriert (die ausgabe des Perl-scripts ersetzt quasi die seite)

              IE: Läuft garnicht, er beschwert sich, daß die variable 'counter' nicht definiert ist

              Ich glaube, es liegt irgendwie daran, wie dein ansatz implementiert wird...irgend eine kleinigkeit ist bei mir nicht ok, nur was? Das Perl-script selbst vielleicht?

              »»  open(COUNTDAT, ">$Savepath")

              die "Fehler beim Anlegen der Counter-Datei!";

              Hey, jemand der das Resultat von open abfängt, nicht schlecht :-) Aber schreib die Variable $! da noch rein, dann erfährst Du im Zweifel noch den Grund.

              ja, ja, Perl und die kauzigen variablen :) ...daran muß ich mich erstmal gewöhnen (bis ich da so den überblick habe)

              wie gesagt, wäre toll, wenn ich deinen ansatz zum laufen bekäme, vielleicht hast du ja 'ne idee wo's hängt... :-)

              tschau...
              /*,*/
              Wowbagger

              1. Hi,

                das ist alles andere als crossbrowser, weil es erst mit den 4ern funktioniert, und auch nur, wenn
                JavaScript aktiv ist. Da habe ich eine bessere Lösung parat:

                Na ja, für mich ist das eben bereits x-browser ;)

                *lol* :-)

                Die alten 3er sind (mir) im grunde wurscht (wer hat die noch?)

                Immer noch eine ganze Menge, Du würdest Dich wundern.

                aber JavaScript ist natürlich oftmals abgeschaltet, deine alternative ist also schon ziemlich sinnvoll...nur sie läuft leider bei mir nicht :(

                Also, bei abgeschaltetem JS hilft meine Methode auch nicht...

                NN: stellt _nur_ den zählerstand selbst dar, der rest der seite wird ignoriert (die ausgabe des Perl-scripts ersetzt quasi die seite)

                IE: Läuft garnicht, er beschwert sich, daß die variable 'counter' nicht definiert ist

                Ich glaube, es liegt irgendwie daran, wie dein ansatz implementiert wird...irgend eine kleinigkeit ist bei mir nicht ok, nur was? Das Perl-script selbst vielleicht?

                Ich vermute das gleiche, weil etwas ähnliches bei mir und anderen hervorragend funktioniert (IP-Adresse ermitteln; irgendwo im Forums-Archiv habe ich die Methode der Öffentlichkeit zugänglich gemacht *g*) Hast Du die Seite online und kannst mal die URL nennen?

                wie gesagt, wäre toll, wenn ich deinen ansatz zum laufen bekäme, vielleicht hast du ja 'ne idee wo's hängt... :-)

                Vielleicht wenn ich die Seite im Einsatz sehe ;-)

                Cheatah

              2. Moin Wowbagger!

                NN: stellt _nur_ den zählerstand selbst dar, der rest der seite wird ignoriert (die ausgabe des Perl-scripts ersetzt quasi die seite)

                Seltsam, bei mir leistet genau diese Methode seit vielen Monaten gute Dienste.

                IE: Läuft garnicht, er beschwert sich, daß die variable 'counter' nicht definiert ist

                Fuer diesen Fall habe ich vor das document.write() noch ein if (self.counter) gepackt. Nur wenn es die Variable gibt und einen Wert groesser 0 hat, wird das write() ausgefuehrt.

                Ich glaube, es liegt irgendwie daran, wie dein ansatz implementiert wird...irgend eine kleinigkeit ist bei mir nicht ok, nur was? Das Perl-script selbst vielleicht?

                Tja, welchen Mime-Type gibst Du denn aus? Eigentlich kuemmern sich die 4er Browser nicht mehr darum, soviel ich weiss. Aber besser wenn Du die Ausgabe mit
                    print "Content-Type: application/x-javascript"
                beginnst. Erst hatte ich auch "text/javascript" verwendet, und es funzte auch mit den 4er Browsern, aber der Netsi 3 besteht auf "application/x-javascript".

                Ich poste nochmal die Form, die ich immer verwende. Vielleicht steckt der Teufel im Detail und Dir faellt noch was auf:

                Im HEAD:
                    <SCRIPT LANGUAGE="JavaScript" SRC="/cgi-bin/counter.pl?page=/path/to/page" TYPE="text/javascript"></SCRIPT>

                Spaeter im BODY:
                <TD ALIGN=CENTER>
                    <SCRIPT LANGUAGE="JavaScript"><!--
                        if (self.counter)
                            document.write("<B>Zugriff Nummer <SPAN CLASS="number">", self.counter, "</SPAN>.</B>");
                    //--></SCRIPT><BR>
                </TD>

                Bye, Calocybe

              3. Hi Cheatah und Calocybe,

                man bin ich blöd! Ich habe ständig die falsche version von 'counter.pl' aufgerufen. Ich hatte eine unter anderem namen angelegt, welche die JS variable ausgibt, diesen namen aber in der betr. HTML-seite natürlich _nicht_ entsprechend angepasst :((

                tut mir echt leid, sowas ist natürlich peinlich...

                An Calocybe: Der Content-Type ist nicht so furchtbar wichtig, glaube ich...meine beiden 4er IE und NN schlucken es selbst dann, wenn man den type ganz wegläßt (ok, schlechter stil, aber ich wollte's nur 'mal erwähnen ;)).
                Danke für'S feedback!

                Danke auch noch 'mal an Cheatah für's feedback!

                tschau sagt
                */,/*
                Wowbagger (heute etwas zerstreut...)

  2. Hi wowbagger,

    Geht sowas überhaupt, oder ist es ohne SSI völlig unmöglich?<<

    es geht zumindestens ansatzweise im netscape:

    <layer src="counter.cgi"></layer>

    ich habe keinen IE, und weiss also nicht, was bei dem alles möglich ist, z.B. als ilayer oder so was...

    vielleicht bastelst du einfach was für den ie zusammen und postest es hier? =)

    bis dann
    gero

    1. Hi Gero,

      es geht zumindestens ansatzweise im netscape:

      <layer src="counter.cgi"></layer>

      Danke für den impuls! Manchmal vergisst man ganz, daß die proprietären sachen von NN und IE doch hin und wieder brauchbar sind ;)

      ich habe keinen IE, und weiss also nicht, was bei dem alles möglich ist, z.B. als ilayer oder so was...

      vielleicht bastelst du einfach was für den ie zusammen und postest es hier? =)

      genau! siehe antwort auf Cheatah's posting...

      bis denn...
      /*,*/
      Wowbagger

  3. Hallo,

    Also einen einfachen Besucherzähler bekommst Du mit dem WebServer OmniHTTPd mitgeliefert.

    Der wird wie folgt auf die Seite eingebunden:
    <IMG SRC="/cgi-bin/visitor.exe?refer">

    Die "refer" erstellst Du vorher mit dem Konfigprogramm, da kannst Du auch den Zählerstand einstellen.

    Dieser Besucherzähler funktioniert auch mit dem ApacheServer.

    Viele Grüße, Rolf

    1. Hi Rolf,

      erstmal danke für's feedback :-)
      Aber da ich ja gerade Perl lernen will (besser: mich damit 'rumplage *g*), versuche ich lieber, was eigenes zu schreiben...

      tschau...
      /*,*/
      Wowbagger