flapflapjack
@flapflapjack
на треть я прав

Ускорение почти удалось. Как решить маленькую загвоздку?

Раньше всегда для постраничной навигации считал общее кол-во записей в БД, и от этого уже отталкивался - как рисовать кнопки навигации.

А сегодня что-то решил сделать по такой логике:

Заранее известные константы:
$onpage = 5;// - желаемое количество записей на одной странице.

Передана ли в URL страничка?
//$params - аргументы для экшена, а $params[0] - это переданный в УРЛ номер страницы.
$page=$params && !empty($params[0]) ? (int)$params[0] : 1; //номер текущей страницы


Выполняем обычный запрос с
... LIMIT ($page-1)*$onpage,$onpage
Если записей по запросу получилось ноль, то пшёл нафиг - нечего вручную номер страницы в URL менять.

Сразу же имеем количество выданных строк по запросу.

Получается что:
у нас после выполнения малюсенького запроса без подсчета общего количества строк, имеется:
1) номер текущей страницы ($page)
2) количество желаемых строк на странице ($onpage)
2) количество выданных из БД записей ($rowCount)

Дальше всё просто:
1) if($page==1 && $rowCount<$onpage) - Мы на первой странице, строк мало, не рисуем листалку

2) if($page>1 && $rowCount<$onpage) - Мы на странице $page, рисуем листалку с 1-й по $page кнопки, дальше не нужно, ибо строк мало, листать некуда уже.

И вот она, наконец-то, проблема:
Если $rowCount==$onpage, то непонятно - рисовать кнопку "Next Page" или нет?

Я хотел спросить - может есть какое-то элегантное решение?

Мои мысли:
- Может отдельно одним запросом выдёргивать следующую запись? Если есть такая - рисуем "Далее"

- Может при выборке сразу задать лимитом на одну строку больше, но не выводить последнюю - зато мы уже заранее знаем, есть ли что-то дальше или нет.

- Кто-то таким извращался, кроме меня?

- Может лучше спать уже пойти, и бросить заниматься ерундой?
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
YardalGedal
@YardalGedal
yeah boy
Можно сразу в LIMIT указать (page-1)*onpage, onpage + 1, и если rowCount больше onpage — выводить Next, в ином случае (если равны или меньше) — нет.
Далее уже делать срез из полученных строк, отсекая этот элемент со следующей страницы.

Это никакое не извращение, логичное и наиболее верное решение, на мой взгляд.

Есть и решение с другой стороны:
В случае, когда количество постов уже совпало - сделать ещё один запрос, получить auto_increment (если вы его используете) и сравнить его с идентификатором последней полученной строки.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы