Whois-сервисы

Служба Whois
Служба Whats
Служба Hoster
Служба Whois History
Служба IP Lookup
Служба GEO IP Lookup
Служба DNSBL Lookup
Служба DNS Watch
Служба Reverse IP






Постраничная разбивка вывода из 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-2026, wb0.ru