PDA

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


r0
19.04.2007, 15:07
За неимением времени прошу поделиться сабжем, чем больше тем лучше. Хорошо, если свои, не выдернутые из порталов.

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

Isis
19.04.2007, 15:47
// Переменная хранит число пользователей выводимых на станице
$num = 20;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число пользователей в базе данных
$result = mysql_query("SELECT COUNT(*) as cnt FROM `users`");
$users = mysql_result($result, 0, "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 - 2 > 0)
$page2left = " <a href= ./$file?page=". ($page - 2) .">". ($page - 2) ."</a> | ";
if($page - 1 > 0)
$page1left = "<a href= ./$file?page=". ($page - 1) .">". ($page - 1) ."</a> | ";
if($page + 2 <= $total)
$page2right = " | <a href= ./$file?page=". ($page + 2) .">". ($page + 2) ."</a>";
if($page + 1 <= $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, это убожество =)честно

r0
19.04.2007, 17:14
Жаль.. думал усовершенствовать себя =/
Спасибо всем.

blaga
19.04.2007, 17:43
blaga, это убожество =)честно
да мне щас не до этого особо. Писал не я да и ладно. Вот зато кто то поставил плюс в репу даже не прочитав мой пост... =\

r0
01.07.2007, 23:42
А есть у кого готовое решение вывода как в vBulletin ? С номерами страниц.

Joker-jar
02.07.2007, 01:17
А вот мой вариант уже непосредственно самого вывода списка страниц. Подходит, когда страниц много (обрезает там всякие штуки)

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 < 1 || $current > $count)
return "";
$result = "|";
$left = "";
$right = "";
$center = "";
$ll = true;
$lr = true;
for ($i = 1; $i <= $count; $i++)
{
if ($i >= $current - 2 && $i <= $current + 2)
if ($i == $current)
$center .= "<b>$i</b>|";
else
$center .= dolink($i,$i,$link);
if ($i < 4)
if ($i >= $current - 2 && $i <= $current + 2)
$ll = false;
else
$left .= dolink($i,$i,$link);
if ($i > $count - 3)
if ($i >= $current - 2 && $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 - тэг вставки номера страницы)

Например:

echo "<center>страница: ".pages(40,27,"index.php?page=%num")."</center>";

SMiX
02.07.2007, 12:08
Я использую SmartyPaginate (http://www.phpinsider.com/php/code/SmartyPaginate/) совместно со Smarty (http://smarty.php.net/manual/ru/) - очень удобно.

SMiX
02.07.2007, 12:34
Он не поддерживает rewritemod, т.е. делает ссылки вида http://url?next=3, но очень несложно сделать его поддержку, подкорректировав скрипты в директории plugins.