AJAX pagination is made up of two components: a server-side script that processes the AJAX requests on each link and the client-side code that actually send the requests. In this tutorial we're going to use PHP for the server-side part and jQuery for making AJAX requests. The choice of PHP and jQuery is irrelevant for our purposes: the important thing here is to understand how pagination works.
How pagination works
In SQL ( we're going to use the MySQL dialect here ) a LIMIT
clause can specify two things:
- If used with a single parameter, it specifies the total number of results to fetch.
- If used with two parameters ( comma-separated ), the first parameter indicates the start offset and the second parameter the total number of results to fetch.
Consider the following MySQL queries:
SELECT * FROM posts ORDER BY id DESC LIMIT 3;
SELECT * FROM posts ORDER BY id DESC LIMIT 3,3;
The first query selects the first three posts from the database, while the second one moves the start offset ( which starts at 0 by default ) by 3 positions and specifies that the total number of posts must be 3.
So the offset sequence for the two queries will be as follows:
0, 1, 2
3, 4, 5
Pagination uses the second type of query. The start offset changes dynamically and is calculated with the following formula:
offset = ( pageNumber * resultsPerPage ) - resultsPerPage
So if we are on page 2, the start offset in our case will be 3 ( ( 2 * 3 ) - 3
). If we are on page 3, the start offset will be
6 ( ( 3 * 3 ) - 3
). And so on.
Using PHP for processing AJAX requests
PHP processes all the GET requests sent by jQuery by performing the following steps:
- Validates the page parameter by making sure that is a valid integer.
- Calculates the start offset.
- Runs the MySQL query.
- Returns and outputs the results as an HTML string.
The first step is data validation:
$start = 0;
$end = 3; // Results per page
$value = 0; // Offset to be calculated
if( isset( $_GET[ 's'] ) ) {
$taintedStart = $_GET[ 's' ];
// We take 2 just for the sake of the example
if( strlen( $taintedStart ) <= 2 ) {
// Raw conversion
$s = intval( $taintedStart );
// Is it a valid integer?
if( filter_var( $s, FILTER_VALIDATE_INT ) ) {
if( $s > $start ) { // Greater than 0?
$start = $s;
}
}
}
}
Then we calculate the start offset:
$value = ( $start * $end ) - $end;
Finally, we run the query and output the resulting HTML string:
$db = new DB( 'host', 'username', 'password', 'database' );
$posts = $db->getResults( "SELECT * FROM posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY id DESC LIMIT $value,$end" );
$html = '';
foreach( $posts as $post => $content ) {
$postContent = $content['post_excerpt'];
$postTitle = $content['post_title'];
$date = strtotime( $content['post_date'] );
$postDate = strftime( '%d-%m-%Y', $date );
$html .= sprintf( '<h3>%s</h3><small>%s</small><p>%s</p>', $postTitle, $postDate, $postContent );
}
echo $html;
Using jQuery to make AJAX requests
Compared to the PHP code, the jQuery code required for our task is really simple:
(function( $ ) {
$(function() {
$( "a", "#pagination" ).on( "click", function( e ) {
e.preventDefault();
var $a = $( this );
$a.addClass( "current" ).
siblings().
removeClass( "current" );
var page = $a.data( "page" );
$.get( "ajax.php", { s: page }, function( html ) {
$( "#content" ).html( html );
});
});
});
})( jQuery );
We simply run a GET request by passing the page number stored on each link as a data attribute as the sole parameter.
Demo
The following video shows our AJAX pagination in action.
Code
You can find the code used in this tutorial on GitHub.