Schrift
[thread]798[/thread]

checkbox abarbeiten (CGI.pm)



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Froschpopo
 2006-08-09 01:54
#8541 #8541
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Wie kann ich mit dem CGI-modul einen query string mit folgendem inhalt abarbeiten:

Code: (dl )
msg=1&msg=2&msg=hot


nun ist es ja so, dass CGI die Parameter offenbar in einen Hash einliest den man dann z.b. per CGI::param() direkt abrufen oder mit CGI::Vars() in einen neuen Hash einlesen kann.

blöderweise kann ich dann mehrere Parameter mit demselben Name nicht mehr auslösen, da ja jeder Schlüssel nur einmal existieren kann und der Parameter-name auch gleichzeitig der schlüssel-name ist.

Also beispiel:

<input type="checkbox" name="id" value="34">
<input type="checkbox" name="id" value="12">

ergibt dann später in CGI::param('id') den Wert: 12
34 aber fehlt.

Wie macht ihr denn das?
GwenDragon
 2006-08-09 06:50
#8542 #8542
User since
2005-01-17
14757 Artikel
Admin1
[Homepage]
user image
Ähm, so:
Code: (dl )
@ids = CGI::param('id');
Froschpopo
 2006-08-09 12:48
#8543 #8543
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ah das wars also :) danke!
Froschpopo
 2006-09-06 00:20
#8544 #8544
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
mein problem ist nun folgendes:

ich habe schrecklich viele solcher param()'s.
Deshalb mache ich einfach folgendes:
Code: (dl )
%args = CGI::Vars();

Nun ist es ja so, dass in diesem Hash der Parametername der Hashkey ist und davon nur einer existieren kann.
Gibts da eine fertige Lösung?
Ich möchte ungern jedesmal param() aufrufen müssen.

Am besten wäre ja, wenn man in diesem Hash irgendwie ein anonymes Array anlegen könnte.
also z.b. so:

Code: (dl )
%args = ( id => [34, 12] );
Ronnie
 2006-09-06 00:49
#8545 #8545
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
schau doch einfach mal rein:
Code: (dl )
1
2
3
4
5
6
7
use Data::Dumper;
use CGI::Carp qw/fatalsToBrowser/;

# yada yada

my %args = CGI::Vars();
die Dumper \%args;
\n\n

<!--EDIT|Ronnie|1157489363-->
Froschpopo
 2006-09-06 02:23
#8546 #8546
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
also ich bekomme folgendes ausgabe:
Code: (dl )
1
2
3
[Wed Sep  6 00:24:19 2006] perlt.pl: $VAR1 = {
[Wed Sep 6 00:24:19 2006] perlt.pl: 'hallo' => 'hm pff'
[Wed Sep 6 00:24:19 2006] perlt.pl: };

habe es aus der konsole folgends aufgerufen: perl perlt.pl hallo=hm hallo=pff

also doch keine arrayref oder sowas...

jetzt könnte man sich natürlich die arbeit machen und das ganze zu splitten... aber blöderweise decodiert CGI ja vorher den @ARGV.
Man kann das sehr schön sehen, wenn man mal das script mit folgendem aufruf startet:

perl perlt.pl hallo=hm%20du hallo=test

das ergibt dann den folgenden hashwert:
Code: (dl )
hallo => 'hallo du test"

und ist somit nichtmehr splitbar, da "du" nach einem split() einen eigenen index bekäme, anstatt in den von "hm" eingeordnet zu werden.\n\n

<!--EDIT|Froschpopo|1157495749-->
renee
 2006-09-06 10:15
#8547 #8547
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst nach \0 splitten...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl -w

use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use Data::Dumper;

my $cgi = CGI->new();
print $cgi->header(type => "text/plain");
my %vars = $cgi->Vars();

print Dumper(\%vars),"\n\n";

my @tests = split /\0/,$vars{test};
print Dumper(\@tests);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2006-09-06 12:25
#8548 #8548
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
es ist ja nicht so, dass das nicht dokumentiert ist, und es ist auch nicht so,
dass froschpopo nicht weiß, wie man perldoc aufruft. er ist wirklich schon
lange genug dabei, um es besser zu wissen.
hier der entsprechende abschnitt direkt unter der erklärung von Vars():

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Many people want to fetch the entire parameter list as a hash in
which the keys are the names of the CGI parameters, and the values are
the parameters' values. The Vars() method does this. Called in a scalar
context, it returns the parameter list as a tied hash reference. Changing a
key changes the value of the parameter in the underlying CGI parameter
list. Called in a list context, it returns the parameter list as an ordinary
hash. This allows you to read the contents of the parameter list, but not to
change it.

When using this, the thing you must watch out for are multivalued CGI
parameters. Because a hash cannot distinguish between scalar and list
context, multivalued parameters will be returned as a packed string,
separated by the "\0" (null) character. You must split this packed string in
order to get at the individual values. This is the convention introduced
long ago by Steve Brenner in his cgi-lib.pl module for Perl version 4.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Dubu
 2006-09-06 12:48
#8549 #8549
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
froschpopo hat aber auch schon oft darauf hingewiesen, dass er mit dem Englischen auf dem Kriegsfuß steht, daher hilft ein "RTFM" auch nicht weiter.
Froschpopo
 2006-09-06 14:25
#8550 #8550
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ah also ich kann ein bisschen mit altavista übersetzen solang es kein slang ist.
Also das mit dem Nullcharacter habe ich verstanden.
Trotzdem komisch, dass die Konsole den \0 wie ein leerzeichen darstellt.
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2006-08-09 01:54.