Главная > Сделай сам, Статьи > Постраничный вывод — простой вариант

Постраничный вывод — простой вариант

Имеем модуль новостей, таблицу с новостями, раздел на сайте — новости.
Нужно замутить постраничный вывод этих новостей, дабы не нагружать длинной портянкой юзера.

Пусть у нас будет:
1. таблица следующей структуры в БД:

//table_news
id, title, text, date

2. файл news.php в котором и будет выполняться скрипт показа новостей

3. Постраничная навигация (постраничка) будет выглядеть следующим образом: 1 2 3 4 5 6 7 8 ... и т.д.

Делаем пока обычную выборку:

$r = mysql_query('SELECT * FROM table_news ORDER BY date DESC');
$i=0;
$cnt = mysql_num_rows($r);

while($d = mysql_fetch_assoc($r))
	{
	$i++;
	echo '
		<div>'.$d['title'].'</div>
		<div>'.html_entity_decode($d['text'],ENT_QUOTES).'</div>
	';
	if ($i<$cnt) echo '<BR>';
	}

вот тут мы выводим все новости, чистая портянка =) представьте 1000 новостей) ух как долго и тяжело будет открываться страница сайта.

так вот, для решения этой задачи, кто-то придумал — постраничную навигацию. Кто-то придумал, а мы ее реализуем.

Для начала определимся, по сколько новостей мы хотим. Пусть это будет переменная:

$topage=10;

Потом, нам нужно как-то узнать, на какой странице сейчас находится пользователь. Пусть это будет реализована переменной _GET передаваемой как параметр в URL к скрипту:

$page = isset($_GET['p']) && (int)$_GET['p']>0 ? (int)$_GET['p'] : 1;

Алгоритм построения постранички:

1. узнаем, сколько всего записей в таблице с новостями
2. зная кол-во выводимых записей а страницу, определяем сколько будет страниц.
3. создаем второй запрос, на вывод новостей, только уже с указанием выбора кол-ва записей и от какой записи выводить
4. обычным циклом строим постраничность, с указанием параметра news.php?p=N, где N — номер страницы (индекс в цикле)

Реализация:

// Индекс новости
$i=0;
// Кол-во новостей на страницу
$topage=10;
// Номер страницы
$page = isset($_GET['p']) && (int)$_GET['p']>0 ? (int)$_GET['p'] : 1;
// Определение
$cnt = mysql_result(mysql_query('SELECT count(*) FROM table_news ORDER BY date DESC'),0,0);
$pages = ceil($cnt/$topage);
$r = mysql_query('SELECT * FROM table_news ORDER BY date DESC LIMIT '.($topage*($page-1)).','.$topage.'');

if (mysql_num_rows($r)>0)
	{
	while($d = mysql_fetch_assoc($r))
		{
		$i++;
		echo '
			<div>'.$d['title'].'</div>
			<div>'.html_entity_decode($d['text'],ENT_QUOTES).'</div>
		';
		if ($i<$cnt) echo '<BR>';
		}
	}
echo '<hr>';
// Весь алгоритм вывода и реализация вывода постранички - это вот в этом цикле вывода страниц
>for($i=1;$i<=$pages;$i++)
	{
	$pages[] = '<a href="news.php?p='.$i.'" '.($page==$i ? 'style="font-weight: bold"' : '').'>'.$i.'</a>';
	}
echo implode(' ',$pages);

Иногда бывает полезно создать функцию, которая будет рисовать постраничку для любых целей, для любых данных. Простая реализация такой постранички в виде функции будет
следующей:

// код скрипта
.....
echo pagesText($pages, $page, 'news.php?p=%%');
function pagesText($pages, $page, $link)
	{
	for($i=1;$i<=$pages;$i++)
		{
		$link = str_replace('%%',$i,$link);
		$pages[] = '<a href="'.$link.'" '.($page==$i ? 'style="font-weight: bold"' : '').'>'.$i.'</a>';
		}
	}

=) вот такой самый просто метод реализации постранички. Остальное — ваши идеи :)

Сделай сам, Статьи ,

  1. 04 Июнь 2009 из 8:58 | #1

    А как сделать постраничный вывод без mysql?

    Вообще, есть-ли такое в интернете?

    Вторую неделю ищу ...

  2. 04 Июнь 2009 из 9:35 | #2

    конечно, смотри код:

    $r = mysql_query('SELECT * FROM table_news ORDER BY date DESC LIMIT '.($topage*($page-1)).','.$topage.'');

    while($d = mysql_fetch_assoc($r))

    это равносильно:

    $array = array('Какие','то',данные','','','','','','',...);

    $array_out = array_slice($array,($topage*($page-1)), $topage);

    foreach($array_out as $num=>$d)

    {

    print_r($d);

    }

  3. 26 Июнь 2009 из 19:04 | #3

    Здравствуйте!

    Написал большой комментарий письмо — не принимается (зависает, 405 ошибка).

    Прочтите здесь, пожалуйста — bestbook.su/cms_2.html

  1. Трекбеков пока нет.