-
-
// データベース接続を確立します - $link = mysql_connect("localhost", "mysql_user", "mysql_password")
- or die("接続できませんでした: " . mysql_error ());
- // 現在のページ番号を取得します
- if( isset($_GET['page']) ){
- $page = intval( $_GET['page'] );
- }
- else{
- $page = 1;
- }
- //ページごとのページ数
- $PageSize = 10;
- //データの総量を取得する
- $sql = "select count(*) as amount from table";
- $result = mysql_query( $sql);
- $row = mysql_fetch_row($result);
- $amount = $row['amount']
- // 合計ページ数を計算します
- if( $amount ){
- if( $amount < ; $page_size ){ $page_count = 1; } // 合計データ量が $PageSize 未満の場合、ページは 1 つだけです
- if( $amount % $page_size ){ // 合計データ量の残りを取ります1ページあたりのページ数で割ったもの
- $page_count = (int)($ amount / $page_size) + 1 //余りがある場合、ページ数は総データ量をページ数で割った値となります。切り上げて 1 を加えます
- }else{
- $page_count = $amount / $page_size; //If 余りがない場合、ページ数は合計データ量を各ページの数で割った値になります
- }
- }
- else{
- $page_count = 0;
- }
// ページめくりリンク
- $page_string = '';
- if( $page == 1 ){
- $page_string .= '最初のページ|前のページ|';
- }
- else{
- $page_string .= '|前のページ|';
- }
- if( ($page == $page_count) || ($page_count == 0) ){
- $page_string . = '次のページ|最後のページ';
- }
- else{
- $page_string .= '次のページ| 最後のページ ';
- }
- // データを取得し、結果を 2 次元配列形式で返します
- if( $amount ){
- $sql = "select * from table order by id desc limit ". ($page-1 )*$page_size .", $page_size";
- $result = mysql_query($sql);
-
- while ( $row = mysql_fetch_row($result) ){
- $rowset[] = $row;
- }
- }else{
- $rowset = array();
- }
- // 結果を表示するコードは含まれていないので、 foreach を使用する限り、取得した 2 次元配列を使用して結果を表示することが簡単にできます
-
-
コードをコピーします 4. OO スタイルのページング コード
次のデータベース接続は、pear db クラスを使用して処理されます。
-
- // FileName: Pager.class.php
- // ページング クラス、このクラスはデータ構造を処理するためにのみ使用され、表示作業の処理には関与しません
- Class Pager
- {
- var $PageSize ; //各ページの数
- var $CurrentPageID; //次のページ
- var $numPages; var $numItems; //レコードの総数
- var $isFirstPage // 最初のページかどうか
- var $sql; // SQLクエリ文
-
- function Pager; ($option)
- {
- global $db;
- $this->_setOptions($option);
- // アイテムの総数
- if ( !isset($this->numItems) )
- {
- $res = $db->query( $this->sql);
- $this->numItems = $res->numRows();
- }
- // 総ページ数
- if ( $this->numItems > 0 )
- {
- if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
- if ( $this->numItems % $this-> PageSize )
- {
- $this->numPages= (int)($this->numItems / $this->PageSize) + 1;
- }
- else
- {
- $this->numPages = $this- >numItems / $this-> ;PageSize;
- }
- }
- else
- {
- $this->numPages = 0;
- }
-
- switch ( $this->CurrentPageID )
- {
- case $this-> ;numPages == 1:
- $ this->isFirstPage = true;
- $this->isLastPage = true;
- ブレーク;
- case 1:
- $this->isFirstPage = true;
- $this->isLastPage = false;
- Break;
- case $this->numPages:
- $this->isFirstPage = false;
- $this->isLastPage = true;
- Break;
- デフォルト:
- $this->isFirstPage = false ;
- $this->isLastPage = false;
- }
-
- if ( $this->numPages > 1 )
- {
- if ( !$this->isLastPage ) { $this->NextPageID = $this ->現在のページID + 1; }
- if ( !$this->isFirstPage ) { $this->前のページID = $this->現在のページID - 1; }
- }
-
- return true;
- }
-
- /* **
- *
- * 結果セットのデータベース接続を返します
- * 結果セットが比較的大きい場合、このメソッドを直接使用してデータベース接続を取得し、クラスの外をトラバースできるため、オーバーヘッドが小さくなります
- *結果セットはそれほど大きくないため、getPageData を直接使用して 2 次元配列形式で結果を取得できます
- * getPageData メソッドもこのメソッドを呼び出して結果を取得します
- *
- ***/
-
- function getDataLink()
- {
- if ( $this->numItems )
- {
- global $db;
-
- $PageID = $this->CurrentPageID;
-
- $from = ($ページ ID - 1)*$this->PageSize;
- $count = $this->PageSize;
- $link = $db->limitQuery($this->sql, $from, $count); // Pear DB::limitQuery メソッドを使用してデータベースの互換性を確保します
-
- return $link;
- }
- else
- {
- return false;
- }
- }
-
- /***
- *
- * 結果セットを 2 次元配列の形式で返します
- *
- ***/
-
- function getPageData()
- {
- if ( $this->numItems )
- {
- if ( $res = $this->getDataLink() )
- {
- if ( $res->numRows() )
- {
- while ( $row = $res ->fetchRow() )
- {
- $result[] = $row;
- }
- }
- else
- {
- $result = array();
- }
-
- return $result;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
-
- function _setOptions($option)
- {
- $allow_options = array(
- 'PageSize',
- 'CurrentPageID',
- 'sql',
- 'numItems'
- );
-
- foreach ( $option as $key => $value )
- {
- if ( in_array($key, $allow_options) && ($value != null) )
- {
- $this-> ;$key = $value;
- }
- }
-
- return true;
- }
- }
- ?>
-
-
- コードをコピー
-
2. PHP ページング コードをテストする
-
- // FileName: test_pager.php
- // これは簡単なサンプルコードです。pear db クラスを使用してデータベース接続を確立するコードは省略されています
- require "Pager.class. php" ;
- if ( isset($_GET['page']) )
- {
- $page = (int)$_GET['page'];
- }
- else
- {
- $page = 1;
- }
- $ sql = "select * from table order by id";
- $pager_option = array(
- "sql" => $sql,
- "PageSize" => 10,
- "CurrentPageID" => $page
- ); if ( isset($_GET['numItems']) )
- {
- $pager_option['numItems'] = (int)$_GET['numItems'];
- }
- $pager = @new Pager($pager_option); $data = $pager->getPageData();
- if ( $pager->isFirstPage )
- {
- $turnover = "ホームページ|前のページ|";
- }
- else
- {
- $turnover = "ホームページ|PreviousPageID."&numItems= .$pager->numItems."'>前のページ|";
- }
- if ( $pager->isLastPage )
- {
- $turnover .= "次のページ|最後のページ" ;
- }
- else
- {
- $turnover .= "NextPageID."&numItems=".$pager->numItems."'>次のページnumPages."&numItems=".$pager->numItems."'>最後のページ" ;
- }
- ?> ;
-
-
コードをコピー
手順:
データ処理と結果表示の両方を 1 つのクラスに入れるのは少し抵抗があるため、このクラスはデータを処理するだけで表示は担当しません。
表示状況や要件は変更可能です。この Pager クラスでは、独自のサブクラスを継承して、ユーザーのページネーションのリストを表示することができます。
Class MemberPager extends Pager- {
- function showMemberList()
- {
- global $db;
-
- $data = $this->getPageData();
- //結果を表示するコード
- // ......
- }
- }
- ///
- if ( isset($_GET['page']) ) を呼び出します
- {
- $page = (int)$_GET['page'];
- }
- else
- {
- $page = 1;
- }
- $sql = "ID 順にメンバーから * を選択";
- $pager_option = array(
- "sql" => $sql,
- "PageSize" => 10,
- "CurrentPageID" => $page
- );
- if (isset($_GET['numItems']) )
- {
- $pager_option['numItems'] = (int)$_GET['numItems'];
- }
- $pager = @new MemberPager($pager_option);
- $pager->showMemberList();
- ?>
-
-
コードをコピー
異なるデータベースでの 2 番目の異なるデータベースの互換性傍受された結果のセクションが異なります。
mysql: テーブル制限オフセット、行から * を選択します
pgsql: select * from tablelimit m offset n
...
クラス内で結果を取得する場合は、pear dbクラスのlimitQueryメソッドを使用する必要があります。
|