Formularfelder prüfen mit "defined"
Richard Krause
- perl
Hallo
Hab aufgrund von Antworten auf eine frührere Anfrage versucht, die Überprüfung, ob in einem Formular Daten eingegeben wurden, mit "defined" + "exists" zu lösen. Hat dann schlussendlich dazu geführt, dass ich von cgi_lib.pl auf cgi.pm umgestiegen bin. Es funktioniert nun alles, nur die Prüfung mit "defined" nicht und beim Einsatz von "strict" die Meldung, dass die Variable $username nicht deklariert wurde (was ich aber doch tue?). Mit "eq" aber funktioniert die Prüfung.
Hätte gerne herausgefunden, was ich bei "defined" falsch geschreiben habe und weshalb ich die "Use of uninitialized value"-Fehlermeldung mit Bezug auf $username kriege.
Hier die nicht funktionierende "defined"-Variante:
********************************************
#!c:/program files/perl/bin/perl -w
use diagnostics;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
require "datum.pl";
my $date = &ctime(time);
chop($date);
my ($outfile);
my $q = CGI::new();
my $username = $q->param("username");
my $city = $q->param("city");
my $comments = $q->param("comments");
my $homepage = $q->param("homepage");
Prüfung, ob zwingende Felder ausgefüllt wurden
if (defined $username)
{test_city();}
else {no_name();}
sub test_city{
if (defined $city)
{test_comments();}
else {no_city();}
}
sub test_comments{
if (defined $comments)
{url_test();}
else {no_comments();}
}
**************************************************
und hier die funktionierende "eq"-Version:
**************************************************
if ($username eq '')
{no_name();}
elsif ($city eq '')
{no_city();}
elsif ($comments eq '')
{no_comments();}
else {url_test();}
**************************************************
Besten Dank
Richard
Hallo Richard,
Es funktioniert nun alles, nur die Prüfung mit "defined" nicht und beim Einsatz von "strict" die Meldung, dass die Variable $username nicht deklariert wurde (was ich aber doch tue?).
Mit defined prüfst du ob zu einem Schlüssel ein Wert im Hash gepeichert ist, mit exists hingegen prüfst du auf die Existens des Schlüssels selber.
Wenn bei dir also kein "username" übergeben wird, liefert
my $username = $q->param("username");
(eigentlich) einen nicht determinierten Wert, die Fehlermeldung bei
if (defined $username)
ist also logisch.
Zu deinem Still: Das erinnert mich sehr an die Geschichte von den Kanonen und Spatzen ...
Ich würde vorschlagen:
my $username = $q->param("username") || &no_username();
my $city = $q->param("city") || &no_city();
my $comments = $q->param("comments") || &no_comments();
my $homepage = $q->param("homepage") || &no_homepage();
und am Ende der &no_.+() dann jeweils nach vollbrachter Arbeit ein exit;
Grüße, pK
Hallo Richard,
Es funktioniert nun alles, nur die Prüfung mit "defined" nicht und beim Einsatz von "strict" die Meldung, dass die Variable $username nicht deklariert wurde (was ich aber doch tue?).
Mit defined prüfst du ob zu einem Schlüssel ein Wert im Hash gepeichert ist, mit exists hingegen prüfst du auf die Existens des Schlüssels selber.
Wenn bei dir also kein "username" übergeben wird, liefert
my $username = $q->param("username");
(eigentlich) einen nicht determinierten Wert, die Fehlermeldung bei
if (defined $username)
ist also logisch.
Zu deinem Still: Das erinnert mich sehr an die Geschichte von den Kanonen und Spatzen ...
Ich würde vorschlagen:
ok - vielen Dank, ich hab das jetzt so geschrieben. Hab nun aber
ein anderes Problem, doch das werd ich separat posten.
my $username = $q->param("username") || &no_username();
my $city = $q->param("city") || &no_city();
my $comments = $q->param("comments") || &no_comments();
my $homepage = $q->param("homepage") || &no_homepage();
und am Ende der &no_.+() dann jeweils nach vollbrachter Arbeit ein exit;
Grüße, pK