Lewick, Taylor wrote:
> Hi all, I have been using perl for sometime for CGI scripts, but have
> always used the print content-type:html version of doing things.
> 
> I would like to learn a better way with the CGI module, but when I
> read the docs I find it pretty easy to get confused as to whether I
> should use the object oriented method, or the functional method.

Either is fine IMO. The function method requires you to import the correct
symbols, which can be a bit tricky.

> 
> Also, because my script is a cgi form that gets some of the select
> fields from a mysql database, I am not sure how to convert that over.
> I don't know how I would make the select field work the same.
> 
> I am not asking for someone to rewrite my project, merely provide me
> with some examples of how they would write the same code using the cgi
> module so I can figure this out a bit better...
> 
> On my form, I am querying a database for a list of names and loading
> them into a select box.  But I found out people want to enter more
> than one name at a time, so I loop through 15 times, and they can
> select up to 15 names...  They select a name, but I store the name's
> id, so it acts as a lookup field...
> 
> Here is how I do this now..
>  #Connect to database
>  print "<table>\n";
>  for (1..15) {
>  print "<td nowrap>\n";
>  $query_teams=("select id, name from teams");
>  $sth = $dbh->prepare($query_teams);
>  $sth->execute();
>  $sth->bind_columns(\$id, \$name);
>  print "<select name='away_team$_'>"; #$_ traps which pass of the loop
> we are in i.e., 3rd pass, 4th pass, etc
>  print "<option value='0'></option>\n";
>  while($sth->fetch()) {
>  print "<option value='$id'>$name</option>\n";
>  }
>  print "</select>\n";
>  $sth->finish();
>  print "</td>\n";
> } #end for loop
> print "</table>\n";
> #disconnect from database
> 
> How would I start to convert this with the CGI module.  My problems
> thus far are on a popup menu, how do I specify the field variable
> that I grab is the ID, while the displayed value is another, and how
> can I say the first value should be 0, in case they do not enter
> anything? 

You're querying the database 15 times; I definitely wouldn't do that.

I ususally grab all the rows into an arrayref using something like this:

   my $rows = $dbh->selectall_arrayref('select id, name from teams');

This handles all the DBI calls one one swoop.

For the CGI module's popup_menu, you need two things:

1) a list of values for the <option> elements, and
2) a hash of value => description pairs for the labels

Here's how to get the labels hash from the rows fetched above:

   my %labels = ( 0 => '', map @$_, @$rows );

You can extract the value list from the hash keys:

   my @values = sort { $a <=> $b } keys %labels;

Now you can generate the table by using CGI's routines like this (OO style):

   print $q->start_table,
     $q->start_Tr,
     $q->td({ -nowrap => 'nowrap' }, [ map $q->popup_menu(
        -name => "away_team$_",
        -labels => \%labels,
        -values => [EMAIL PROTECTED],
        -default => '0',
     ), 1 .. 15 ]),
     $q->end_Tr,
     $q->end_table;

CGI let's you use start_xxx and end_xxx methods to generate just a start or
end tag.

If you pass an arrayref to a method like td(), CGI will generate multiple
elements, one for each entry in the array. This lets us generate all 15 <td>
elements in one call. Look in the CGI docs under "THE DISTRIBUTIVE PROPERTY
OF HTML SHORTCUTS"

The map() function generates a list of <select> objects.

HTH

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to