Для получения данных из базы в MySQL используется команда SELECT. Для ограничения количества возвращаемых командой SELECT строк необходимо добавить оператор LIMIT с двумя параметрами: начало первой возвращаемой строки и максимальное количество возвращаемых строк.
SELECT * FROM table LIMIT 0,10
Нумерация строк начинается с нуля, поэтому, например, команда для получения строк с 5 по 14 будет выглядеть так:
SELECT * FROM table LIMIT 4,10
Таким образом, для вывода страницы с требуемыми записями нам необходимо передавать в этот запрос нужные значения.
Для постраничного вывода, прежде всего, нам необходимо знать общее количество страниц. А для этого, в свою очередь, нам понадобится определить общее количество строк в базе.
В MySQL до версии 4.0 это можно сделать следующим образом:
$query = "SELECT count(*) FROM table";
$res = mysql_query($query);
$row = mysql_fetch_row($res);
$total_rows = $row[0];
Начиная с версии 4.0, можно использовать более быструю функцию FOUND_ROWS() с опцией SQL_CALC_FOUND_ROWS:
$query = "SELECT SQL_CALC_FOUND_ROWS * FROM table";
mysql_query($query);
$query = "SELECT FOUND_ROWS()";
$total_rows = mysql_query($query);
Чтобы получить общее количество страниц, нам необходимо поделить общее количество записей на количество записей на одной странице и округлить получившееся значение в большую сторону с помощью PHP-функции ceil().
$rows_per_page = 10;
$total_pages = ceil($total_rows / $rows_per_page);
Организуем вывод ссылок на страницы с помощью цикла.
for($i = 1; $i <= $total_pages; $i++)
echo '<a href="?page=' . ($i - 1) * $rows_per_page . '">' . $i . '</a>';
Теперь организуем вывод записей на странице и сделаем отображение страниц более красивым. Для этого будем указывать ссылки в виде номера страницы, а уже в скрипте преобразовывать данный номер к нужному значению для передачи в LIMIT, и выделим текущую страницу.
$rows_per_page = 10; // количество записей, выводимых на странице
if (isset($_GET['page']))
$page = ($_GET['page'] - 1); else $page = 0; // номер страницы для вычисления значения первой записи
$from = $page * $rows_per_page; // значение первой записи для LIMIT
$query = "SELECT * FROM table ORDER BY field LIMIT $from, $rows_per_page";
$res = mysql_query($query);
// вывод записей на странице
while($row = mysql_fetch_array($res))
echo ++$from . ". " . $row['field']."<br>";
// вывод ссылок на страницы
$query = "SELECT count(*) FROM table";
$res = mysql_query($query);
$row = mysql_fetch_row($res);
$total_rows = $row[0];
$total_pages = ceil($total_rows / $rows_per_page);
for($i = 1; $i <= $total_pages; $i++) {
if (($i - 1) == $page) {
echo "<b>" . $i . "</b> ";
} else {
echo '<a href="?page=' . $i . '">' . $i . '</a> ';
}
}
В заключение сделаем скрипт более универсальным, учтем передачу других переменных и использование шаблона. В результате у нас получилось:
<?
// общее количество записей
$query = "SELECT count(*) FROM table";
$res = mysql_query($query);
$row = mysql_fetch_row($res);
$total_rows = $row[0];
// общее количество страниц
$rows_per_page = 10;
$total_pages = ceil($total_rows / $rows_per_page);
// номер текущей страницы
if (isset($_GET['page']))
$cur_page = ($_GET['page']); else $cur_page = 1;
// значение первой записи для LIMIT
$from = ($cur_page - 1) * $rows_per_page;
// массив данных для вывода на странице
$query = "SELECT * FROM table ORDER BY field DESC LIMIT $from, $rows_per_page";
$res = mysql_query($query);
while ($row = mysql_fetch_array($res))
$data[++$from] = $row;
// адрес страницы без переменной page
$uri = strtok($_SERVER['REQUEST_URI'],"?") . "?";
if (count($_GET))
$uri .= http_build_query($_GET) . "&";
// массив со ссылками на страницы
for($i = 1; $i <= $total_pages; $i++)
$pages[$i] = $uri . 'page=' . $i;
// передача значений шаблону
$smarty->assign(array(
'data' => $data,
'pages' => $pages,
'total_pages' => $total_pages,
'cur_page' => $cur_page
));
$smarty->display("page.tpl");
?>
Вывод данных и навигации в шаблоне:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<BODY>
Текущая страница: {$cur_page}
<br>
{foreach from=$data item=itemdata}
{$i}. {$itemdata.field}<br>
{/foreach}
<br>
Страницы:
{while $page++ < $total_pages}
{if $page == $cur_page}
<b>{$page}</b>
{else}
<a href="{$pages[page]}">{$page}</a>
{/if}
{/while}
</BODY>
</HTML>
|