raphael: cgi/perl gästebuch

ich schreibe gerade bzw versuche ein perl skript für mein gästebuch zu schreiben....dabei habe ich folgende frage
mein skript:
#!/usr/bin/perl

require "cgi-lib.pl";
require "datum.pl";
$date = &ctime(time);
chop($date);
&parse_form;

print "Content-type: text/html\n\n";
print '<!doctype html public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">', "\n";
print "<HTML>\n";
print "<head><title>Neueintrag in das Gästebuch</title></head>\n";
print "<body>\n";
print "<center>\n";
print "<H2>Neueintrag in das Gästebuch</H2>\n";
print "am $date<p>\n";
print "<HR>\n";
print "</center><p>\n";
print "Wir haben von Ihnen folgende Angaben erhalten:<p> \n";
print "<ul> \n";
print "<li>Ihr Name lautet: <b>$in{'username'}</b> \n";
print "<li>Ihre eMail Adresse ist: <b>$in{'email'}</b> \n";
print "<li>Sie sind ein Besucher aus: <b>$in{'herkunft'}</b> \n";
print "<li>Ihr erster Eindruck war: <b>$in{'check1'}</b> \n";
print "<li>Ihr zweiter Eindruck war: <b>$in{'check2'}</b> \n";
print "<li>Sie beurteilten unsere WWW-Seiten als: <b>$in{'rating'}</b> \n";
print "<li>Ihre Meinung:
print "<b>$in{'comments'}</b> \n";
print "</ul><p> \n";
print "<B>Vielen Dank für Ihre Eintragung in unser Gästebuch!</B><p> \n";
print "</BODY>\n";
print "</HTML>\n";

$outfile = ">> gaestebuch.html";
open(OUTFILE, $outfile);
print OUTFILE "

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

Als ich die Seiten sah, dachte ich: <p>
<ul>
<li>$in{'check1'}
<li>$in{'check2'}
<li>Meiner bescheidenen Meinung nach, ist diese Seite <b>"$in{'rating'}"</b>.
</ul>
Und hier noch mein ganz persönlicher Kommentar:<br>
"<b>$in{'comments'}</b>"

";
close(OUTFILE);

