Formularparameter mit dem CGI-Modul
myMojito
- perl
0 Rolf Rost0 C14L0 Alexander Foken0 myMojito
0 timothy
Hallo SelfForum,
wenn ich mittels dem CGI-Modul die einzelnen Formularfelder in meinem Skript einlese, lege ich alle Werte zuerst in einer Variable ab:
my $sid = $CGI->param('sid');
Nun ist in der Variable $sid auch der Inhalt des Formularfeldes gespeichert. Werte ich aber in meinem Skript das Formularfeld über $CGI->param('sid') direkt aus, bekomme ich als Inhalt immer HASH{x5766} zurück.
Bei wenigen Formularfeldern ist es ja kein Akt jeden Parameter zuerst in einer Variablen zwischen zu speichern. Bei 20 Formularfeldern kommt mir das ganze jedoch sehr unpraktisch vor.
Wie kann ich den Inhalt von my $CGI->param('sid') direkt auswerten, ohne das zwischenspeichern in eine Variable? Würde mich im allgemeinen interessieren, wie ihr die Formularfelder über das CGI-Modul in euer Skript einbindet.
greets
myMojito
hi,
bisher hab ich zum Parsen eines Forms meistens die cgi-lib.pl verwendet. Das Modul CGI.pm ist dazu kompatibel, siehe
http://i-netlab.de/links/cgi.htm
cgi-lib.pl erzeugt einen hash %in, damit kann global auf jedes Inputfeld zugegriffen werden $in{'vorname'}...
Falls es nur um das Parsen eines Forms geht ists vielleicht effektiver eine eigene Funktion zu haben und auf das Einbinden weiterer Module zu verzichten. Eine erprobte Funktion - siehe Link.
Rolf
Hallo SelfForum,
wenn ich mittels dem CGI-Modul die einzelnen Formularfelder in meinem Skript einlese, lege ich alle Werte zuerst in einer Variable ab:
my $sid = $CGI->param('sid');Nun ist in der Variable $sid auch der Inhalt des Formularfeldes gespeichert. Werte ich aber in meinem Skript das Formularfeld über $CGI->param('sid') direkt aus, bekomme ich als Inhalt immer HASH{x5766} zurück.
Bei wenigen Formularfeldern ist es ja kein Akt jeden Parameter zuerst in einer Variablen zwischen zu speichern. Bei 20 Formularfeldern kommt mir das ganze jedoch sehr unpraktisch vor.
Wie kann ich den Inhalt von my $CGI->param('sid') direkt auswerten, ohne das zwischenspeichern in eine Variable? Würde mich im allgemeinen interessieren, wie ihr die Formularfelder über das CGI-Modul in euer Skript einbindet.
greets
myMojito
Hallo SelfForum,
Hi Mojito!
wenn ich mittels dem CGI-Modul die einzelnen Formularfelder in meinem Skript einlese, lege ich alle Werte zuerst in einer Variable ab:
my $sid = $CGI->param('sid');
Zwar keine direkte Antwort, aber mit
----------------------------
sub ReadParse {
(*in) = @_ if @_;
my ($i, $loc, $key, $val);
if ($ENV{'REQUEST_METHOD'} eq "GET"){ $in = $ENV{'QUERY_STRING'} }
elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN,$in,$ENV{'CONTENT_LENGTH'}) }
@in = split(/&/,$in);
foreach $i (0 .. $#in){
$in[$i] =~ s/+/ /g;
($key, $val) = split(/=/,$in[$i],2);
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%0D%0A/\n/g;
$val =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/<!--(.|\n)*-->//g;
$val =~ s/\t/ /g;
$in{$key} .= " " if (defined($in{$key}));
$in{$key} .= $val;
}
}
----------------------------
rufst du einfach &ReadParse; auf, und hast alle GET und POST vars im %in Hash.
Gruß
C14L
Moin Moin !
Du hast definitiv einen Fehler in Deinem Code, oder Du machst etwas sehr "perverses" mit den CGI-Parametern.
Normalerweise liefert param() keinen Hash zurück (der dann bei der Ausgabe als HASH(0xDEADBEEF) geschrieben wird).
Poste mal etwas Code.
Alexander
Hallo Alexander,
Jetzt habe ich nochmals ein wenig mit dem Code herumgespielt. Wenn ich folgende Zeile eingebe:
print $CGI->param('test');
Funktioniert alles wie gewollt.
Wenn ich jedoch folgende Zeile eingebe:
print "Hallo, $CGI->param('test')";
Bekomme ich folgende Ausgabe auf dem Browser:
Hallo, CGI=HASH(0x1a6f038)->param('test')
Jetzt gehe ich davon aus, das ich den obige Code wie folgt schreiben muss, das es funktioniert:
print "Hallo,". $CGI->param('test');
Habe ich jetzt alles richtig verstanden? Ja, ich weiß, eigentlich hätte ich ja gleich selbst drauf kommen können, aber irgendwie hat erst die Aussage das es gehen muss mich dazu bewogen mal ein paar Tests zu machen.
Kann mir eigentlich jemand die Ausgabe der Zeile CGI=HASH(0x1a6f038)->param('test') erklären?
greets
myMojito
Moin Moin !
Hallo Alexander,
Jetzt habe ich nochmals ein wenig mit dem Code herumgespielt. Wenn ich folgende Zeile eingebe:
print $CGI->param('test');
liebes Perl, bitte gib den Rückgabewert der Methode param des Objektes $CGI aus.
Funktioniert alles wie gewollt.
Wenn ich jedoch folgende Zeile eingebe:
print "Hallo, $CGI->param('test')";
liebes Perl, bitte gebe den String aus und ersetze alle Variablen die Du findest. $CGI ist ein Objekt, in diesem Fall eine "blessed reference" auf einen Hash. Also soll Perl "Hallo, ", dann eine Hash-Referenz, gecastet auf einen String, dann "->param('test')" ausgeben. Und eine Hash-Referenz, gecastet auf einen String, ist "HASH(" + hexadezimale Adresse der internen Struktur + ")". Bei "blessed references" wird auch noch der Klassenname und ein "=" vorangestellt.
Bekomme ich folgende Ausgabe auf dem Browser:
Hallo, CGI=HASH(0x1a6f038)->param('test')
Genau das hast Du ja von Perl verlangt.
Jetzt gehe ich davon aus, das ich den obige Code wie folgt schreiben muss, das es funktioniert:
print "Hallo,". $CGI->param('test');
liebes Perl, bitte schreibe den String "Hallo,", concatiniert mit dem Rückgabewert der Methode param des Objektes $CGI.
Habe ich jetzt alles richtig verstanden? Ja, ich weiß, eigentlich hätte ich ja gleich selbst drauf kommen können, aber irgendwie hat erst die Aussage das es gehen muss mich dazu bewogen mal ein paar Tests zu machen.
Vielleicht solltest Du Dir mal die Perl-Doku vornehmen.
Kann mir eigentlich jemand die Ausgabe der Zeile CGI=HASH(0x1a6f038)->param('test') erklären?
siehe oben.
Alexander
Hallo Alexander,
danke für die ausführliche Erklärung. Das zeigt mir immer wieder das ich noch verdammt viel lernen muß, um mit Perl auf Du und Du zu sein.
Zum Glück sagt selbst Larry Wall "TMTOWTDI". Meine Programme haben zwar immer Funktioniert, waren aber wahrscheinlich nicht immer die effizienesten!
greets
myMojito
Nun ist in der Variable $sid auch der Inhalt des Formularfeldes gespeichert. Werte ich aber in meinem Skript das Formularfeld über $CGI->param('sid') direkt aus, bekomme ich als Inhalt immer HASH{x5766} zurück.
IMHO wenn Du schreibst
print "$cgi->param('par')";
erhälst Du einen Hash bei Arrays, Hashes ..., da nur Scalare (also $bla) innerhalb von "" aufgelöst werden.
Gruß
Timothy