Gästebuch
Arthur Müller
- perl
Leute, ich habe ein Problem mit dem Script für mein Gästebuch.
Der Script läuft zwar in der Consolle, aber macht dafür nichts auf der WEB-Seite. Anstatt der neuen Datei neu.html öffnet sich nach dem Absenden questbook.pl als eine Browser-Seite.
Vielleicht liege ich ja in einer ganz falscher Richtung mit diesem Script. Kann mir da jemand auf den richtigen Weg helfen.
Danke
Arthur
___________________________________________________________________
Mein Formular des Gästebuchs:
-------------------------------------------------------------------
<html>
<head>
<title>questbook</title>
</head>
<body bgcolor="black" text="yellow">
<form action="cgi-bin\guestbook.pl" name="questbook" target="_top" method="post" enctype="multipart/form-data">
<p><input type="text" name="name" value="<Name>" maxlength="20" size="20"></p>
<p><textarea name="kommentar" rows="5" cols="80"><Kommentar></textarea></p>
<p><input type="submit" name="senden" value="Absenden"></p>
</form>
</body>
</html>
____________________________________________________________________
Hier ist der Script:
--------------------------------------------------------------------
#!usr/bin/perl -w
use CGI;
use strict;
use CGI::Carp qw(fatalsToBrowser);
my $cgi = new CGI;
my @name = $cgi->param('name');
my @kommentar = $cgi->param('kommentar');
my @datei;
my @alt;
my @neu;
open(DATEI, "<neu.html");
@datei = <DATEI>;
close(DATEI);
foreach(@datei)
{push(@alt,$_)};
foreach(@name)
{push(@alt,$_)};
foreach(@kommentar)
{push(@alt,$_)};
foreach (@alt)
{if(/^<!-- NEU -->/)
{push(@neu,$_);}
push(@alt,"<!-- NEU -->\n");};
open(DATEI, "<neu.html");
$, = "<br>";
print "@neu";
close(DATEI);
--------------------------------------------------------------------
Halihallo Arthur
<form action="cgi-bin\guestbook.pl" name="questbook" target="_top" method="post" enctype="multipart/form-data">
Du sagst, dass guestbook.pl angezeigt wird und dir ist das nicht klar? - Hier steht's ja. Du übermittelst die Formulareingaben _an_ guestbook.pl, was dieses damit macht, ist seine Sache, aber das guestbook.pl bleibt in jedem Fall in der Adresszeile.
my $cgi = new CGI;
my @name = $cgi->param('name');
my $name = $cgi->param('name');
oder hat eine Person mehrere Namen? - Du hast nur Eingabefeld namens 'name' im Formular, ein Array ist hier unlogisch.
my @kommentar = $cgi->param('kommentar');
s. oben
open(DATEI, "<neu.html");
du hast oben so schön mit einfachen Quotes gearbeitet, warum hier ein double quote? - Das ist aperformant.
push(@alt,"<!-- NEU -->\n");};
hier macht der double quote frühestens Sinn!
open(DATEI, "<neu.html");
$, = "<br>";
print "@neu";
das funktioniert zwar, print join('<br>', @neu) ohne das $,='<br>' wäre jedoch wesentlich schöner.
close(DATEI);
Hier gibst du die neue neu.html aus. Warum meinst du, dass dies in der Adresszeile angezeigt werden soll? - Der Browser sieht nur eines, nämlich eine HTML Datei, die von _guestbook.pl_ kommt.
Zudem hast du den HTTP-Header vergessen => das führt immer zu einem Fehler. Du musst mindestens den Content-Type ausgeben, sonst weiss der Browser gar nicht, wie er deine Seite ausgeben soll.
also: print 'Content-Type: text/html'."\015\012" x 2;
am Anfang.
Viele Grüsse
Philipp
PS: Wenn du dich wunderst, warum keine neuen Postings gespeichert werden: Du musst @neu auch in der Datei speichern!
hi,
Leute, ich habe ein Problem mit dem Script für mein Gästebuch.
Der Script läuft zwar in der Consolle, aber macht dafür nichts auf der WEB-Seite.
Genauso sieht der Code auch aus.
Tipps:
my @name = $cgi->param('name');
my $name ...
open(DATEI, "<neu.html");
open () or die ();
Und damit was im Browser ankommt:
print "Content-type: text/html\n\n";
print "Danke...";
Rolf
Hi,
<form action="cgi-bin\guestbook.pl" name="questbook" target="_top" method="post" enctype="multipart/form-data">
Bei URLs ist / das Trennzeichen, nicht \
my $cgi = new CGI;
my @name = $cgi->param('name');
Mehrere Namen? Wie soll das bei Deinem Formular gehen?
my @kommentar = $cgi->param('kommentar');
Same here.
my @datei;
my @alt;
my @neu;
open(DATEI, "<neu.html");
@datei = <DATEI>;
close(DATEI);foreach(@datei)
{push(@alt,$_)};
push(@alt,@datei);
wobei Du dieses sparen könntest, wenn Du die Datei direkt in @alt einlesen würdest.
foreach(@name)
{push(@alt,$_)};
push(@alt,@name)
bzw.
push(@alt, $name), denn Du hast ja eigentlich nur einen Namen, also keinen Grund, eine Liste aufzumachen.
foreach(@kommentar)
{push(@alt,$_)};
s.o.
foreach (@alt)
{if(/^<!-- NEU -->/)
{push(@neu,$_);}
push(@alt,"<!-- NEU -->\n");};open(DATEI, "<neu.html");
Jetzt liest Du schon wieder die Datei. Der Inhalt steht doch noch in @datei
$, = "<br>";
print "@neu";
Hier gibt Dein CGI etwas auf STDOUT, also an den http-Client, aus.
Aber vorher wurde kein http-header gesendet.
Außerdem könnte @neu hier sogar leer sein.
close(DATEI);
cu,
Andreas