|
|
|
| Решил завести тему, т.к. считаю что статья не совершена, и в ней есть что исправить. Ввиду того, что я не писал в школе рефератов, а скачивал их, я не всегда могу точно передать свои мысли, так что строго не судите. Писал статью первый раз, надеюсь не последний.
Сама статья.
Проблема постраничной навигации встает часто перед начинающими программистами на php. Давайте попробуем решит эту проблему. Постараюсь меньше голого текста, и показывать побольше примеров. Сначала следует определиться с задачей. Что требуется? Возьмем за пример гостевую книгу, где требуется организовать подобный постраничный вывод.
Задача поставлена, теперь рассмотрим, что от нас требуется более конкретно. Сообщения от пользователей охраняться в базе данных post. Нам надо выводить Х количество сообщений на станицу, а также организовать удобную навигацию, например, такую: << < ..2|3|4|5|6.. > >> где 4 текущая станица.
Итак, нам нужен параметр, по которому нам надо определить текущую станицу. Добавим его в URL www.myserver.com/?page=X. Где X - номер станицы.
Приступим.
<?php
// Переменная хранит число сообщений на станице
$num = 25;
// Получаем переменную page из URL
$page = $_GET['page'];
// Определяем общее количество сообщений
$result = mysql_query("SELECT COUNT(*) FROM post");
$posts = mysql_fetch_row($result);
// Находим общее число станиц
$pages = intval(($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей станицы
$page = intval($page);
if(empty($page) or $page < 0) $page = 1; // удостоверяемся что это число
if($page > $pages) $page = $pages; // и оно меньше общего числа станиц
$start = $page * $num - $num; // Начинать отображать со $start элемента
// Выбираем нужные сообщения
$result = mysql_query("SELECT * FROM post LIMIT ".$start.".".$num);
while ( $postrow[] = mysql_fetch_array($result))
?>
|
На этом первая часть закончилась. Двумерный массив postrow хранить все элементы отображения станицы, осталось организовать навигацию.
<?php
// Нужны ли стрелки назад - вперед?
if ($page != 1) $pervpage = '<a href= ./page?page=1><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> · · ';
if ($page != $pages) $nextpage = ' · · <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page=' .$pages. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 < $pages) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 < $pages) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>
|
На этом все. Напоследок я прикрепил файл, чтоб вы могли вдоволь наиграться.
P.S. Прикрепленный файл переименуйте в page.php или поменяйте ссылки | |
|
|
|
|
|
|
|
для: Artem S.
(12.12.2004 в 22:40)
| | Забираю на редактирование - выложу дополненнный вариант - будут править другие. | |
|
|
|
|
|
|
|
для: cheops
(12.12.2004 в 22:51)
| | 2cheops
Извините, я и не заметил что выложил не тот вариант, поменяйте пожалуйста следующие сточки
<?
// Нужны ли стелки назад - вперед?
if ($page != 1) $pervpage = '<a href= ./page?page=1><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> · · ';
if ($page != $pages) $nextpage = ' · · <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page=' .$pages. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $pages) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $pages) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(12.12.2004 в 22:51)
| | Вот правленный вариант:
Перед начинающими программистами на PHP часто встаёт проблема постраничной навигации. К разбиению объёмного текста на отдельные страницы прибегают во многих Web-приложениях от гостевых книг и форумов до различных каталогов. Давайте попробуем решит эту проблему. Постараемся действовать по принципу: меньше голого текста — побольше примеров. Сначала следует определиться с задачей. Что требуется? Возьмем за пример гостевую книгу содержащую несколько сотен сообщений, в которой требуется выводить на страницу Х сообщений.
Задача поставлена, теперь рассмотрим, что от нас требуется более конкретно. Сообщения пользователей хранятся в базе данных post. От нас требуется выводить Х сообщений на станицу, а также организовать удобную навигацию, например, такую: << < ..2|3|4|5|6.. > >> где 4 текущая станица.
Для того, чтобы отслеживать текущую страницу будем использовать параметр page, передаваемый через URL, например, www.myserver.com/index.php?page=X. Где X - номер станицы (пусть будет 25).
Приступим.
<?php
// Устанавливаем соединение с базой данных
include "config.php";
// Переменная хранит число сообщений выводимых на станице
$num = 25;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT COUNT(*) FROM post");
$posts = mysql_fetch_row($result);
// Находим общее число станиц
$total = intval(($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей станицы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
if(empty($page) or $page < 0) $page = 1; // удостоверяемся что это число
if($page > $total) $page = $total; // и оно меньше общего числа станиц
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $num - $num; // Начинать отображать со $start элемента
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM post LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))
?>
|
На этом первая часть закончена. Двумерный массив postrow хранит все поля таблицы post, необходимые для отображения станицы — осталось организовать навигацию.
<?
// Нужны ли стелки назад - вперед?
if ($page != 1) $pervpage = '<a href= ./page?page=1><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> · · ';
if ($page != $total) $nextpage = ' · · <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page=' .$total. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
?>
|
PS Заменил $pages на $total, так как очень похожа на $page - мне кажется это запутывает... Очень бы хотелось увидеть вывод из двумерного массива - может даже структуру таблицы привести?
PPS Так же не плохо бы побольше комментариев во втором блоке кода.
PPPS Ничего так получается, я про такое формирование двумерного массива чего-то не додумывался, надо будет утащить :)))
PPPPS Исправления постом выше внёс. | |
|
|
|
|
|
|
|
для: cheops
(12.12.2004 в 23:21)
| | Измененный вариант мне нравиться больше, но я думаю, что есть излишки в комментариях. Вы добавили свои, не убрав моих.
>> Очень бы хотелось увидеть вывод из двумерного массива - может даже структуру таблицы привести?
Это вопрос мне, или это просто размышления - не понял.
>> Так же не плохо бы побольше комментариев во втором блоке кода.
Даже не знаю и где их написать и к чему. | |
|
|
|
|
|
|
|
для: Artem S.
(13.12.2004 в 01:05)
| | >>> Очень бы хотелось увидеть вывод из двумерного массива -
>может даже структуру таблицы привести?
>Это вопрос мне, или это просто размышления - не понял.
Если вам не сложно реализуйте такой вывод - это будет удачным украшением статьи
>>> Так же не плохо бы побольше комментариев во втором блоке
>кода.
>Даже не знаю и где их написать и к чему.
Так как мы заносим всё в переменные необходимо их описать и сказать как их правильно вывести - людям часто очень нужно разобраться в проблеме, они нерничают, читают не всё и чем больше будет разжёвано, тем лучше :))) | |
|
|
|
|
|
|
|
для: cheops
(13.12.2004 в 01:23)
| | Artem S. будем увеличивать статью или оставим в таком виде и отдадим её на редактирование Кузнецову М.В. в плане русского языка? | |
|
|
|
|
|
|
|
для: cheops
(13.12.2004 в 15:49)
| | Извините за мою медлительность. Я думаю надо будит ее еще исправить, просто как то все не собраться. Думаю надо слегка код подправить, что его легче можно было понять. К 17.00 выложу исправленный вариант. | |
|
|
|
|
|
|
|
для: Artem S.
(13.12.2004 в 16:06)
| | Я не тороплю, сами мы долго пишем :))) - просто хотел узнать планы.... | |
|
|
|
|
|
|
|
для: Artem S.
(12.12.2004 в 22:40)
| | Класс! Супер! Спасибо, Artem S. статья действительно стоящая :) | |
|
|
|
|
|
|
|
для: Artem S.
(12.12.2004 в 22:40)
| | Перед начинающими программистами на PHP часто встаёт проблема постраничной навигации. К разбиению объёмного текста на отдельные страницы прибегают во многих Web-приложениях от гостевых книг и форумов до различных каталогов. Давайте попробуем решит эту проблему. Сначала следует определиться с задачей. Что требуется? Возьмем за пример гостевую книгу, содержащую несколько сотен сообщений, в которой требуется выводить на страницу Х сообщений.
Рассмотрим задачу более конкретно. Сообщения пользователей хранятся в базе данных post со следующей структурой:
- id – номер сообщения,
- text – тело сообщения,
- name – имя автора,
- time – время создания,
В итоге надо получить вывод Х сообщений на станицу, а также организовать удобную навигацию, например, такую: << < ..2|3|4|5|6.. > >> где 4 текущая станица.
Для того чтобы отслеживать текущую страницу будем использовать параметр page, передаваемый через URL, например, www.myserver.com/index.php?page=X. Где X - номер станицы (пусть будет 25).
Приступим.
<?php
// Устанавливаем соединение с базой данных
include "config.php";
// Переменная хранит число сообщений выводимых на станице
$num = 25;
// Извлекаем из URL текущую страницу
$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT COUNT(*) FROM post");
$posts = mysql_fetch_row($result);
// Находим общее число станиц
$total = intval(($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей станицы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, но переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM post LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))
?>
|
На этом первая часть закончена. Двумерный массив postrow хранит все поля таблицы post, необходимые для отображения станицы. Вот пример как можно организовать вывод сообщений.
<?php
echo "<table>";
for($i = 0; $i < $num; $i++)
{
echo "<tr><td>".$postrow[$i]['name']."</td><td>".$postrow[$i]['time']."</td></tr>
<tr><td colspan=\"2\">".$postrow[$i]['text']."</td></tr>";
}
echo "</table>";
?>
|
Осталось организовать навигацию. Формируем составляющие будущей навигации.
Коды стрелки «в начало» и «назад» поместим в одну переменную, также поступим и со стрелками «в конец» и «вперед»
<?php
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./page?page=1><<</a>
<a href= ./page?page='. ($page - 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= ./page?page='. ($page + 1) .'>></a>
<a href= ./page?page=' .$total. '>>></a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= ./page?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= ./page?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= ./page?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= ./page?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
?>
|
| |
|
|
|
|
|
|
|
для: Artem S.
(13.12.2004 в 16:33)
| | В печать :) Если еще чего добавить не пожелаете, я статью забираю и добавляю. Скиньте мне Ваши подлинные ФИО, чтобы я знал как автора правильно написать :) | |
|
|
|
|
|
|
|
для: Кузнецов М.В.
(13.12.2004 в 17:39)
| | ФИО - С.А.Н. ; )
Семенов А.Н.
Думаю достаточно | |
|
|
|
|
|
|
|
для: Artem S.
(13.12.2004 в 17:47)
| | ок | |
|
|
|
|
|
|
|
для: Artem S.
(13.12.2004 в 16:33)
| | Небольшое замечание. Отдельным примечанием, или описанием к коду надо пояснить, что такое include "config.php" и как так в одной строчке происходит соединение с БД. Ну что-нибудь вроде "Файл config.php содержит код... и т.д.". Можно этот код отдельно привести. | |
|
|
|
|
|
|
|
|
для: cheops
(13.12.2004 в 18:52)
| | ок | |
|
|
|
|
|
|
|
|
для: Кузнецов М.В.
(14.12.2004 в 00:19)
| | Рад что внес свой скромный вклад в SoftTime INFO | |
|
|
|