Script das Einträge eines Formulars in eine Datei speichert
Florian
- perl
Hallo
Durch die hilfe vorangegangener Foreneinträge habe ich ein kleines perl script das Einträge vom Formular in eine Datei speichert.
Leider ist es noch sehr Fehlerhaft.
1. Es speichert nur wenn die Datei in der die Daten hineingeschrieben werden nicht existiert oder leer ist.
2. Die Passwortüberprüfung funktioniert nicht.
3. Alle einträge werden nur in einer einzigen Variablen gespeichert
Das Script sieht folgendermaßen aus:
#!/usr/bin/perl
$datfile="mitteilung.txt";
my $action = 'start'; # das müsste schon sein, nicht?
print "Content-type: text/html\n\n";
####### Formulardaten einlesen ###################
my $cgi = new CGI; # OOP!!!
use CGI;
my $name = $cgi->param("vuname");
my $mitteilung = $cgi->param("mitteilung");
my $passwort = $cgi->param("pw");
my $passwort2 = $cgi->param("pwst");
my $email = $cgi->param("email");
if ($pw != $pwst) {
print "<html><head><title>FEHLER</title></head>\n";
print "<body bgcolor="navy" text="red" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Es ist ein Fehler aufgetreten</center></h1>\n";
print "<br><br>\n";
print "Ihre Passwörter $passwort und $passwort2 stimmen nicht überein! <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
};
print "<html><head><title>Vielen Dank für ihre Eingaben</title></head>\n";
print "<body bgcolor="navy" text="white" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Vielen Dank für ihre Eingaben</center></h1><br>\n";
print "<br><br>\n";
print "Ihr Name = $name <br>\n";
print "Ihre Mitteilung = $mitteilung <br>\n";
print "Ihr Passwort = $passwort <br>\n";
print "Ihre E-Mail adresse = $email <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
if ($action eq "start") {&start;}
open(DATA,">>$datfile");
print DATA "$name§$mitteilung§$passwort§$passwort2§\n";
close(DATA);
sub start {
open(INDEX,"$datfile");
@index = <INDEX>;
close(INDEX);
foreach (@index) {
$dzeil =$_;
chomp($dzeil);
($name,$mitteilung,$passwort,$passwort2) = split(/§/,$dzeil);
print "Ihr Name = $name\n";
print "Ihre Mitteilung = $mitteilung\n";
print "Ihr Passwort = $passwort\n";
print "Ihre Passwortbestätigung = $passwort2\n";
exit;
}
}
-------------------------------
Florian
Halihallo nochmals
print "Content-type: text/html\n\n";
hier wäre:
print "Content-Type: text/html\015\012\015\012";
etwas sicherer.
my $cgi = new CGI; # OOP!!!
use CGI;
my $name = $cgi->param("vuname");
my $mitteilung = $cgi->param("mitteilung");
my $passwort = $cgi->param("pw");
my $passwort2 = $cgi->param("pwst");
my $email = $cgi->param("email");
Also: Die Passwörter sind in den Variablen $passwort und $passwort2 gespeichert! - Warum unten mit "if ($pw != $pwst)"???
if ($pw != $pwst)
Hier muss
if ($passwort ne $passwort2)
stehen!
if ($action eq "start") {&start;}
Das ist wohl etwas redundant. So lange die Variable (s. oben) immer auf 'start' steht, wird eh immer &start aufgerufen. Also kannst du hier auch nur
&start;
schreiben, statt "if ($action eq 'start') {&start;} ";
sub start {
open(INDEX,"$datfile");
Aha! - Hier steckt noch ein Fehler:
das muss
open(INDEX, "<$datfile");
heissen. '>>' ist zum Anhängen von Daten, '>' ist um die Datei zu überschreiben und '<' ist zum Datei lesen.
Hier nochmals der verbesserte Code:
#!/usr/bin/perl
$datfile="mitteilung.txt";
print "Content-type: text/html\n\n";
####### Formulardaten einlesen ###################
my $cgi = new CGI; # OOP!!!
use CGI;
my $name = $cgi->param("vuname");
my $mitteilung = $cgi->param("mitteilung");
my $passwort = $cgi->param("pw");
my $passwort2 = $cgi->param("pwst");
my $email = $cgi->param("email");
if ($passwort != $passwort2) {
print "<html><head><title>FEHLER</title></head>\n";
print "<body bgcolor="navy" text="red" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Es ist ein Fehler aufgetreten</center></h1>\n";
print "<br><br>\n";
print "Ihre Passwörter $passwort und $passwort2 stimmen nicht überein! <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
};
print "<html><head><title>Vielen Dank für ihre Eingaben</title></head>\n";
print "<body bgcolor="navy" text="white" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Vielen Dank für ihre Eingaben</center></h1><br>\n";
print "<br><br>\n";
print "Ihr Name = $name <br>\n";
print "Ihre Mitteilung = $mitteilung <br>\n";
print "Ihr Passwort = $passwort <br>\n";
print "Ihre E-Mail adresse = $email <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
&start; # Vielleicht solltest du das nach den nächsten drei Zeilen
# hinsetzen, dann wird der vom Benutzer eingegebene
# Datensatz auch noch mit ausgegeben.
open(DATA,">>$datfile");
print DATA "$name§$mitteilung§$passwort§$passwort2§\n";
close(DATA);
sub start {
open(INDEX, "<$datfile");
@index = <INDEX>;
close(INDEX);
foreach (@index) {
$dzeil =$_;
chomp($dzeil);
($name,$mitteilung,$passwort,$passwort2) = split(/§/,$dzeil);
print "Ihr Name = $name\n";
print "Ihre Mitteilung = $mitteilung\n";
print "Ihr Passwort = $passwort\n";
print "Ihre Passwortbestätigung = $passwort2\n";
exit;
}
}
So, versuchs jetzt nochmals. Ich hoffe, dass dies nun funktioniert
Viele Grüsse
Philipp
PS: Wenn du nicht weisst, warum ich irgend etwas bemängle oder verbessere, dann frag! - Wir sind hier um Fragen zu beantworten und wenn du perl lernen willst, musst du fragen. Wir helfen dir gerne; aber wir dienen nicht gerne, wenn's darum geht ein Programm einfach zu verbessern nur weil man selber nicht einmal bereit ist, perl zu lernen. Dies ist eine allgemeine Anmerkung! - Also nur persönlich nehmen, wenn's auch zutrifft!
Halihallo??? Ist da wer???
Ist das Problem gelöst Florian? - Hast'ne Frage??? Oder is alles klar?
Viele Grüsse
Philipp
Halloo
Danke, allerdings funktioniert das script trotzdem nicht wie es funktionieren sollte.
wieso muss statt != , ne hin? != steht doch für ungleich.
Leider wurde keines der Probleme Behoben. ;(
das script schreibt wieder nur den ersten abgeschickten eintrag in die datei. Passwortbestätigung wird nicht überprüft, Eingaben immernoch nicht in der Ausgabe sortiert.
Und danke für den Hinweiß mit dem Anhängen, Überschreiben und Lesen von Daten, das habe ich noch nicht gewusst, Bin ja noch ein blutiger Anfänger.
Die Ausgabe sieht so aus:
Vielen Dank für ihre Eingaben
Ihr Name = Mein Name mitteilung=meine Mitteilung pw=das Passwort pwst=nochmal das passwort
Ihre Mitteilung =
Ihr Passwort =
Ihre E-Mail adresse =
Zurück
Ihr Name = Mein Name Ihre Mitteilung = Ihr Passwort = Ihre Passwortbestätigung =
Und in der Datei ist nur der erste eintrag zu finden obwohl ich schon 4 Einträge abgeschickt habe (jeweils mit anderen daten)
Florian
Hallo,
Danke, allerdings funktioniert das script trotzdem nicht wie es funktionieren sollte.
wieso muss statt != , ne hin? != steht doch für ungleich.
Strings zu vergleichen und Zahlen zu vergleichen ist in Perl unterschiedlich zu kodieren:
Zahlen : ==,!=,...
Strings: eq,ne,...
mehr dazu in der, Perl beiliegenden, Dokumentation (perldoc perlop)
Leider wurde keines der Probleme Behoben. ;(
Irgendwie klingt daß so, als ob Du mit einem Lieferanten über Nachbesserungen eines von ihm erworbenen Produkts sprichst.
Vielleicht solltest Du etwas an Deiner Wortwahl hier feilen.
Nun zu etwas aus dem Vorposting
if ($pw != $pwst)
Hier muss
if ($passwort ne $passwort2)
stehen!
Dieser Fehler wäre nicht passiert, wenn Du 'use strict' verwenden würdest, da dadurch von Dir sofort erkannt worden wäre, daß $pw und $pwst noch nicht deklariert worden ist.
das script schreibt wieder nur den ersten abgeschickten eintrag in die datei.
Du hast einen Logikfehler im Programm. Zuerst werden die Variablen $name,$mitteilung,$passwort,$passwort2 aus den CGI-Parametern gefüllt, dann werden sie ausgegeben, dann wird &start aufgerufen.
hier werden die Daten von der Datei gelesen, und nochmals ausgegeben.
Und dann... wird das Script nach der Ausgabe der ersten Zeile beendet.
Zum Schreiben des neuen Datensatzes kommt es dann gar nicht mehr.
Abgesehen davon , würde sowieso nur der letzte der in der Datei gespeicherten Datensätze immer udn immer wieder abgespeichert werden, da ja die oben genannte Variablen überschrieben werden.
Passwortbestätigung wird nicht überprüft,
Siehe Hinweis von Philipp (mene Güte, da sind die Doppelkonsonanten aber nicht Standardkonform *g*)
und die Lösung wurde hier auch reinkopiert.
Eingaben immernoch nicht in der Ausgabe sortiert.
Ich habe allerdings auch in Deinem Script niregendwo auch nur einen Ansatz von Sortierung gesehen. Und was man nicht programmiert, das geschieht auch nicht.
[...] Bin ja noch ein blutiger Anfänger.
Und wir werden gemeinsam dafür sorgen, daß Du es nicht mehr lange bist, sofern Du Deiniges dazu beiträgst.
Grüße
Klaus
Halihallo
wieso muss statt != , ne hin? != steht doch für ungleich.
Strings zu vergleichen und Zahlen zu vergleichen ist in Perl unterschiedlich zu kodieren:
Zahlen : ==,!=,...
Strings: eq,ne,...
mehr dazu in der, Perl beiliegenden, Dokumentation (perldoc perlop)
Meine Güte! - So einfach??? - Nun, ja, es hat mich nie gestört. Bei mir funktionierte es immer (mit 'eq' und 'ne')...
Leider wurde keines der Probleme Behoben. ;(
Irgendwie klingt daß so, als ob Du mit einem Lieferanten über Nachbesserungen eines von ihm erworbenen Produkts sprichst.
Vielleicht solltest Du etwas an Deiner Wortwahl hier feilen.
Danke.
Nun zu etwas aus dem Vorposting
if ($pw != $pwst)
Hier muss
if ($passwort ne $passwort2)
stehen!
Dieser Fehler wäre nicht passiert, wenn Du 'use strict' verwenden würdest, da dadurch von Dir sofort erkannt worden wäre, daß $pw und $pwst noch nicht deklariert worden ist.
Genau! - Ich habe schon darauf hingewiesen, dass sich Florian gleich mal das "use strict;" angewöhnen soll. Wie gesagt: Ich habe es zu spät gelernt und bereuhe es.
Du hast einen Logikfehler im Programm. Zuerst werden die Variablen $name,$mitteilung,$passwort,$passwort2 aus den CGI-Parametern gefüllt, dann werden sie ausgegeben, dann wird &start aufgerufen.
hier werden die Daten von der Datei gelesen, und nochmals ausgegeben.
Und dann... wird das Script nach der Ausgabe der ersten Zeile beendet.
Zum Schreiben des neuen Datensatzes kommt es dann gar nicht mehr.
Abgesehen davon , würde sowieso nur der letzte der in der Datei gespeicherten Datensätze immer udn immer wieder abgespeichert werden, da ja die oben genannte Variablen überschrieben werden.
Genau! - Ging ein Weilchen, bis ich den Fehler gefunden habe. Das exit; habe ich irgendwie übersehen...
Passwortbestätigung wird nicht überprüft,
Siehe Hinweis von Philipp (mene Güte, da sind die Doppelkonsonanten aber nicht Standardkonform *g*)
Äm. Tja. Gebe mich geschlagen. Meinst du den Namen oder meine Grammatik? -
if ($Grammatik)
{
1. ich bin Schweizer
2. gebe ich mir überhaupt keine Mühe.
}
if ($Name)
{
1. habe ihn nicht ausgewählt
2. to be continued
}
Eingaben immernoch nicht in der Ausgabe sortiert.
Ich habe allerdings auch in Deinem Script niregendwo auch nur einen Ansatz von Sortierung gesehen. Und was man nicht programmiert, das geschieht auch nicht.
Es sei denn man arbeitet mit Microsoftprodukten *grrrrrr* ;-)))
[...] Bin ja noch ein blutiger Anfänger.
Und wir werden gemeinsam dafür sorgen, daß Du es nicht mehr lange bist, sofern Du Deiniges dazu beiträgst.
Ja! - Bin auch dabei ;-)
Viele Grüsse
Philipp
Hallo,
if ($Grammatik)
{
1. ich bin Schweizer
2. gebe ich mir überhaupt keine Mühe.
persönlicher Zusatz: würde ich mir nie anmaßen, zu kritisieren, da ich eine 'grammatische Vollnuß' bin.
}
if ($Name)
{
1. habe ihn nicht ausgewählt
Ich weiß, es ist halt nur schwer, es dann auch richtig zu machen, vor allem wenn man das 'Glück' hat, daß im eigenen keine Verdoppelungen vorkommen.
Und man weiß ja nie, ob man nicht jemanden beleigt, wenn man Phillip schreibt;-)
2. to be continued
}
Grüße
Klaus
Halihallo
persönlicher Zusatz: würde ich mir nie anmaßen, zu kritisieren, da ich eine 'grammatische Vollnuß' bin.
Ach wo, so schlimm wird's bei uns beiden nicht sein ;)
Und auch wenn: Ist immer noch ein Forum für Fragen rundum Computer, nicht?
Ich weiß, es ist halt nur schwer, es dann auch richtig zu machen, vor allem wenn man das 'Glück' hat, daß im eigenen keine Verdoppelungen vorkommen.
Ach so. Nun, ja ;)
Und man weiß ja nie, ob man nicht jemanden beleigt, wenn man Phillip schreibt;-)
Du sprichst aus Erfahrung? - Warst du bei einem bestimmten Thread etwa auch dabei, wo ich mal mit den diversen Namen, welche mir unfreiwillig verliehen wurden, aufgeräumt habe???
Viele Grüsse
Philllippp
Halihallo
Danke, allerdings funktioniert das script trotzdem nicht wie es funktionieren sollte.
ver... Hm. Schade.
wieso muss statt != , ne hin? != steht doch für ungleich.
Es sind beide Notationen richtig. != ist genau das selbe wie ne. Genauso wie == genau das selbe ist wie 'eq'.
Stopp! - Jetzt habe ich es gleich bemerkt: mit != funktionierte es nicht, aber 'ne' funktioniert. Faszinierend... Na, ja, verwenden wir eben 'ne'...
Leider wurde keines der Probleme Behoben. ;(
Was??? - Na, mal schaun... Muss doch irgendwie zu schaffen sein.
das script schreibt wieder nur den ersten abgeschickten eintrag in die datei.
Passwortbestätigung wird nicht überprüft, Eingaben immernoch nicht in der Ausgabe sortiert.
Wie und wonach soll sortiert werden? - Dann kann ich dir den Code noch kurz anpassen.
Und danke für den Hinweiß mit dem Anhängen, Überschreiben und Lesen von Daten, das habe ich noch nicht gewusst, Bin ja noch ein blutiger Anfänger.
Kein Problem. Nur weiterfragen oder am Besten sich auch mal mit der Doku beschäftigen ;)
Also: Ich hab mich mal kurz deinem Programm angenommen und noch einige Bugs gefunden. Es sollte jetzt funktionieren (hab's getestet), bis auf die Sortierung. Also, ich weiss nicht mehr alles, was ich verändert habe, aber es waren noch einige logische Fehler zu finden. Am Besten zu vergleichst deine alte Version mit meiner neuen:
Ach ja, jetzt funktioniert es auch mit use strict ;-)
Viel Glück, viel Spass und viele Grüsse
Philipp
___END___
___DATA___
#!/usr/bin/perl
use strict;
my $datfile="mitteilung.txt";
print "Content-type: text/html\015\012\015\012";
####### Formulardaten einlesen ###################
use CGI;
my $cgi = new CGI; # OOP!!!
my $name = $cgi->param("vuname");
my $mitteilung = $cgi->param("mitteilung");
my $passwort = $cgi->param("pw");
my $passwort2 = $cgi->param("pwst");
my $email = $cgi->param("email");
####### Diese Zeilen werden gelöscht, nur Testzweck #######
#my $name = 'Hallo Welt';
#my $mitteilung = 'dies ist die Mitteilung';
#my $passwort = 'pw123';
#my $passwort2 = 'pw123';
#my $email = 'hello@entryon.ch';
if ($passwort ne $passwort2)
{
print "<html><head><title>FEHLER</title></head>\n";
print "<body bgcolor="navy" text="red" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Es ist ein Fehler aufgetreten</center></h1>\n";
print "<br><br>\n";
print "Ihre Passwörter $passwort und $passwort2 stimmen nicht überein! <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
exit; die "byebye";
};
print "<html><head><title>Vielen Dank für ihre Eingaben</title></head>\n";
print "<body bgcolor="navy" text="white" link="yellow" alink="lime" vlink="yellow"\n";
print "<h1><center>Vielen Dank für ihre Eingaben</center></h1><br>\n";
print "<br><br>\n";
print "Ihr Name = $name <br>\n";
print "Ihre Mitteilung = $mitteilung <br>\n";
print "Ihr Passwort = $passwort <br>\n";
print "Ihre E-Mail adresse = $email <br>\n";
print "<br><br><a href="javascript:history.back()">Zurück</a></body></html>\n";
&start;
open(DATA,">>$datfile");
print DATA "$name§$mitteilung§$passwort§$passwort2§\n";
close(DATA);
sub start
{
open(INDEX, "<$datfile");
my @index = <INDEX>;
close(INDEX);
foreach (@index)
{
my $dzeil =$_;
chomp($dzeil);
my ($name,$mitteilung,$passwort,$passwort2) = split(/§/,$dzeil);
print "Ihr Name = $name<br>\n";
print "Ihre Mitteilung = $mitteilung<br>\n";
print "Ihr Passwort = $passwort<br>\n";
print "Ihre Passwortbestätigung = $passwort2<br>\n";
}
}