WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Ночные мытарства спеца по раскрутке, или постраничный вывод контента в браузер на примере PHP


Прислал: Roman Dukhanin [ 28.07.2003 @ 11:57 ]
Раздел:: [ Статьи по PHP ]


Половина второго ночи, несколько дней недосыпа... И вдруг озарение - наконец-то я понял, какой-такой супер-пупер скрипт мне нужен для раскрутки моего нового сайта. Сказано - сделано, сажусь... нет не писать этот супер-пупер скрипт :) Программисты народ ленивый, спецы по раскрутке тем более (отсюда и баннерообменные сети, авторегистраторы в каталогах и пр. лентяйские штучки). В общем лезу на Google и начинаю методично обшаривать Рунет в поисках требуемого. Проходит час, два... В душу закрадываются смутные подозрения, плавно перерастающие в уверенность, что требуемый мне скрипт в природе либо не существует, либо спрятан на чьем-то заповедном локалхосте с правами доступа 000.

Разбиваю стоящую перед скриптом задачу на несколько составных и минут за 15 пишу реализацию большинства его (скрипта) функций :) Радостно берусь за следующую фичу... В общем, необходимо всего-то навсего обеспечить постраничный вывод контента. То есть, например, имеется 60 статей и нужно эти статьи выводить по 10 на страницу и построить меню для оного вывода в виде "1 2 3 ..."

Четыре утра, окромя заветного "LIMIT" в голову ничего не приходит. И дело даже не в том, что БД к моему скрипту никакого отношения не имеет. С горечью понимаю, что квалификация потеряна, лучшие годы жизни прожиты впустую и... иду на Google ;)
После... в общем уже наступил рассвет. К этому времени я познакомился с кучей литературы по данному вопросу, но везде ситуация так или иначе рассматривалась в контексте работы с SQL, либо я постоянно наталкивался на какую-то растиражированно-заумную статью про "отделение алгоритма постраничного вывода от контекста или-что-то-в-этом-роде" (ИМХО, нижеприведенные 7 строчек кода эту проблему решают) в которой ничегошеньки не понял... :( И вот когда я уже отчаялся и решил что утро вечера мудренее, на каком-то дремучем, заросшим мхом форуме (адрес к сожалению канул в Лету - по крайней мере у меня его нет), наткнулся на переписку некоего вечно извиняюшегося Программера и безумного и злобного Модератора - тема переписки была посвящена именно построению меню для постраничного вывода. И это было именно то что нужно!

В общем, ниже по тексту я исправляю несправедливость: теперь в Интернете есть статья о том, как обеспечить построение меню для постраничного вывода! Простой рабочий код на PHP, с подробными комментариями. Никакой излишней функциональности типа ссылок "next page". Сделано сие намеренно - ни разу в жизни не нажимал на "next" если можно было нажать на номер страницы - а данная статья написана с целью дать возможность понять основной принцип, т.е. чем меньше кода, тем лучше (хотя кнопка "next" и добавляется тремя строками кода).

Соглашения о комментариях к коду:

  • "Статья" - это некий целостный блок данных (не обязательно текстовых) который и выводится по несколько штук на страницу (это могут быть статьи, новости, картинки и пр.)
  • "Страница" - это страница :) на которой расположено некоторое количество "статей".

<?
$total_articles_number = 79;   //общее количество статей
$articles_per_page=10; // количество статей на странице
//получаем количество страниц
$total_pages = ceil($total_articles_number/$articles_per_page);


