Отсебятина Статьи Проекты
Облако тегов
Web CMS CSS htaccess HTML Javascript MySQL Php Безопасность Мониторы Новостная лента Оптимизация Ошибки Разработка сайта Часы Юзабилити оптимизация ошибки

Постраничный вывод статей

Отсебятина от 01 октября 2008 года.    Теги: Оптимизация MySQL


Как известно, удобнее всего читать и воспринимать текст, когда он форматирован в относительно узкую колонку, разбит на абзацы, а так же, на страницы.

В интернете крайне редко встречаются тексты, которые разбиты по страницам. Как правило, если сайт и использует такую систему, то только для того, чтобы показать как можно больше рекламы посетителю, разбивая текст на большое количество страниц по 4-6 абзацев.


Реализовать данный алгоритм, опять-таки, проще через базу и контент-менеджера. Концепция идентична со статьей "Реализация анонсов к новостям через тег [cut]".


Часть 1

Создаем кнопку с функцией, добавляющей разделитель страниц:
<input type="button" onClick="page_add()" value="Страница"> <textarea id="text"></textarea>

Теперь дополним функцией JavaScript:
page = 1;
function page_add () {

document.getElementById("text").innerHTML += '[page'+page+]';

page++;

}

Обратите внимание: page — глобальная переменная (объявлена без var), увеличивается при каждом клике на кнопку "Страница".

Стоит отметить тот факт, что при написании статьи часто забываешь кинуть в конец текста тег, но эта проблема решается автоматическим добавлением при сохранении текста (либо на стороне клиента, либо проверять, непосредственно, перед записью в базу).




Часть 2

Для начала, обдумаем ход действий.

Для того, чтобы выбрать первую страницу текста, то необходимо просто вытащить все до тега "page1". Так как тема поднималась в прошлой части статьи, то рассказывать о её реализации подробно не буду.

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


В связи с этими фактами, будет использоваться составной запрос:
if (isset($_GET["page"])) {

if ((int)$_GET["page"] != $_GET["page"]) {

die(); //Если page не число, то бросаем страницу 404 (В данном случае просто убиваем скрипт)

}

$page $_GET["page"]; //делается намеренно, т.к. мы проверили входящую переменную и знаем, что она безопасна, а переименовываем, чтобы не было путаницы.

if ($page > 1) {

//Если страница не первая, то ищем позицию тега предыдущей страницы

$pagetag = '[page'.($page-1).']';

$start_sql = '(INSTR(`text`, "'.$pagetag.'")+'.strlen($pagetag).')';

}

else {

//Если страница первая, то стартуем с 1 позиции

$start_sql = 1;

}

}
else {

//Если страница не указана, стартуем с первой позиции

$start_sql = 1;

$page = 1;

}

А теперь запрос в базу:
'SELECT `id`, SUBSTRING(`text`, @pos:='.$start_sql.', (INSTR(`text`, "[page'.$page.']")-@pos)) as `text`

FROM `items` WHERE `id`='.$_GET["item"]


Таким образом для выборки первой страницы запрос превратится в следующий:
SELECT `id`, SUBSTRING(`text`, @pos:=1, (INSTR(`text`, "[page1]")-@pos)) as `text`

FROM `items` WHERE `id`=1


Здесь, казалось бы, пользовательские переменные не нужны. Однако, дело меняется, когда выбираются последующие страницы и переменная предотвращает повторное выполнение функции:
SELECT `id`, SUBSTRING(`text`, @pos:=(INSTR(`text`, "[page1]")+6), (INSTR(`text`, "[page2]")-@pos)) as `text`

FROM `items` WHERE `id`=1


Работает запрос так:

1. Переменной @pos присваивается значение, которое получается в результате поиска позиции предыдущего разделителя страницы (в нашем случае [page1], т.к. мы выбираем вторую страницу) и суммирования символьной длины самого тега (она считается в коде выше)


2. Выполняется поиск разделителя текущей страницы. Из полученной позиции вычитаем значение @pos, тогда у нас получается количество символов между разделителями страниц


3. Функция SUBSTRING обрезает `text` начиная с позиции @pos. Третий параметр у функции &mdash lenght (количество символов от начала "вырезки"). Это количество и есть результат действия 2



База возвращает только то, что нам нужно :)
На сладующей странице продолжение.
Оставить сообщение






Любое копирование должно сопровождаться ссылкой на сайт.
Если вам что-то не понравилось — сообщайте.
Кича Владимир
x
Мне не нравится этот сайт, удалить его