cgi/perl gästebuch
raphael
- perl
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
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);
Moin Moin !
#!/path/to/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser);
Man muß es ja nicht endlos unsicher bauen, und Fehlermeldungen im Browser finde ich deutlich angenehmer als "500 Internal Server Error".
Alexander
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:
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