Forum Moderators: coopster
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 ******/
?>
for ($x = (($currentpage - $range) - 1); $x < (($currentpage + $range) + 1); $x++) {
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
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.