PHPで何件かごとに検索結果のページを分割するには

■ 処理の概要

インターネットの検索エンジンなどではよく「次の10件」などのようにページを分割します。ここではこの機能を作成してみたいと思います。この機能での最重要項目はSELECT文のLIMITオプションです。LIMITは取得するレコードの取得開始位置と取得件数を指定するオプションで、この機能をうまく使うことにより簡単に検索結果のページを分割することができます。

検索対象のテーブルは引き続きtsumiki_tblを使います。ここでは、このテーブルの検索結果を10件ごとに分割して表示することにします。何十件かのデータが必要になりますので、予め適当なデータを作成しておいてください。

用意するファイルは検索条件入力フォームのbunkatsu.htmlと検索処理用スクリプトのbunkatsu.phpです。分割処理を実装するのは検索処理用スクリプトになります。

ページ分割の処理は、具体的には現在のページ番号を引き渡すことによって実現します。まず検索条件入力画面から検索条件とページ番号=0を引き渡します。このスクリプトでは、ページ番号によって取得するレコードの位置を買える仕掛けを入れておきます。

検索結果の画面には、「前の10件」「次の10件」というリンクを張りつけておきます。このリンクは、検索処理用スクリプトへのリンクでURLのクエリー文字列を使って、ページ番号と検索条件を送るようにします。「前の10件」は現在のページ番号-1を、「次の10件」には現在のページ番号+1を送るようにしておけば、次に券s買う処理用スクリプトが呼ばれたときは、ページが入れ替わって表示されるようになります。

■ 検索条件入力画面の作成

まず、検索条件の入力画面を作成します。検索条件は名前のみで、名前のテキスト入力項目を作成します。注目すべきなのはhiddenでページ数を設定していることです。検索条件入力画面から検索して表示するのは1ページ目なので、ページ数には0を設定します。

bunkatsu.html

<html>
<body>
<form action = "bunkatsu,php" method="post">
名前:<input type="text" name="nm">
年齢:<input type="hidden" name="page_num" value="0">
<input type="submit" name="exec" value="検索">
</form>
</body>
</html>

■ 検索スクリプトの作成

検索処理スクリプトは次のような内容になります。

bunkatsu.php

<html>
<body>
<?
//データベースに接続
if (!$con = mysql_connect("localhost", "mysql", "password")) {
echo "接続エラー" ;
exit ;
}

//データベースを選択
if (!mysql_select_db("tsumiki", $con)) {
echo "データベース選択エラー" ;
exit ;
}

//LIMITを使ったSELECT文を作成
$sql = "select id, name, age from tsumiki_tbl " ;
$sql . = "where name like '%$nm% ' order by id " ;
$sql . = "limit" . $page_num*10 . ", 10" ;

//SQL実行
if (!$res = mysql_query($sql)) {
echo "SQLエラー<BR>" ;
exit ;
}

//検索結果表示
echo "<table border=1>" ;
echo "<tr><td>id</td><td>name</td><td>age</td></tr>" ;
while($row = mysql_fetch_array($res)){
echo "<tr>" ;
echo "<td>" . $row["id"] . "</td>" ;
echo "<td>" . $row["name"] . "</td>" ;
echo "<td>" . $row["age"] . "</td>" ;
echo "</tr>" ;
}
echo "</table>" ;

//検索条件に該当する全データの件数取得
$sql = "select count(*) from tsumiki_tbl " ;
$sql . = "where name like '%$nm% ' order by id " ;
if (!$res = mysql_query($sql)) {
echo "SQLエラー<BR>" ;
exit ;
}
$row = mysql_fetch_array($res) ;
$cnt = $row[0] ;

//ページ表示
if(!$cnt > 10)
echo ceil($cnt / 10), "ページの中の", $page_num + 1, "ページ目を表示<br>" ;

//前の10件
if ($page_num != 0) {
echo "<a href = bunkatus.php?nm=",$nm, ", $page_num -1.">" ;
echo "&lt 前の10件" ;


//次の10件
if (($page_num + 1)*10 < $cnt) {
echo "<a href = bunkatus.php?nm=",$nm, ", $page_num +1.">" ;
echo " 次の10件 &g</a>t" ;


//結果セットの開放
mysql_free_result ($res) ;

//データベースから切断
mysql_close($con) ;
?>

</body>
</html>

1. 検索処理スクリプトでは、まずはじめにSELECT文を実行します。フォームから送信された変数nmをもとにWHERE句を作成します。重要なのはその後のlimit関数です。$page_num*10というリミットのオフセット(取得済み件数)を設定しています。検索条件入力画面からこのスクリプトが実行された場合、page_numは0に設定されているため、0件目、つjまり先頭からレコードが取得されます。逆に、このpage_numを1に設定すると10件目からレコード取得が行われます。このSQL文によって具体的なレコードの分割が行われます。

2. SELECT文実行後は取得したレコードをHTMLテーブルで出力します。

3. 次に、検索条件に合致するレコードの総件数を取得します。これは、次の「総ページ数」の判定や「前の10件」の算出の際に必要になります。

4. ページ数はレコード件数($cnt)が11件以上、つまり2ページ分ある場合にのみ出力します。総ページ数はレコード件数÷10で算出しています。ceilは、小数点切り上げの関数です。

5. 「前の10件」は、現在のページ数が0以外の場合に出力します。前の10件はこのスクリプトに対してページ番号-1のリンクをはることで実現します。bunkatus.phpの後の?は「この後にクエリー文字列の変数を記述します」という意味で、ここに検索条件の$nmと現在のページ番号を-1した$page_numを指定しています。

6. 最後に「次の10件」を出力します。次の10件はまだ表示すべきレコードが存在する場合にのみ出力します。「前の10件」と同様にこのスクリプトに対してリンクをはることで実現します。次の10件の場合はpage_numを+1します。

■ 検索の確認

それでは、実際に検索を行ってみましょう。ブラウザから作成したkensaku.htmlにアクセスしてみます。

1. 名前には「鈴」と入力してみましょう。

2. [検索]ボタンをクリックして検索を行います。

LIKEによるあいまい検索が実行されて、検索結果が表示されました。

<< 戻る

RIKO's Trial Page | Shirley's i-box | Shirley's little box