Schrift
[thread]13129[/thread]

Rueckgabe von Werten aus HTML-Formular

Leser: 3


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
ofmueller
 2009-02-11 21:59
#118807 #118807
User since
2009-02-11
2 Artikel
BenutzerIn
[default_avatar]
Bitte um kurzen Denkanstoß.

Ich habe das nachfolgende Skript geschrieben. Der Wert $eing soll durch die Funktion "sub eingabe_menue" übergeben werden. Das nachfolgende Hauptprogramm wartet aber nicht auf die Rückgabe des Wertes und gibt als Fehlermeldung heraus, dass die Variable $test ($test = eingabe_menue) nicht definiert ist, obwohl sie von der oben genannten Funktion den Wert übernehmen soll. Wenn ich endlich eine Eingabe in das fertige Formular über den Browser vornehme, wird auch der Wert für übergeben. Aber wie gesagt, bis dahin erhalte ich Fehlermeldungen, was insbesondere bei Schleifen problematisch ist (Endlosschleife).

Danke
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
!/usr/bin/perl -w
use strict;

use CGI qw(param);
use CGI::CARP qw(fatalsToBrowser);
print "Content-type: text/html\n\n";

my $teste;

sub eingabe_menue
{
my $url = 'http://127.0.0.1/cgi-bin/cgi/woerterbuch3.pl';

print <<END;
<html>
<head><title>Vokabletrainer</title></head>
<body>
<p>Vokabeltrainer
<p>**************
<p>Menue
<p>1 Vokabeln eingeben
<p>2 Englisch - Deutsch
<p>3 Deutsch - Englisch
<p>4 Programmende
<p>
<form action='$url' method='POST'>
<p>Auswahl: 
<input type='text' name='eingabe' value=''>
<input type='submit' name='submit' value='Abschicken'>
<\/form>
<\/p>
<\/body>
<\/html>
END
        my $eing = 0;
        if (param()) {
                $eing = param('eingabe');
        }

return [b]$eing = param('eingabe');[/b] 
}
styx-cc
 2009-02-11 23:58
#118808 #118808
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hallo, also wenn ich den Code so ausführe, bekomme ich keine Fehlermeldung und als Ausgabe halt nichts (oder HTML wenn man die Subroutine aufruft):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/perl -w
use strict;

use CGI qw(param);
use CGI::CARP qw(fatalsToBrowser);
print "Content-type: text/html\n\n";

my $teste = eingabe_menue();
print $teste if $teste;

sub eingabe_menue {
my $url = 'http://127.0.0.1/cgi-bin/cgi/woerterbuch3.pl';;

print <<"END";
<html>
<head><title>Vokabletrainer</title></head>
<body>
<p>Vokabeltrainer
<p>**************
<p>Menue
<p>1 Vokabeln eingeben
<p>2 Englisch - Deutsch
<p>3 Deutsch - Englisch
<p>4 Programmende
<p>
<form action='$url' method='POST'>
<p>Auswahl:
<input type='text' name='eingabe' value=''>
<input type='submit' name='submit' value='Abschicken'>
</form>
</p>
</body>
</html>
END

my $eing = 0;
if (param()) {
$eing = param('eingabe');
}
return $eing;
}


P.s.: Dein HTML ist ganz schön kaputt...

EDIT: Huch, hab wegen der 24h-Übersicht gar nicht mitbekommen, dass wir hier über mod_perl & Apache reden... sorry
Pörl.
renee
 2009-02-12 09:50
#118810 #118810
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
$teste ne $test...


Außerdem heißt das Modul CGI::Carp und nicht CGI::CARP
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/
nepos
 2009-02-12 10:22
#118811 #118811
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code (perl): (dl )
print "Content-type: text/html\n\n";

Du lädst doch CPAN:CGI, warum benutzt du es nicht für einen gültigen HTTP-Header?
GwenDragon
 2009-02-12 11:05
#118812 #118812
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
1) Du solltest auch sinnvollerweise use warnings; verwenden.

2) Warum verwendest du nicht gleich die Funktionen von CGI zur korrekten Erstellung von HTML?