// запускаем цикл - количество итераций равно количеству страниц
for ($i=0; $i<$total_pages; $i++){
// получаем значение $from (как $page_number) для использования в формировании ссылки
$page_number=$i*$articles_per_page;
// если $page_number (фактически это проверка того является ли $from текущим) не соответствует текущей странице,
// выводим ссылку на страницу со значением $from равным $page_number
if ($page_number!=$from) echo "<a href='".$PHP_SELF."?from=".$page_number."'> ".($i+1)." </a>";
// иначе просто выводим номер страницы - данная строка необязательна,
// пропустив ее вы просто получите линк на текущую страницу
else echo $i+1; // если page_number - текущая страница - ничего не выводим (ссылку не делаем)
}
?>
Таким образом, на экране браузера мы получили что-то вроде "1 2 3 4 5 6 7 8", при этом URL (на моем компьютере, при выбранной третьей "странице") выглядит так: //localhost/ep/ep.php?from=20. Обратите внимание, на то, что странице под номером "3" соответствует значение from=20 то есть отсчет выводимых статей будет вестись в данном случае с 20-й.

Вообще, как вы уже поняли, переменная $from играет здесь ключевую роль. Она участвует в построении ссылок на каждую отдельную страницу (если, конечно, можно так выразиться :), и самое главное - дает нам точку отсчета для вывода статей. Например (и наверняка вы сделаете именно так) указатели на статьи (или сами статьи ;) можно поместить в массив, с последующей выборкой и выводом в браузер по 10 статей, начиная от значения $from.

То есть еще раз иными словами: весь огород собственно и городился ради того, чтобы дать скрипту данные относительно того на какой "странице" сейчас находится посетитель и начиная с какого номера "статьи" следует вывести заданное количество этих статей на страницу - а это и есть значение переменной $from. Т.е. при $from=20 выведутся страницы с 21 по 30 (это также зависит от реализации вывода и значения переменной $articles_per_page)

Вот и все - предисловие длиннее чем код :) А в Жизни всегда так - прелюдия гораздо длиннее чем финал ;)

Духанин Роман as RWinner winner@2winners.com

проекты автора
раскрутка сайта - реклама в интернете - статьи
философия жизни и рекламы в интернете
экстремальная раскрутка сайта - услуги

RWinner® все права сохранены© Допускается свободное копирование и публикация данной статьи при условии отсутствия купюр и с сохранением структуры гиперссылок. А если по простому, то при перепечатке линки на мои сайты вверху страницы НЕ ВЫРЕЗАТЬ. Данный копирайт, также, необходимо оставить



 :::::  RomikChef пишет 28.07.2003 @ 14:16 
Ну, если не считать нескромного "теперь в Интернете есть статья ", а так же собственно мизерности рассмотренной проблемы, то ничего себе так матерьяльчик.
Хоть ошибок не содержит.

Вообще же, я считаю, что для того, чтобы сделать постраничный вывод, надо обладать двумя вещами - познаниями в арифметике в объеме начальной школы и ЧЕТКО представлять себе - чего хочешь сделать. если не предсталвяешь - нарисовать.
 :::::  RWinner пишет 28.07.2003 @ 14:44 
ИМХО, ты просто забыл те счастливые времена, когда учился программингу :)
"Hello World!" ;))
Сколько живу, столько поражаюсь на элегантный изгиб пальцев программеров, научившихся чуть-чуть писать на чем-нить (реальные программисты как правило пальцЫ не гнут)

RWinner.

http://immigration.neobrand.ru/

З.Ы. Пацаны, кому реально помогла данная статья - откликнитесь! Просто черканите - "мне это помогло" - и все.


 :::::  Алексей пишет 28.07.2003 @ 15:19 
Мне это помогло! :)
Хотя я до этого практически дошел сам в процессе недавней работы :)))
 :::::  Photus пишет 28.07.2003 @ 17:01 
Я до этого дошёл сам за 3 минуты на http://psd.h10.ru - причём это мой первый проект на PHP(раньше вообще ничего не писал). И это называется статьёй? Роман, ты подожди пока со статьями. Через годик, может два упорной работы с PHP - може тогда стоит начать их писать.
 :::::  RWinner пишет 28.07.2003 @ 17:21 
Ай молодца!!! Ты представляешь сколько тут будет постов, если каждый программер начнет писать о том, какой он умный? ;)
И какая от этого будет ПРАКТИЧЕСКАЯ польза для тех, кто не так умен как гений Photus? :)

ИМХО - для того чтобы меряться длиной члена - есть другие сайты... :)))

