Home  >  Article  >  Backend Development  >  Analysis of PHP paging principle, you can take a look_PHP tutorial

Analysis of PHP paging principle, you can take a look_PHP tutorial

WBOY
WBOYOriginal
2016-07-21 15:41:441433browse

1. Introduction

Paging display is a very common method of browsing and displaying large amounts of data, and is one of the most commonly processed events in web programming. For veterans of web programming, writing this kind of code is as natural as breathing, but for beginners, they are often confused about this issue, so I specially wrote this article to explain this issue in detail, and strive to let readers Friends who have finished this article will have some understanding of the principles and implementation methods of paging display. This article is suitable for beginners to read, and all sample codes are written in PHP.

2. Principle

The so-called paging display means that the result set in the database is artificially divided into segments for display. Two initial parameters are required here:

How many records per page ($PageSize)?
What page is the current page ($CurrentPageID)?

Now as long as you give me another result set, I can display a specific result.
As for other parameters, such as: previous page ($PreviousPageID), next page ($NextPageID), total number of pages ($numPages), etc., they can all be obtained based on the previous things.
Take the mysql database as an example. If you want to intercept a certain piece of content from the table, the sql statement can be used: select * from table limit offset, rows. Take a look at the following set of SQL statements and try to find the rules.

The first 10 records: select * from table limit 0,10
The 11th to 20th records: select * from table limit 10,10
The 21st to 30th records: select * from table limit 20,10
......

This set of sql statements is actually the sql statement for fetching each page of data in the table when $PageSize=10. We can summarize such a template:

select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize

Take this template and substitute the corresponding value with the above set of sql statements to see if it is the same thing. After solving the most important problem of how to obtain the data, all that is left is to pass the parameters, construct the appropriate SQL statement and then use PHP to obtain the data from the database and display it. Below I will explain it with specific code.

3. Simple code
Please read the following code in detail, debug and run it yourself. It is best to modify it once and add your own functions, such as search, etc.

Copy code The code is as follows:

// Establish database connection
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
or die("Could not connect: " . mysql_error());
// Get the current page number
if( isset (
___FCKpd___0GET['page']) ){
$page = intval(
___FCKpd___0GET['page'] );
}
else{
$page = 1;
}
// Number of pages per page
$PageSize = 10;
// Get total data amount
$sql = "select count(*) as amount from table";
$ result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row['amount'];
// Calculate how many pages there are in total
if( $amount ){
if( $amount < $page_size ){ $page_count = 1; } //If the total data amount is less than $PageSize, then there is only one page
if( $amount % $page_size ){ / /Get the remainder of the total amount of data divided by the number of pages
$page_count = (int)($amount / $page_size) + 1; //If there is a remainder, the number of pages is equal to the total amount of data divided by the number of pages The result is rounded up and added by one
}else{
$page_count = $amount / $page_size; //If there is no remainder, the number of pages is equal to the total data amount divided by the number of pages
}
}
else{
$page_count = 0;
}

// Page turning link
$page_string = '';
if( $page == 1 ) {
$page_string .= 'First page|Previous page|';
}
else{
$page_string .= '|Previous page|';
}
if( ($page == $page_count) || ($page_count == 0) ){
$page_string .= 'next page|last page';
}
else{
$ page_string .= 'Next page|Last page';
}
// Get data and return the result in two-dimensional array format
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();
}
// Does not include display results The code is beyond the scope of discussion. As long as you use foreach, you can easily use the obtained two-dimensional array to display the results
?>


4. OO style Code
The database connection in the following code is processed using the pear db class

Copy code The code is as follows:

// FileName: Pager.class.php
// Paging class, this class is only used to process data structures and is not responsible for processing display work
Class Pager
{
var $PageSize; //Number of each page
var $CurrentPageID; //Current page number
var $NextPageID; //Next page
var $PreviousPageID; / /Previous page
var $numPages; //Total number of pages
var $numItems; //Total number of records
var $isFirstPage; //Whether it is the first page
var $isLastPage; // Is the last page
var $sql; //sql query statement

function Pager($option)
{
global $db;
$this->_setOptions($ option);
//Total number of items
if ( !isset($this->numItems) )
{
$res = $db->query($this->sql );
$this->numItems = $res->numRows();
}
//Total number of pages
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;
case 1:
$this->isFirstPage = true;
$this->isLastPage = false;
break;
case $this->numPages:
$this->isFirstPage = false;
$this->isLastPage = true;
break;
default:
$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; }
}

return true;
}

/***
*
* Return the database connection of the result set
* When the result set is relatively large, you can directly use this method to obtain the database connection, and then traverse outside the class, which has less overhead
* If the result set is not very large, you can directly use getPageData to obtain the results in two-dimensional array format
* The getPageData method also calls this method to obtain the results
*
***/

function getDataLink()
{
if ( $this->numItems )
{
global $db;

$PageID = $this->CurrentPageID;

$ from = ($PageID - 1)*$this->PageSize;
$count = $this->PageSize;
$link = $db->limitQuery($this->sql, $ from, $count); //Use Pear DB::limitQuery method to ensure database compatibility

return $link;
}
else
{
return false;
}
}

/***
*
* Returns the result set in the format of a two-dimensional array
*
***/

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;
}
}
?>

Copy code The code is as follows:
" 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();
if ( $pager->isFirstPage )
{
$turnover = "Homepage|Previous Page|";
}
else
{
$turnover = "Homepage|PreviousPageID."&numItems=".$pager->numItems."'>Previous page|";
}
if ( $pager->isLastPage )
{
$turnover .= "Next page|Last page";
}
else
{
$turnover .= "NextPageID."&numItems=".$pager->numItems."'>Next Page|numPages."&numItems=".$pager->numItems."'>Last Page";
}
?>



There are two things that need to be explained:

This class only processes data and is not responsible for display, because I think the processing of data and the display of results should be put into one class. It's really a bit reluctant. When displaying, the situation and requirements are changeable. It is better to handle it according to the results given by the class. A better way is to inherit a subclass of your own based on the Pager class to display different paginations. For example, displaying the user pagination list can:



Copy code

The code is as follows:


Class MemberPager extends Pager { function showMemberList() { global $db;
$data = $this->getPageData();
// Code to display the results
// ... ...
}
}
/// Call
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" => $page
);
if ( isset(
___FCKpd___0GET['numItems']) )
{
$pager_option['numItems'] = (int)
___FCKpd___0GET['numItems'];
}
$ pager = @new MemberPager($pager_option);
$pager->showMemberList();
?>



The second thing that needs to be explained is the different databases For compatibility, the way to write a section of results in different databases is different.
mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
......
So you need to use pear when you want to get the result in the class The limitQuery method of the db class.
Ok, I’ll take credit when I’m done. I hope you don’t feel like it’s a waste of time if you take the time to read these words.



http://www.bkjia.com/PHPjc/321096.html

www.bkjia.com

true

http: //www.bkjia.com/PHPjc/321096.html

1. Preface Pagination display is a very common method of browsing and displaying large amounts of data, which is the most common method in web programming. One of the commonly handled events. For web programming veterans, writing this code...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn