PHP pagination problem
So for some reason I am trying to figure out why my pagination isnt working properly. I get it to move from page 1 to 2 but it wont go to page 3 for some reason. I checked to see if the query from the DB was correct and it was so not sure where I am going wrong.
$per_page = '4';
$tenure_sql = 'SELECT COUNT(id) as count
FROM people.bywu
WHERE type <> 0
AND status = "approved"';
$tenure_query = mysql_query( $tenure_sql, DB );
$tenure_count = mysql_fetch_object( $tenure_query );
$tenure_count = $tenure_count -> count;
$tenure_pages = ceil( $tenure_count / $per_page );
<div class="pagination" id="tenure_pages">
<a href="" class="lt grayed"><</a>
Stories <span id="tenure_low" class="current_low"><?= $tenure_count ? '1':'0' ?></span>-<span id="tenure_high" class="current_high"><?= $tenure_count > 4 ? $per_page : $tenure_count ?></span> of <span class="total"><?= $tenure_count ?></span>
<a href="" class="gt<?= $tenure_count < 5 ? ' grayed':'' ?>">></a>
<span class="pages" style="display:开发者_如何学JAVAnone;"><?= $tenure_pages ?></span>
<?
for( $i = 1; $i < $tenure_pages + 1; $i++ )
{
echo '<a href="">' . $i . '</a> ';
} // for
?>
Scrapped away from kohana pagination class, i think you will find it useful if you know any basics about php classes.
Usage :
$pager = Pagination::factory(array('current_page' => $_GET['page'], 'total_items' => $total_items, 'items_per_page' => 20));
if ($pager->next_page) { /* etc.......*/ }
<?php
class Pagination {
protected $config = array(
'current_page' => 1,
'total_items' => 0,
'items_per_page' => 10
);
// Current page number
protected $current_page;
// Total item count
protected $total_items;
// How many items to show per page
protected $items_per_page;
// Total page count
protected $total_pages;
// Item offset for the first item displayed on the current page
protected $current_first_item;
// Item offset for the last item displayed on the current page
protected $current_last_item;
// Previous page number; FALSE if the current page is the first one
protected $previous_page;
// Next page number; FALSE if the current page is the last one
protected $next_page;
// First page number; FALSE if the current page is the first one
protected $first_page;
// Last page number; FALSE if the current page is the last one
protected $last_page;
// Query offset
protected $offset;
/**
* Creates a new Pagination object.
*
* @param array configuration
* @return Pagination
*/
public static function factory(array $config = array())
{
return new Pagination($config);
}
/**
* Creates a new Pagination object.
*
* @param array configuration
* @return void
*/
public function __construct(array $config = array())
{
// Pagination setup
$this->setup($config);
}
/**
* Loads configuration settings into the object and (re)calculates pagination if needed.
* Allows you to update config settings after a Pagination object has been constructed.
*
* @param array configuration
* @return object Pagination
*/
public function setup(array $config = array())
{
// Only (re)calculate pagination when needed
if ($this->current_page === NULL
OR isset($config['current_page'])
OR isset($config['total_items'])
OR isset($config['items_per_page']))
{
// Calculate and clean all pagination variables
$this->current_page = (int) $this->config['current_page'];
$this->total_items = (int) max(0, $this->config['total_items']);
$this->items_per_page = (int) max(1, $this->config['items_per_page']);
$this->total_pages = (int) ceil($this->total_items / $this->items_per_page);
$this->current_page = (int) min(max(1, $this->current_page), max(1, $this->total_pages));
$this->current_first_item = (int) min((($this->current_page - 1) * $this->items_per_page) + 1, $this->total_items);
$this->current_last_item = (int) min($this->current_first_item + $this->items_per_page - 1, $this->total_items);
$this->previous_page = ($this->current_page > 1) ? $this->current_page - 1 : FALSE;
$this->next_page = ($this->current_page < $this->total_pages) ? $this->current_page + 1 : FALSE;
$this->first_page = ($this->current_page === 1) ? FALSE : 1;
$this->last_page = ($this->current_page >= $this->total_pages) ? FALSE : $this->total_pages;
$this->offset = (int) (($this->current_page - 1) * $this->items_per_page);
}
// Chainable method
return $this;
}
/**
* Returns a Pagination property.
*
* @param string property name
* @return mixed Pagination property; NULL if not found
*/
public function __get($key)
{
return isset($this->$key) ? $this->$key : NULL;
}
/**
* Updates a single config setting, and recalculates pagination if needed.
*
* @param string config key
* @param mixed config value
* @return void
*/
public function __set($key, $value)
{
$this->setup(array($key => $value));
}
} // End Pagination
?>
Unless the count()
you get from the database is 9
or larger, you'd never see a 3
.
ceil(0/4) -> 0
...
ceil(8/4) -> 2
ceil(9/4) -> 3
So... how many articles are there in the database that match the conditions in your query?
You don't show how you're passing around the "current page" count in your code, so how does the code know which page you're on at the moment?
$total_pages = 8;
$current_page = $_GET['curPage'];
for ($i = 1; $i <= $total_pages; $i++) {
$class = ($i == $current_page) ? ' class="current"' : '';
echo <<<EOL
<a href="page.php?curPage=$i"$class>$i</a>
EOL;
}
精彩评论