З.Ы. Если данная статья поможет хотя бы 10 начинающим программистам - это будет классно - часы потрачены не зря.
Если даже 10000000 человек узнает о том как умен Photus - пользы не будет никому...

 :::::  Андрей Е. пишет 29.07.2003 @ 08:42 
Народы, человеки! Ну что вы кичитесь своими знаниями друг перед другом "...Я наваял то, а ты типа хуже меня..." - не будьте маленькими детьми. Помогла статься - слава Богу, не помогла, Бог ему судья. МИР!
 :::::  RWinner пишет 29.07.2003 @ 11:01 
Во-во - если все такие умные, лучше бы код выровняли - я то сам вижу, что там есть что сократить ;)

Или дописали бы че-нить :)

RWinner

http://forum.neobrand.ru/
 :::::  !dx пишет 29.07.2003 @ 13:09 
Мне помогла статья!
Хотелось бы видеть больше "разжеванных" статей, примеров..
Сенка за ранее.. ;)

Удачи!
 :::::  RWinner пишет 29.07.2003 @ 13:49 
Вот и я о том же - сам люблю почитать "разжеванные" примеры.
Умников-то поди много, а Жевальщиков ;)) - мало!

Спасибо за подтверждение полезности статьи - вдохновляет, знаете-ли :)

З.Ы. Каждый из нас ламер в той или иной области знаний - это не страшно. Главное иметь желание научиться. ИМХО хакерами не рождаются.

http://neobrand.ru - там совсем чуть-чуть... трудно одному...
 :::::  Photus пишет 29.07.2003 @ 16:20 
2RWinner:
Простите,простите.
Я не хотел сказать что я самый умный - я хотел сказать что каждый до этого додумается сам, даже новичок, поэтому то что написано можно назвать уроком, а не статьёй. Т.е. материалы надо бы как-нибудь делить на уроки(для начинающих) и статьи(для начавших).
 :::::  RomikChef пишет 29.07.2003 @ 16:59 
мда...
воинствующее ничтожество...

и подозрительно резко набежавшие "осчастливленные"...

НАС, я все понимаю, что контент нужен... Но по мне - лучше ничего, что ЭТО

 :::::  RWinner пишет 29.07.2003 @ 17:02 
2Photus:

"Каждый" - это кто такой? Любой? Ну пусть даже так. Имхо, можно, конечно научиться писать на PHP "методом тыка" подбирая, имена и назначение функций, но на это уйдут годы :) С мануалем на перевес как-то сподручней. Да? ;)
Все зависит от степени подготовки - это уже другой вопрос. В любом случае решать админу, что размешать а что нет, равно как и читателю, что читать а что нет.
Посмотри на zend.com - ничего, не брезгают публиковать уроки по поводу воплощения базовых алгоритмов. Ибо это основа на которой все строится.

По поводу "статей" и "уроков" - как говрил незабвенный Goblin в ВК1 - "не надо путать мягкое с теплым". Это различные вещи, хотя и близки друг к другу.
Т.е. урок может быть оформлен в виде статьи. А статья может содержать в себе урок.

Делить на "начинающих" и "начавших"... С этим к господину Нестеренко плиз - он здесь главный.

Или заведи свой сайт для "кончивших" ;)

Ладно, ИМХО - опять флейм какой-то получается.

Всех благ. RWinner.

ЗЫ. Спасибо за линк на свой сайт - я давно хотел с Фотошопом разобраться - почитаю, поучусь - мне не в падлу ;)
 :::::  NAS пишет 29.07.2003 @ 17:05 
Господа, всё просто кому не интересно или не нравится, тот не читает. Критиковать естественно всегда можно, но очень хотелось бы, чтобы критика была конструктивная.
 :::::  RWinner пишет 29.07.2003 @ 17:31 
2RomikChef:

%№%% - еще один с синдромом "осетенения" - это когда в сетку пишут то, чего в глаза никогда не скажут... На х... личные оскорбления-то нужны?

