Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Гостевая книга


Автор: Troy Evans 23.3.2004, 17:49
Ребята, я прошу прощения...
Кто-нибудь знает как реализовать постраничный вывод сообщений в гостевой книге, либо где можно посмотреть похожий код?!
Буду признателен всем кто поможет!..

Автор: Baster 23.3.2004, 18:24
ну ты скажи у тебя на чём книга ? mysql ? текстовики ?

Автор: IZ@TOP 24.3.2004, 00:10
Baster , какая ращница на чем? Тут важен алгоритм.

Значит так, пишу один раз, пишу последний раз. Если кто то будет еще спрашивать, направляйте в эту тему... хотя что то мне кажется что это уже обсуждалось mad.gif

И так. Для начала мы закачиваем в массив данные, например из бд, но это не суть важно:
Цитата
$messages = my_func_grab_data();
// На выходе получаем примерно такой массив:
// $messages = array(
//    0 => array(
//        0 => "User name",
//        1 => "Sur name",
//        2 => "email user",
//        3 => "message"
//    );
// );

Но и опять таки, это не суть важно, наш массив может быть абсолютно какой угодно структуры.
Ползем дальше. Определяем максимальное количество сообщений на странице:
Цитата

$max_m = 5; // Допустим что по пять сообщений мы хотим на странице видеть, и не более!

Далее, проверяем, есть ли переменная которая передается через GET (адресную строку в браузере) и отвечает за хранение в себе номер текущей страницы:
Цитата

If(isset($_GET['pn'])) { // Собственно $_GET['pn'] и есть та самая переменая.
    $pn = $_GET['pn'];
    if($pn <= 0) { // Проверка на обнуление или уменьшение.
        $pn = 1; // Если в строку адреса случайно, или по чужому злому умыслу попало ненужное нам значение, то мы это исправляем.
        $ppn = 1;
        $npn = 2;
    } else // Думаю несложно догадаться что если у нас не меньше положеного, то может быть больше  butbut.gif
    if($pn * $max_m > sizeof($messages)) { // Проверка на то что у нас количество страниц не переедет за предел. А если переехало, значит судьба такова  sad.gif
        $pn = ceil(sizeof($messages) / $max_m) - 1;
        $ppn = $pn - 1;
        $npn = $pn;
    } else {
        // Коли все прошло успешно, ставим мы следующую страницу равной + 1 к текущей позиции, а предыдущую - 1 (если разумеется это удволетворяет нашим потребностям).
        $ppn = ($pn != 1) ? $pn - 1 : 1;
        $npn = (ceil(sizeof($messages) / $max_m) != $pn) ? $pn + 1 : ceil(sizeof($messages) / $max_m) - 1;
    }
}

Так, значит с этим мы разобрались, теперь нам осталось собственно вывести все данные:
Цитата

$i = $pn * $max_m - $max_m; // Вычисляем текущую позицию.
$e = ($i + $max_m <= sizeof($messages)) ? $i + $max_m : sizeof($messages); // Вычисляем сколько сообщений вывдить. причем если у нас так получится что одного индекса будет не хватать, то нужно как то это дело урезать. Что мы и сделали приравняв конечный итог к длинне самого массива с сообщениями.
Ну а далее поехали print'ом или echo'м в цикле фигачить сообщения на страницу:
while($i < $e) {
    printing_messages_funtion($messages[$i]);
    $i++;
}


Ну а теперь нам ни чего не стоит джать ссылку на следующую страницу:
Цитата

echo "<a href=\"?pn={$ppn}\">Предыдущая</a><br>";
echo "<a href=\"?pn={$npn}\">Следующая</a><br>";


Вот и все. Если что то не понятно, спрашивайте (но как говорится, прежде чем задать какой то вопрос - посмотрите в FAQ!!! mad.gif )!

Автор: Wowa 24.3.2004, 00:13
если MySQL, то с использованием конструкции LIMIT выбирается нужное кол-во записей начиная с такой-то записи.

Автор: IZ@TOP 24.3.2004, 00:16
Admin , да! Чуть не забыл... можно тогда конструкцию совсем иначе построить smile.gif

Добавлено @ 00:17
ЧТо то типа:
Цитата
$cp->FETCH = MYSQL_NUM;
$slimit = 0;
$order = "lid";
$sort_to = 'ASC';
$nextsort = 'd';
$limit = MAX_RESULT_TO_PAGE;
if(isset($_GET['orderby'])) {
$order = $_GET['orderby'];
}
if(isset($_GET['sortto'])) {
if($_GET['sortto'] == 'a') {
  $sort_to = 'ASC';
  $nextsort = 'd';
} else {
  $sort_to = 'DESC';
  $nextsort = 'a';
}
}
if($count_document[0] > MAX_RESULT_TO_PAGE) {
if(isset($_GET['slimit'])) {
  $slimit = $_GET['slimit'];
}
$prevlimit = ($slimit - $limit < 0)? 0 : $slimit - $limit;
$nextlimit = ($slimit + $limit > $count_document[0])? $slimit : $slimit + $limit;
$prevmeta = "<a class=\"normal\" href=\"?".GOMOD."={$cp->mod}&".RESOURCE."={$cp->res}&slimit={$prevlimit}\">предыдущая</a>";
$nextmeta = "<a class=\"normal\" href=\"?".GOMOD."={$cp->mod}&".RESOURCE."={$cp->res}&slimit={$nextlimit}\">следующая</a>";
$curpage = ceil(($slimit == 0)? 1 : $slimit / $limit + 1);
$maxpage = ceil(($count_document[0] < $limit)? 1 : $count_document[0] / $limit);
$countpage = "Страница {$curpage} из {$maxpage}";
} else {
$countpage = "Страница 1 из 1";
$prevmeta = "предыдущая";
$nextmeta = "следующая";
}
$document = $cp->query("select lid, name, title, created, updated from TABLE_DOCUMENT order by '{$order}' {$sort_to} limit {$slimit}, {$limit}");

Автор: Troy Evans 24.3.2004, 15:06
Спасибо!!!
В следующий раз с тривиальными вопросами полезу читать FAQ! rolleyes.gif

Автор: IZ@TOP 24.3.2004, 16:34
Ладно, если у кого то вдруг возникнут вопросы - тему я не закрываю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)