To access the form's various parameters, use $r->content to access POSTed parameters and $r->args to access GET parameters encoded in the URL.
%post_parameters = $r->content; %get_parameters = $r->args;
You can call $r->content only once per request because the first call consumes all POSTed data.
The Apache::Request module from CPAN gives you a $r->param method to access specific parameters, regardless of whether they're from GET or POST:
use Apache::Request; sub handler { my $r = Apache::Request->instance(shift); my @param_names = $r->param; my $value = $r->param("username"); # single value my @values = $r->param("toppings"); # multiple values # ... }
Processing form parameters without Apache::Request is problematic with values that occur multiple times. For example, a SELECT list with MULTIPLE enabled sends repeated entries for the same parameter name. Putting them into a hash preserves only one of those entries. Apache::Request solves this problem by accumulating multiply-submitted parameters in an array.
Form parameters POSTed to your handler can be a problem. The nature of Apache is that once one handler reads the POSTed data, another handler cannot come along later and reread that same information. So if you're going to process POSTed form parameters, you had better keep the decoded parameters around in case another handler wants to access them. The instance constructor handles this for us. When two handlers both call the instance constructor, the second handler gets back the Apache::Request object populated by the first, with form parameters already decoded.
The Apache::Request $r->param interface is based on the CGI module's parameter-parsing interface.
The Apache.pm manpage; Writing Apache Modules with Perl and C; Recipe 3.5 in mod_perl Developer's Cookbook; the Apache::Request manpage; Recipe 20.2
Copyright © 2003 O'Reilly & Associates. All rights reserved.