|| разделы:: | |
|| поиск по сайту:: | |
|| реклама:: | |
|| новости почтой:: | |
Популярные статьи |
|
Hot 5 Stories |
|
|| рекомендуем:: | |
| |
Ночные мытарства спеца по раскрутке, или постраничный вывод контента в браузер на примере 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® все права сохранены© Допускается свободное копирование и публикация данной статьи при условии отсутствия купюр и с сохранением структуры гиперссылок. А если по простому, то при перепечатке линки на мои сайты вверху страницы НЕ ВЫРЕЗАТЬ. Данный копирайт, также, необходимо оставить
|
Ну, если не считать нескромного "теперь в Интернете есть статья ", а так же собственно мизерности рассмотренной проблемы, то ничего себе так матерьяльчик.
Хоть ошибок не содержит.
Вообще же, я считаю, что для того, чтобы сделать постраничный вывод, надо обладать двумя вещами - познаниями в арифметике в объеме начальной школы и ЧЕТКО представлять себе - чего хочешь сделать. если не предсталвяешь - нарисовать.
|
::::: 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 - пользы не будет никому...
|
Народы, человеки! Ну что вы кичитесь своими знаниями друг перед другом "...Я наваял то, а ты типа хуже меня..." - не будьте маленькими детьми. Помогла статься - слава Богу, не помогла, Бог ему судья. МИР!
|
::::: 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:
Простите,простите.
Я не хотел сказать что я самый умный - я хотел сказать что каждый до этого додумается сам, даже новичок, поэтому то что написано можно назвать уроком, а не статьёй. Т.е. материалы надо бы как-нибудь делить на уроки(для начинающих) и статьи(для начавших).
|
мда...
воинствующее ничтожество...
и подозрительно резко набежавшие "осчастливленные"...
НАС, я все понимаю, что контент нужен... Но по мне - лучше ничего, что ЭТО
|
::::: 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 и тп...
|
Писал я такое ) Только более извращенно.....РЕспект за простоту и красоту )
|
::::: Dmitriy пишет 18.10.2003 @ 15:22 | |
Даа, помню год назад я написал подобное для себя, но у меня была еще одна проблема: номера страниц тоже отображались не все, а скажем 5 штук [3 4 5 6 7].
Помню за день извратнулся на столько, что голова припухла, однако все работало! Удачи всем программистам!
|
Спасибо тебе огромное Роман ничего более ясного не читал...
она мне очень помогла :)
|
::::: Ёптыть пишет 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
|
Идея актуальная. Я вот какой дизайн предлагаю:
(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)
|
|
а вот и реализация. Ссылка на автора не обязательна :) автор Федоров Роман
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;
}
|
|
т.е. это просто функция
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
|
кстати никаких "Ночных мытарств спеца по раскрутке" небыло.
Ушло чуть больше часа.
Напишите отзыв, может кто глюки найдет
|
::::: 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...
|
| |