Пейджинг своими руками.

Зачем программистам это нужно? Объясняю…
Как не крути, а основой любого нормального сайта (не гавносайта) является контент. В большинстве случаев это обычный текст (ну и картинки). Человек, приходя на сайт, рассчитывает найти на нем необходимую ему информацию. И если он ее находит, то радуется что больше искать ничего не надо. Но, как показывает практика, в большинстве случаев, напрасно. Еще есть некоторые проблемы, которые могут встать у него на пути. Например, кривое предоставление информации.

Представим, что мы ищем ответ на какой-нибудь научный вопрос (как размножаются пальмы).

Находим какой-то сайт, с несоответствующим заголовком, но в описании про размножение пальм что-то мелькает. Заходим туда и видим трактат на 150 кб текста, для которого только прокручивание займет минуты 2 :) и сразу думаем: “о, черт”, “много букф”, “наверное, лучше просто про пальмы искать” и т.д. После такого вида посетитель может даже перенервничать и вообще уйти. Очевидно, что это на популярность сайта влияет негативно (да и поисковик такой длинный текст вряд ли проиндексирует весь).

Тут есть, как минимум два решения.
Либо хозяин сайта заказывает контент-менеджеру разбить текст на главы, пункты и т.д. и для каждого пункта сделать в CMS сайта отдельную страницу.
Либо, разбить текст на страницы автоматически (программным способом). Как это сделано в wordpress – там внизу каждой страницы с постами есть пейджинг с номерами страниц.

Первый способ реализовывать не наша задача, а вот как второй реализовать я напишу.

Рассмотрим на примере гостевой книги (я в первых постах писал упрощенную версию).
Итак, у нас есть 50 сообщений и все на одной странице. Каждое сообщение хранится в БД.
Нам нужно сделать так, чтобы на странице отображалось не более 10 сообщений.

Допустим, что поля таблицы guestbook в БД для всех сообщений будут следующими:
Id, author, title, post, post_date.
Тогда выборка всех страниц будет производится следующим способом.

SELECT * FROM guestbook ORDER BY post_date DESC

Но возможности SQL позволяют реализовать эту выборку не полностью, а фрагментарно.
Например нам нужно выбрать записи с 20ой по 30ую из этого списка:

SELECT * FROM huestbook ORDER BY post_date DESC LIMIT 20, 10

Здесь мы указываем начиная с какой позиции нужно выбирать (20) и сколько записей надо выбирать (10).

Тогда пейджинг реализовывается очень просто:

index.php:

<?
    define ("POSTS_PER_PAGE", 10);

    include "connect.php";

    $page = $_REQUEST["page"]?intval($_REQUEST["page"]):0;
   
    $sql = "select * from guestbook order by post_date limit ".($page*POSTS_PER_PAGE).",".POSTS_PER_PAGE;
   
    $res = mysql_query($sql);

    while ($post = mysql_fetch_assoc($res))
        $posts[] = $post;


    $sql = "select COUNT(*) from guestbook order by post_date";

    $res = mysql_query($sql);
    $res = mysql_fetch_assoc($res);
    $pages_num = ceil($res["COUNT(*)"]/POSTS_PER_PAGE);

    include "guestbook.html";

?>

connect.php:

<?
     $host = "localhost";
     $user = "root";
     $pass = "";
     $dbname = "inovice";

     mysql_connect($host, $user, $pass);
     mysql_select_db($dbname);
?>

guestbook.html

<html>
<body>

<!-- Выводим все посты -->
<table width="300">

<? foreach ($posts as $post) { ?>
<tr>
    <td colspan="2"><b><?=$post['title']?></b></td>
</tr>
<tr>
    <td><?=$post['author']?></td>
    <td><?=$post['post_date']?></td>
</tr>
<tr>
    <td colspan="2"><?=$post['post']?><br></td>
</tr>
<? } ?>

</table><br />

<? for( $i=0; $i < $pages_num; $i++) { ?>
    <a href="index.php?page=<?=$i?>"><?=($i+1)?></a>  
<? } ?>

</body>
</html>

В случае же с нашими пальмами дело будет обстоять еще проще. Просто предварительно нам надо будет разбить текст на страницы и каждую страницу сделать элементом массива.

А потом выводить только элементы с 20го по 30ый в цикле.

Проблема пейджинга решается не очень сложно, но результаты внедрения такого механизма на ваш сайт могут существенно сказаться на его прибыльности :)





Читайте также:



12 Ответов на “Пейджинг своими руками.”

  1. Не против, что я на своей новой социалке закинул ваш пост?

  2. novice

    Не против конечно. Главное - оставить ссылку на оригинал.

  3. mif

    Копните в сторону шаблонизации (; Стоит обратить внимание на Smarty.
    Пригодится

  4. novice

    Да. Наслышан про эту библиотеку. В ближайшее время хочу попробывать ее. :)

  5. mif

    Кстати, сам только что узнал, лучше обратить внимание на Blitz - мощный шаблонизатор, но в то же время, и производительный (быстрее smarty), что критично для больших проектов

  6. novice

    Хм. Интересный проект. Посмотрю его тоже :) Почему он быстрее остальных, интересно.

  7. Вообще я люблю написать какую-нибудь едкую критику, но тут не придраться! :)

  8. А если страниц будет штук 100? Что скрипт их все выведет?
    Имхо надо делать постраничную навигацию такого плана:
    < << 1…3 4 5 6 7 8 9 … 100 > >>
    Согласитесь займет место гораздо меньше, чем вывод 100 страниц!

  9. В догонку еще одно исправление:
    $sql = “select COUNT(*) from guestbook order by post_date”;
    замените на:
    $sql = “select COUNT(*) AS cnt from guestbook order by post_date”;

    А это:
    $pages_num = ceil($res[“COUNT(*)”]/POSTS_PER_PAGE);
    замените на:
    $pages_num = ceil($res[‘cnt’]/POSTS_PER_PAGE);

  10. cryptus

    Насчет первого понятно.. тут надо подумать как реализовать.
    А насчет второго - непонял немного - в чем разница между полученным результатом? Кроме оформления запросов.

  11. Возможно задам глупый вопрос….но это же раздел для начинающих )
    не совсем понятна строчка
    $page = $_REQUEST[“page”]?intval($_REQUEST[“page”]):0;
    а именно, зачем после $_REQUEST[“page”] идёт знак вопроса, затем функция возвращающая целое значение переменной(ведь числа и так предположительно целые) и :0
    если кто-нибудь пояснит буду очень благодарна.

  12. novice

    2 Snejok: Нет, вопрос не глупый. Тут на самом деле лучше написать так:
    $page = intval($_REQUEST[“page”]);
    Надо как-нибудь будет исправить в тексте статьи. intval нужно применять, чтобы кто-то случайно не подсунул в переменную page строку или еще что-то. Т.е. мы принудительно приводим эту переменную в целочисленный тип.


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map