Статьи

Как разбить данные на страницы с помощью PHP

Я помню несколько лет назад, когда я впервые начал программировать на PHP и MySQL, насколько я был взволнован, когда впервые получил информацию из базы данных, которая появилась в веб-браузере.

Для кого-то, у кого было мало знаний в области баз данных и программирования, просмотр строк таблицы на экране, основанный на написанном мною коде (хорошо, поэтому я скопировал пример из книги — давайте не будем расстраиваться), дал мне триумфальный максимум. Возможно, я тогда еще не полностью осознал всю магию на работе, но этот первый успех подтолкнул меня к большим и лучшим проектам.

Хотя мой уровень изобилия в базах данных может быть не таким, каким он был когда-то,
С тех пор, как я впервые попал на «привет мир» с PHP и MySQL, меня зацепило
на силу сделать вещи простыми и удобными в использовании.

Как разработчик, одна проблема, с которой я постоянно сталкиваюсь, заключается в том, чтобы взять большой набор информации и облегчить ее усвоение. Является ли это списком клиентов большой компании или личным mp3-каталогом, необходимость сидеть и смотреть на ряды на ряды на рядах данных может обескураживать
и расстраивает. Что может сделать хороший разработчик? Постраничный!

Если вы ищете быстрое решение, на Envato Market есть большая коллекция сценариев и помощников по разбиению на страницы .

Этот класс разбиения на страницы PHP действительно полезен. Он может быть реализован с любым ядром базы данных, поддерживаемым PHP, его очень легко настраивать и реализовывать, он поддерживает два дисплея по умолчанию, имеет многоцветные схемы проектирования и многое другое.


Пагинация — это, по сути, процесс получения набора результатов и распространения
их на страницах, чтобы их было легче просматривать.

пример 1

Я рано понял, что если у меня есть 5000 строк информации для отображения не только
было бы головной болью для кого-то, чтобы попытаться прочитать, но большинство браузеров
Интернет-вечность (то есть более пяти секунд) для его отображения.

Чтобы решить эту проблему, я бы кодировал различные операторы SQL, чтобы извлечь куски данных, и если бы я был
в хорошем настроении я мог бы даже добавить пару кнопок «следующий» и «предыдущий».
Через некоторое время приходится вставлять этот код в каждый подобный проект и настраивать
чтобы соответствовать старею. Быстро. И, как знает каждый хороший разработчик, лень порождает изобретательность
или что-то типа того. Итак, однажды я сел и решил придумать простое,
гибкий и простой в использовании класс PHP, который автоматически сделает грязную работу для
мне.

Небольшое слово обо мне и классах PHP. Я не объектно-ориентированный вундеркинд. На самом деле я вряд ли
когда-либо использовать вещи. Но после прочтения некоторых ООП примеров и учебников, а некоторые
Простые примеры проб и ошибок, я решил привести его в движение, и вы знаете, что?
Это прекрасно работает для нумерации страниц. Используемый здесь код написан на PHP 4, но будет
работать в PHP 5.


Должен любить MySQL. Не в обиду другим системам баз данных, кроме как
мне все, что мне нужно, это MySQL. И одна из замечательных особенностей MySQL — это то, что они дают вам
бесплатные образцы баз данных для игры на http://dev.mysql.com/doc/#sampledb .

Для моих примеров я буду использовать мировую базу данных (~ 90 тыс. Архивов), которая содержит более
4000 записей для игры, но прелесть PHP-скрипта, который мы создадим, заключается в
что его можно использовать с любой базой данных. Теперь я думаю, что мы все можем согласиться с тем, что если мы решили
не разбивать на страницы наши результаты, что мы в конечном итоге с некоторыми очень долго и громоздко
результаты, подобные следующим:

пример 2

( нажмите для увеличения, смехотворно длинное изображение ~ 338k)

Итак, давайте приступим к разбивке наших данных на легко перевариваемые фрагменты:

пример 3

Красиво, не правда ли? Как только вы поместите класс нумерации в свой код, вы можете
быстро и легко преобразовать огромный набор данных в удобные для навигации страницы с
всего несколько строк кода. В самом деле.


Этот пример будет состоять из двух сценариев, класса многоразового использования paginator и индексного файла, который будет отображать элементы таблицы и элементы управления.

Класс paginator будет иметь только два метода и конструктор, мы будем строить его постепенно, объясняя каждый шаг по мере продвижения вперед.

01
02
03
04
05
06
07
08
09
10
11
<?php
 
class Paginator {
 
     private $_conn;
        private $_limit;
        private $_page;
        private $_query;
        private $_total;
 
}

