php Постраничный вывод из MySQL 

Дата публикации  Дата изменения08.11.21  КомментарииНет   Просмотры6626

Курсы

Как сделать постраничный вывод из MySQL: по 10 (20, 30) записей на страницу, а внизу – ссылки на остальные страницы?

Чтобы получить нужные записи, воспользуемся оператором LIMIT, который вызывается с двумя параметрами – с какой записи начинать, и сколько выводить:

SELECT id, title FROM items LIMIT 0, 10;

Этот запрос вернет записи с первой по 10, поскольку нумерация начинается с 0. Cоответственно, запросы для второй и третьей страницы будут выглядеть

SELECT id, title FROM items LIMIT 10, 10;
SELECT id, title FROM items LIMIT 20, 10;

Как видите, нам надо лишь передать в скрипт число, которое потом подставить в запрос.

Для построения постраничной навигации нам еще понадобится общее число записей в таблице. Это можно сделать с помощью запроса

SELECT COUNT(*) FROM items;
$query = "SELECT COUNT(*) FROM items";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );

Далее определим, сколько всего получится страниц:

$cnt_pages = ceil( $total / ITEMS_PER_PAGE );

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

<?php
$dblocation = "localhost";   // Имя сервера
$dbuser     = "root";        // Имя пользователя
$dbpswrd    = "";            // Пароль
$dbname     = "catalog";     // Имя базы данных

DEFINE('ITEMS_PER_PAGE', 5);

// Соединение с сервером базы данных
$dblink = mysql_connect( $dblocation, $dbuser, $dbpswrd );
mysql_query( 'SET NAMES cp1251' );
// Выбираем базу данных
mysql_select_db( $dbname, $dblink );

// Выбираем из БД общее количество записей
$query = "SELECT COUNT(*) FROM products WHERE 1";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );
   
// Проверяем, передан ли номер текущей страницы
if ( isset($_GET['page']) ) {
  $page = (int)$_GET['page'];
  if ( $page < 1 ) $page = 1;
} else {
  $page = 1;
}

// Сколько всего получится страниц
$cnt_pages = ceil( $total / ITEMS_PER_PAGE );
if ( $page > $cnt_pages ) $page = $cnt_pages;
// Начальная позиция
$start = ( $page - 1 ) * ITEMS_PER_PAGE;

$query = "SELECT id, title, price
          FROM products
          ORDER BY price ASC
          LIMIT ".$start.", ".ITEMS_PER_PAGE;
$res = mysql_query( $query );

// Выводим "шапку" таблицы
echo '<table border="1" cellpadding="5" cellspacing="0">';
echo '<tr>';
echo '<th>ID</th>';
echo '<th>Наименование</th>';
echo '<th>Цена</th>';
echo '</tr>';

while( $prd = mysql_fetch_array( $res ) )
{
    echo '<tr>';
    echo '<td>'.$prd['id'].'</td>';
    echo '<td>'.$prd['title'].'</td>';
    echo '<td>'.$prd['price'].'</td>';   
    echo '</tr>';
}

echo '</table>';

// Строим постраничную навигацию
if ( $cnt_pages > 1 )
{
    echo '<div style="margin:1em 0">&nbsp;Страницы: ';
    // Проверяем нужна ли стрелка "В начало"
    if ( $page > 3 )
        $startpage = '<a href="'.$_SERVER['PHP_SELF'].'?page=1"><<</a> ... ';
    else
        $startpage = '';
    // Проверяем, нужна ли стрелка "В конец"
    if ( $page < ($cnt_pages - 2) )
        $endpage = ' ... <a href="'.$_SERVER['PHP_SELF'].'?page='.$cnt_pages.'">>></a>';
    else
        $endpage = '';

    // Находим две ближайшие страницы с обоих краев, если они есть
    if ( $page - 2 > 0 )
        $page2left = ' <a href="'.$_SERVER['PHP_SELF'].'?page='.($page - 2).'">'.($page - 2).'</a> | ';
    else
        $page2left = '';
    if ( $page - 1 > 0 )
        $page1left = ' <a href="'.$_SERVER['PHP_SELF'].'?page='.($page - 1).'">'.($page - 1).'</a> | ';
    else
        $page1left = '';
    if ( $page + 2 <= $cnt_pages )
        $page2right = ' | <a href="'.$_SERVER['PHP_SELF'].'?page='.($page + 2).'">'.($page + 2).'</a>';
    else
        $page2right = '';
    if ( $page + 1 <= $cnt_pages )
        $page1right = ' | <a href="'.$_SERVER['PHP_SELF'].'?page='.($page + 1).'">'.($page + 1).'</a>';
    else
        $page1right = '';

    // Выводим меню
    echo $startpage.$page2left.$page1left.'<strong>'.$page.'</strong>'.$page1right.$page2right.$endpage;

    echo '</div>';
}
?>

Постраничный вывод из MySQL

Тут есть проблема, о которой стоит упомянуть: кроме переменной $page нашему скрипту могут быть переданы и другие переменные. Решается это просто:

