Mam problem z paginacją, która została zapożyczona z phpbb. Mianowicie, mam taki kod:

  1. function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = true)
  2. {
  3. $seperator = ' ';
  4.  
  5. $total_pages = ceil($num_items/$per_page); // ilość stron
  6.  
  7. $amp = strpos($base_url, '?') !== false ? '&' : '?'; // czy łączyć "?" czy "&"
  8. if ($total_pages == 1 || !$num_items) // ilość elementów = 1?
  9. {
  10. if ($start_item % $per_page == 0)
  11. {
  12. return '<b><span class="pagination">1</span></b>'; // 1 strona bez linka
  13. }
  14. else
  15. {
  16. return ($add_prevnext_text? '<a href="'. $base_url . $amp . 'start=0"><span class="pagination">&lt;&lt;</span></a>' . $seperator:'') . '<b><span class="pagination">1</span></b>'; // 1 strona z linkiem do poczatku (<<)- zaczeto nierówno z iloscia postow na strone (1 user ma 10/str, inny ma 15 i daje linka temu pierwszemu)
  17. }
  18. }
  19.  
  20. $on_page = floor($start_item / $per_page) + 1; // ilosc na strone
  21. $page_string = ($add_prevnext_text && $on_page!=1 || $start_item % $per_page != 0) ? '<a href="'. $base_url . $amp . 'start=' . max(0,($on_page-2)*$per_page) . '"><span class="pagination">&lt;&lt;</span></a>'.$seperator : ''; // poczatkowy << (o ile jestesmy dalej niz na 1 stronie)
  22.  
  23. if ($total_pages>10) // wiecej niz 10 stron
  24. {
  25. for($i = 1; $i <= 3; $i++) // poczatkowe 3 strony wyswietlane zawsze
  26. {
  27. $page_string .= ($i == $on_page) ? '<b><span class="pagination">' . $i . '</span></b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '"><span class="pagination">' . $i . '</span></a>';
  28. $page_string .= $seperator;
  29. }
  30.  
  31. $start1=max(4,floor($on_page/2)-1); // ustalenie poczatku i konca 2 czesci ( 3 ... [tutaj] ... srodek ... ... koniec)
  32. $end1=max(4,min($total_pages-3,floor($on_page/2)+1));
  33.  
  34. $start2=max($end1+1,min($total_pages-6,max(4,$on_page-4))); // ustalenie poczatku i konca 3 czesci ( 3 ... ... ... [tutaj] ... ... koniec)
  35. $end2=max(6,min($total_pages-3,$on_page+4));
  36.  
  37. $start3=max($end2+1,min($total_pages-3,floor($on_page+($total_pages-$on_page)/2)-2)); // ustalenie poczatku i konca 4 czesci ( 3 ... ... ... ... ... [tutaj] ... koniec)
  38. $end3=min($total_pages-3,max(4,floor($on_page+($total_pages-$on_page)/2)));
  39.  
  40. if ($start1>4)
  41. {
  42. $page_string .= '...' . $seperator; // jesli 2 czesc sie zaczyna dalej niz na 4 stronie
  43. }
  44. if ($start2>=$end1) // jesli 2 czesc w ogole istnieje
  45. for($i = $start1; $i <= $end1; $i++)
  46. {
  47. $page_string .= ($i == $on_page) ? '<b><span class="pagination">' . $i . '</span></b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '"><span class="pagination">' . $i . '</span></a>';
  48. $page_string .= $seperator;
  49. }
  50. if ($start2-$end1>1) // jesli 2 czesc jest przynajmniej o 1 odlegla od nastepnej
  51. {
  52. $page_string .= '...' . $seperator;
  53. }
  54. for($i = $start2; $i <= $end2; $i++) // srodkowa czesc
  55. {
  56. $page_string .= ($i == $on_page) ? '<b><span class="pagination">' . $i . '</span></b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '"><span class="pagination">' . $i . '</span></a>';
  57. $page_string .= $seperator;
  58. }
  59.  
  60. if ($start3-$end2>1) // jesli 4 czesc jest przynajmniej o 1 odlegla od nastepnej
  61. {
  62. $page_string .= '...' . $seperator;
  63. }
  64. for($i = $start3; $i <= $end3; $i++) // 4 czesc
  65. {
  66. $page_string .= ($i == $on_page) ? '<b><span class="pagination">' . $i . '</span></b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '"><span class="pagination">' . $i . '</span></a>';
  67. $page_string .= $seperator;
  68. }
  69.  
  70. if ($end2<$total_pages-3) // jesli ostatnia czesc jest konczy sie na wiecej niz 3 strony od konca
  71. {
  72. $page_string .= '...' . $seperator;
  73. }
  74.  
  75. for($i = $total_pages-2; $i <= $total_pages; $i++) // koncowe strony
  76. {
  77. $page_string .= ($i == $on_page) ? '<b><span class="pagination">' . $i . '</span></b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '"><span class="pagination">' . $i . '</span></a>';
  78. if ($i < $total_pages)
  79. {
  80. $page_string .= $seperator;
  81. }
  82. }
  83. }
  84. else // mniej niz 10 sttron - wyswietlamy cala liste
  85. {
  86. for($i = 1; $i <= $total_pages; $i++)
  87. {
  88. $page_string .= ($i == $on_page) ? '<b><span class="pagination">' . $i . '</span></b>' : '<a href="' . $base_url . $amp . "start=" . (($i - 1) * $per_page) . '"><span class="pagination">' . $i . '</span></a>';
  89. if ($i < $total_pages)
  90. {
  91. $page_string .= $seperator;
  92. }
  93. }
  94. } // dodanie koncowej >>, jesli nie jestesmy na ostatniej stronie
  95. $page_string .= ($on_page == $total_pages || !$add_prevnext_text) ?'': $seperator.'<a href="'. $base_url . $amp . 'start='.$on_page*$per_page . '"><span class="pagination">&gt;&gt;</span></a>';
  96.  
  97. return '<br><br><br><center>'.$page_string.'</center>';
  98. }


Problem jest tego typu, że jeśli w linku wpiszemy sobie np. index.php?start=1000000 to link wchodzi. Próbowałem na początku dodać taki warunek:

  1. if ( $start_item > $total_pagaes )
  2. {
  3. $start_item = $total_pages;
  4. }


Ale z tym nic się nie dzieje, nadal bez problemu można pisać głupoty w linku. Jakaś rada, jak to "ugryźć" ?