Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Пагинатор [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 [2] 3 »   

> Без описания
tuareg
Отправлено: 30 Мая, 2012 - 20:27:28
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Давайте так DeepVarvar и etoYA договоримся. В принципе проблему я обозначил. Если не будет ответов. Я вечерком(или завтра) напишу Вам в личку. Может Илья потом статью напишет.
Просто мне надо все проверить. EXPLAIN и т.д Улыбка
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Мая, 2012 - 20:32:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




tuareg у меня все довольно просто - но с учетом того что страницы кешируются.
Запросы естественно проходят с условиями и джойнами - вобщем любые запросы.
Все - я домой еду.
 
 Top
tuareg
Отправлено: 30 Мая, 2012 - 20:34:04
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




etoYA пишет:
tuareg, хм. точно, ведь если нужно условие в запросе, то.....

UPD

А теперь уневирсальный?

Из контроллера
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = 'SELECT * FROM `users`';
  3. $view->r = Paginator::split($sql, 'users', 5, $page);
  4.  


Сам пагинатор
PHP:
скопировать код в буфер обмена
  1.  
  2. class Paginator{
  3.         public static function split($sql, $tbl, $perPage, $page){
  4.                 $r = mysqli()->query("SELECT count(*) FROM $tbl");
  5.                 if (!is_object($r)) throw new ErrorController('db');
  6.                 $count = $r->fetch_row();
  7.                 $total = intval(($count[0] - 1) / $perPage) + 1;
  8.                 $page = intval($page);
  9.                 if (empty($page) || $page <= 0) $page = 1;
  10.                 if ($page > $total) $page = $total;
  11.                 $start = $page * $perPage - $perPage;
  12.                 $r = mysqli()->query("$sql LIMIT $start, $perPage");
  13.                 if (!is_object($r)) throw new ErrorController(mysqli()->error);
  14.                 return $r;
  15.         }
  16. }
  17.  

А вот смотри. Есть таблица новостей. Причем есть новости от даты будущей (занесены заранее), есть новости скрытые(недоступный для просмотра)
PHP:
скопировать код в буфер обмена
  1.  
  2. $r = mysqli()->query("SELECT count(*) FROM $tbl");
  3.  

Этот запрос вернет все новости. Хотя по идее должно быть условие не ворачивать новости в которых дата публикации > текущей даты, плюс новости которые скрыты?
Я просто к тому, что надо предусмотреть условие к этому запросу... Радость

(Отредактировано автором: 30 Мая, 2012 - 20:37:11)

 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 21:11:00
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg, а это просто, ведь это можно делать не в пагинаторе, а в модели(в который был раньше), просто возвращать общее кол-во учитываемых новостей).

(Отредактировано автором: 30 Мая, 2012 - 22:14:58)

 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Мая, 2012 - 22:47:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




PHP:
скопировать код в буфер обмена
  1. function splitToPages($query, $perpage, $emptyignore = false) {
  2.   $p = (isset($_GET['page'])) ? intval($_GET['page']) : 1;
  3.   $limit = $p - 1 == 0 ? 0 : ($p - 1) * $perpage;
  4.   $res = query("SELECT SQL_CALC_FOUND_ROWS * FROM ($query) TBL LIMIT $limit, $perpage");
  5.  
  6.   if (!$res and !$emptyignore) {
  7.     // throw 404
  8.   }
  9.  
  10.   $all = query("SELECT FOUND_ROWS()"); // $all - это целое число!
  11.   $ps = ceil($all/$perpage);
  12.  
  13.   if ($ps > 0 and $p > $ps) {
  14.     // throw 404
  15.   }
  16.  
  17.   generatePages($p, $ps, $requestPrefix . "?page=");
  18.   return $res;
  19.  
  20. }
  21.  
  22. function generatePages($p, $ps, $uri) {
  23.   // генерация либо готового куска хтмл-кода страниц
  24.   // либо пуш массива, для последующего разбора уже во вьюхе
  25.   // результат пихается сразу во вьюху
  26. }
  27.  

(Отредактировано автором: 30 Мая, 2012 - 22:53:16)

 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 22:56:21
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




DeepVarvar. нифига не понял).
А с твоим вариантом реально будет:
tuareg пишет:
Этот запрос вернет все новости. Хотя по идее должно быть условие не ворачивать новости в которых дата публикации > текущей даты, плюс новости которые скрыты?

(Добавление)
А нет, не должен. Просто для меня это какие-то странные sql запросы))).
 
 Top
DeepVarvar Супермодератор
Отправлено: 31 Мая, 2012 - 00:32:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




