Разбиение на страницы на PHP

Если вы занимаетесь разработкой интернет магазинов, каталогов, досок объявлений — то наверняка сталкивались с проблемой постраничного вывода информации. Проще говоря с пагинацией. Представленная ниже функция помогает решить эту задачу. В данной реализации используется враппер MySQLi под названием goDB. Но вы без труда сможете переделать под собственные нужды, главное понимать принцип работы.

Он очень простой: передаем в функцию необходимые параметры, такие как сам SQL запрос, данные для запроса (если используются плейсхолдеры), количество записей на страницу и номер страницы.

Сначала запрашиваются все записи по переданному запросу, чтобы определить количество строк. Затем вычисляется количество страниц. Далее идут условия и проверки. Их не буду описывать, сами смотрите код.

Функция возвращает массив:

  1. Array
  2. (
  3. [‘sql’]=>‘SELECT…’, //Модифицированный
  4. [‘pageline’]=>array() //Линейка с номерами страниц
  5. )

Функция дописывает к исходному запросу LIMIT и возвращает его. Так же возвращается массив с номерами страниц для вывода на экран. Он имеет следующий вид:

  1. Array
  2. (
  3. [0] => 1
  4. [1] => 0
  5. [2] => 3
  6. [3] => 4
  7. [4] => 5
  8. [5] => 6
  9. [6] => 7
  10. [7] => 8
  11. [8] => 9
  12. [9] => 0
  13. [10] => 17
  14. )

Текущая страница идет с отрицательным значением. В данном случае -6.
В качестве разделителя используется 0. Его можно преобразовать в любой символ при выводе. Например в «…»

Вот сам код функции:

  1. function _paginator($sql, $sqldata, $pagetodisplay, $rowonpage)
  2. {
  3. global $db; //идентификатор соединения с MySQL
  4. $countofrows = $db>query($sql, $sqldata, ‘num’);
  5. $totalpages = ceil($countofrows/$rowonpage); //Общее коичество страниц в результате запроса
  6. if($countofrows <= $rowonpage) //Если не более одной страницы
  7. $pageline = NULL;
  8. elseif($totalpages < $pagetodisplay) //Если запрошенная страница больше, чем можно отобразить.
  9. $pageline = FALSE;
  10. else
  11. {
  12. $start = ($pagetodisplay1)*$rowonpage;
  13. $sql .= » LIMIT $start, $rowonpage»;
  14. if($totalpages <= 9) //Если страниц меньше или 9.
  15. {
  16. for($i=1; $i<=$totalpages; $i++)
  17. {
  18. if($pagetodisplay == $i)
  19. $pageline[]=$i*(1);
  20. else
  21. $pageline[]=$i;
  22. }
  23. }
  24. elseif($pagetodisplay > 5 && $pagetodisplay <= $totalpages5) //промежуток между первой и последней
  25. {
  26. $pageline=array(1,0);
  27. for($i=$pagetodisplay3; $i<=$pagetodisplay+3; $i++)
  28. {
  29. if($pagetodisplay == $i)
  30. $pageline[]=$i*(1);
  31. else
  32. $pageline[]=$i;
  33. }
  34. $pageline[]=0;
  35. $pageline[]=$totalpages;
  36. }
  37. elseif($pagetodisplay <= 5 && $totalpages > 9) //промежуток от начала
  38. {
  39. for($i=1; $i<=7; $i++)
  40. {
  41. if($pagetodisplay == $i)
  42. $pageline[]=$i*(1);
  43. else
  44. $pageline[]=$i;
  45. }
  46. $pageline[]=0;
  47. $pageline[]=$totalpages;
  48. }
  49. elseif($pagetodisplay > 5 && $pagetodisplay > $totalpages5)
  50. {
  51. $pageline=array(1,0);
  52. for($i=$totalpages6; $i<=$totalpages; $i++)
  53. {
  54. if($pagetodisplay == $i)
  55. $pageline[]=$i*(1);
  56. else
  57. $pageline[]=$i;
  58. }
  59. }
  60. }
  61. return(array(‘sql’ => $sql, ‘pageline’ => $pageline));
  62. }