$uri = strtok($_SERVER['REQUEST_URI'],"?")."?";
if (count($_GET)) {
  foreach ($_GET as $k => $v) {
    if ($k != "page") $uri.=urlencode($k)."=".urlencode($v)."&";
  }
}

и полученную переменную $uri подставляем в код вместо $_SERVER['PHP_SELF']

и ещё знаки вопроса постирать из

$page1right = ' | <a href="'.$_SERVER['PHP_SELF'].'?page='.($page + 1).'">'.($page + 1).'</a>';

Может быть, есть необходимость выводить записи (например, новостей) в обратном порядке? Т.е. сначала более свежие записи, а потом более старые? Тогда надо просто изменить запрос к базе данных

$query = "SELECT id, title, puttime
          FROM news
          ORDER BY puttime DESC
          LIMIT ".$start.", ".ITEMS_PER_PAGE;
$res = mysql_query( $query );

Если все-таки надо изменить нумерацию страниц, то обрати внимание на строку

echo $startpage.$page2left.$page1left.'<strong>'.$page.'</strong>'.$page1right.$page2right.$endpage;

Нам никто не мешает ее “развернуть”

echo $endpage.$page2right.$page1right.'<strong>'.$page.'</strong>'.$page1left.$page2left.$startpage;

  Размер:  1,31kB | Изменен: 12.02.13 | Загрузок: 386

//////////// Вариант

Проблема реализации постраничной навигации часто встает перед начинающими PHP-программистами. К разбиению объёмного текста на отдельные страницы прибегают во многих Web-приложениях от гостевых книг и форумов до различных каталогов. Давайте
решим эту проблему.
Итак, что нам требуется для реализации постраничной навигации? Для примера возьмем гостевую книгу, содержащую несколько сотен сообщений, в которой требуется выводить на страницу Х сообщений.
Рассмотрим задачу более конкретно. Сообщения пользователей хранятся в базе данных post со следующей структурой:

id – номер сообщения,
text – тело сообщения,
name – имя автора,
time – время создания.
В итоге нам надо получить вывод Х сообщений на страницу, а также организовать удобную навигацию, например, такую:

<< < ..2|3|4|5|6.. > >>

где 4 – текущая станица. Для того чтобы отслеживать текущую страницу, будем использовать параметр page, передаваемый через URL. К примеру:

www.myserver.com/index.php?page=X.

Здесь X – номер станицы (для примера, пусть Х будет равно 25).

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

<?php 
// Устанавливаем соединение с базой данных 
include "config.php"; 
// Переменная хранит число сообщений выводимых на станице 
$num = 25; 
// Извлекаем из URL текущую страницу 
$page = $_GET['page']; 
// Определяем общее число сообщений в базе данных 
$result = mysql_query("SELECT COUNT(*) FROM post"); 
$posts = mysql_result($result, 0); 
// Находим общее число страниц 
$total = intval(($posts - 1) / $num) + 1; 
// Определяем начало сообщений для текущей страницы 
$page = intval($page); 
// Если значение $page меньше единицы или отрицательно 
// переходим на первую страницу 
// А если слишком большое, то переходим на последнюю 
if(empty($page) or $page < 0) $page = 1; 
  if($page > $total) $page = $total; 
// Вычисляем начиная к какого номера 
// следует выводить сообщения 
$start = $page * $num - $num; 
// Выбираем $num сообщений начиная с номера $start 
$result = mysql_query("SELECT * FROM post LIMIT $start, $num"); 
// В цикле переносим результаты запроса в массив $postrow 
while ( $postrow[] = mysql_fetch_array($result)) 
?>

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

<?php 
echo "<table>"; 
for($i = 0; $i < $num; $i++) 
{ 
echo "<tr>
         <td>".$postrow[$i]['name']."</td>
         <td>".$postrow[$i]['time']."</td></tr>
       <tr><td colspan=\"2\">".$postrow[$i]['text']."</td></tr>"; 
} 
echo "</table>"; 
?>

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

<?php 
// Проверяем нужны ли стрелки назад 
if ($page != 1) $pervpage = '<a href= ./page?page=1><<</a> 
                               <a href= ./page?page='. ($page - 1) .'><</a> '; 
// Проверяем нужны ли стрелки вперед 
if ($page != $total) $nextpage = ' <a href= ./page?page='. ($page + 1) .'>></a><a href= ./page?page=' .$total. '>>></a>'; 
// Находим две ближайшие станицы с обоих краев, если они есть 
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | '; 
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | '; 
if($page + 2 <= $total) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>'; 
if($page + 1 <= $total) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню 
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage; 
?>


////////////

*UPD
+ Постраничная навигация через ООП для текстового файла (+ поиск), для файлов в директории и для СУБД MySQL

Бесплатные курсы

Категории

Теги: , , , , ,

Оцените материал:

Рейтинг: 7.0/10 (3)


КомментарииКомментарии:

Нет комментариев к этой статье.


 

Старые →← Новые