accessing numeric variables from textfield input in a form

Discussion in 'Perl Misc' started by rallabs@adelphia.net, Nov 22, 2006.

  1. Guest

    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;
     
    , Nov 22, 2006
    #1
    1. Advertising

  2. Guest

    Re: accessing numeric variables from textfield input in a form

    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
     
    , Nov 22, 2006
    #2
    1. Advertising

  3. Guest

    Re: accessing numeric variables from textfield input in a form

    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

    > 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
     
    , Nov 22, 2006
    #3
  4. Amer Neely Guest

    Re: accessing numeric variables from textfield input in a form

    wrote:
    > 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
    >
    >> 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!"
     
    Amer Neely, Nov 22, 2006
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Remco Groot Beumer

    How to read input from a textfield in a datagrid !?!

    Remco Groot Beumer, Nov 6, 2003, in forum: ASP .Net
    Replies:
    0
    Views:
    314
    Remco Groot Beumer
    Nov 6, 2003
  2. Remco Groot Beumer

    How to read input from a textfield in a datagrid !?!

    Remco Groot Beumer, Nov 6, 2003, in forum: ASP .Net Building Controls
    Replies:
    1
    Views:
    136
  3. Remco Groot Beumer

    How to read input from a textfield in a datagrid !?!

    Remco Groot Beumer, Nov 6, 2003, in forum: ASP .Net Web Controls
    Replies:
    1
    Views:
    143
  4. Mario Ruiz
    Replies:
    0
    Views:
    91
    Mario Ruiz
    Feb 18, 2009
  5. Jared Cobb

    Textfield Numeric Sorting?

    Jared Cobb, Sep 18, 2003, in forum: Javascript
    Replies:
    2
    Views:
    87
    Lasse Reichstein Nielsen
    Sep 18, 2003
Loading...

Share This Page