Это определение только устанавливает обязательные переменные-члены paginator, так как это вспомогательный класс, и он предназначен для разбивки на страницы, только он будет полагаться на действительное соединение с сервером MySQL и уже определенный запрос, к которому мы добавим параметры, необходимые для разбивки на страницы результатов. Начнем с метода конструктора.

01
02
03
04
05
06
07
08
09
10
11
<?php
 
public function __construct( $conn, $query ) {
     
    $this->_conn = $conn;
    $this->_query = $query;
 
    $rs= $this->_conn->query( $this->_query );
    $this->_total = $rs->num_rows;
     
}

Довольно просто, верно? Этот метод только устанавливает соединение с базой данных объекта и необходимый запрос, после чего он вычисляет общее количество строк, извлеченных этим запросом без каких-либо ограничений или пропуская параметры, это общее количество необходимо для создания ссылок для разбивателя на страницы.

Обратите внимание, что для простоты мы не делаем проверку ошибок или любую другую проверку данных параметров, но в реальных приложениях эти проверки будут необходимы.

Теперь давайте создадим метод, который будет фактически разбивать данные на страницы и возвращать результаты.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
public function getData( $limit = 10, $page = 1 ) {
     
    $this->_limit = $limit;
    $this->_page = $page;
 
    if ( $this->_limit == ‘all’ ) {
        $query = $this->_query;
    } else {
        $query = $this->_query .
    }
    $rs = $this->_conn->query( $query );
 
    while ( $row = $rs->fetch_assoc() ) {
        $results[] = $row;
    }
 
    $result = new stdClass();
    $result->page = $this->_page;
    $result->limit = $this->_limit;
    $result->total = $this->_total;
    $result->data = $results;
 
    return $result;
}

Давайте проанализируем этот шаг за шагом, сначала мы установим лимит и параметры страницы, которые по умолчанию устанавливаются в 10 и 1 соответственно. Затем мы проверяем, требуется ли пользователю заданное количество строк или все из них, основываясь на этом, и в параметре страницы мы устанавливаем параметр LIMIT запроса, «- 1» страницы учитывает тот факт, что мы начинаем страницы в 1 вместо 0.

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

Теперь давайте напишем метод, используемый для получения ссылок на страницы.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
public function createLinks( $links, $list_class ) {
    if ( $this->_limit == ‘all’ ) {
        return »;
    }
 
    $last = ceil( $this->_total / $this->_limit );
 
    $start = ( ( $this->_page — $links ) > 0 ) ?
    $end = ( ( $this->_page + $links ) < $last ) ?
 
    $html = ‘<ul class=»‘ . $list_class . ‘»>’;
 
    $class = ( $this->_page == 1 ) ?
    $html .= ‘<li class=»‘ . $class . ‘»><a href=»?limit=’ . $this->_limit . ‘&page=’ . ( $this->_page — 1 ) . ‘»>&laquo;</a></li>’;
 
    if ( $start > 1 ) {
        $html .= ‘<li><a href=»?limit=’ . $this->_limit . ‘&page=1″>1</a></li>’;
        $html .= ‘<li class=»disabled»><span>…
    }
 
    for ( $i = $start ; $i <= $end; $i++ ) {
        $class = ( $this->_page == $i ) ?
        $html .= ‘<li class=»‘ . $class . ‘»><a href=»?limit=’ . $this->_limit . ‘&page=’ . $i . ‘»>’ .
    }
 
    if ( $end < $last ) {
        $html .= ‘<li class=»disabled»><span>…
        $html .= ‘<li><a href=»?limit=’ . $this->_limit . ‘&page=’ . $last . ‘»>’ .
    }
 
    $class = ( $this->_page == $last ) ?
    $html .= ‘<li class=»‘ . $class . ‘»><a href=»?limit=’ . $this->_limit . ‘&page=’ . ( $this->_page + 1 ) . ‘»>&raquo;</a></li>’;
 
    $html .= ‘</ul>’;
 
    return $html;
}

