go top

MEGA Sale

  • Colection of 65 PHP scripts for $4.29 each

Get 65 PHP scripts in a bundle for $4.29 each!

View Offer

PHP / MySQL select data and split on pages

Tuesday, 6th December, 2011  /  PHP Tutorials  / MySQL Tutorials  /  219 Comments
This tutorial is going to show you how to SELECT data from a MySQL database, split it on multiple pages and display it using page numbers. Check our live demo.

We have MySQL table called "students" holding 100 records with the following fields:
ID: autoincrement ID
Name: varchar(250)
PhoneNumber: varchar(250)

Instead of doing a single SELECT query and display all the 100 records on a single page we can have 5 pages each containing maximum 20 records. To do this we will need to use the LIMIT clause for SELECT command so we can limit the query to show only 20 records. The LIMIT clause also allows you to specify which record to start from. For example this query

$sql = "SELECT * FROM students ORDER BY name ASC LIMIT 0, 20";


returns 20 records sorted by name starting from the first record. This next query

$sql = "SELECT * FROM students ORDER BY name ASC LIMIT 50, 20";


shows 20 records sorted again by name but this time it will start from the 50th record.
So basically in this clause (LIMIT start, count) "start" specify the starting record and "count" specifies how many records to show.

We will first define MySQL connection variables and connnect to the database

<?php
error_reporting(0);
$servername = "localhost";
$username = "****";
$password = "****";
$dbname = "****";
$datatable = "students"; // MySQL table name
$results_per_page = 20; // number of results per page

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
?>


Next thing to do is to make a PHP file called index.php which will show the first 20 records from our table. The code below selects and then prints the data in a table.

<?php
if (isset($_GET["page"])) { $page = $_GET["page"]; } else { $page=1; };
$start_from = ($page-1) * $results_per_page;
$sql = "SELECT * FROM ".$datatable." ORDER BY ID ASC LIMIT $start_from, ".$results_per_page;
$rs_result = $conn->query($sql);
?>
<table border="1" cellpadding="4">
<tr>
<td bgcolor="#CCCCCC"><strong>ID</strong></td>
<td bgcolor="#CCCCCC"><strong>Name</strong></td><td bgcolor="#CCCCCC"><strong>Phone</strong></td></tr>
<?php
while($row = $rs_result->fetch_assoc()) {
?>
<tr>
<td><? echo $row["ID"]; ?></td>
<td><? echo $row["Name"]; ?></td>
<td><? echo $row["PhoneNumber"]; ?></td>
</tr>
<?php
};
?>
</table>


Now, when you open index.php in your web browser you will see table showing the first 20 records from your "students" table.

The first 2 lines of the above code

if (isset($_GET["page"])) { $page  = $_GET["page"]; } else { $page=1; }; 
$start_from = ($page-1) * $results_per_page;


are used to create a $start_from variable depending on the page that we want to view. Later you will see that we will pass a "page" value using the URL (e.g. index.php?page=2) to go to different pages. Next, we need to find out the total amount of records in our table and the number of pages that we will need. To do this we run another query using COUNT() function.

$sql = "SELECT COUNT(ID) AS total FROM ".$datatable; 
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$total_pages = ceil($row["total"] / $results_per_page);


The $total_records is now equal to the number of records that we have in our database, in our case 100. We have 20 records per page so the total number of pages that will be needed is 5 (4 pages with 20 records and last page will have 10 records).

Calculating the amount of pages needed using PHP can be done using ceil() function.

$total_pages = ceil($total_records / $results_per_page);


We divide the total number of records by records per page and then the ceil() function will round up the result. Now we have 2 new variables - $total_records equal to 100 and $total_pages equal to 5.
To print page numbers and associate URLs to each number we will use for() cycle.

<?php 
for ($i=1; $i<=$total_pages; $i++) {
echo "<a href='index.php?page=".$i."'>".$i."</a> ";
};
?>


Above code will print numbers from 1 to 5 and for each number will create different link.
index.php?page=1
index.php?page=2
index.php?page=3
index.php?page=4
index.php?page=5
as you can see each link passes different page value which is used in the SELECT query above.

At the end you should have a file like this (remember to add the MySQL connection string):

