複数ページの名簿表示
例によって 本には図がないので
コードを読み説いた私の想像の結果、となります。
ですので ノークレーム 自己責任で お願いいたします。
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}); }