Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Perl Misc (http://www.velocityreviews.com/forums/f67-perl-misc.html)
-   -   accessing numeric variables from textfield input in a form (http://www.velocityreviews.com/forums/t900742-accessing-numeric-variables-from-textfield-input-in-a-form.html)

rallabs@adelphia.net 11-22-2006 01:25 AM

accessing numeric variables from textfield input in a form
 
Dear Perl Experts: A weird thing is happening to me when I try to use
numeric input from a textfield form. The following two scripts, named
'in_sides.cgi' and 'findhyp.cgi', illustrate the problem.
'findhyp' is supposed to do some math on the two input variables
from 'in_sides.cgi', and it does it successfully, but when I try to
store the two input variables into an array (line 25 of the script
'findhyp'), the resulting array has only one element says the
script, and it gives a nonsensical foreach result. In addition, two
messages appear in the error log, saying: "$side[0] not numeric in line
25" and "$side[1] not numeric in line 25". I only get these complaints
when I try to store the variables into the array, but not otherwise. I
have seen in several references, eg "Perl and CGI for the WWW" by
Elizabeth Castro, that string variables automatically convert to
numeric when used in an arithmetic expression, and so I tried on line
24 of the second script to add zero to each variable, but it didn't
work. The error message for line 25 refers to the variables as
'$side[0]' or '$side[1]' even though they are now called
'$pct'. If anybody can explain this I'll be forever grateful.
Thanks in advance.
Mike
The first script ('in_sides.cgi') is:
#!/usr/bin/perl -wT
#this is in_sides.cgi
use CGI::Carp qw(fatalsToBrowser);
use CGI qw(:standard);
use strict;
use diagnostics;
use URI::Escape;
$CGI::DISABLE_UPLOADS=1;
$CGI::POST_MAX=500;
my $co = new CGI;
print $co->header("text/html");
print $co->start_html;
print $co->center($co->h1("This is where we input the two sides to the
right triangle\n"));
my @sidesarray;
$sidesarray[0]='a:';
$sidesarray[1]='b:';
print $co->startform(-method=>"POST",-action=>"findhyp.cgi");
foreach (0..$#sidesarray){
print $co->h3($sidesarray[$_]," ",textfield("side[$_]"));
}
print $co->p,$co->submit,$co->reset,
$co->endform;
exit;
and the second script ('findhyp.cgi') is:
#!/usr/bin/perl -wT
#This is findhyp.cgi
use strict;
use warnings;
use CGI qw(:standard);
$CGI::DISABLE_UPLOADS=1;
$CGI::POST_MAX = 102_400; #100KB
my $cc = new CGI;
print $cc->header;
print $cc->start_html(-title=>'findhyp');
my @percentS;
my $sumsq=0.0;
if (param()){
my @param=param();#these are the two numbers from textboxes on previous
page
foreach my $s (param () ) {
my $ss=param($s);
print $cc->h2("The variable \$s is $ss\n");
$sumsq=$sumsq + param($s)*param($s); #sums up squares of two sides
}
my $squirt=sqrt($sumsq);
print $cc->h2("The variable \$sumsq is $sumsq\n");
print $cc->h2("The variable \$squirt is $squirt\n");
foreach my $s ( param() ) {
my $pcnt=0+param($s);# this is supposed to make the $pcnt variable
numeric according to Castro p24
$percentS[$s] =$pcnt; #we're getting 2 messages in the errorlog saying
"$side[n] not numeric in line 25"; one for each pass thru the foreach
}
}
my $numelements=scalar(@percentS);
print $cc->h2("The number of elements in array \@percentS is
$numelements\n");
print $cc->h2("The index number of the last element is $#percentS\n");
exit;


attn.steven.kuo@gmail.com 11-22-2006 02:00 AM

Re: accessing numeric variables from textfield input in a form
 
rallabs@adelphia.net wrote:

(snipped)

> two
> messages appear in the error log, saying: "$side[0] not numeric in line
> 25" and "$side[1] not numeric in line 25".


(snipped)


> and the second script ('findhyp.cgi') is:
> #!/usr/bin/perl -wT
> #This is findhyp.cgi
> use strict;
> use warnings;
> use CGI qw(:standard);
> $CGI::DISABLE_UPLOADS=1;
> $CGI::POST_MAX = 102_400; #100KB
> my $cc = new CGI;
> print $cc->header;
> print $cc->start_html(-title=>'findhyp');
> my @percentS;
> my $sumsq=0.0;
> if (param()){
> my @param=param();#these are the two numbers from textboxes on previous
> page
> foreach my $s (param () ) {
> my $ss=param($s);
> print $cc->h2("The variable \$s is $ss\n");
> $sumsq=$sumsq + param($s)*param($s); #sums up squares of two sides
> }
> my $squirt=sqrt($sumsq);
> print $cc->h2("The variable \$sumsq is $sumsq\n");
> print $cc->h2("The variable \$squirt is $squirt\n");
> foreach my $s ( param() ) {
> my $pcnt=0+param($s);# this is supposed to make the $pcnt variable
> numeric according to Castro p24
> $percentS[$s] =$pcnt; #we're getting 2 messages in the errorlog saying
> "$side[n] not numeric in line 25"; one for each pass thru the foreach



You need an integer index to access a particular
element of the array @percentS. The value in
your $s variable is not an integer.

Was param($s) the integer you wanted?
If so, try:

$percentS[ param($s) ] = $pcnt;

instead of

$percentS[ $s ] = $pcnt;

--
Hope this helps,
Steven


rallabs@adelphia.net 11-22-2006 12:18 PM

Re: accessing numeric variables from textfield input in a form
 
attn.steven.kuo@gmail.com wrote:

Was param($s) the integer you wanted?

--
Hope this helps,
Steven
Steven, Thanks very much, it DID help. Your insight helped me analyze
the situation in a more logical and sane way. I now realize that the
root of my problem is the necessity to use param() without any
arguments. This is because I haven't any idea how many textfields will
be presented for parsing. (my post contained a form with 2 textfields
only, but that's an oversimplification of the real situation, in which
the form presents as little as 1 and as many as 9 textfields.) When
one uses param with no arguments, one gets the NAMES of the textfields,
not their contents. The problem is how to get the contents. The
following is what I tried. Basically, I filled an array with the names
of the textfields and then tried to use param on each array element in
turn. I don't understand why it doesn't work, but I at least
understand why I was getting the error log msg. Here's the guts of my
script 'parse.cgi':

if (param()){
my @Parray=param();#these are the contents of textboxes in submitting
form, 1-9 of them
my $lenparr=scalar(@Parray);
print $cc->h2("The number of elements in \@Parray is $lenparr. \n");
foreach (0..$#Parray) {
print $cc->h3("\$Parray[$_] is $Parray[$_]. Content of checkbox#$_ is
param($Parray[$_]).\n");
}
The last operation, param($Parray[$_]) , does not yield the contents of
$Parray[$_], but rather the words " param(side[N] " for pass "N" thru
the foreach. Yukk. Thank you very much for the help.
Mike

> rallabs@adelphia.net wrote:
>
> (snipped)
>
> > two
> > messages appear in the error log, saying: "$side[0] not numeric in line
> > 25" and "$side[1] not numeric in line 25".

>
> (snipped)
>
>
> > and the second script ('findhyp.cgi') is:
> > #!/usr/bin/perl -wT
> > #This is findhyp.cgi
> > use strict;
> > use warnings;
> > use CGI qw(:standard);
> > $CGI::DISABLE_UPLOADS=1;
> > $CGI::POST_MAX = 102_400; #100KB
> > my $cc = new CGI;
> > print $cc->header;
> > print $cc->start_html(-title=>'findhyp');
> > my @percentS;
> > my $sumsq=0.0;
> > if (param()){
> > my @param=param();#these are the two numbers from textboxes on previous
> > page
> > foreach my $s (param () ) {
> > my $ss=param($s);
> > print $cc->h2("The variable \$s is $ss\n");
> > $sumsq=$sumsq + param($s)*param($s); #sums up squares of two sides
> > }
> > my $squirt=sqrt($sumsq);
> > print $cc->h2("The variable \$sumsq is $sumsq\n");
> > print $cc->h2("The variable \$squirt is $squirt\n");
> > foreach my $s ( param() ) {
> > my $pcnt=0+param($s);# this is supposed to make the $pcnt variable
> > numeric according to Castro p24
> > $percentS[$s] =$pcnt; #we're getting 2 messages in the errorlog saying
> > "$side[n] not numeric in line 25"; one for each pass thru the foreach

>
>
> You need an integer index to access a particular
> element of the array @percentS. The value in
> your $s variable is not an integer.
>
> Was param($s) the integer you wanted?
> If so, try:
>
> $percentS[ param($s) ] = $pcnt;
>
> instead of
>
> $percentS[ $s ] = $pcnt;
>
> --
> Hope this helps,
> Steven



Amer Neely 11-22-2006 05:51 PM

Re: accessing numeric variables from textfield input in a form
 
rallabs@adelphia.net wrote:
> attn.steven.kuo@gmail.com wrote:
>
> Was param($s) the integer you wanted?
>
> --
> Hope this helps,
> Steven
> Steven, Thanks very much, it DID help. Your insight helped me analyze
> the situation in a more logical and sane way. I now realize that the
> root of my problem is the necessity to use param() without any
> arguments. This is because I haven't any idea how many textfields will
> be presented for parsing. (my post contained a form with 2 textfields
> only, but that's an oversimplification of the real situation, in which
> the form presents as little as 1 and as many as 9 textfields.) When
> one uses param with no arguments, one gets the NAMES of the textfields,
> not their contents. The problem is how to get the contents. The
> following is what I tried. Basically, I filled an array with the names
> of the textfields and then tried to use param on each array element in
> turn. I don't understand why it doesn't work, but I at least
> understand why I was getting the error log msg. Here's the guts of my
> script 'parse.cgi':
>
> if (param()){
> my @Parray=param();#these are the contents of textboxes in submitting
> form, 1-9 of them
> my $lenparr=scalar(@Parray);
> print $cc->h2("The number of elements in \@Parray is $lenparr. \n");
> foreach (0..$#Parray) {
> print $cc->h3("\$Parray[$_] is $Parray[$_]. Content of checkbox#$_ is
> param($Parray[$_]).\n");
> }
> The last operation, param($Parray[$_]) , does not yield the contents of
> $Parray[$_], but rather the words " param(side[N] " for pass "N" thru
> the foreach. Yukk. Thank you very much for the help.
> Mike
>
>> rallabs@adelphia.net wrote:
>>
>> (snipped)
>>
>>> two
>>> messages appear in the error log, saying: "$side[0] not numeric in line
>>> 25" and "$side[1] not numeric in line 25".

>> (snipped)
>>
>>
>>> and the second script ('findhyp.cgi') is:
>>> #!/usr/bin/perl -wT
>>> #This is findhyp.cgi
>>> use strict;
>>> use warnings;
>>> use CGI qw(:standard);
>>> $CGI::DISABLE_UPLOADS=1;
>>> $CGI::POST_MAX = 102_400; #100KB
>>> my $cc = new CGI;
>>> print $cc->header;
>>> print $cc->start_html(-title=>'findhyp');
>>> my @percentS;
>>> my $sumsq=0.0;
>>> if (param()){
>>> my @param=param();#these are the two numbers from textboxes on previous
>>> page
>>> foreach my $s (param () ) {
>>> my $ss=param($s);
>>> print $cc->h2("The variable \$s is $ss\n");
>>> $sumsq=$sumsq + param($s)*param($s); #sums up squares of two sides
>>> }
>>> my $squirt=sqrt($sumsq);
>>> print $cc->h2("The variable \$sumsq is $sumsq\n");
>>> print $cc->h2("The variable \$squirt is $squirt\n");
>>> foreach my $s ( param() ) {
>>> my $pcnt=0+param($s);# this is supposed to make the $pcnt variable
>>> numeric according to Castro p24
>>> $percentS[$s] =$pcnt; #we're getting 2 messages in the errorlog saying
>>> "$side[n] not numeric in line 25"; one for each pass thru the foreach

>>
>> You need an integer index to access a particular
>> element of the array @percentS. The value in
>> your $s variable is not an integer.
>>
>> Was param($s) the integer you wanted?
>> If so, try:
>>
>> $percentS[ param($s) ] = $pcnt;
>>
>> instead of
>>
>> $percentS[ $s ] = $pcnt;
>>
>> --
>> Hope this helps,
>> Steven

>


According to 'Official Guide to Programming with CGI.pm' [Lincoln Stein]
this should walk through all the form fields:

foreach $name(param())
{
$value=param($name);
print "The value of $name is $value\n";
}

--
Amer Neely
w: www.softouch.on.ca/
b: www.softouch.on.ca/blog/
Perl | MySQL programming for all data entry forms.
"We make web sites work!"


All times are GMT. The time now is 01:32 AM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


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 45 46 47 48 49 50 51 52 53 54 55 56 57