<?php
if (isset($_GET["page"])) { $page = $_GET["page"]; } else { $page=1; };
$start_from = ($page-1) * $results_per_page;
$sql = "SELECT * FROM ".$datatable." ORDER BY ID ASC LIMIT $start_from, ".$results_per_page;
$rs_result = $conn->query($sql);
?>
<table border="1" cellpadding="4">
<tr>
<td bgcolor="#CCCCCC"><strong>ID</strong></td>
<td bgcolor="#CCCCCC"><strong>Name</strong></td><td bgcolor="#CCCCCC"><strong>Phone</strong></td></tr>
<?php
while($row = $rs_result->fetch_assoc()) {
?>
<tr>
<td><? echo $row["ID"]; ?></td>
<td><? echo $row["Name"]; ?></td>
<td><? echo $row["PhoneNumber"]; ?></td>
</tr>
<?php
};
?>
</table>

<br />

<?php
$sql = "SELECT COUNT(ID) AS total FROM ".$datatable;
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$total_pages = ceil($row["total"] / $results_per_page); // calculate total pages with results

for ($i=1; $i<=$total_pages; $i++) { // print links for all pages
echo "<a href='index.php?page=".$i."'";
if ($i==$page) echo " class='curPage'";
echo ">".$i."</a> ";
};
?>


This index.php file will print a table with maximum 20 records per page and at the bottom 5 page numbers each pointing to a page showing different 20 records.

If you have any questions you can always use the form below to ask for free help.
Do not forget to check the demo here.
Share on:

219 Comments to "PHP / MySQL select data and split on pages"

Emeka Ossai

Emeka Ossai / October 15, 2021 at 17:55 pm

I have customer table. And I want the report print one page, one customer details. Am using php and mysql.

Thanks

Marcel van der Stap

Marcel van der Stap / March 19, 2021 at 17:55 pm

i used your code for spitting mysql table in pages. All works well only for a table without variables
I want mytable first reduce records with selection variables. After that Mytable is minimized. I want this minimized records split in pages.par exemple : mytabe has 60000 records en consist of variable columns like persons en events collected from news paper. I first can make a select query from all events of died persons at several regio's .After that there are 70 records left, wich i like to split in pages. I can do a select statement in Where statement of my selection. This works well when I write the full selection statement then i get the pages . But if i do instead the selection in a variable i only get the first page. next pages keep empty.
How can i solve that problem

Felipe

Felipe / April 10, 2021 at 06:56 am

if you passing the variable form a form or something i think we need to find a way to save the variable because second time you call the page you lost your data(search), that's why I think next time you click pages numbers it display empty, it shows no record.

Felipe

Felipe / April 10, 2021 at 06:57 am

if you are passing the variable from a form or something i think we need to find a way to save the variable because second time you call the page you lost your data(search), that's why I think next time you click pages numbers it display empty, it shows no record.

Shiva Prasad Nayak Guguloth

Shiva Prasad Nayak Guguloth / January 7, 2021 at 16:24 pm

here is my design. which gets data from phpmyadmin in tables. so How can I develop custom pagnation as my design at the bottom for data load from phpmyadmin.
can somebody help me with that. I have seen datatables solutions but that dint get my design results.
thank you in advance

Ruchi

Ruchi / August 5, 2020 at 08:00 am

I want to display the last record to 1st page.

RI Sayem

RI Sayem / November 17, 2020 at 02:31 am

USE ORDER BY id DESC

DESC means desending Order

DR

DR / July 22, 2020 at 13:53 pm

This is beautiful, cheers!

shahin

shahin / May 31, 2020 at 21:33 pm

Hi,
I want to 1 row data from table to make one page , What I need to do?
Thanks

Mary

Mary / January 9, 2020 at 21:22 pm

Worked perfect. Thank you!

joseph golez

joseph golez / October 5, 2019 at 17:20 pm

hi! how can i view male and female separated column in php

enarco

enarco / September 3, 2019 at 13:06 pm

Hi,
This code start fetch data from first table, if I want fetch data from table 3, What I need to do?
Thanks

HASSANE

HASSANE / July 17, 2019 at 08:20 am

NICE PROJECT

Add your comment

Captcha

    Please, be polite and helpful and do not spam or offend others! We promise you will be treated the same way!

    Log in to your account to post your comments. If you still haven't joined our community yet, you can create your FREE account now!

    Posting tip:
    If you use code in your comments, please put it in these tags [php], [sql], [css], [js] PHP code example: [php] echo date("Y-m-d"); [/php]

    Thank you,
    PHPJabbers Team

    Free Scripts

    Add great new functionalities to your website with our Free Scripts collection.


    Free scripts

    PHP Scripts

    Check our extensive collection of top-notch PHP Scripts that will enhance your website!


    Commercial PHP scripts