[PHP-users 19471]検索結果を次ページに渡したい

Tomonori Ueno tomo-u @ abeam.ocn.ne.jp
2003年 12月 21日 (日) 07:52:57 JST


はじめまして、HTMLからPHPに入門したての上野と申します。
今後ともよろしくお願いします。

環境
Windows2000、PHP4.3.4、MySQL3.23.58、Apache1.3.29

さて、自分が持っているCDをデータベース(MySQL)に入れて、
検索できるプログラムを作っています。 モチーフにさせて
いただいたのは、Allabout Japanのサンプルソースです。
http://allabout.co.jp/computer/database/closeup/CU20021126/index.htm

検索画面と結果表示の画面を一体化したのですが、検索結果の2ページ目を
開くとまた全件表示に戻ってしまうことが問題です。 これはHTTPの
ステイトレスな性質によるものと聞いています。 これを検索結果の
ページをちゃんと最後までめくっていけるようにつくるのが目標です。

以下に、ソースを付けておきます。 どのような考えで、どう改造して
いけば良いのかアドバイスいただけましたら、すごく助かります。

<?
〜ヘッダ部省略〜
//DBへ接続開始 
$dbHandle = mysql_connect("localhost","hoge","xxxx");
//頁内に表示する行数
$maxline = 10;
//DBの接続に失敗した場合はエラー表示をおこない処理中断
if ($dbHandle == False) {
	print ("can not connect db\n");	
	exit;
}
//GETで渡された?pageを取り出し$pageにセット
$page = $_REQUEST ["page"];
//頁数がセットされていない場合は頁数に1をセット
if ($page < 1) {
	$page = 1;
}
//開始行を算出
$startline =  ($page - 1) * $maxline;
//終了行を算出
$endline   =  $page * $maxline -1;
//db名  test
$db = "mydb";
//入力されたデータをpostで渡されるので
//str_key の内容を取り出し $str_keyに格納
$str_key = $_REQUEST["str_key"];
$str_key2 = $_REQUEST["str_key2"];
//条件判断部分
// タイトル/アーティスト名が入っている、ジャンル別が空白の場合の処理
if( $str_key != "" && $str_key2 == "")  {
//SQL文 cdshop表からid列の値が入力フィールドで入力された値と等しい行を抽出
$sql = "select * from cdshop where title like '%$str_key%' or 
artist like '%$str_key%' or genre like '%$str_key%' order by release desc";
// タイトル/アーティスト名が入っている、ジャンル別も入っている場合の処理
// 両方のキーを併用しての検索が可能になった。
}else if ( $str_key != "" && $str_key2 != "" ) {
$sql = "select * from cdshop where (title like '%$str_key%' or artist like '%$str_key%') and genre = '$str_key2' order by release desc";
}else if ( $str_key == "" && $str_key2 != "" ){
//タイトルやアーティスト名が空白だが、ジャンル別指定だけがある場合。  
$sql = "select * from cdshop where genre like '%$str_key2%' order by release desc";
}else{
	$sql = "select * from cdshop order by release desc";
//SQL文を実行する
}
	$rs = mysql_db_query($db,$sql);
	$row = mysql_fetch_array($rs);
	if ($row < 1){
	print "<br><font color=red>このキーワードでは見つかりません</font>";
	exit;
	}
//結果から列数を取得する
$num = mysql_num_fields($rs);
//mysql_num_rows 関数を使用し行数を取得する
$rows = mysql_num_rows($rs);
//取得した行数から最終頁を算出
//ceil(数値)は小数点以下を切り上げる関数
$maxpage = ceil(mysql_num_rows($rs) / $maxline);
?>
<table border=1 width=80% align=center>
<P><font color=blue>■</font>タイトルまたはアーティスト名で検索
</P>
<FORM METHOD=POST NAME="search" action="<? echo $_SERVER[PHP_SELF];?>">
<INPUT TYPE="text" SIZE="40" NAME="str_key">
<INPUT TYPE="submit" VALUE="検索">
<INPUT TYPE="reset" VALUE="クリア"><BR>
<P><font color=blue>■</font>ジャンル<BR><BR>
<SELECT NAME="str_key2">
 <OPTION VALUE=""SELECTED>- - - -
 <OPTION VALUE="Jazz" >Jazz
 <OPTION VALUE="Rock">Rock
 <OPTION VALUE="Pop">Pop
 <OPTION VALUE="R&B">R&B
 <OPTION VALUE="Funk">Funk
 <OPTION VALUE="World">World
 <OPTION VALUE="Classical">Classical
 <OPTION VALUE="Others">Others 
</SELECT>
<INPUT TYPE="submit" VALUE="検索">
</FORM>
<P><font color=blue>■</font>編集画面</P>
<A HREF="http://localhost/cd2db/form.php">CDデータの登録
</A>
<?
//現在の頁/最終頁を表示
print("<caption valign='top' align='right'>Page ".$page."/".
	$maxpage."</caption>	");
//test表の列数と同じ回数を繰り返す
for ($i=0;$i<$num;$i++){
//HTML文を出力 列名を <td>で囲んで出力
	print("<td>".mysql_field_name($rs,$i)."</td>");
}
//mysql_data_seekによりcdshop表内の指定した行に移動する
mysql_data_seek($rs, $startline);
//$iに$startlineを代入
$i = $startline;
//最終行でなく かつ $i<=$endlineの条件の間
//cdshop表から行を取り出す
 while($row=mysql_fetch_array($rs) and $i<=$endline){	
//HTML文を出力 表の行の開始<tr> を出力
	print("<tr>");
//cdshop表の列数と同じ回数を繰り返す
	for($j=0;$j<$num;$j++){
//HTML文を出力 列の内容を <td>で囲んで出力
	print("<td>".$row[$j]."</td>");
        }
//HTML文を出力 表の改行</tr> を出力
	print("</tr>");
//$iに1を加算
	$i = $i + 1;
}
//HTML文を出力 caption を出力
print("<caption align='bottom'>");
//現在表示している頁が1ページより後の頁の場合は前の頁のリンクを作成
if ($page > 1) {
		$i = $page - 1;
//HTML文を出力 $pageに指定された頁数をセットしてGETで渡すリンクを作成
	print("<a href='$PHP_SELF?page=".$i ."'>前頁</a>");
}
//現在表示している頁が1ページではなく最終頁ではない場合は前頁と次頁を
//区切る「・」を出力
if ($page <> 1 and $page <> $maxpage) {
	print("・");
}
//現在表示している頁が最終頁より前の頁の場合は前の頁のリンクを作成
if ($page < $maxpage) {
			$i = $page + 1;
//HTML文を出力 .$pageに指定された頁数をセットしてGETで渡すリンクを作成
			print("<a href='$PHP_SELF?page=".$i ."'>次頁</a>");
}
///HTML文を出力 改行
print("<br>");
//出力可能な頁数分繰り返す
for ($i=1;$i<=$maxpage;$i++) {
//現在の頁の時は [ ]で囲む
	if ($i==$page){
		print("[".$i."]");
	} else {
//HTML文を出力 .$pageに指定された頁数をGETで渡すリンクを作成
		print("<a href='$PHP_SELF?page=".$i."'>$i</a>");
	}
//最終頁以外では頁間を区切る「・」を出力
	if ($i <> $maxpage) {
		print("・");
	}
}
//HTML文を出力 テーブルの終了を指定
print("</table>");
//HTML文を出力 /caption を出力
	print("</caption>");
//結果レコードをメモリから開放
mysql_free_result($rs);
//DBへの接続を切断
mysql_close($dbHandle);
?>



PHP-users メーリングリストの案内