Пагинация PHP | Комплект 2
В предыдущей статье о разбиении на страницы в PHP мы увидели, зачем нужна разбивка на страницы, а также разработали базовую структуру для реализации системы разбивки на страницы с использованием PHP. В продолжение, давайте начнем с нашего процесса разработки и сначала создадим скрипт для подключения к нашей базе данных.
Подключение к базе данных
Connecting to Database is often a required task for showing data in any PHP file, thus writing the same code repeatedly is not the best approach so following the convention we will create a PHP file to be known as “connection.php”, and will write the following code.
<?php // Define needed credentials. define( "HOST" , "localhost" ); define( "USER" , "root" ); define( "PASS" , "pass1234" ); define( "DB" , "test" ); // Establish Connection. $conn = mysql_connect(HOST, USER, PASS) or die ( "Error connecting to Database." ); $connection = mysql_select_db(DB); ?> |
В этой статье мы будем использовать расширение mysql. Если вы хотите поработать с расширением mysqli, обратитесь к следующей статье. Приведенный выше фрагмент кода просто определяет учетные данные, такие как хост, имя пользователя, пароль и имя базы данных, как константы PHP и использует их для установления соединения. Теперь нам нужно получить данные и распределить их по страницам.
Выборка и представление данных
So far, we have created a Demo Markup, we have created the Database table to hold fake data and we have also connected to the database. Now all that is left is to fetch the rows of information and show it on various pages. Now, what could be the general logic behind it. Pagination generally limits the number of entries in a page and also maintains the sequence of all the entries throughout the pages. So, if we could have a variable that would denote us the Max number of entries that can be shown on a page and given a page number we could find exactly which entries are to be shown. For example, if the current page number is 5 and the limit is 10 then we can see manually that the first page will contain 1-10, the second page will contain 11-20, and similarly, the fifth page will contain 41-50 entries.
So we could write that if the page number is denoted using $pn and limit is denoted using $limit then the starting index of the entry can be written as: (($pn-1)*$limit)+1. As we have calculated the relation we just now need to implement the following in our “index.php” file. The following is what we should finally get.
<!DOCTYPE html> <html> <head> <title>ProGeeks Cup 2.0</title> <meta charset= "utf-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1" > <link rel= "stylesheet" </head> <body> <?php // Import the file where we defined the connection to Database. require_once "connection.php" ; $limit = 10; // Number of entries to show in a page. // Look for a GET variable page if not found default is 1. if (isset( $_GET [ "page" ])) { $pn = $_GET [ "page" ]; } else { $pn =1; }; $start_from = ( $pn -1) * $limit ; $sql = "SELECT * FROM table1 LIMIT $start_from, $limit" ; $rs_result = mysql_query ( $sql ); ?> <div class = "container" > <br> <div> <h1>ProGeeks Cup 2.0</h1> <p>This page is just for demonstration of Basic Pagination using PHP.</p> <table class = "table table-striped table-condensed table-bordered" > <thead> <tr> <th width= "10%" >Rank</th> <th>Name</th> <th>College</th> <th>Score</th> </tr> </thead> <tbody> <?php while ( $row = mysql_fetch_array( $rs_result , MYSQL_ASSOC)) { // Display each field of the records. ?> <tr> <td><?php echo $row [ "rank" ]; ?></td> <td><?php echo $row [ "name" ]; ?></td> <td><?php echo $row [ "college" ]; ?></td> <td><?php echo $row [ "score" ]; ?></td> </tr> <?php }; ?> </tbody> </table> <ul class = "pagination" > <?php $sql = "SELECT COUNT(*) FROM table1" ; $rs_result = mysql_query( $sql ); $row = mysql_fetch_row( $rs_result ); $total_records = $row [0]; // Number of pages required. $total_pages = ceil ( $total_records / $limit ); $pagLink = "" ; for ( $i =1; $i <= $total_pages ; $i ++) { if ( $i == $pn ) { $pagLink .= "<li class="active"><a href="index.php?page=" . $i . "">" . $i . "</a></li>" ; } else { $pagLink .= "<li><a href="index.php?page=" . $i .""> ".$i." </a></li>"; } }; echo $pagLink ; ?> </ul> </div> </div> </body> </html> |
Как видите, мы добавили три раздела (выделенные части) в ранее написанный код для извлечения и отображения данных, а также ссылок на следующие страницы. Давайте рассмотрим все эти разделы по отдельности, чтобы лучше понять код.
Fetching from Database
// Import the file where we defined the connection to Database. require_once "connection.php" ; $limit = 10; // Number of entries to show in a page. // Look for a GET variable page if not found default is 1. if (isset( $_GET [ "page" ])) { $pn = $_GET [ "page" ]; } else { $pn =1; }; $start_from = ( $pn -1) * $limit ; $sql = "SELECT * FROM table1 LIMIT $start_from, $limit" ; $rs_result = mysql_query ( $sql ); |
После того, как мы создали соединение с базой данных в «connection.php», мы просто импортируем файл с ключевым словом require_once. Затем мы явно определяем максимальное количество записей, отображаемых на одной странице. Впоследствии мы проверяем, есть ли в URL-адресе какой-либо атрибут «страница», т.е. мы ищем атрибут «страница» в методе «GET», который, если найден, устанавливается как номер страницы, которая будет отображаться, в противном случае это первая страницы или значение 1. После этого мы вычисляем индекс для начала нашей выборки, он рассчитывается с использованием формул, которые мы вывели ранее, но поскольку SQL использует 0-индексирование, мы не добавляем дополнительные 1. Наконец, мы просто получаем каждый поле записей, начиная с индекса $ start_from и ограничивая до $ limit записей и сохраняющих в переменной $ rs_result.
Showing the Records
<?php while ( $row = mysql_fetch_array( $rs_result , MYSQL_ASSOC)) { // Display each field of the records. ?> <tr> <td><?php echo $row [ "rank" ]; ?></td> <td><?php echo $row [ "name" ]; ?></td> <td><?php echo $row [ "college" ]; ?></td> <td><?php echo $row [ "score" ]; ?></td> </tr> <?php }; ?> |
Этот раздел довольно прост: мы просто перебираем выбранные записи и выбираем каждую строку как ассоциативный массив, мы повторяем каждое поле как данные таблицы (теги td) в каждой строке таблицы (теги tr). После каждой итерации мы создаем строку таблицы, состоящую из четырех столбцов, а именно: Ранг, Имя, Колледж и Оценка.
Showing the Page Navigation
$sql = "SELECT COUNT(*) FROM table1" ; $rs_result = mysql_query( $sql ); $row = mysql_fetch_row( $rs_result ); $total_records = $row [0]; // Number of pages required. $total_pages = ceil ( $total_records / $limit ); $pagLink = "" ; for ( $i =1; $i <= $total_pages ; $i ++) { if ( $i == $pn ) $pagLink .= "<li class = "active" ><a href="index.php?page= ".$i." "> ".$i." </a></li>"; else $pagLink .= "<li><a href="index.php?page=" . $i .""> ".$i." </a></li>"; }; echo $pagLink ; |
Это последний раздел, в котором нам нужно разработать навигационные ссылки, чтобы помочь пользователю переходить на разные страницы. Чтобы сделать то же самое, нам сначала нужно знать, на скольких страницах распространяется наш контент. В приведенном выше коде мы сначала получаем количество общих записей, которое в этом примере составляет 1500. Затем мы вычисляем потолок деления общего количества записей на предел, который дает нам необходимое количество страниц. Наконец, мы просто повторяем то же количество раз, что и общее количество страниц, каждый раз, когда создаем ссылку, имеющую номер страницы в атрибуте «page» ее URL-адреса, и если нужно добавить ссылку на текущую страницу, мы просто добавляем class = » active », обозначающий, что страница активна. Рисунок ниже - наш окончательный результат.
Мы создали простую систему разбивки на страницы с использованием PHP процедурным способом, но теперь проблема в том, что у нас всего 150 страниц, и, несмотря на функциональную правильность, действительно выглядит странно иметь все эти страницы, и поэтому в следующей статье мы рассмотрит возможность добавления дополнительных функций и косметического макияжа нашей системы пагинации.