Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Алгоритмы постраничного вывода сообщений (https://forum.antichat.xyz/showthread.php?t=38322)

r0 19.04.2007 15:07

Алгоритмы постраничного вывода сообщений
 
За неимением времени прошу поделиться сабжем, чем больше тем лучше. Хорошо, если свои, не выдернутые из порталов.

censored! 19.04.2007 15:38

А он всего один:
1. Определяешь общее количество сообщений.
2. Делишь на 10 (если надо 10 записей на странице) и округляешь в большую сторону - так определишь сколько всего страниц получится.
3. Делаешь запрос с лимитом (номер страницы умноженый на 10)

Isis 19.04.2007 15:47

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;
      } 


GreenBear 19.04.2007 15:49

у тебя лишний мускул запрос

Isis 19.04.2007 15:59

ну это из двига совего выдернул..забыл убрать

GreenBear 19.04.2007 16:23

я про то что кол-во рядов и данные можно взять из одного запроса.

Isis 19.04.2007 16:28

GreenBear, не темни....напиши как плучше..у мну и так все работает :)

GreenBear 19.04.2007 16:31

а чего темнить то? http://mysql.ru/
ну работает у тебя, а можно сделать на один запрос меньше.

blaga 19.04.2007 16:35

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

В запросе использовать:
Код:

LIMIT ( $index - 1 ) * $delimiter, $delimiter
Сама функция:
Код:

<?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=(%)');

?>


Isis 19.04.2007 16:53

blaga, это убожество =)честно


Время: 02:28