Алгоритмы постраничного вывода сообщений

Discussion in 'PHP' started by r0, 19 Apr 2007.

  1. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    За неимением времени прошу поделиться сабжем, чем больше тем лучше. Хорошо, если свои, не выдернутые из порталов.
     
  2. censored!

    censored! Green member

    Joined:
    2 Nov 2004
    Messages:
    1,159
    Likes Received:
    299
    Reputations:
    156
    А он всего один:
    1. Определяешь общее количество сообщений.
    2. Делишь на 10 (если надо 10 записей на странице) и округляешь в большую сторону - так определишь сколько всего страниц получится.
    3. Делаешь запрос с лимитом (номер страницы умноженый на 10)
     
    _________________________
  3. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    PHP:
    // Переменная хранит число пользователей выводимых на станице
    $num 20;
    // Извлекаем из URL текущую страницу
    $page $_GET['page'];
    // Определяем общее число пользователей в базе данных
    $result mysql_query("SELECT COUNT(*) as cnt FROM `users`");
    $users mysql_result($result0"cnt");
    // Находим общее число страниц
    $total intval(($users 1) / $num) + 1;
    // Определяем начало сообщений для текущей страницы
    $page intval($page);
    // Если значение $page меньше единицы или отрицательно
    // переходим на первую страницу
    // А если слишком большое, то переходим на последнюю
    if(empty($page) || $page 0$page 1;
      if(
    $page $total$page $total;
    // Вычисляем начиная к какого номера
    // следует выводить сообщения
    $start $page $num $num;
    $result mysql_query("SELECT * FROM `users` ORDER by `id` ASC LIMIT $start$num");
    for (
    $i 0$i mysql_num_rows($result); $i++) {
           
    //Здесь пишешь то, что должно выводиться на странице N раз
    }
    //Вводим ссылки на др.страницы
    $file 'users.php'
           if (
    $page != 1)
           
    $pervpage "<a href= ./$file?page=1><<   </a>";
           
    // <a href= ./$file?page=". ($page - 1) ."><</a> ";
    // Проверяем нужны ли стрелки вперед
    if ($page != $total$nextpage #"<a href= ./$file?page=". ($page + 1) .">></a>
                                       
    "<a href= ./$file?page=" .$total">   >></a>";

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

    // Вывод меню
    echo $page2left.$page1left."<b>".$page."</b>".$page1right.$page2right;
          }
     
  4. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,548
    Likes Received:
    1,397
    Reputations:
    612
    у тебя лишний мускул запрос
     
  5. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    ну это из двига совего выдернул..забыл убрать
     
  6. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,548
    Likes Received:
    1,397
    Reputations:
    612
    я про то что кол-во рядов и данные можно взять из одного запроса.
     
  7. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    GreenBear, не темни....напиши как плучше..у мну и так все работает :)
     
  8. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,548
    Likes Received:
    1,397
    Reputations:
    612
    а чего темнить то? http://mysql.ru/
    ну работает у тебя, а можно сделать на один запрос меньше.
     
    1 person likes this.
  9. blaga

    blaga Elder - Старейшина

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    Вот мой вариант. Его писал не я и вообще не помню откуда он у меня, но работает хорошо. Итак:
    $index = номер страницы;
    $count = общее число элементов;
    $delimiter = количество элементов на странице;
    $href_link = шаблон ссылки где (%) - подстановка номера страницы;
    $count_list= количество ссылок на другии листы помимо активного;

    В запросе использовать:
    Code:
    LIMIT ( $index - 1 ) * $delimiter, $delimiter
    Сама функция:
    Code:
    <?php
        function string_spliter($index, $count, $delimiter, $href_link, $count_list = 10)
        {
            $max_c = intval($count_list / 2) - 1;
            //$text .= '<center>';
            
            if ($count <= $delimiter)
            {
                return ; 
            }
            else
            {
                $max_int = intval($count / $delimiter);
                $max     = $count / $delimiter;
                $c_max = $max > $max_int ? $max_int + 1 : $max_int;
                
                if ($max_int > ($max_c * 2 + 1))
                {
                    $r_min = ($index - $max_c >= 1)      ? $index - $max_c : 1     ;
                    $r_max = ($index + $max_c <= $c_max) ? $index + $max_c : $c_max;
                    
                    if ($r_min < $max_c + 1)
                    {
                        $r_max = $r_min + $max_c + $max_c;
                    }
                    
                    if ($r_max - $r_min < $max_c * 2 )
                    {
                        $r_min = $r_max - $max_c - $max_c ;
                    }
                }
                else
                {
                    $r_min = 1;
                    $r_max = $c_max;
                }
                
                $r_min = $r_min < 1      ? 1      : $r_min;
                $r_max = $r_max > $c_max ? $c_max : $r_max;
                
                if ($index > 1)
                {
                    $link = str_replace('(%)', $index - 1 , $href_link);
                    $array[] = '<a href="' . $link . '">&laquo;</a> ';
                }
                else
                {
                    $array[] = '&nbsp;';
                }
                
                for ($i = $r_min; $i <= $r_max; $i++)
                {
                    $link = str_replace('(%)', $i, $href_link);
                    $t = ($i == $index) ? $i . ' ' : "<a href='$link'>$i</a> ";
                    $array[] = $t;
                }
                
                if ($index < $c_max)
                {
                    $link = str_replace('(%)', $index + 1 , $href_link);
                    $array[] = '<a href="' . $link . '">&raquo;</a>';
                }
                else
                {
                    $array[] = '&nbsp;';
                }
                
            }
            
            if (is_array($array))
            {
                $text = '<center><table><tr>';
                foreach ($array as $cell)
                {
                    $text .= '<td>' . $cell . '</td>';
                }
                $text .= '</tr></table></center>';
            }
            
            return $text;
        }
        
        $step = $_GET['step'];
        $step = $step == null ? 1 : $step;
        
        echo string_spliter($step, 120, 10, 'test2.html?step=(%)');
    
    ?>
    
     
    2 people like this.
  10. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    blaga, это убожество =)честно
     
  11. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Жаль.. думал усовершенствовать себя =/
    Спасибо всем.
     
  12. blaga

    blaga Elder - Старейшина

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    да мне щас не до этого особо. Писал не я да и ладно. Вот зато кто то поставил плюс в репу даже не прочитав мой пост... =\
     
  13. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    А есть у кого готовое решение вывода как в vBulletin ? С номерами страниц.
     
  14. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    А вот мой вариант уже непосредственно самого вывода списка страниц. Подходит, когда страниц много (обрезает там всякие штуки)

    PHP:
    function pages($count,$current,$link)
    {
      function 
    dolink($num,$text,$link)
        {
          return 
    "<a style=\"text-decoration: none\" href=\"".str_replace("%num",$num,$link)."\">$text</a>|";
        }
      if (
    $count <= 1  || $current || $current $count)
        return 
    "";
      
    $result "|";
      
    $left "";
      
    $right "";
      
    $center "";
      
    $ll true;
      
    $lr true;
      for (
    $i 1$i <= $count$i++)
        {
          if (
    $i >= $current && $i <= $current 2)
            if (
    $i == $current)
              
    $center .= "<b>$i</b>|";
            else
              
    $center .= dolink($i,$i,$link);
          if (
    $i 4)
            if (
    $i >= $current && $i <= $current 2)
              
    $ll false;
            else
              
    $left .= dolink($i,$i,$link);
          if (
    $i $count 3)
            if (
    $i >= $current && $i <= $current 2)
              
    $lr false;
            else
              
    $right .= dolink($i,$i,$link);
        }
      if (
    $current 1)
        
    $result .= dolink($current 1,"<",$link);
      if (
    $left != "")
        {
          
    $result .= $left;
          if (
    $ll && $current != 6)
            
    $result .= "...|";
        }
      
    $result .= $center;
      if (
    $right != "")
        {
          if (
    $lr && $current != $count 5)
            
    $result .= "...|";
          
    $result .= $right;
        }
      if (
    $current $count)
        
    $result .= dolink($current 1,">",$link);
      return 
    $result;
    }
    $count - количество страниц
    $current - номер текущей страницы
    $link - формат ссылки (%num - тэг вставки номера страницы)

    Например:

    PHP:
    echo "<center>страница: ".pages(40,27,"index.php?page=%num")."</center>";
     
    #14 Joker-jar, 2 Jul 2007
    Last edited: 2 Jul 2007
  15. SMiX

    SMiX Elder - Старейшина

    Joined:
    25 Jul 2005
    Messages:
    227
    Likes Received:
    55
    Reputations:
    29
    #15 SMiX, 2 Jul 2007
    Last edited: 2 Jul 2007
    1 person likes this.
  16. SMiX

    SMiX Elder - Старейшина

    Joined:
    25 Jul 2005
    Messages:
    227
    Likes Received:
    55
    Reputations:
    29
    Он не поддерживает rewritemod, т.е. делает ссылки вида http://url?next=3, но очень несложно сделать его поддержку, подкорректировав скрипты в директории plugins.