Limit pagination page number
Ok if you mean show something like
Prev 1 2 3 4 5 6 .. 40 41 Next Prev 1 2 .. 6 7 8 9 10 .. 40 41 Next
First thing we need to is create a function that can process what we need to output the pagination. Heres a function I use and it works well.
function get_paging_info($tot_rows,$pp,$curr_page){ $pages = ceil($tot_rows / $pp); // calc pages $data = array(); // start out array $data['si'] = ($curr_page * $pp) - $pp; // what row to start at $data['pages'] = $pages; // add the pages $data['curr_page'] = $curr_page; // Whats the current page return $data; //return the paging data}
Now this function is pretty solid and works very well for me.
So you pass this function
- $tot_rows = counted rows for query
- $pp = items per page
- $curr_page = the current page number
Ok, now that you have the data you need, you'll need to display it.
Heres what I use and please read it before you think, 'ah, it's too long'. It's actually very simple.
Heres a snapshot of what it will return
<!-- Create the query --> <?php $count = mysql_fetch_assoc( mysql_query ( "SELECT COUNT( rows ) as count FROM table" ) ) ; <?php $count = $count[0]['count']; ?><!-- Call our function from above --><?php $paging_info = get_paging_info($count,5,34); ?><p> <!-- If the current page is more than 1, show the First and Previous links --> <?php if($paging_info['curr_page'] > 1) : ?> <a href='' title='Page 1'>First</a> <a href='' title='Page <?php echo ($paging_info['curr_page'] - 1); ?>'>Prev</a> <?php endif; ?> <?php //setup starting point //$max is equal to number of links shown $max = 7; if($paging_info['curr_page'] < $max) $sp = 1; elseif($paging_info['curr_page'] >= ($paging_info['pages'] - floor($max / 2)) ) $sp = $paging_info['pages'] - $max + 1; elseif($paging_info['curr_page'] >= $max) $sp = $paging_info['curr_page'] - floor($max/2); ?> <!-- If the current page >= $max then show link to 1st page --> <?php if($paging_info['curr_page'] >= $max) : ?> <a href='' title='Page 1'>1</a> .. <?php endif; ?> <!-- Loop though max number of pages shown and show links either side equal to $max / 2 --> <?php for($i = $sp; $i <= ($sp + $max -1);$i++) : ?> <?php if($i > $paging_info['pages']) continue; ?> <?php if($paging_info['curr_page'] == $i) : ?> <span class='bold'><?php echo $i; ?></span> <?php else : ?> <a href='' title='Page <?php echo $i; ?>'><?php echo $i; ?></a> <?php endif; ?> <?php endfor; ?> <!-- If the current page is less than say the last page minus $max pages divided by 2--> <?php if($paging_info['curr_page'] < ($paging_info['pages'] - floor($max / 2))) : ?> .. <a href='' title='Page <?php echo $paging_info['pages']; ?>'><?php echo $paging_info['pages']; ?></a> <?php endif; ?> <!-- Show last two pages if we're not near them --> <?php if($paging_info['curr_page'] < $paging_info['pages']) : ?> <a href='<?php echo str_replace('/page'.$paging_info['curr_page'], '', $paging_info['curr_url']) . '/page'.($paging_info['curr_page'] + 1); ?>' title='Page <?php echo ($paging_info['curr_page'] + 1); ?>'>Next</a> <a href='<?php echo str_replace('/page'.$paging_info['curr_page'], '', $paging_info['curr_url']) . '/page'.$paging_info['pages']; ?>' title='Page <?php echo $paging_info['pages']; ?>'>Last</a> <?php endif; ?></p>
I solved a very similar issue for someone else with a very similar script here: How to limit pages shown in pagination script
Also, I noticed a few other anomalies with your script (besides the unreadable formatting that I fixed). You should change all occurrences of $_SERVER[SCRIPT_NAME]
to $_SERVER['SCRIPT_NAME']
. In your script, for instance:
echo " <a href ='$_SERVER[SCRIPT_NAME]?Page=...";
Would become:
echo " <a href ='{$_SERVER['SCRIPT_NAME']}?Page=...";