Если вы занимаетесь разработкой интернет магазинов, каталогов, досок объявлений — то наверняка сталкивались с проблемой постраничного вывода информации. Проще говоря с пагинацией. Представленная ниже функция помогает решить эту задачу. В данной реализации используется враппер 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)); }
root4root aka admin
if($countofrows <= $rowonpage) //Если менее одной страницы
Комментарий неверен. Правильно: не более одной страницы.
Большое спасибо, исправил!