トップ > Perl Tips > 「次のページ」「前のページ」リンク


 ■ 「次のページ」「前のページ」リンク

掲示板に「次のページ」「前のページ」リンクをつけたいと思います。
掲示板は以前紹介したものを使います。
簡単な掲示板を作ろう!」の<サンプル>からもらっていってください。

<サンプル>(bbs.cgi 表示用スクリプト)


#!/usr/bin/perl

# 1ページに表示する件数
$max = 10;

print "Content-type: text/html\n\n";

$buffer = $ENV{'QUERY_STRING'};
($name, $value) = split(/=/, $buffer);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/</&lt;/g;
$value =~ s/>/&gt;/g;
$start = $value;

# データ読み込み
if (!open(IN,"bbs.log")) { &fileerror; }
flock(IN, 1);
@file = <IN>;
close(IN);

if($start > $#file) {$start = $#file;}
$next = $start + $max;
$back = $start - $max;
if ($back < 0) { $back = 0; }

# ヘッダー ~ 投稿フォーム
print "<HTML><HEAD>\n";
print "<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n";
print "<TITLE>掲示板</TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<H1 align=\"center\">掲示板</H1>\n";
print "<FORM method=\"POST\" action=\"reg.cgi\"><CENTER><TABLE><TBODY>\n";
print "<TR><TD>お名前</TD><TD><INPUT size=\"25\" type=\"text\" name=\"name\"></TD></TR>\n";
print "<TR><TD>件名</TD><TD><INPUT size=\"30\" type=\"text\" name=\"title\"></TD></TR>\n";
print "<TR><TD>本文</TD><TD><TEXTAREA rows=\"7\" cols=\"50\" name=\"body\"></textarea></TD></TR>\n";
print "</TBODY></TABLE><BR><INPUT type=\"submit\" value=\"送信\"> <INPUT type=\"reset\" value=\"リセット\"></FORM><HR><BR><BR>\n";

# 記事表示
for ($i=$start;$i<$next;$i++){
last if ($i > $#file);

$data = $file[$i];
if ($data ne ""){
($name,$title,$body)=split(/<>/,$data);
print "<TABLE border=\"1\" width=\"640\"><TBODY>\n";
print "<TR><TD>\n";
print "<TABLE cellpadding=\"3\"><TBODY>\n";
print "<TR><TD>名前</TD><TD>$name</TD></TR>\n";
print "<TR><TD>件名</TD><TD>$title</TD></TR>\n";
print "<TR><TD valign=\"top\">本文</TD><TD>$body</TD></TR>\n";
print "</TBODY></TABLE>\n";
print "</TD></TR>\n";
print "</TBODY></TABLE>\n";
print "<BR><BR>\n";
}
}

if ($start > 0) {
print "<A href=\"bbs.cgi?start=$back\">[前のページ]</A>\n";
}
if ($next-1 < $#file) {
print " <A href=\"bbs.cgi?start=$next\">[次のページ]</A>\n";
}

# フッター
print "</CENTER></BODY></HTML>\n";

# ファイルエラー表示
sub fileerror {
print "<CENTER><B>ファイルが開けません!</B></CENTER>";
exit;
}

<解説>
bbs.cgiを上のスクリプトに置き換えます。
reg.cgiは前述のページのものをそのまま使ってもらってかまいません。

元のbbs.cgiから変更になった点のみ解説します。
※掲示板記事の番号は最新の記事を0として数えます。全部で10件なら一番最初の記事は9となります。

まず、1ページに表示する件数を指定してください。
$start(最初に表示する記事の番号)を得るためにデコードをしておきます。
万が一、$startが記事の数より多いといけないので、
if($start > $#file) {$start = $#file;} で調整します。
$next = $start + $max; で次のページで最初に表示する記事の番号を設定します。
$back = $start - $max; で前のページで最初に表示する記事の番号を設定します。

if ($back < 0) { $back = 0; }
$backが0より小さかったら、$backを0にしておきます。
$backが負の数ですと、最初に表示する記事の番号が負となり、ありえないので調整します。

記事表示では、forを使って配列の中身を処理します。(foreachではできません)
forループの中で最初に、登録されている記事の件数を超えて処理することのないように、
件数を超えていれば、last if ($i > $#file); でループから抜けておきます。
$file[$i]で$i番目(0から数えます)の記事を取り出して、表示処理をします。
この処理は元のbbs.cgiとほぼ同じです。

このページが最後でなければ「次のページ」リンクを表示します。
ここでは、次のページで最初に表示する記事の番号を送っています。

この次に、「前のページ」リンクを表示します。
$startが0より大きい、すなわち、まだ表示する記事があるときはリンクを表示するようにします。




トラックバック

このエントリーのトラックバックURL:
http://easycgi.xrea.jp/mt-tb.cgi/65