Постраничная разбивка вывода из MySQL. Статьи. wb0.ru - Все для веб-мастера, on-line сервисы

Постраничная разбивка вывода из MySQL

Для получения данных из базы в MySQL используется команда SELECT. Для ограничения количества возвращаемых командой SELECT строк необходимо добавить оператор LIMIT с двумя параметрами: начало первой возвращаемой строки и максимальное количество возвращаемых строк.

SELECT * FROM table LIMIT 0,10

Нумерация строк начинается с нуля, поэтому, например, команда для получения строк с 5 по 14 будет выглядеть так:

SELECT * FROM table LIMIT 4,10

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

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

В MySQL до версии 4.0 это можно сделать следующим образом:

  1. $query = "SELECT count(*) FROM table";
  2. $res = mysql_query($query);
  3. $row = mysql_fetch_row($res);
  4. $total_rows = $row[0];

Начиная с версии 4.0, можно использовать более быструю функцию FOUND_ROWS() с опцией SQL_CALC_FOUND_ROWS:

  1. $query = "SELECT SQL_CALC_FOUND_ROWS * FROM table";
  2. mysql_query($query);
  3. $query = "SELECT FOUND_ROWS()";
  4. $total_rows = mysql_query($query);

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

  1. $rows_per_page = 10;
  2. $total_pages = ceil($total_rows / $rows_per_page);

Организуем вывод ссылок на страницы с помощью цикла.

  1. for($i = 1; $i <= $total_pages; $i++)
  2.   echo '<a href="?page=' . ($i - 1) * $rows_per_page . '">' . $i . '</a>';

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

  1. $rows_per_page = 10; // количество записей, выводимых на странице
  2. if (isset($_GET['page']))
  3.    $page = ($_GET['page'] - 1); else $page = 0; // номер страницы для вычисления значения первой записи
  4. $from = $page * $rows_per_page; // значение первой записи для LIMIT
  5. $query = "SELECT * FROM table ORDER BY field LIMIT $from, $rows_per_page";
  6. $res = mysql_query($query);
  7.  
  8. // вывод записей на странице
  9. while($row = mysql_fetch_array($res))
  10.   echo ++$from . ". " . $row['field']."<br>";
  11.  
  12. // вывод ссылок на страницы
  13. $query = "SELECT count(*) FROM table";
  14. $res = mysql_query($query);
  15. $row = mysql_fetch_row($res);
  16. $total_rows = $row[0];
  17.  
  18. $total_pages = ceil($total_rows / $rows_per_page);
  19.  
  20. for($i = 1; $i <= $total_pages; $i++) {
  21.   if (($i - 1) == $page) {
  22.     echo "<b>" . $i . "</b>&nbsp;";
  23.   } else {
  24.     echo '<a href="?page=' . $i . '">' . $i . '</a>&nbsp;';
  25.   }
  26. }

В заключение сделаем скрипт более универсальным, учтем передачу других переменных и использование шаблона. В результате у нас получилось:

  1. <?
  2. // общее количество записей
  3. $query = "SELECT count(*) FROM table";
  4. $res = mysql_query($query);
  5. $row = mysql_fetch_row($res);
  6. $total_rows = $row[0];
  7.  
  8. // общее количество страниц
  9. $rows_per_page = 10;
  10. $total_pages = ceil($total_rows / $rows_per_page);
  11.  
  12. // номер текущей страницы
  13. if (isset($_GET['page']))
  14.    $cur_page = ($_GET['page']); else $cur_page = 1;
  15.  
  16. // значение первой записи для LIMIT
  17. $from = ($cur_page - 1) * $rows_per_page;
  18.  
  19. // массив данных для вывода на странице
  20. $query = "SELECT * FROM table ORDER BY field DESC LIMIT $from, $rows_per_page";
  21. $res = mysql_query($query);
  22. while ($row = mysql_fetch_array($res))
  23.    $data[++$from] = $row;
  24.  
  25. // адрес страницы без переменной page
  26. $uri = strtok($_SERVER['REQUEST_URI'],"?") . "?";
  27. if (count($_GET))
  28.    $uri .= http_build_query($_GET) . "&";
  29.  
  30. // массив со ссылками на страницы
  31. for($i = 1; $i <= $total_pages; $i++)
  32.    $pages[$i] = $uri . 'page=' . $i;
  33.  
  34. // передача значений шаблону
  35. $smarty->assign(array(
  36.    'data' => $data,
  37.    'pages' => $pages,
  38.    'total_pages' => $total_pages,
  39.    'cur_page' => $cur_page
  40. ));
  41. $smarty->display("page.tpl");
  42.  
  43. ?>

Вывод данных и навигации в шаблоне:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <HTML>
  3. <BODY>
  4. Текущая страница: {$cur_page}
  5. <br>
  6. {foreach from=$data item=itemdata}
  7.    {$i}. {$itemdata.field}<br>
  8. {/foreach}
  9. <br>
  10. Страницы:
  11. {while $page++ < $total_pages}
  12.    {if $page == $cur_page}
  13.       <b>{$page}</b>
  14.    {else}
  15.       <a href="{$pages[page]}">{$page}</a>
  16.    {/if}
  17. {/while}
  18. </BODY>
  19. </HTML>


Дата публикации: 08.08.2013
wb0.ru

Статьи по теме:


Комментарии:
  1. new: офигенный сайт
    Добавлен: 2013-12-02

  2. newbie: а как теперь связать php-скрипт с html-страничкой?=)У вас никакой связи нет, так как же html-ка поймет, откуда взялись те параметры(переменные) в фигурных скобках? =) Лично мне, новичку, не понятно =(
    Добавлен: 2014-08-18

  3. Andrei: newbie, переменные в шаблон передаются с помощью метода assign (строки 35-40). Отображение шаблона ("html-странички") - строка 41.
    Добавлен: 2014-08-18

  4. syncallow: newbie, Это ООП!
    Добавлен: 2015-01-04

  5. Ive Leen: А если страниц получилось 759? Зачем показывать это мясо юзеру? Надо ограничить количество выводимых в ссылки страниц. Например: ...PREV... 16 - 17 - (18) - 19 - 20 ...NEXT...
    Добавлен: 2015-02-19

  6. Sputnik: Супер. Спасибо!
    Добавлен: 2018-10-02


   Ваш псевдоним:
Ваш комментарий:

Календарь событий


Новости Интернет


Поиск





Последний пересчет

тИЦ:07 Окт 15
PR:09 Дек 13

Наши партнеры

wservices.ru - регистрация доменов, Whois-сервисы Смайлы на все случаи жизни


 
Copyright © 2006-2024, wb0.ru