А по поводу "осчастливленных" - конечно это я писал, через проксю залез, и накатал. Кстати, RomikChef - это тоже я ;) Через другой прокси :)

Шиза форева...
 :::::  Photus пишет 30.07.2003 @ 10:49 
Ну ладно вроде разобрались.

Теперь у меня посерьёзнее вопрос:
Вот такая ссылка http://localhost/ep/ep.php?from=20
И в ep.php наверно есть такие строки $query="Select * from Article where .... Limit $from,$articles_per_page". А вот допустим можно ли как-нибудь набрать что-нибудь вместо 20 в from=20 , включающее что-нибудь типа "DELETE FROM ARTICLES WHERE 1",а перед этим например какая-нибудь куча символов возврата каретки, и так чтобы действительно произошло удаление из таблицы статей всех записей? То что я написал - фантастика или что?
 :::::  Kwazar пишет 30.07.2003 @ 11:49 
Нда...
Берем файл, читаем его, отделяем указанное количество слов и выводим. Анализируя остальное количество символов - выводим станицы.
На 2,3-ей и т д. страницы начинаем считать с $n*$stranica-$stranica
Где - $n = количеству слов на вывод
$stranica = номеру страницы на вывод.
Разбить строки на страницы - split (яз. Perl)
Возникает вопрос, чем он занимался всю ночь??? Уж лучше на девушку это время пустить :)
 :::::  RWinner пишет 30.07.2003 @ 15:36 
2Photus: в реале мой скрипт выводит линки на файлы расположенные в каталоге на сервере - это совсем другая история...
По поводу delete - ИМХО мускуль просто грязно выругается и все :)

2Kwazar:
" Возникает вопрос, чем он занимался всю ночь??? Уж лучше на девушку это время пустить :)"
----------------------------------
Спасибо за оригинальную идею ;) Если подойти совсем радикально - наверное мне надо подумать о смене профессии и стать Жигало ;))

http://ru.neobrand.ru/


 :::::  RWinner пишет 06.08.2003 @ 23:32 
З.Ы. Я тут третий день подряд пытаюсь ребят научиться пользоваться e-mail - а вы говорите...
 :::::  White пишет 13.08.2003 @ 22:16 
Тема интересная. Реализация задачи на -3.
Хотелось бы чтоб кто ни будь поделился своим личным опытом опытом.
Cделаем скрипт. Обсудим. Есть опытный народ в этом деле?
 :::::  BLACK пишет 23.08.2003 @ 15:40 
2White

Лихо ты прения прекратил, сразу все "умники" заткнулись! Ясно что у всех есть кусочек собственного кода и получше обсуждаемого, но постить его, да еще с комментариями это так скучно.... Гораздо интереснее почесать языки на общую тему, критикуя при этом всех и вся. А ведь "приопустить" других это древнейший метод "приподняться" самому, так кто же здесь хочет выглядеть "умным" - автор статьи, который наивно хочет помочь новичками или уважаемые господа критики ???
 :::::  RWinner пишет 24.08.2003 @ 13:36 
Ну, наивно - не наивно... :))

2BLACK&WHITE :) - парни, спасибо! Обожаю конструктивный подход.

Я же прекрасно понимаю, что программер из меня тот еще ;) Просто я увидел, что в сети данная проблема нигде освещена не была - вот и решил сделать это сам. Ну, как смог - так и сделал - не обессудьте :) Если кто-то может лучше - я же всегда за - ибо для меня, всегда лучше юзать готовое, нежели писать самому - остается больше времени на занятие прямой специальностью. И соответственно больше денег на выходе :))) Больше свободного времени на пиво и общение с друзьями ;)

З.Ы. Сейчас вот CMS ищу, с возможностью прописывания META для каждой страницы отдельно + чтобы корректные урлы генерила - знаю что в природе эта штука есть, но хрен кто поделится... ИМХО - прийдется дописывать свой скрипт с http://www.2winners.com/ и выкладывать в сеть.

ТАк ведь только выложишь - "у тебя тут косо, да здесь криво..." - да млин! Напишите сами, не косо и не криво - с удовольствием буду использовать - мне же меньше работы ;)

