単一ページの名簿表示
文章だけで読むと 非常に悩みます。
staffs.pl のコードには フォーム部分がないんです。
勝手に手前味噌に コードを書きました。
索引ページの表示と個別のエントリの表示だけとありますので。
こんな感じのことを この本は言いたいのではないかと。。。
staffs.pl
#!D:/xampp/perl/bin/perl use CGI; use utf8; use WebDB; $q = new CGI; $q->start_html(-title => "Staff Directory", -bgcolor => "white"); print $q->header(-type =>'text/html',-charset => 'utf-8'), $q->start_html(-title=>"Database Form"), $q->h1(' データを検索します'), $q->start_form, $q->em("Your ID"), $q->textfield(-name=>'id'), $q->br, $q->p, $q->reset, $q->submit(-name =>'Action', -value =>'検索'), $q->submit(-name =>'Action', -value =>'Scream'); $q->end_form; $param=$q ->param('id'); my $dbh = WebDB::connect (); my $id = WebDB::trim ($param); if ($id ne "") { display_entry ($dbh, $id); } else { display_index ($dbh); } $dbh->disconnect (); print end_html (); exit (0); sub display_entry { my ($dbh, $id) = @_; my ($sth, $ref); $sth = $dbh->prepare ("SELECT * FROM staff WHERE id = ?"); $sth->execute ($id); $ref = $sth->fetchrow_hashref (); $sth->finish (); if (!$ref) { print $q->p($q->escapeHTML ("No record for ID $id was found.")); return; } print $q->p($q->escapeHTML ("ID: $ref->{id}")); print $q->p($q->escapeHTML ("Name: $ref->{lname}, $ref->{fname}")); print $q->p($q->escapeHTML ("Position: $ref->{position}")); print $q->hr (); print $q->p("[" . $q->a ({-href =>$q->referer()}, "index") . "]"); } sub display_index { my $dbh = shift; my ($sth, @nav_bar, @item_list); my $cur_letter = ""; @nav_bar = gen_nav_bar ($dbh); if (!@nav_bar) { print $q->p ("The directory has no entries."); return; } print $q->p ($q->a ({-name => "top"}, "Select a letter to go to that part of the directory:")); print $q->hr (), $q->center (@nav_bar), $q->hr (); $sth = $dbh->prepare ( "SELECT id, CONCAT(lname,', ',fname) AS name FROM staff ORDER BY name"); $sth->execute (); while (my ($id, $name) = $sth->fetchrow_array ()) { if ($cur_letter ne uc (substr ($name, 0, 1))) {print $q->ul ($q->li (\@item_list)) if @item_list; @item_list = (); $cur_letter = uc (substr ($name, 0, 1)); print $q->p ( $q->strong ($q->a ({-name => "$cur_letter"}, $cur_letter )) . "[" . $q->a ({-href => "#top"}, "index") . "]");} push (@item_list, $q->a({-href =>$q->self_url() . "?id=$id"} , $q->escapeHTML ($name) )) ;} $sth->finish (); print $q->ul ($q->li (\@item_list)) if @item_list; print $q->hr (), $q->center (@nav_bar), $q->hr (); } sub gen_nav_bar { my $dbh = shift; my $letter_ref; $letter_ref = $dbh->selectcol_arrayref ( "SELECT DISTINCT UPPER(LEFT(lname,1)) AS letter FROM staff ORDER BY letter"); return () if !$letter_ref || !@{$letter_ref}; return (map { "[" . $q->a({-href => "#$_"}, $_ ) . "]\n" } @{$letter_ref});}