Forum Moderators: coopster

Message Too Old, No Replies

What's Wrong with My Pagination Script?

         

Tehuti

5:23 pm on Sep 16, 2008 (gmt 0)

10+ Year Member Top Contributors Of The Month



What's wrong with my pagination script (below)?

It displays navigation links like this:

1 2 3 > >>

Even if no results are returned from the database, the pagination links are still there:

1 2 3 > >>

If 2 or 3 are clicked, they go to blank pages.

I've played with $range but the problem remains. When I change $range to 0, for example, the pagination links display like the following, even if no results are returned:

1 > >>

If ">" or ">>" are clicked, they lead to blank pages.

Anyone know how I can fix this? If no results are returned, I don't want links to blank pages.

Below's the full script. However, all you will need is the bottom part.

-----------------------

<?php

// database connection info
$conn = mysql_connect('localhost','root') or trigger_error("SQL", E_USER_ERROR);
$db = mysql_select_db('ctyi', $conn) or trigger_error("SQL", E_USER_ERROR);

// find out how many rows are in the table
$sql = "SELECT COUNT(*) FROM tcoupon";
$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);
$r = mysql_fetch_row($result);
$numrows = $r[0];

// number of rows to show per page
$rowsperpage = 5;
// find out total pages
$totalpages = ceil($numrows / $rowsperpage);

// get the current page or set a default
if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage'])) {
// cast var as int
$currentpage = (int) $_GET['currentpage'];
} else {
// default page num
$currentpage = 1;
} // end if

// if current page is greater than total pages...
if ($currentpage > $totalpages) {
// set current page to last page
$currentpage = $totalpages;
} // end if
// if current page is less than first page...
if ($currentpage < 1) {
// set current page to first page
$currentpage = 1;
} // end if

// the offset of the list, based on current page
$offset = ($currentpage - 1) * $rowsperpage;

// get the info from the db
$sql = "SELECT * FROM wherever LIMIT $offset, $rowsperpage";

$result = mysql_query($sql, $conn) or trigger_error("SQL", E_USER_ERROR);

if(mysql_num_rows($result) < 1)

{
echo "<p>No results.</p>";
}

else

{

while($row = mysql_fetch_assoc($result))
{

// echo data
echo "Results";

} // end while
} // end else


/****** build the pagination links ******/

// if not on page 1, show back links
if ($currentpage > 1) {
// show << link to go back to page 1
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=1'><<</a> ";
// get previous page num
$prevpage = $currentpage - 1;
// show < link to go back to 1 page
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$prevpage'><</a> ";
} // end if

// range of num links to show
$range = 3;

// loop to show links to range of pages around current page
for ($x = (($currentpage - $range) - 1); $x < (($currentpage + $range) + 1); $x++) {
// if it's a valid page number...
if (($x > 0) && ($x <= $totalpages)) {
// if we're on current page...
if ($x == $currentpage) {
// 'highlight' it but don't make a link
echo " [$x] ";
// if not current page...
} else {
// make it a link
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$x'>$x</a> ";
} // end else
} // end if
} // end for

// if not on last page, show forward and last page links
if ($currentpage != $totalpages) {
// get next page
$nextpage = $currentpage + 1;
// echo forward link for next page
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$nextpage'>></a> ";
// echo forward link for lastpage
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$totalpages'>>></a> ";
} // end if

/****** end build pagination links ******/

?>

d40sithui

8:22 pm on Sep 16, 2008 (gmt 0)

10+ Year Member



The problem here is that you never check if your proceeding pages contains any records.
for ($x = (($currentpage - $range) - 1); $x < (($currentpage + $range) + 1); $x++) {

Your loop goes through all the ranges, but you should do something additional to make sure that the data for page $x exists otherwise you will always get the links whether or not you have data for the page.
It's the end of the day and the only thing I can think of is probaly doing a single query inside the loop
for ($x = (($currentpage - $range) - 1); $x < (($currentpage + $range) + 1); $x++) {

// if we're on current page...
if ($x == $currentpage) {
// 'highlight' it but don't make a link
echo " [$x] ";
// if not current page...
} else {
$result = mysql_query("SELECT * FROM wherever LIMIT ".(($x-1)*$rowsperpage).", $rowsperpage");
//if data exists
if(mysql_num_rows($result)){
// make it a link
echo " <a href='{$_SERVER['PHP_SELF']}?currentpage=$x'>$x</a> ";
}//ends if data exist
//else do nothing
else{}
} // end else
} // end if
} // end for

Tehuti

9:25 pm on Sep 16, 2008 (gmt 0)

10+ Year Member Top Contributors Of The Month



Thanks for the effort, d40sithui, but it didn't work.

When there are no results, my links now look like this:

1 > >>

If I click ">" or ">>", it still goes to a blank page.

Any other ideas?

Tehuti

3:08 am on Sep 17, 2008 (gmt 0)

10+ Year Member Top Contributors Of The Month



I've just understood something very important . . .

There's nothing wrong with my script! The number of pagination links that are displayed on any one page following a query depend on how many rows I have in my database and how many rows I want to be displayed on each page. For example, if there were 10 rows in my database and I wanted to show 5 per page, links to pages 1 and 2 would appear on my page, thus:

1 2 > >>

And if there were 15 rows in my database and I wanted to display 5 per page, links 1, 2 and 3 would appear on my page, thus:

1 2 3 > >>

No more than links 1, 2 and 3 would ever appear because I have set $range to 3.

Now, if I had 15 rows in my database, even if my SELECT query returned no rows, I would still have links 1, 2 and 3 on my page because the number of links present on my page will always depend on how many rows I have in my database and how many rows I want to display on my page. Therefore, the only way to control the number of links that will actually appear on my page per each query is to make sure that the SELECT COUNT(*) query only counts the rows that will be selected during the main query and not all of my rows. In other words, the exact same rows must be taken into account by both of the following queries:

$sql = "SELECT COUNT(*) FROM table WHERE . . .";

$sql = "SELECT * FROM table WHERE . . . LIMIT . . .";

As such, I realise that I have made a mistake: in fact, there really isn't a problem with my script! I therefore want to extend an apology to you, D40sithui, for wasting your time.

Sorry, dude, and thank you for your help.

d40sithui

2:27 pm on Sep 17, 2008 (gmt 0)

10+ Year Member



grats. you didn't waste my time. in fact, you give me something to do while i'm at work.