3) Verwendest du wirklich mod_perl?

So geht es auch:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl
use strict;
use warnings;

use CGI qw(-no_xhtml);
use CGI::Carp qw(fatalsToBrowser);

my $cgi = new CGI;

print $cgi->header();
print $cgi->start_html(-title=>'Vokabeltrainer');

my $teste = eingabe_menue();

print $cgi->p($cgi->b("Eingabe ist: $teste")) if $teste;

print $cgi->end_html;

sub eingabe_menue {
my $url = $cgi->url; # Nur zum Testen!
#my $url = 'http://127.0.0.1/cgi-bin/cgi/woerterbuch3.pl';

print $cgi->p(
[ 'Vokabeltrainer',
'**************',
'Menue',
'1 Vokabeln eingeben',
'2 Englisch - Deutsch',
'3 Deutsch - Englisch',
'4 Programmende'
]
),
$cgi->start_form(-action=>$url),
$cgi->p('Auswahl:'),
$cgi->textfield(-name=>'eingabe', -value=>'', -size=>1),
$cgi->submit(-name=>'submit', value=>'Abschicken'),
$cgi->endform,
$cgi->p('');

my $eing = $cgi->param('eingabe');
return $eing;
}

1;
Struppi
 2009-02-12 12:10
#118813 #118813
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Ich stimme dir in allen Punkten zu (und war auch schon kurz davor das Skript entsprechend umzubauen, aber du kamst mir zuvor ;-)), aber

GwenDragon+2009-02-12 10:05:43--
1) Du solltest auch sinnvollerweise use warnings; verwenden.

Er hat den -w Switch benutzt (den ich persönlich auch bevorzuge, da dann das komplette Skript und alle Module ihre Warnungen ausgeben).
Taulmarill
 2009-02-12 12:45
#118814 #118814
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Struppi+2009-02-12 11:10:49--
Er hat den -w Switch benutzt (den ich persönlich auch bevorzuge, da dann das komplette Skript und alle Module ihre Warnungen ausgeben).


Der Grund, warum einige use warnings; dem -w Switch vorziehen ist der, dass bei Verwendung von -w einige wenige CPAN Module Warnungen ausgeben, obwohl eigentlich alles ok ist. Bei Verwendung des Pragmas überlässt man jedem Modul selbst die Entscheidung, ob Warnungen sinnvoll sind oder nicht.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
GwenDragon
 2009-02-12 13:48
#118815 #118815
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Struppi+2009-02-12 11:10:49--
Er hat den -w Switch benutzt (den ich persönlich auch bevorzuge, da dann das komplette Skript und alle Module ihre Warnungen ausgeben).
Ja, das sah ich.
Allerdings werfen eben dann alle Module Warnungen aus.
Das kann im technischen Betriebe ab und an Ärger geben.
Es ist sinnvoller Fehler und Warnungen selbst anzufangen.

Wenn es sicher sein soll, sollte noch der Parameter -T im Shebang benutzt werden, um Tainting zu aktivieren.
Niemals den Eingabevariablen trauen.
Struppi
 2009-02-12 14:39
#118816 #118816
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Ich hab mit -w seit Jahren keine Probleme mehr. Ich kenn kein Modul, dass Warnungen unnötig erzeugt, aber ich kann mich erinnern, dass das früher mal so war.

Und mit -w erfahre ich ja dann auch, wenn ich einem Modul einen undefinierten Wert übergebe oder zeigt das use warnings auch an?
moritz
 2009-02-12 21:16
#118817 #118817
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
-w ist "action at a distance" und keine gute Idee. Wenn man ein Modul einsetzt, sollte man dem Autor soweit vertrauen, dass man nicht in sein Modul hereinpfuscht.

Es kann auch gute Gründe geben, warum Code ohne warnings laufen soll, z.B. bei generiertem Code kann es zu aufwändig sein, alle Warnungen zu beseitigen.

Für Einzeiler ist -w extrem praktisch, aber ansonsten halte ich es nicht mehr für den Gebrauch geeignet.
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2009-02-11 21:59.