---------------------------------------------------------------------
so meine frage dazu ist wie das, was in die datei gaestebuch.html geschrieben wird, nicht als letztes in die html datei eingefügt wird sondern zum beispiel in die mitte, sodass ich am schluss noch einen  fixen text haben kann oder sonstiges
danke für eure hilfe schon im vorhinein
mfg
raphael

  1. use Mosche;

    require "cgi-lib.pl";

    Benutze lieber CGI.pm. Suche dazu im Archiv, da wurde dies bereits mehrfach erklärt.

    $date = &ctime(time);

    Lass das '&' weg, es ist veraltet (du brauchst es nur noch, wenn du Referenzen auf Subroutinen benutzen willst).

    print "Content-type: text/html\n\n";

    Benutze here-Dokumente:

    print <<"ENDE";
    Content-type: text/html

    <Doctype ...>

    dein HTML-Quellcode

    END

    $outfile = ">> gaestebuch.html";
    open(OUTFILE, $outfile);

    Ist die Datei erfolgreich geöffnet worden? Fange Fehler mit

    open FH, $outfile or die "Fehler: $!";

    ab.

    print OUTFILE "

    Auch hier kannst du here-documents einsetzen (diese sind m.E. schöner als mehrzeilige Strings, obwohl sie letztendlich gleich geparst werden. Du musst dich aber nicht mehr um Maskierung von Sonderzeichen kümmern (, ", ', ...);

    <hr>
    Am $date kritzelte <b>$in{'username'}</b> (eMail: <a href=mailto:$in{'email'}>$in{'email'}</a>)

    Mit CGI.pm statt %in kommt jetzt param('dein_key');

    <li>$in{'check1'}

    Neuere HTML-Versionen (bzw. XHTML) machen es erforderlich, dass du deine Tags richtig schliesst:

    <li>text</li>

    so meine frage dazu ist wie das, was in die datei gaestebuch.html geschrieben wird, nicht als letztes in die html datei eingefügt wird sondern zum beispiel in die mitte, sodass ich am schluss noch einen  fixen text haben kann oder sonstiges

    Dann musst du die Datei erst einlesen (in einen Array), schliesst den Lesezugriff und öffnest sie zum Schreiben. Dann durchläufst du diesen Array (und druckst immer alle Zeilen in die Datei aus), bis du zu einer bestimmten Markierungszeile kommst (einen HTML-Kommentar zB). Dort schreibst du dann deinen neuen Eintrag, und dann weiter mit dem Array. Ungetestetes Beispiel:

    my $file = 'blah.html';

    open(FH, "<$file") or die "Kann '$file' nicht zum Lesen oeffnen: $!";
    my @guestbook = <FH>; # die gesamte Datei ist jetzt im Array
    close(FH);

    open(FH, ">$file") or die "Kann '$file' nicht zum Schreiben oeffnen: $!";
    foreach (@guestbook) {
       # erst mal aktuelle Zeile rein schreiben (damit nichts verloren geht)
       print FH $_;

    # wenn die Markierungszeile erreicht ist,
       # deinen Text _darunter_ setzen (weil die aktuelle Zeile bereits
       # neu geschrieben ist (ansonsten Reihenfolge umdrehen)
       if (/<!--Jetzt neuen Beitrag-->/){
       print <<"ENDE";
       Das ist ein neuer Kommentar in meinem Gästebuch. Er steht ganz oben, weil mein Einfügungskommentar auch vor den anderen Beiträgen stand (und weiterhin steht).

    ENDE
       }
    }
    close(FH;

    Ganz einfach, oder? Wenn du das verfeinern willst (und performance-mäßig verbessern), nimm zB eine temporäre Datei, in die du gleich reinschreibst (und sparst dir den Array), und kopierst dies um. Dieses hier müsste performance-mäßig für die meisten Guestbooks vollkommen ausreichen :-)

    use Tschoe qw(Matti);

    --
    $a=n(1001010);print chr($a+=$_)for(0,43,-2,1,-84,65,13,1,5,
    -12,-3,13,-82,48,21,13,-6,-76,72,-7,2,8,-6,13,-104);sub n{
    $b=0;$_=0;for($c=length$_[0];$c;--$c){$_+=_($b)if substr$_
    [0],$c-1,1;$b++;}$_}sub _{($d)=@_;for($e=1;$d--;$e*=2){}$e}
    1. Moin Moin !

      #!/path/to/perl -w

      use strict;
      use CGI::Carp qw(fatalsToBrowser);

      Rest des Codes ...

      Man muß es ja nicht endlos unsicher bauen, und Fehlermeldungen im Browser finde ich deutlich angenehmer als "500 Internal Server Error".

      Alexander

      --
      <!--#include file="signature.html" -->
  2. hi Raphael,


    so meine frage dazu ist wie das, was in die datei gaestebuch.html geschrieben wird, nicht als letztes in die html datei eingefügt wird sondern zum beispiel in die mitte, sodass ich am schluss noch einen  fixen text haben kann oder sonstiges

    Gästebuch Postings in eine HTML Datei zu schreiben stößt sehr schnell auf Grenzen, denn wenn es viele GB Einträge gibt wird das unübersichtlich. Ich schlage dir also einen anderen Ansatz vor:

    • die Einträge fortlaufend in einer ganz normalen Textdatei speichern,
    • das Gästebuch vollständig als CGI zu schreiben.

    Das CGI liest diese Textdatei aus, generiert eine HTML Datei und schickt diese zur Laufzeit zum Browser, die Inhalte der Textdatei werden dabei in die HTML Seite eingebaut.

    Und nun kommt der Gedanke wegen der Übersichtlichkeit: Die Textdatei baust du so, dass die vom CGI Script gut geparst werden kann so dass das Script einmal die einzelnen Postings ermittelt und auch deren Anzahl. Genau damit kannst du die Einträge gruppieren, so dass der Besucher beispielsweise die Einträge [1-10][11-20] usw. auswählen kann.

    Was ich meine sieht so aus:
    http://i-netlab.de/cgi-bin/gb.cgi

    und die Datei die dahinter liegt hat das Format einer ini Datei.

    Beispiel eines Eintrages

    [Rolf Rost am Sonntag, 12. März 2000 um 21:11:51]
    cont=<<EOT
     Liebe Besucher meiner Seite, ich freue mich über jeden Eintrag in
     dieses - mein Gästebuch! Das Script zu diesem Gästebuch habe ich
     selbst geschrieben, es kann sein dass hier noch Fehler drin sind.
     Viele Grüße, Rolf
     eMail: rolfrost@web.de
    EOT

    Mit den PERL Modul Config::IniFiles ist das Auslesen einer ini Datei ganz einfach. Auch das Schreiben.

    Rolf