За последние 24 часа нас посетили 17010 программистов и 1297 роботов. Сейчас ищут 1427 программистов ...

Постраничная навигация.

Тема в разделе "PHP для новичков", создана пользователем Mr.ILLUMINOR, 3 мар 2012.

  1. Mr.ILLUMINOR

    Mr.ILLUMINOR Активный пользователь

    С нами с:
    6 фев 2012
    Сообщения:
    27
    Симпатии:
    0
    У меня есть следующая таблица с комментариями на сайте:

    [​IMG]

    Page - ID страницы, где должен выводиться данный комментарий. Таким образом на странице 2, будут выводиться комментарии, где page = 2. Как в таком случае сделать постраничную навигацию? То есть в обычном случае я бы просто получил с какого по какой ID комментария мне выводить. Например, на первой странице комментарии с ID 1-10, на второй с ID 11-21 и т.д.? Но в этом случае так не получиться, так как комментарии с ID 1-10, могут содержать разные page. Как в таком случае поступить?
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Раз page и есть тот критерий, по которому группируются записи, то пишем в MySQL запросе условие WHERE page='2'.
    Также нужно добавить ограничитель LIMIT, чтобы собирать результат постранично.
    Код (Text):
    1. $length = 10; //элементов на одну страницу
    2. $start = $pageNum * $length + 1; //$pageNum - номер страницы
    3. "SELECT * FROM моя_таблица WHERE page='2' LIMIT $start,$length;"
    То есть выбираются записи, соответствующие странице 2, потом из этого списка выбирается диапазон от $start до $start+$length.
     
  3. Mr.ILLUMINOR

    Mr.ILLUMINOR Активный пользователь

    С нами с:
    6 фев 2012
    Сообщения:
    27
    Симпатии:
    0
    [​IMG]

    вот таблица.

    вот код:
    Код (Text):
    1.     $comment = $_GET["comments"];
    2.     $select_comments = mysql_query("SELECT * FROM `comments` WHERE page = $id");
    3.     $length = 2;
    4.     $start = $comment * $length - $length + 1;
    5.     $finish = $comment * $length;
    6.     $select_comments = mysql_query("SELECT * FROM `comments` WHERE `page` = '$id' LIMIT $start, $finish");
    7.     while ($comments = mysql_fetch_array($select_comments))
    8. {
    9.     echo '<div class = "comments"><b>'.htmlspecialchars($comments["name"]).'</b><br>'.htmlspecialchars($comments["message"]).'</div>';
    10. }
    вот страница: index.php?page=2&comments=3

    По идеи должно выводить сообщения с 4 по 6. Но выводит 4 сообщения с ID 6, 7, 8, 9 из таблицы.

    В чём проблема?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    простите, а зачем лимит если вы и так через page говорите на какой странице выводить?
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Ну а насчет где проблема.... ее нет.

    Давайте посчитаем вместе

    вот страница: index.php?page=2&comments=3
    $length = 2;

    $start = 3*2-2+1 = 6-2+1= 4+1=5
    $finish = 3*2 = 6

    т.е. возвращает с 6 позиции 6 элементов

    Все правильно.
     
  6. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Простейший пейджер всего с 1 запросом.
    Код (PHP):
    1. $id=(int)$_GET['id'];//id страницы с комментариями
    2. $comment=(isset($_GET['comments']))?(int)$_GET['comments']:0;
    3. if($comment<0){$comment=0;}
    4.  
    5. $length = 3; //элементов на одну страницу
    6. $start = $comment * $length;
    7. $lengthsql=$length+1; //из БД берём на 1 элемент больше, чтобы использовать потом в формировании ссылок
    8. $select_comments = mysql_query("SELECT * FROM comments WHERE page='$id' LIMIT $start,$lengthsql");
    9. $count = mysql_num_rows($select_comments); //если получили меньше, чем $length, значит это последняя страница
    10. echo "<dl>\n";
    11. for($i=0;$i<$length;$i++){
    12.     $comments = mysql_fetch_array($select_comments);
    13.     echo '<dt>',$comments['name'],'</dt><dd>',$comments['message'],"</dd>\n";
    14. }
    15. echo "</dl>\n";
    16. //формируем ссылки для листания
    17. $forv=($count >= $lengthsql)?($comment+1):$comment;
    18. $back=($comment > 0)?($comment-1):0;
    19. echo '<div>[url="?id=',$id,'&comments=',$forv,'"]вперед >>[/url]</div>';