Если вы занимаетесь разработкой интернет магазинов, каталогов, досок объявлений — то наверняка сталкивались с проблемой постраничного вывода информации. Проще говоря с пагинацией. Представленная ниже функция помогает решить эту задачу. В данной реализации используется враппер MySQLi под названием goDB. Но вы без труда сможете переделать под собственные нужды, главное понимать принцип работы.
Он очень простой: передаем в функцию необходимые параметры, такие как сам SQL запрос, данные для запроса (если используются плейсхолдеры), количество записей на страницу и номер страницы.
Сначала запрашиваются все записи по переданному запросу, чтобы определить количество строк. Затем вычисляется количество страниц. Далее идут условия и проверки. Их не буду описывать, сами смотрите код.
Функция возвращает массив:
- Array
- (
- [‘sql’]=>‘SELECT…’, //Модифицированный
- [‘pageline’]=>array() //Линейка с номерами страниц
- )
Функция дописывает к исходному запросу LIMIT и возвращает его. Так же возвращается массив с номерами страниц для вывода на экран. Он имеет следующий вид:
- Array
- (
- [0] => 1
- [1] => 0
- [2] => 3
- [3] => 4
- [4] => 5
- [5] => —6
- [6] => 7
- [7] => 8
- [8] => 9
- [9] => 0
- [10] => 17
- )
Текущая страница идет с отрицательным значением. В данном случае -6.
В качестве разделителя используется 0. Его можно преобразовать в любой символ при выводе. Например в «…»
Вот сам код функции:
- function _paginator($sql, $sqldata, $pagetodisplay, $rowonpage)
- {
- global $db; //идентификатор соединения с MySQL
- $countofrows = $db—>query($sql, $sqldata, ‘num’);
- $totalpages = ceil($countofrows/$rowonpage); //Общее коичество страниц в результате запроса
- if($countofrows <= $rowonpage) //Если не более одной страницы
- $pageline = NULL;
- elseif($totalpages < $pagetodisplay) //Если запрошенная страница больше, чем можно отобразить.
- $pageline = FALSE;
- else
- {
- $start = ($pagetodisplay—1)*$rowonpage;
- $sql .= » LIMIT $start, $rowonpage»;
- if($totalpages <= 9) //Если страниц меньше или 9.
- {
- for($i=1; $i<=$totalpages; $i++)
- {
- if($pagetodisplay == $i)
- $pageline[]=$i*(—1);
- else
- $pageline[]=$i;
- }
- }
- elseif($pagetodisplay > 5 && $pagetodisplay <= $totalpages—5) //промежуток между первой и последней
- {
- $pageline=array(1,0);
- for($i=$pagetodisplay—3; $i<=$pagetodisplay+3; $i++)
- {
- if($pagetodisplay == $i)
- $pageline[]=$i*(—1);
- else
- $pageline[]=$i;
- }
- $pageline[]=0;
- $pageline[]=$totalpages;
- }
- elseif($pagetodisplay <= 5 && $totalpages > 9) //промежуток от начала
- {
- for($i=1; $i<=7; $i++)
- {
- if($pagetodisplay == $i)
- $pageline[]=$i*(—1);
- else
- $pageline[]=$i;
- }
- $pageline[]=0;
- $pageline[]=$totalpages;
- }
- elseif($pagetodisplay > 5 && $pagetodisplay > $totalpages—5)
- {
- $pageline=array(1,0);
- for($i=$totalpages—6; $i<=$totalpages; $i++)
- {
- if($pagetodisplay == $i)
- $pageline[]=$i*(—1);
- else
- $pageline[]=$i;
- }
- }
- }
- return(array(‘sql’ => $sql, ‘pageline’ => $pageline));
- }