I have a really large data set from SQL that i need to paginate.
I have an issue with my pagination code. The code does show the page number in the URL and it does give me pagination hyperlinks at the bottom of the table. However, any page I click on, it outputs the same exact portion of the sql datatable.
Also, I'm doing this in wordpress.
// define how many results you want per page
$results_per_page = 10;
// find out the number of results stored in database
$sql='SELECT * FROM ETF';
$result = mysqli_query($con, $sql);
$number_of_results = mysqli_num_rows($result);
// determine number of total pages available
$number_of_pages = ceil($number_of_results/$results_per_page);
// determine which page number visitor is currently on
if (!isset($_GET['page'])) {
$page = 1;
} else {
$page = $_GET['page'];
}
// determine the sql LIMIT starting number for the results on the displaying page
$this_page_first_result = ($page-1)*$results_per_page;
// retrieve selected results from database and display them on page
$sql='SELECT * FROM ETF LIMIT ' . $this_page_first_result . "," .$results_per_page;
$result = mysqli_query($con, $sql);
while($row = mysqli_fetch_array($result)) {
echo $row['ETF'] . ' ' . $row['ETF NAME']. '<br>';
}
// display the links to the pages
for ($page=1;$page<=$number_of_pages;$page++) {
echo '<a href="index.php/stocks/sec-forms/?page=' . $page . '">' . $page. '</a>';
}
Try:
Also as mentioned you should sort by a certain column with 'ORDER BY' for consistent results.
Using
OFFSET
andLIMIT
for pagination of web pages leads to two bugs -- duplicated rows shown, and rows not shown.Why?
INSERTed
orDELETEd
that belongs in the first 10.[Next]
and go to the page that shows the next 10 rows. But wait, it is not showing the "next" 10 rows, it is showing rows #11-20. And, since something changed in rows 1-10, the rows are not really continuing where you left off.I just gave you a hint of how to avoid it -- "remember where you left off" instead of using
OFFSET
. More .You should change
to something like this
because it is faster to get count from mysql (index if its a large table) instead of fetching all table data (because
SELECT *...
) for looping trough it just for row counting.You using good query, but using wrong function to get its results.
Query should be
or:
Both of these work.
Change
to
because "mysqli_fetch_array" fetch array width numbered indexes (for example 0, 1, 2...) not a text ones you are trying to use, but "mysqli_fetch_assoc" does that you need.
Full code should be