1. はじめに
ページング表示は、大量のデータを参照および表示する非常に一般的な方法であり、Web プログラミングで最も一般的に処理されるイベントの 1 つです。 Web プログラミングのベテランにとって、この種のコードを書くのは呼吸するのと同じくらい自然なことですが、初心者にとってはこの問題について混乱することが多いため、この問題を詳しく説明するために特別にこの記事を書き、読者の友人に知ってもらえるよう努めています。この記事を読み終えると、ページング表示の原理と実装方法がある程度理解できるようになります。この記事は初心者が読むのに適しており、すべてのサンプル コードは PHP で書かれています。
2. 原則
いわゆるページング表示とは、データベース内の結果セットが表示のために人為的にセグメントに分割されることを意味します。
1 ページあたりのレコード数 ($PageSize)?
現在のページ ($CurrentPageID) は何ページですか?
別の結果セットを提供していただければ、特定の結果を表示できます。
前のページ ($PreviousPageID)、次のページ ($NextPageID)、総ページ数 ($numPages) などの他のパラメーターについては、すべて前述の内容に基づいて取得できます。
mysql データベースを例として挙げます。テーブルから特定のコンテンツを取得したい場合は、select * from table limit offset, rows を使用できます。次の一連の SQL ステートメントを見て、ルールを見つけてください。
最初の 10 レコード: select * from table limit 0,10
11 番目から 20 番目のレコード: select * from table limit 10,10
21 番目から 30 番目のレコード: select * from table limit 20,10
....
この SQL ステートメントのセットは、実際には、$PageSize=10 の場合にテーブル内のデータの各ページをフェッチするための SQL ステートメントです。このようなテンプレートを要約できます。
select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize
このテンプレートを使用し、対応する値を上記の SQL ステートメントのセットに置き換えて、それが同じこと。データを取得する方法という最も重要な問題を解決したら、あとはパラメータを渡し、適切な SQL ステートメントを作成し、PHP を使用してデータベースからデータを取得して表示するだけです。以下、具体的なコードを用いて説明していきます。
3. 簡単なコード
以下のコードを詳しく読み、自分でデバッグして実行してください。一度変更して、検索などの独自の機能を追加するのが最善です。等
コードをコピー コードは次のとおりです:
// データベース接続を確立します。
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
or die("接続できませんでした: " . mysql_error()); // 現在のページ番号を取得します
if( isset (
___FCKpd___0GET['page']) ){
$page = intval(
___FCKpd___0GET['page'] );
else{
$page = 1;
}
// ページあたりのページ数
$PageSize = 10;
// 合計データ量を取得します
$sql = "テーブルからカウント(*)を選択します";
$ result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row['amount'];
// そこにあるページ数を計算しますare in total
if( $amount ){
if( $amount < $page_size ){ $page_count = 1 } // 合計データ量が $PageSize 未満の場合、ページは 1 つだけです
if( $amount % $page_size ){ / /データの総量をページ数で割った余りを取得します
$page_count = (int)($amount / $page_size) 1;余りがある場合、ページ数はデータの総量をページ数で割った結果と等しくなります。切り上げて 1 を加算します
}else{
$page_count = $amount / $page_size / /余りがない場合、ページ数は総データ量をページ数で割ったものとなります
}
}
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 .= '次のページ< ;/a>|最後のページ';
}
// データを取得し、結果を 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>}
$rowset = array();
}
// 結果を表示するコードは含まれていません。foreach を使用する限り、取得した 2 次元配列を簡単に使用できます。結果を表示します
?>
4. OO スタイル コード
次のコードのデータベース接続は、pear db クラスを使用して処理されます。
// FileName: Pager.class.php
// ページング クラス。このクラスはデータ構造の処理にのみ使用され、表示作業の処理には関与しません
クラス ページャー
{
var $PageSize; // 各ページの番号
var $NextPageID; // 次のページ
var $PreviousPageID; /前のページ
var $numPages; //ページの総数
var $numItems; //最初のページかどうか
var $isLastPage; ; // 最後のページです
var $sql; //SQL クエリ文
function Pager($option)
{
$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;
break;
ケース 1:
$this->isFirstPage = true; ;
break ;
case $this->numPage = false;
$this->isLastPage = true; :
$ this->isFirstPage = false;
$this->isLastPage = false;
if ( $this->numPages > 1 )
{
if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID 1; }
if ( !$this->isFirstPage ) { $this-> PreviousPageID = $this- >CurrentPageID - 1; }
}
true を返す
}
/***
*
* 結果セットのデータベース接続を返します
* 結果セットが比較的大きい場合は、このメソッドを直接使用してデータベース接続を取得し、クラスの外部を横断することができます。オーバーヘッドが少なくなります
* 結果セットがそれほど大きくない場合は、getPageData を直接使用して 2 次元配列形式で結果を取得できます
* getPageData メソッドはこのメソッドも呼び出して結果を取得します
*
***/
関数getDataLink()
{
if ( $this->numItems )
{
global $db;
$PageID = $this->CurrentPageID; 🎜>$from = ($PageID - 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
}
}
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 }
}
?>
コードをコピー
コードは次のとおりです:
" Pager.class.php";
if ( isset(
___FCKpd___0GET['page']) )
{
$page = (int)
___FCKpd___0GET['page']; 🎜 >}
else
{
$page = 1;
}
$sql = "select * from table order by id
$pager_option = array(
" sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => ]) )
{
$pager_option['numItems'] = (int)
___FCKpd___0GET['numItems'];
}
$pager = @new Pager($pager_option);
$data = $pager->getPageData(); isFirstPage )
{
$turnover = "ホームページ|前のページ|"
}
else
{
$turnover = "ホームページ|PreviousPageID."&numItems=".$pager->numItems. "'>前のページ|";
}
if ( $pager->isLastPage )
{
$turnover .= "次のページ|最後のページ"; >}
else
{
$turnover .= "NextPageID."&numItems=".$pager->numItems." '>次のページ|numPages."&numItems=".$pager->numItems."'>最後のページ}
?>
説明する必要があることが 2 つあります:
このクラスはデータを処理するだけであり、責任はありません表示については、データの処理と結果の表示を 1 つのクラスにまとめるべきだと思うので、それはちょっと気が進まないです。表示する場合、状況や要件が変更される可能性があるため、Pager クラスをベースにして独自のサブクラスを継承して別のページネーションを表示することをお勧めします。ユーザーページネーションリストは次のことができます:
コードをコピー
{ global $db; $data = $this->getPageData();結果を表示するコード// ... ... } }
///
if ( isset(
___FCKpd___0GET['page']) ) {
$page = (int)
___FCKpd___0GET['page']
}
else
{
$page = 1; sql = "select * from members order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $ページ
);
if ( isset(
___FCKpd___0GET['numItems']) )
{
$pager_option['numItems'] = (int)
___FCKpd___0GET['numItems' ];
}
$ pager = @new MemberPager($pager_option);
次に説明する必要があるのは、データベースが異なることです。互換性を確保するために、データベースが異なると結果のセクションを書き込む方法が異なります。
mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
......
したがって、クラス内の結果 db クラスの limitQuery メソッド。
わかりました。読み終わったら、時間の無駄だと思わないでください。