Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: (Статья) Разделение конекта на станицы
 
 автор: Artem S.   (12.12.2004 в 22:40)   письмо автору
 
 

Решил завести тему, т.к. считаю что статья не совершена, и в ней есть что исправить. Ввиду того, что я не писал в школе рефератов, а скачивал их, я не всегда могу точно передать свои мысли, так что строго не судите. Писал статью первый раз, надеюсь не последний.
Сама статья.
Проблема постраничной навигации встает часто перед начинающими программистами на 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 0$page2left ' <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a> | ';
 if(
$page 0$page1left '<a href= ./page?page='. ($page 1) .'>'. ($page 1) .'</a> | ';
 if(
$page $pages$page2right ' | <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a>';
 if(
$page $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 или поменяйте ссылки

   
 
 автор: cheops   (12.12.2004 в 22:51)   письмо автору
 
   для: Artem S.   (12.12.2004 в 22:40)
 

Забираю на редактирование - выложу дополненнный вариант - будут править другие.

   
 
 автор: Artem S.   (12.12.2004 в 23:05)   письмо автору
 
   для: cheops   (12.12.2004 в 22:51)
 

2cheops
Извините, я и не заметил что выложил не тот вариант, поменяйте пожалуйста следующие сточки

<?
// Нужны ли стелки назад - вперед?
 
if ($page != 1$pervpage '<a href= ./page?page=1>&lt;&lt;</a>
                              &nbsp;<a href= ./page?page='
. ($page 1) .'>&lt;</a>&nbsp&middot &middot&nbsp';
 if (
$page != $pages$nextpage '&nbsp&middot &middot&nbsp<a href= ./page?page='. ($page 1) .'>&gt;</a>
                                   <a href= ./page?page=' 
.$pages'>&gt;&gt;</a>';

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

   
 
 автор: cheops   (12.12.2004 в 23:21)   письмо автору
 
   для: 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>&lt;&lt;</a> 
                              &nbsp;<a href= ./page?page='
. ($page 1) .'>&lt;</a>&nbsp&middot &middot&nbsp'
if (
$page != $total$nextpage '&nbsp&middot &middot&nbsp<a href= ./page?page='. ($page 1) .'>&gt;</a> 
                                   <a href= ./page?page=' 
.$total'>&gt;&gt;</a>'

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


PS Заменил $pages на $total, так как очень похожа на $page - мне кажется это запутывает... Очень бы хотелось увидеть вывод из двумерного массива - может даже структуру таблицы привести?
PPS Так же не плохо бы побольше комментариев во втором блоке кода.
PPPS Ничего так получается, я про такое формирование двумерного массива чего-то не додумывался, надо будет утащить :)))
PPPPS Исправления постом выше внёс.

   
 
 автор: Artem S.   (13.12.2004 в 01:05)   письмо автору
 
   для: cheops   (12.12.2004 в 23:21)
 

Измененный вариант мне нравиться больше, но я думаю, что есть излишки в комментариях. Вы добавили свои, не убрав моих.

>> Очень бы хотелось увидеть вывод из двумерного массива - может даже структуру таблицы привести?
Это вопрос мне, или это просто размышления - не понял.

>> Так же не плохо бы побольше комментариев во втором блоке кода.
Даже не знаю и где их написать и к чему.

   
 
 автор: cheops   (13.12.2004 в 01:23)   письмо автору
 
   для: Artem S.   (13.12.2004 в 01:05)
 

>>> Очень бы хотелось увидеть вывод из двумерного массива -
>может даже структуру таблицы привести?
>Это вопрос мне, или это просто размышления - не понял.
Если вам не сложно реализуйте такой вывод - это будет удачным украшением статьи

>>> Так же не плохо бы побольше комментариев во втором блоке
>кода.
>Даже не знаю и где их написать и к чему.
Так как мы заносим всё в переменные необходимо их описать и сказать как их правильно вывести - людям часто очень нужно разобраться в проблеме, они нерничают, читают не всё и чем больше будет разжёвано, тем лучше :)))

   
 
 автор: cheops   (13.12.2004 в 15:49)   письмо автору
 
   для: cheops   (13.12.2004 в 01:23)
 

Artem S. будем увеличивать статью или оставим в таком виде и отдадим её на редактирование Кузнецову М.В. в плане русского языка?

   
 
 автор: Artem S.   (13.12.2004 в 16:06)   письмо автору
 
   для: cheops   (13.12.2004 в 15:49)
 

Извините за мою медлительность. Я думаю надо будит ее еще исправить, просто как то все не собраться. Думаю надо слегка код подправить, что его легче можно было понять. К 17.00 выложу исправленный вариант.

   
 
 автор: cheops   (13.12.2004 в 18:54)   письмо автору
 
   для: Artem S.   (13.12.2004 в 16:06)
 

Я не тороплю, сами мы долго пишем :))) - просто хотел узнать планы....

   
 
 автор: Naught   (13.12.2004 в 02:18)   письмо автору
 
   для: Artem S.   (12.12.2004 в 22:40)
 

Класс! Супер! Спасибо, Artem S. статья действительно стоящая :)

   
 
 автор: Artem S.   (13.12.2004 в 16:33)   письмо автору
 
   для: 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 0$page2left ' <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a> | '
if(
$page 0$page1left '<a href= ./page?page='. ($page 1) .'>'. ($page 1) .'</a> | '
if(
$page <= $total$page2right ' | <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a>'
if(
$page <= $total$page1right ' | <a href= ./page?page='. ($page 1) .'>'. ($page 1) .'</a>'
?> 

   
 
 автор: Кузнецов М.В.   (13.12.2004 в 17:39)   письмо автору
 
   для: Artem S.   (13.12.2004 в 16:33)
 

В печать :) Если еще чего добавить не пожелаете, я статью забираю и добавляю. Скиньте мне Ваши подлинные ФИО, чтобы я знал как автора правильно написать :)

   
 
 автор: Artem S.   (13.12.2004 в 17:47)   письмо автору
 
   для: Кузнецов М.В.   (13.12.2004 в 17:39)
 

ФИО - С.А.Н. ; )

Семенов А.Н.
Думаю достаточно

   
 
 автор: Кузнецов М.В.   (13.12.2004 в 17:50)   письмо автору
 
   для: Artem S.   (13.12.2004 в 17:47)
 

ок

   
 
 автор: Кузнецов М.В.   (13.12.2004 в 18:32)   письмо автору
 
   для: Artem S.   (13.12.2004 в 16:33)
 

Небольшое замечание. Отдельным примечанием, или описанием к коду надо пояснить, что такое include "config.php" и как так в одной строчке происходит соединение с БД. Ну что-нибудь вроде "Файл config.php содержит код... и т.д.". Можно этот код отдельно привести.

   
 
 автор: cheops   (13.12.2004 в 18:52)   письмо автору
 
   для: Кузнецов М.В.   (13.12.2004 в 18:32)
 

Дай ссылку на http://www.softtime.ru/info/articlephp.php?id_article=24 - там содержимое config.php описан.

   
 
 автор: Кузнецов М.В.   (13.12.2004 в 22:05)   письмо автору
 
   для: cheops   (13.12.2004 в 18:52)
 

ок

   
 
 автор: Кузнецов М.В.   (14.12.2004 в 00:19)   письмо автору
 
   для: Artem S.   (12.12.2004 в 22:40)
 

-

http://www.softtime.ru/info/articlephp.php

   
 
 автор: Artem S.   (14.12.2004 в 01:54)   письмо автору
 
   для: Кузнецов М.В.   (14.12.2004 в 00:19)
 

Рад что внес свой скромный вклад в SoftTime INFO

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования