Mirko: Gästebucheinträge oben einfügen

Hallo, ich nutze das Gästebuch von André Hahn: http://userpage.fu-berlin.de/~ahahn/www/cgikurs/

Das Problem bei diesem Script ist, dass die Beiträge am Ende des HTML Dokuments geschrieben werden. Ich möchte sie jedoch am Anfang haben, was kann ich tun?

Hier ein Ausschnitt des CGI-Scripts:

#!/usr/sbin/perl

testform.cgi, Gaestebuchskript (Version 0.1)

[..]

$outfile = ">> [...]gaeste/gaestebuch.htm";

open(OUTFILE, $outfile);

print OUTFILE "

<hr>
Am $date traschte <b>$in{'username'}</b> (eMail: <a href=mailto:$in{'email'}>$in{'email'}</a>)
aus <b>"$in{'herkunft'}"</b> das folgende<p>

"<b>$in{'comments'}</b>"

";
close(OUTFILE);

ICh denke doch das mit open [...] das html Dokument geöffnet wird und dem OUTFILE zugewiesen wird. Danach wird der aktuelle Beitrag hinzugefügt. Der BODY wird offen gelassen, sodass das Einfügen hier relativ einfach gelöst ist. Wie schaffe ich es den Beitrag direkt an einer bestimmten Stelle im Body zu platzieren, oder wenigstens direkt nach dem Body?

Kann ich den CGI anweisen ab einer bestimmten Stelle, zB. nach dem <body>, den Quelltext abzugreifen?

  1. hi,

    Das Problem bei diesem Script ist, dass die Beiträge am Ende des HTML Dokuments geschrieben werden. Ich möchte sie jedoch am Anfang haben, was kann ich tun?

    hier liest du die bisherigen daten ein:

    $outfile = ">> [...]gaeste/gaestebuch.htm";
    open(OUTFILE, $outfile);

    und hier gibst du die bisherigen daten wieder aus, gefolgt von den neuen:

    print OUTFILE "

    <hr>
    Am $date traschte <b>$in{'username'}</b> (eMail: <a href=mailto:$in{'email'}>$in{'email'}</a>)
    aus <b>"$in{'herkunft'}"</b> das folgende<p>

    "<b>$in{'comments'}</b>"

    ";

    ändere also hier die reihenfolge, dann sollte es passen:

    print "

    <hr>
    Am $date traschte <b>$in{'username'}</b> (eMail: <a href=mailto:$in{'email'}>$in{'email'}</a>)
    aus <b>"$in{'herkunft'}"</b> das folgende<p>

    "<b>$in{'comments'}</b>"

    " OUTFILE;

    gruss,
    wahsaga

    1. hallo wahsaga,

      hier liest du die bisherigen daten ein:

      $outfile = ">> [...]gaeste/gaestebuch.htm";
      open(OUTFILE, $outfile);

      Das ist AKAIK nicht richtig. Wegen ">>" wird die gesamte Datei zum Schreiben geöffnet, und zwar so, daß grundsätzlich alles unten angehängt wird.

      und hier gibst du die bisherigen daten wieder aus, gefolgt von den neuen:

      print OUTFILE "

      Nein. Hier wird in die geöffnete Datei etwas hineingeschrieben.

      ändere also hier die reihenfolge, dann sollte es passen:
      print "
      <hr>

      Damit wird nichts in die Datei geschrieben, sondern nur am Bildschirm ausgegeben, da der Handler fehlt. Es ist zwingend nötig, soweit ich weiß, daß
      print OUTFILE [...]
      geschrieben wird, da erst durch den Handler klar ist, daß tatsächlich in die geöffnete Datei geschrieben werden soll.

      Die Reihenfolge umkehren kann man, indem man die gesamte bisherige Gästebuchdatei oder einen Teil davon in einen Array ausliest (was hier nicht geschieht), und die Gästebuchdatei dann mit ">" zum Überschreiben öffnet. Dann kann so weiterverfahren werden, wie du angegeben hast, also erst den "neuen Text" eingeben und darunter den Inhalt des Arrays wieder hineinschreiben.

      Grüße aus Berlin

      Christoph S.

      1. hi,

        Das ist AKAIK nicht richtig.

        da magst du recht haben.

        kenne mich mit perl(?) nicht aus, habe deshalb wohl $outfile und OUTFILE verwechselt, und deshalb angenommen, dass print OUTFILE lediglich dazu dient, die in eine variable OUTFILE eingelesenen daten wieder auszugeben ...

        gruss,
        wahsaga

      2. Hallo und Danke soweit,

        ich seh das genauso, mit der Lösung von Wahsaga kann es nicht funktionieren, aus genannten Gründen und weil sozusagen erst Text käme und dann der <html>-Quellcode vom vorherigen Gästebuch mit dem Header und den Body.

        Die Reihenfolge umkehren kann man, indem man die gesamte bisherige Gästebuchdatei oder einen Teil davon in einen Array ausliest (was hier nicht geschieht), und die Gästebuchdatei dann mit ">" zum Überschreiben öffnet. Dann kann so weiterverfahren werden, wie du angegeben hast, also erst den "neuen Text" eingeben und darunter den Inhalt des Arrays wieder hineinschreiben.

        Wie kann man die Datei Sequenzweise auslesen? In diesen Fall in zwei Variablen. Wie kann man anweisen wo er anfangen und aufhören soll den TExt zu übernehmen?

        Ist es möglich zuerst einen Teil auszulesen, den Eintrag einzufügen und dann den restlichen Teil?

        Grüße aus Berlin

        Christoph S.

        Grüsse aus Ilmenau

        Mirko

        1. hallo,

          Wie kann man die Datei Sequenzweise auslesen? In diesen Fall in zwei Variablen. Wie kann man anweisen wo er anfangen und aufhören soll den TExt zu übernehmen?

          Dazu müssen in deinem Gästebuch entsprechende Marken vorhanden sein oder eben Zeilen, bei denen du "stop" sagen kannst.

          Ist es möglich zuerst einen Teil auszulesen, den Eintrag einzufügen und dann den restlichen Teil?

          Prinzipiell ja, aber bissel umständlich.

          Du kannst dir ein (vorsichtig kommentiertes) Script unter http://www.christoph-schnauss.de/prog/perl/perl05.htm anschauen.

          Grüße aus Berlin

          Christoph S.

        2. Hallo Mirko,

          Wie kann man die Datei Sequenzweise auslesen? In diesen Fall in zwei Variablen. Wie kann man anweisen wo er anfangen und aufhören soll den TExt zu übernehmen?

          Kommt auf die Sequenz an. Mit

          while(<FILEHANDLE>) {
            # tu was
          }

          kannst du die Datei zeilenweise auslesen, wobei $_ immer die aktuell gelesene Zeile enthält, die du dann mit deinen Vorgaben vergleichen kannst, bspw. unter Zuhilfenahme von Regulären Ausdrücken. Mit der Funktion read() kannst du die Datei auch zeichenweise auslesen:

          http://www.perldoc.com/perl5.8.0/pod/func/read.html

          Ist es möglich zuerst einen Teil auszulesen, den Eintrag einzufügen und dann den restlichen Teil?

          Prinzipiell schon, wie du dabei vorgehst, hängt von der Struktur der Datei ab. Hier könnte dir unter Umständen die Funktion seek() helfen:

          http://www.perldoc.com/perl5.8.0/pod/func/seek.html

          Hoffe es hilft
          Torsten