Код разбивки на PHP

Итак, я пытаюсь создать разбиение на страницы с максимальным количеством страниц на 5 страниц. Если есть только пять страниц, которые возвращаются из моего оператора MySQL, верните пять страниц. В противном случае верните 2 страницы в каждом направлении. Поэтому в идеале, если я нахожусь на странице 1, он показывает страницы 1 2 3 4 5. Если я на странице 5 и не более 5 страниц, покажите 1 2 3 4 5. Если, однако, я нахожусь стр. 20, а всего 100, я хотел бы показать 18 19 20 21 22. Любые предложения?

Допустим, у вас есть запрос, который возвращает много и много строк:

$query_results = array(...); 

И у вас есть максимальное ограничение на количество результатов, отображаемых на странице:

 $results_per_page = 20; 

Теперь общее количество страниц, которые вам понадобятся, это

 $total_pages = ceil(count($query_results)/$results_per_page); 

Но теперь идет сложная часть; вам нужно знать, на какой странице находится пользователь, и какие результаты отображаются на этой странице. Скажем, вы определяете номер страницы с помощью простой переменной GET:

 yoursite.com/results.php?page=2 

Таким образом, страница 1 соответствует результатам 0 – 19, страница 2 – 20 – 29 и т. Д. Затем вы можете определить, какие результаты будут показаны там, например:

 $page = min($_GET['page'], $total_pages); //ensures you never have an illegal page $start_results = ($page - 1) * $results_per_page; $results_on_page = array_slice($query_results, $start_results, $results_per_page); 

Теперь вы можете отображать те в HTML, сколько хотите. Но как насчет ссылок? Вы сказали, что вам нужны две ссылки в любом направлении, в общей сложности пять ссылок на странице.

 $total_links = 5; $pivot = floor($total_links / 2); $leftmost = max(1, $page - $pivot); $rightmost = min($total_pages, $page + $pivot); $links = array(); for ($i = $leftmost; $i <= $rightmost; $i++) { $links[] = "results.php?page=$i"; } 

Это даст вам множество ссылок для отображения на вашей странице. Я оставлю эту часть вам.

Теперь это будет работать, но для больших результирующих наборов оно будет крайне неэффективным, потому что вся обработка и ограничение происходят после того, как она возвращается из базы данных. Поэтому вы, вероятно, захотите сделать это в своем запросе. Я оставлю это как упражнение для читателя, но вот подсказка, чтобы вы начали:

 SELECT * FROM some_table LIMIT $results_per_page OFFSET ($page - 1) * $results_per_page 

Это, как говорится, сворачивание вашего собственного кода для чего-то столь мирского и общего является хорошим опытом обучения, но редко хорошим использованием вашего времени. Если это для какой-либо профессиональной работы, рассмотрите возможность использования предварительно построенной библиотеки, такой как PEAR-пейджер или Zend_Paginator библиотеки Zend Framework.

Для увеличения количества страниц, то, что вы предлагаете, затрудняет пользователю простой переход на удаленные страницы. Попробуйте использовать описанную здесь «логарифмическую» методику:

Как выполнять навигацию по страницам для многих, многих страниц? Логарифмическая навигация по страницам