Это довольно длинный метод, примерно 34 строки кода, поэтому давайте теперь объясним, что происходит с этим методом.

  1. Сначала мы оцениваем, требует ли пользователь заданного количества ссылок или всех из них, во втором случае мы просто возвращаем пустую строку, поскольку никакой нумерации страниц не требуется.
  2. После этого мы рассчитываем последнюю страницу на основе общего количества доступных строк и элементов, необходимых для каждой страницы.
  3. Затем мы берем параметр links, который представляет количество ссылок, отображаемых ниже и выше текущей страницы, и вычисляем начальную и конечную ссылку для создания.
  4. Теперь мы создаем открывающий тег для списка и устанавливаем его класс с параметром класса списка и добавляем ссылку «предыдущая страница», обратите внимание, что для этой ссылки мы проверяем, является ли текущая страница первой, и если да, мы устанавливаем отключенное свойство ссылки.
  5. На этом этапе мы отображаем ссылку на первую страницу и символ многоточия в случае, если начальная ссылка не первая.
  6. Затем мы добавляем ссылки ниже и выше текущей страницы на основе ранее рассчитанных параметров начала и конца, на каждом шаге мы снова оцениваем текущую страницу, отображаемую страницу ссылки, и соответственно устанавливаем активный класс.
  7. После этого мы показываем еще один символ многоточия и ссылку на последнюю страницу, если конечная ссылка не последняя.
  8. Наконец, мы отображаем ссылку «следующая страница» и устанавливаем отключенное состояние, когда пользователь просматривает последнюю страницу, закрываем список и возвращаем сгенерированную строку HTML.

Это все, что есть в Paginator.class, конечно, мы могли бы добавить сеттеры и геттеры для соединения с базой данных, ограничения, страницы, запроса и итоговых параметров, но для простоты мы сохраним это так.

Теперь мы создадим файл, отвечающий за использование класса Paginator и отображение данных, поэтому сначала позвольте мне показать вам базовый HTML.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
    <head>
        <title>PHP Pagination</title>
        <link rel=»stylesheet» href=»css/bootstrap.min.css»>
    </head>
    <body>
        <div class=»container»>
                <div class=»col-md-10 col-md-offset-1″>
                <h1>PHP Pagination</h1>
                <table class=»table table-striped table-condensed table-bordered table-rounded»>
                        <thead>
                                <tr>
                                <th>City</th>
                                <th width=»20%»>Country</th>
                                <th width=»20%»>Continent</th>
                                <th width=»25%»>Region</th>
                        </tr>
                        </thead>
                        <tbody></tbody>
                </table>
                </div>
        </div>
        </body>
</html>

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

1
2
3
4
5
6
7
8
<?php for( $i = 0; $i < count( $results->data ); $i++ ) : ?>
        <tr>
                <td><?php echo $results->data[$i][‘Name’];
                <td><?php echo $results->data[$i][‘Country’];
                <td><?php echo $results->data[$i][‘Continent’];
                <td><?php echo $results->data[$i][‘Region’];
        </tr>
<?php endfor;

Теперь для использования нашего класса Paginator добавьте следующий php-код вверху документа.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
    require_once ‘Paginator.class.php’;
 
    $conn = new mysqli( ‘127.0.0.1’, ‘root’, ‘root’, ‘world’ );
 
    $limit = ( isset( $_GET[‘limit’] ) ) ?
    $page = ( isset( $_GET[‘page’] ) ) ?
    $links = ( isset( $_GET[‘links’] ) ) ?
    $query = «SELECT City.Name, City.CountryCode, Country.Code, Country.Name AS Country, Country.Continent, Country.Region FROM City, Country WHERE City.CountryCode = Country.Code»;
 
    $Paginator = new Paginator( $conn, $query );
 
    $results = $Paginator->getData( $page, $limit );
?>

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

Затем мы создаем соединение с нашей базой данных, используя библиотеку MySQLi, извлекаем параметры paginator из запроса GET и устанавливаем запрос, поскольку это не статья о MySQL или что-либо из этого, я не буду вдаваться в подробности о соединении или запросе. используется здесь.

Наконец, мы создаем объект Paginator и извлекаем результаты для текущей страницы.

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

1
2
3
4
5
6
7
8
<?php for( $i = 0; $i < count( $results->data ); $i++ ) : ?>
        <tr>
                <td><?php echo $results->data[$i][‘Name’];
                <td><?php echo $results->data[$i][‘Country’];
                <td><?php echo $results->data[$i][‘Continent’];
                <td><?php echo $results->data[$i][‘Region’];
        </tr>
<?php endfor;

Здесь мы просто перебираем атрибут данных результатов, содержащий записи о городах, и создаем строку таблицы для каждого из них.

Теперь, чтобы отобразить ссылки на страницы, добавьте следующий код под таблицей.

1
<?php echo $Paginator->createLinks( $links, ‘pagination pagination-sm’ );

В метод Paginator createLinks мы передаем полученный параметр links и класс css для ссылок на страницы, используемых из начальной загрузки. Вот результат созданной страницы.

Это должно предоставить вам все, что вам нужно знать, чтобы начать работу с нумерацией страниц в вашем приложении.

Пожалуйста, не стесняйтесь оставлять вопросы, комментарии или общие отзывы в ленте ниже!

Все еще застряли? Попробуйте связаться с одним из наших опытных разработчиков PHP на Envato Studio.