Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I have a web page with sveral checkboxes, when this this is submitted i need to process data based on the boxes checked. If one of the boxes was named option1, i know i can use
$value = $query->param("option1");
this would let me process the data based on the $value. How how can i adapt this so that $value = the value from the checkbox? Thanks

Replies are listed 'Best First'.
Re: $query->param question
by Nevtlathiel (Friar) on Jun 09, 2005 at 15:13 UTC
    Have a look in the CGI docs for 'Creating a group of related checkboxes' :)

    ----------
    My cow-orkers were talking in punctuation the other day. What disturbed me most was that I understood it.

Re: $query->param question
by ikegami (Patriarch) on Jun 09, 2005 at 15:22 UTC

    Ideally, you'd give checkboxes different names:
    (Using a travel agent site as an example.)

    # <input type="checkbox" name="search_first_class"> # <input type="checkbox" name="search_economy_class"> my $search_first_class = $cgi->param('search_first_class'); my $search_economy_class = $cgi->param('search_economy_class'); warn("Classes to search:" . ($search_first_class ? ' First' : '') . ($search_economy_class ? ' Economy' : '') ) if $DEBUG;

    But you can give them the same name if they have different values:

    # <input type="checkbox" name="search_class" value="first"> # <input type="checkbox" name="search_class" value="economy"> # Call $cgi->param in a list context. my @search_classes = $cgi->param('search_class'); warn("Classes to search: " . join(' ', @search_classes)) if $DEBUG; # # The array can be converted to a hash for easy to lookup. # my %search_classes; # @search_classes{@search_classes} = @search_classes; # # warn("Classes to search:" # . ($search_class{'first' } ? ' First' : '') # . ($search_class{'economy'} ? ' Economy' : '') # ) if $DEBUG;

    Update: I concur with Ovid. The second case is the ideal one, not the first. What was I thinking??

      You have the order reversed. Ideally, you should give each input the same name with a different value. The reason for that is one of maintainability. If you have different names, you generally have to write code to handle each name. However, in a well-designed app, if the only a new value is added, you may not have to change the code:

      Football: <input name="sport" value="football" type="checkbox" /><br + /> Baseball: <input name="sport" value="baseball" type="checkbox" /><br + /> Soccer: <input name="sport" value="soccer" type="checkbox" /><br + />

      With those three inputs, you can often use just one basic line to handle them:

      foreach my $sport ($cgi->param('sport') { # do something with sport }

      If handled correctly, adding a new sport is now just adding a new input box. By using different names, I'd like have to write a new input box and write new code.

      Cheers,
      Ovid

      New address of my CGI Course.

        thanks for all those suggestions, proved to be very useful
Re: $query->param question
by radiantmatrix (Parson) on Jun 09, 2005 at 15:18 UTC

    Each checkbox group0 should have its own name. Your assignment should fetch the value of the checkbox named 'option1'. Your HTML might look like this:

    <form action='submission.pl' method='post'> <input type='checkbox' name='option1' value='Option 1 checked!' /> This is the text next to option 1 <input type='submit' value='Submit' /> </form>
    If the checkbox named 'option1' is checked, then the code you use above will assign the string 'Option 1 checked!' to $value; if it were not checked, $value ends up being undefined.

    Adding more checkboxes with the same name will result in different or multiple values. If you use CGI::Simple (which I recommend as a CGI drop-in replacement), the multiple values will returned as an array. So, your Perl code might contain something like:

    my @value = $cgi->param('option1');
    And @value will contain a list of all the values for the 'option1' group of checkboxes.0 - all of this para.

    0: Updated 09.Jun.2005 @ 14:40 CST. Re-read revealed an oops.

    Yoda would agree with Perl design: there is no try{}

Re: $query->param question
by Anonymous Monk on Jun 09, 2005 at 15:10 UTC
    sorry, what happens when more than more box is checked?
      @values = $query->param('foo')
      That will get all of the values checked.

      As stated below check out the CGI.pm docs.