Всех благ!

RWinner.



 :::::  Seneka пишет 15.09.2003 @ 12:07 
Было бы очень полезно, если бы рассказали как вывести только по 10 номеров страниц, а не все сразу..
и кнопки >> следующие 10 и тп...
 :::::  bsdaemon пишет 07.10.2003 @ 23:01 
Писал я такое ) Только более извращенно.....РЕспект за простоту и красоту )
 :::::  Dmitriy пишет 18.10.2003 @ 15:22 
Даа, помню год назад я написал подобное для себя, но у меня была еще одна проблема: номера страниц тоже отображались не все, а скажем 5 штук [3 4 5 6 7].
Помню за день извратнулся на столько, что голова припухла, однако все работало! Удачи всем программистам!
 :::::  Художник пишет 02.11.2003 @ 13:20 
Спасибо тебе огромное Роман ничего более ясного не читал...
она мне очень помогла :)
 :::::  Ёптыть пишет 19.11.2003 @ 22:15 
Рома, на дуриков не обращай внимания, статья действительно хорошая.
 :::::  M†Lew пишет 30.11.2003 @ 11:49 
Люди, а вот если у меня на сайте есть простейший скрипт новостей, в качестве БД использующий *.txt... Каждая новость в нём находится на новой строке и имеет вид: "дата новость".
Как мне настроить скрипт, о котором написано в этой статье, для постраничного вывода моих новостей?
 :::::  Pahan пишет 30.11.2003 @ 19:13 
Народ! Да это полный бред. Это статья для .....
 :::::  Gromit пишет 23.01.2004 @ 12:27 
вы знаете, вы как пятилетние ей Богу...
вместо тогшо, что бы здесь ругаться - вы могли бы саморазвиваться - т.е. писать новые скрипты...

и ваще из за пхп не нужно ругаться, Ассебблер рулит :-)
 :::::  cat-x пишет 17.02.2004 @ 00:19 
спасибо, статья помогла в работе :)
 :::::  tibalt пишет 19.02.2004 @ 09:11 
RomikChief-a на phpclube вижу, он, в отличие от большинства здесь, не ламак. Лучше б его слушали. Чем такие статьи читать, лучше б на www.php.net/manual/ сходили. И на www.phpclub.ru в форум для новичков - намного больше бы узнали и быстрее бы научились пхп. прав был тот, кто сказал, что такие задачи за 3 минуты решаются...
 :::::  KY пишет 05.03.2004 @ 22:03 
Для того, чтобы узнать алгоритм пострничной реализации массива статей достаточно просто скачать почти любой готовый скорипт гостевой книги и немножечко в него вникнуть =)))
Во всяком случае я поступи именно так =)))
Удачи всем!!!

httз://ky.suckme.ru
 :::::  roman2311 пишет 07.05.2004 @ 19:18 
Идея актуальная. Я вот какой дизайн предлагаю:
(1) 2 3 4 5 6 7 8 .. 15
1 (2) 3 4 5 6 7 8 .. 15
1 2 (3) 4 5 6 7 8 .. 15
1 2 3 (4) 5 6 7 8 .. 15
1 2 3 4 (5) 6 7 8 .. 15
1 .. 3 4 5 (6) 7 8 9 .. 15
1 .. 4 5 6 (7) 8 9 10 .. 15
1 .. 5 6 7 (8) 9 10 11 .. 15
1 .. 6 7 8 (9) 10 11 12 .. 15
1 .. 7 8 9 (10) 11 12 13 .. 15
1 .. 8 9 10 (11) 12 13 14 15
1 .. 8 9 10 11 (12) 13 14 15
1 .. 8 9 10 11 12 (13) 14 15
1 .. 8 9 10 11 12 13 (14) 15
1 .. 8 9 10 11 12 13 14 (15)
 :::::  roman2311 пишет 07.05.2004 @ 19:19 
а вот и реализация. Ссылка на автора не обязательна :) автор Федоров Роман

