初心者だけどPerlが大好き

コードが世界を変える!

複数ページの名簿表示 

例によって 本には図がないので 
コードを読み説いた私の想像の結果、となります。
ですので ノークレーム 自己責任で お願いいたします。

use WebDB は 前回のコードのままでオーケーです。

use CGI; ということで 本のコードには 改造を加えました。
フォームも オリジナルで設置しました。
$q->em("Your name?"),
$q->textfield(-name=>'letter'),
は LastName を入れませんと 検索できません、
いちおう パラメーターは本の通りにしてみました。

下記の 3つの記法を使い分けてくださいね
$q->a ({-href =>$q->referer()
$q->a({-href =>$q->url()
$q->a({-href =>$q->self_url ()

staffm.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('Database Form'),
$q->start_form,
$q->em("YourID?"),
$q->textfield(-name=>'id'),
$q->br,
$q->p,
$q->em("Your name?"),
$q->textfield(-name=>'letter'),
$q->br,
$q->p,
$q->reset,
$q->submit(-name =>'Action', -value =>'検索'),
$q->submit(-name =>'Action', -value =>'Scream');
$q->end_form;
$q->end_html;
my $dbh = WebDB::connect();
my $id = WebDB::trim($q->param ('id'));
my $letter = WebDB::trim($q->param ('letter'));
if ($id ne "")
{
display_entry ($dbh, $id);
}
elsif ($letter ne "")
{
display_subindex ($dbh, $letter);
}
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 (@nav_bar, $count);
@nav_bar = gen_nav_bar ($dbh, "");
if (!@nav_bar)
{
print $q->p ("The directory has no entries.");
return;
}
print $q->p ("Welcome to the staff directory.\n"
. "Entries are listed by last name.\n"
. "Please select a letter below to find the person\n"
. "you're looking for.");
print $q->hr (), $q->center (@nav_bar), $q->hr ();
$count = $dbh->selectrow_array ("SELECT COUNT(*) FROM staff");
print $q->p ("The directory contains $count entries.");
}
sub display_subindex
{
my ($dbh, $letter) = @_;
my ($sth, @nav_bar, @item_list);
@nav_bar = gen_nav_bar ($dbh, $letter);
if (!@nav_bar)
{
print $q->p ("The directory has no entries.");
return;
}
print $q->p ("Staff directory entries for the letter '$letter'");
print $q->hr (), $q->center (@nav_bar), $q->hr ();
$sth = $dbh->prepare (
"SELECT id, CONCAT(lname,', ',fname) AS name
FROM staff WHERE lname LIKE ? ORDER BY name");
$sth->execute ($letter . "%");
while (my ($id, $name) = $sth->fetchrow_array ())
{
push (@item_list, $q->a({-href =>$q->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, $letter) = @_;
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 =>$q->self_url () . "?letter=$_"} , $_))
. "]\n" } @{$letter_ref});
}