MDB2でデータを表示するのにページを分割して表示する
つまりは
前へ ...5 6 7 8 9 10 11... 次へ 6/24ページ目
みたいなものを表示したかったので作ってみた。上記であれば5または11をクリックするとナビゲーションの表示が切り替わる。「前へ」や「次へ」は単純に次のページなり前のページなりへ遷移。現在のページ情報はGETで送信しています。一部抜粋*1です。
まずは設定。
<?php # conf.php # ページナビゲーションの最大表示ページ数を設定 define('PAGE_LIMIT', 5); ?>
データベースの操作。
総数と1ページ分のデータを取得するのに2回もクエリを発行するのが、なんかこれでよいのか?と疑問。誰かつっこみください。
<?php # model.php # データベースへのアクセス # データ取得時に該当データの総件数と1ページ分のデータを取得 require_once('MDB2.php'); // エラーハンドラ function my_error() { print('DBアクセスエラーが発生しました.管理者にお問い合わせ下さい.'); exit; } class model { protected $db; // DBクラスオブジェクト // コンストラクタ function __construct() { $con =& MDB2::connect(DSN); // DBへ接続 if (PEAR::isError($con)) die($con->getMessage()); $con->setErrorHandling(PEAR_ERROR_CALLBACK, 'var_dump'); $this->db = $con; } // データ一覧の取得 function get_datas($page, $limit) { $result = array('page' => $page); $res = $this->db->query('SELECT * FROM table ORDER BY update DESC'); $result['numrows'] = $res->numRows(); $this->db->setLimit($limit, ($page-1)*$limit); $res = $this->db->query('SELECT * FROM table ORDER BY update DESC'); $result['rows'] = $res->fetchAll(MDB2_FETCHMODE_ASSOC); $res->free(); return $result; } // データ一覧の取得(プリペアドステートメントを使用) function get_datas_by_id($id, $page, $limit) { $result = array('page' => $page); $types = array('text'); $data = array('id' => $id); $sth = $this->db->prepare('SELECT * FROM table WHERE id = :id ORDER BY update DESC', $types); $res = $sth->execute($data); $result['numrows'] = $res->numRows(); $this->db->setLimit($limit, ($page-1)*$limit); $sth = $this->db->prepare('SELECT * FROM postdata WHERE id = :id ORDER BY update DESC', $types); $res = $sth->execute($data); $result['rows'] = $res->fetchAll(MDB2_FETCHMODE_ASSOC); $sth->free(); $res->free(); return $result; } } ?>
表示にはSmartyを使用しています。
<!-- page_navi.tpl ページナビゲーション --> <div id="page_navi"> {if $navi.before}<a href="{$uri}&page={$navi.page-1}">前へ</a>{/if} {if $navi.page_before}...<a href="{$uri}&page={$navi.block*$smarty.const.PAGE_LIMIT}">{$navi.block*$smarty.const.PAGE_LIMIT}</a>{/if} {section name=i start=1 loop=$navi.loop+1} {if $navi.position === $smarty.section.i.index} {$navi.block*$smarty.const.PAGE_LIMIT+$smarty.section.i.index} {else} <a href="{$uri}&page={$navi.block*$smarty.const.PAGE_LIMIT+$smarty.section.i.index}">{$navi.block*$smarty.const.PAGE_LIMIT+$smarty.section.i.index}</a> {/if} {/section} {if $navi.page_next}<a href="{$uri}&page={$navi.block*$smarty.const.PAGE_LIMIT+6}">{$navi.block*$smarty.const.PAGE_LIMIT+6}</a>...{/if} {if $navi.next}<a href="{$uri}&page={$navi.page+1}">次へ</a>{/if} {$navi.page}/{$navi.num_page}ページ目 </div>