|
六、 用CGI.pm - receive.iphtml处理表单结果
<?
my $cgi = new CGI; # 利用 "param" 解码方法的优势
my $dbh = DBI->connect('DBI:mysql:test:localhost', '','',
{ PrintError => 0}) || die $DBI::errstr;
!>//
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<TITLE>Results from the Database Search</TITLE>
</HEAD>
<BODY>
<P>
<?=${\( display_query_results(\$dbh, \$cgi) )}!>//
<P>
<A HREF=selection.iphtml>Return to the query page</A>
</BODY>
</HTML>
<?
$dbh->disconnect;
!>//
<?
sub display_query_results {
#
# 注意我将引用传递给数据库处理器dbh和
# cgi对象 - 这意味着要想在子程序中引用他们
# 我必须使用$$dbh和$$cgi.
#
my $dbh = shift;
my $cgi = shift;
my $return = '';
my $SQL;
if ( defined($$cgi->param('title')) ) {
my $SQL = <<"EOT";
select title, artist, year(released)
from albums
where ucase(title) like ${ \($$dbh->quote(uc($$cgi->
param('title')) . '%') ) }
order by title, artist
EOT
#
# 在上述语句中我使用了更复杂的SQL。SQL不会
# 自动将返回的结果排序,但是利用
# "order by" 语句可以很容易地实现排序 - 只需设定你希望显示的列数
# 以及它们,的顺序优先级,"Like"可以匹配子程序 -
# 如果你提供了标题 "abc," 则所有标题以"abc"开头的唱片
# 都会被返回。为了消除这种现象,我
# 在SQL中使用ucase(title),以及uc($$cgi->param('title'),
将两个字符串都大写显示。
# %字符是一个通配符,很象UNIX中的*
# 文件名globbing.
#
my $cursor = $$dbh->prepare($SQL);
$cursor->execute;
$return .= "<TABLE BORDER>\n<TR><TH COLSPAN=3>";
$return .= "<B>Matches on the title search for:
<TT><I>${ \($$cgi->param('title') )}</I></TT></B></TH></TR>";
$return .= "<TR><TH>Title</TH><TH>Artist</TH><TH>
Year of Release</TH></TR>\n";
my @fields;
while ( @fields = $cursor->fetchrow ) {
$return .= "<TR><TD>$fields[0]</TD><TD>$fields[1]
</TD><TD>$fields[2]</TD></TR>\n";
}
$cursor->finish;
$return .= "</TABLE>\n";
} else {
if ( defined($$cgi->param('artist_submit')) ) {
$SQL = <<"EOT";
select title, year(released)
from albums
where artist = ${ \($$dbh->quote($$cgi->param('artist'))) }
order by released desc, title
EOT
} elsif ( defined($$cgi->param('year_submit')) ) {
$SQL = <<"EOT";
select artist, title
from albums
where year(released) = ${ \($$dbh->quote($$cgi->param('year'))) }
order by artist, title
EOT
}
my $cursor = $$dbh->prepare($SQL);
$cursor->execute;
$return .= "<TABLE BORDER>\n<TR><TH COLSPAN=2>";
$return .= (defined($$cgi->param('artist_submit'))?
("<B>Artist: <TT><I>".
"${ \($$cgi->param('artist')) }</I>".
"</TT></B></TH></TR>\n<TR>".
"<TH>Album Title</TH>".
"<TH>Year of Release</TH></TR>\n" :
("<B>Year of Release: <TT><I>".
"${ \($$cgi->param('year')) }</I>".
"</TT></B></TH></TR>\n<TR>".
"<TH>Artist</TH><TH>Album Title</TH>".
"</TR>\n" );
my @fields;
while ( @fields = $cursor->fetchrow ) {
$return .= "<TR><TD>$fields[0]</TD>";
$return .= "<TD>$fields[1]</TD></TR>\n";
}
$cursor->finish;
$return .= "</TABLE>\n";
}
$return;
}
!>//
本教程到此就结束了,但是它只是为了数据库编程的入门,而不是结束。我希望该教程能对你有所帮助。 |
|