Итак, видел много таких штук и везде все по разному.
Решил выложить и свой взгляд на это, чтобы всё было разобрано по шагам и очень доступно.
[size=18]Предисловие[/size]
И так, разбивка на страницы — это всего лишь немного логики, математики и LIMIT в SQL запросе.
[size=18]Экшн[/size]
[size=14]Для начала[/size]
установим кол-во записей, выводимых на страницу.
$nums = 10;
[size=14]Затем[/size]
мы определимся на какой странице находимся (в нашем случае мы будем передавать номер страницы GET'ом).
if (isset($_GET['page']))
{
$page = intval($_GET['page']);
}
else
{
$page = 1;
}
[size=14]Посмотрим[/size]
сколько всего у нас страниц, чтобы юзер не ввёл нам 1589 страницу из 13 возможных
Для этого необходимо подсчитать кол-во элементов всего:
$query = "SELECT COUNT(*) AS `counter`
FROM `table`";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$elements = $row['counter'];
[size=14]А уже[/size]
кол-во страниц выясняется нехитрым методом деления всех элементов на кол-во на страницу и округляется в большую сторону.
$pages = ceil($elements/$nums);
Теперь проверим
чтобы текущая страница не была меньше 1 и не больше последней страницы
if ($page < 1)
{
$page = 1;
}
elseif ($page > $pages)
{
$page = $pages;
}
итак, в $page находится номер нашей страницы
[size=14]Для[/size]
лимита в нашем запросе, нам необходимо подстачитать первый оператор, который показывает с какой записи мы зачинаем делать выборку
$start = ($page-1)*$nums;
[size=14]Всё![/size]
Запрос составлен:
$query = "SELECT *
FROM `table`
LIMIT {$start}, {$nums}";
[size=18]Листалка страниц[/size]
[size=14]В нашем[/size]
пагинаторе мы не будем выводить все страницы от 1 .. до 150 например, а будем выводить только соседние по отношению к текущей,
например если у нас выбрана страница 5, то мы введем слева и справа от неё определённое кол-во страниц, допустим у нас это кол-во будет равно 6.
$neighbours = 6;
[size=14]Определяем[/size]
крайнего левого и правого соседей
$left_neighbour = $page - $neighbours;
if ($left_neighbour < 1) $left_neighbour = 1;
$right_neighbour = $page + $neighbours;
if ($right_neighbour > $pages) $right_neighbour = $pages;
[size=14]А как же[/size]
нам вывести листалку?
if ($page > 1)
{
print ' <a href="?page=1">начало</a> … <a href="?page=' . ($page-1) . '">←сюда</a> ';
}
for ($i=$left_neighbour; $i<=$right_neighbour; $i++)
{
if ($i != $page)
{
print ' <a href="?page=' . $i . '">' . $i . '</a> ';
}
else
{
// выбранная страница
print ' <b>' . $i . '</b> ';
}
}
if ($page < $pages)
{
print ' <a href="?page=' . ($page+1) . '">туда→</a><a href="?page=' . $pages . '">конец</a> … ';
}
[size=14]Вот[/size]
мы и получили модную листалку как на яндексах, хабрах и т.д.
[size=16]Соберём[/size]
всё это в кучу!
$nums = 10;
if (isset($_GET['page']))
{
$page = intval($_GET['page']);
}
else
{
$page = 1;
}
$query = "SELECT COUNT(*) AS `counter`
FROM `table`";
$sql = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($sql);
$elements = $row['counter'];
$pages = ceil($elements/$nums);
if ($page < 1)
{
$page = 1;
}
elseif ($page > $pages)
{
$page = $pages;
}
$start = ($page-1)*$nums;
// когда у нас в таблице нет записей
if ($start < 0) $start = 0;
$query = "SELECT *
FROM `table`
LIMIT {$start}, {$nums}";
$sql = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($sql))
{
// здесь выводим наши записи из базы
}
// далее нам надо прицепить листалку
$neighbours = 6;
$left_neighbour = $page - $neighbours;
if ($left_neighbour < 1) $left_neighbour = 1;
$right_neighbour = $page + $neighbours;
if ($right_neighbour > $pages) $right_neighbour = $pages;
if ($page > 1)
{
print ' <a href="?page=1">начало</a> … <a href="?page=' . ($page-1) . '">←сюда</a> ';
}
for ($i=$left_neighbour; $i<=$right_neighbour; $i++)
{
if ($i != $page)
{
print ' <a href="?page=' . $i . '">' . $i . '</a> ';
}
else
{
// выбранная страница
print ' <b>' . $i . '</b> ';
}
}
if ($page < $pages)
{
print ' <a href="?page=' . ($page+1) . '">туда→</a> … <a href="?page=' . $pages . '">конец</a> ';
}