etoYA, уменьшит конечно же - фонд-ровс работает быстрее простого лимита (как минимум в 2 раза) - его не надо возвращать клиенту.
CODE (text):
скопировать код в буфер обмена
  1. http://valera.ws/2007.08.29~sql_calc_found_rows/

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

(Отредактировано автором: 31 Мая, 2012 - 01:13:59)

 
 Top
etoYA
Отправлено: 31 Мая, 2012 - 00:38:41
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




DeepVarvar, переделай ссылку с какимнибудь префиксом, или без http://... Опять редирект тупит)
 
 Top
tuareg
Отправлено: 31 Мая, 2012 - 08:24:31
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Сегодня постараюсь отписать, что вчера придумал.
А вот тут про COUNT(*) VS SQL_CALC_FOUND_ROWS
Цитата:
http://www.askdev.ru/mysql/763/Количество-записей-в-таблице-count-vs-SQL_CALC_FOUND_ROWS/

(Отредактировано автором: 31 Мая, 2012 - 08:25:49)

 
 Top
etoYA
Отправлено: 31 Мая, 2012 - 10:20:24
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg пишет:
А вот тут про COUNT(*) VS SQL_CALC_FOUND_ROWS

Немогу понять где бред, а где правда.

Везде пишут по разному, но везде говорят, что COUNT(*) удобней и практичней, а разности в скорости никакой, а где по другому.. Растерялся

(Отредактировано автором: 31 Мая, 2012 - 10:32:32)

 
 Top
tuareg
Отправлено: 31 Мая, 2012 - 10:42:35
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




etoYA пишет:
tuareg пишет:
А вот тут про COUNT(*) VS SQL_CALC_FOUND_ROWS

Немогу понять где бред, а где правда.
Везде пишут по разному, но везде говорят, что COUNT(*) удобней и практичней, а разности в скорости никакой..

По ссылке есть пример.~15000 строк.
Теперь если подумать Улыбка
Что происходит при запросе(примеры я взял у DeepVarvar)
PHP:
скопировать код в буфер обмена
  1.  
  2. $res = query("SELECT SQL_CALC_FOUND_ROWS * FROM ($query) TBL LIMIT $limit, $perpage");
  3.  

Будет полная выборка (fullscan) таблицы причем она будет читаться полностью.(просто отдаст только LIMIT)
Вариант
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT COUNT(1) FROM `table`;
  3.  

Читать таблицу не надо(если есть индекс по id), а только посмотреть дерево индексов
Отсюда и разница
P.S Это только я так думаю Радость
P.P.S Сейчас глянул EXPLAIN запроса.
С SQL_CALC_FOUND_ROWS как и думал просмотрена вся таблица(столбик rows) EXTRA ничего не пишет
С COUNT(1) столбик rows--> NULL, EXTRA-->"Select tables optimized away"
 
 Top
etoYA
Отправлено: 31 Мая, 2012 - 10:42:49
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT SQL_CALC_FOUND_ROWS `u`.*, `g`.`name` AS `group` FROM `users` `u` INNER JOIN `groups` `g` ON `u`.`group` = `g`.`id` ORDER BY `id` ASC LIMIT 1, 5

Запрос на моем говнокомпьютере выполняется от 0.0020 - 0.0035 сек.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT SQL_CALC_FOUND_ROWS * FROM ($query) TBL LIMIT $limit, $perpage[//code]
  2. Если вместо $query вставить [code=SQL]SELECT `u`.*, `g`.`name` AS `group` FROM `users` `u` INNER JOIN `groups` `g` ON `u`.`group` = `g`.`id` ORDER BY `id` ASC


Ошибка: #1060 - Duplicate column name 'group'

CODE (htmlphp):
скопировать код в буфер обмена
  1. SELECT `u`.*, `g`.`name` AS 'group' FROM `users` `u` INNER JOIN `groups` `g` ON `u`.`group` = `g`.`id` ORDER BY `id` ASC


Этот запрос 0.0010 - 0.0017 сек
 
 Top
tuareg
Отправлено: 31 Мая, 2012 - 10:49:58
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Если мало ли не видел, смотри мой пост перед твоим
 
 Top
etoYA
Отправлено: 31 Мая, 2012 - 11:01:07
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg, я это уже тоже смотрел)
 
 Top
tuareg
Отправлено: 31 Мая, 2012 - 11:08:11
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




etoYA пишет:
tuareg, я это уже тоже смотрел)

Вот и получается разница в 2 раза
 
 Top
Страниц (3): « 1 [2] 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB