検索ページ送りを前のページ、後ろのページにするの巻
ページ送りで注意することは URLエンコードの必要性です
フォームのパラメーター値を
ASCIIコード値を表す16進数で変換しなければ
結果のハイパーリンクの文字が 文字化けします
3月4日の記事
PerlとMySQLで簡単検索エンジンだよ
で使用した 日本語を混ぜたデータベースのテーブルでやります
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;