初心者だけどPerlが大好き

コードが世界を変える!

検索ページ送りを前のページ、後ろのページにするの巻

ページ送りで注意することは URLエンコードの必要性です
フォームのパラメーター値を
ASCIIコード値を表す16進数で変換しなければ 
結果のハイパーリンクの文字が 文字化けします

3月4日の記事
PerlMySQLで簡単検索エンジンだよ
で使用した 日本語を混ぜたデータベースのテーブルでやります
3件づつ 検索結果をページ送りにしていきます
とにかく 動かしてみましょう

使うモジュールは
use URI::Escape;
モジュールは ここで発見しました
メモ:PerlでURLエンコード・デコードはURIEscapeを使う - hylom の日記
http://slashdot.jp/~hylom/journal/450313


Perlの組み込み関数に URLエンコード・デコード用に
pack やunpack がありますが
[Perl] 5.10.0 で pack・unpack の仕様が変わった『U0C*』とか
http://kawa.at.webry.info/200801/article_11.html
要は、UTF-8 フラグ ON の文字列の場合の pack() と unpack() 動作が変更になった。
従来の動作を再現するには、use bytes を使う。
あるいは、C0 を指定すると文字列モード、U0 を指定するとバイトモードになる。
C0・U0 は以前の pack()・unpack() では無視されていたので、互換性も◎。

ややこしいので
モジュール use URI::Escape; を使いましょう

pager.cgi という名前にしました

#!D:/xampp/perl/bin/perl
use utf8;
use URI::Escape;
use CGI;
use DBI;
$q = new CGI;
print $q->header(-type =>'text/html',-charset => 'utf-8'),
$q->start_html(-title=>"Database Form"),
$q->h1(' データを検索します'),
$q->start_form,
$q->em("検索内容"),
$q->textfield(-name=>'nm'),
$q->br,
$q->reset,
$q->hidden(-name =>'page_num', -value =>'0'),
$q->submit(-name =>'Action', -value =>'検索'),
$q->end_form;
$dbname = "trinity777";
$user = "root";
$passwd = "あなたの決めたパスワードにしてね";
$tbname = "cgipm";
$host = "localhost";
$myname =$q->param('nm');
$page_num=$q->param('page_num');
if($myname ne ""){ &searchform;}
sub searchform{
# DBに接続
$dbh=DBI->connect("DBI:mysql:$dbname; host=$host", $user, $passwd) 
or die $DBI::errstr;
$dbh->do("SET NAMES utf8");
# 最初に3件だけ出力するSQL実行
$offset=$page_num*3;
$sth = $dbh->prepare(" SELECT * FROM  $tbname WHERE name LIKE '%$myname%' order by id  LIMIT 3 OFFSET $offset ");
if(!$sth->execute){print "SQL失敗\n";exit;}
print $q->start_table({-border=>1}),
$q->start_Tr,
$q->th(['id', 'mtime','name','email','subject', 'comments','uploaded_file']);
while (@rec = $sth->fetchrow_array())
{
print $q->start_Tr,
$q->td([$rec[0],$rec[1],$rec[2],$rec[3],$rec[4],$rec[5],$rec[6]]);
}
# 検索条件に該当する全データの件数取得
$sth = $dbh->prepare(" SELECT count(*) FROM $tbname WHERE name LIKE '%$myname%' order by id ");
if(!$sth->execute){print "SQL失敗\n";exit;}
@rec = $sth->fetchrow_array();
$cnt=$rec[0];
# ページ数表示
if($cnt>3){
$a=$cnt/3;
$ceil=( $a  == int($a) ? $a : int($a + 1) );
print $q->p($ceil,"ページ中の");
print $q->p((($page_num) +1),"ページ目を表示");
}
$escaped = uri_escape($myname);
# 前の3件
if($page_num !=0){
print $q->a({href=>$q->url()."?nm"."="."$escaped&page_num"."=".(($page_num) -1)}, " <前の3件 " );
}
# 次の3件
if(($page_num +1)*3 < $cnt){
print $q->a({href=>$q->url()."?nm"."="."$escaped&page_num"."=".(($page_num)+1)}, "次の3件>");
}
# ステートメントハンドルクリア
$sth->finish;
# DB切断
$dbh->disconnect;}
print $q->end_html;