function print_pages($c, $o, $r=2){//$c - колличество страниц. $o - текущая страница. $r - выводить страниц от $o не более, чем на $r
$j=0;$rez="";
//в 2 нижестоящих строчках я решаю, с какой позиции начать вывод страниц
if (($o-$r)<1) {$i=1;} else {$i=$o-$r;} if ($i==1) {$i++;}
if (($c-($r*2+1))<$i) {$i=$c-($r*2+1);} if ($i<2) {$i=2;}
//первую страницу вывожу всегда
if ($o!=1) {$rez.="1 ";} else{$rez.="<b>(1)</b> ";}if ($i>2) {$rez.=" .. ";}
while ( ( ($i<=($o+$r)) or ($j<($r*2+1)) ) and ($i<$c)) // j это колличество выводенных страниц, $i текущая выводимая страница
{
if ($i!==$o) {$rez.=($i);} else{$rez.="<b>(".($i).")</b>";}//проверяю текущая ли страница. если да то помечаю ее жирным
if ($i<=$c) {$rez.= " ";} // это печать разделителя между цифрами. В конце не печатается
$i++;$j++;
}
if ($i<$c) {$rez.=" .. ";}
if ($c>1) {if ($c!==$o) {$rez.=($c)." ";} else{$rez.="<b>(".($c).")</b> ";}}
return $rez;
}
 :::::  roman2311 пишет 07.05.2004 @ 19:25 
т.е. это просто функция
function print_pages(count, offset, radius)
где

count - колличество страниц
offset - текущая страница (смещение)
radius - радиус захвата. по сколько страниц выводить относительно текущей

всего будет выведенно страниц: 3+radius*2

в примере выше были такие данные:

for ($i=1; $i<=15; $i++) {echo print_pages(15,$i,3)."<br>";}

если есть вопросы, то вам сюда: roman2311@mail.ru

 :::::  roman2311 пишет 07.05.2004 @ 19:28 
кстати никаких "Ночных мытарств спеца по раскрутке" небыло.
Ушло чуть больше часа.

Напишите отзыв, может кто глюки найдет

 :::::  dmitro пишет 19.05.2006 @ 18:20 
Скрипт пригодился, но пафосу многовато, за скрипт пасиба :)
 :::::  foxx пишет 02.07.2006 @ 20:11 
Читал-читал... думал почитаю и свалю... Не. Кину постик.
Развелось блин ГУРУ! Вместо того чтобы пользу обществу приносить (писать супер-мега профессиональные скрипты) они лазят по статьям для ньюбисов и постят месы про свою крутость и лоховатость всего что вокруг них движется. Вы челы лучше MICROSOFT Российский создайте, если такие умные. Речи нет, можно с гостевухи дернуть пару строчек, можно свои гипер-мега-HQ мозги чуток понапрягать, но это опять же для вас, крутые гуру! А что делать тем кто заглядывая в скрипт гостевухи просто не знает где именно дергать и конечно самому написать - фантастика пока что? Вот такие статьи нужны тем кто ищет в интернете способы решения насущных задач ну или для тренировки. А вам тут ваще нехер делать.
 :::::   пишет 23.08.2006 @ 23:53 
Молодец парень, а например заморочился с этим скриптом, я правдо по другому сделал, но всё таки! Я тоже искал как и что но не нашёл, Молодец!
 :::::  Sym пишет 16.03.2007 @ 22:37 
Эх, ну вот что ж все такие умные!
"Вообще, как вы уже поняли, переменная $from играет здесь ключевую роль. "
Поняли, поняли...
А как прописать эту переменную? по-моему, из скрипта ее уже кто-то вырезал... :(
 :::::  PHPer пишет 01.04.2007 @ 10:25 
Pazany, po moemu vy vse lohi. Vy obshuzhdaete 6 strochek kakogo-to tipa progera. imho esli o takin "problemah" pisat statyi, ineta ne hvatit:), luboy normalniy proger v ezhednevnoe rabote reshaet desatki takih "zadach" v den...
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0272350