от поиска перебором по тексту в любом случае надо уходить. а в данном случае SELECT COUNT(*) будет уместен.
> Рисовать ссылки `назад` и `вперед`, поиск все-таки а не просмотр рейтингов. более того, такой схемы достаточно для 99% возможных применений пейджэра
> CI, кодировки, латиница/кирилица - в одно время меня достали, и больше ничем кроме `пустого` REGEXP не пользуюсь. индексы тебя тоже, я смотрю, достали?
Это не мне объясняй, а богатому дяде который видел что "На Яндексе после поиска все страницы видны". На все индексы не повесишь. А меня вообще жизнь достала , сейчас еще триггеры сяду писать на mysql - запомните меня добрым и веселым :twisted:. Не уходите от темы постраничного вывода!
Лично высеку тебе памятник если ты мне здесь найдешь заказчика который будет работать с другой страной, если есть возможность вживую пообщаться с местными фирмами. Кстати энтэрнэт у нас тут 4 мб у каждого третьего, а если у вас на форуме с этим такие серьезные психологические проблемы - я русский. Мне пофиг, могу и на англоязычных форумах посидеть (ёж птица гордая, не пнешь - не полетит ).
писал года 2 назад PHP: <?php Class Scroller { public $itemsCount = 0, $limit, $pageCount, $currentPage, $currentPageNumber, $currentPageName, $offset, $direction, $firstPage, $lastPage, $formName; function Scroller($itemsCount, $itemsPerPage, $formName, $direction, $page = 0){ $this->formName = empty($formName) ? "page" : $formName; $this->page = empty($page) ? $_REQUEST[$this->formName] : $page; $this->itemsCount = (int)$itemsCount; $this->limit = (int)$itemsPerPage; $this->pageCount = ceil($this->itemsCount / $this->limit); if((int)$direction < 0){ $this->currentPage = !(int)$this->page && $this->page != "0" ? $this->pageCount : $this->page; if($this->currentPage > $this->pageCount){ $this->currentPage = $this->pageCount; } else { if($this->currentPage < 1) $this->currentPage = 1; } $this->currentPageNumber = $this->pageCount - $this->currentPage + 1; $this->currentPageName = $this->currentPageNumber; if($this->pageCount && $this->currentPage < $this->pageCount){ $this->isFullPage = $this->itemsCount % $this->limit ? 1 : 0; $this->offset = $this->itemsCount % $this->limit + ($this->pageCount - $this->currentPage - $this->isFullPage) * $this->limit; } else { $this->offset = 0; } $this->direction = "-1"; $this->firstPage = $this->pageCount; $this->lastPage = 1; } else { $this->currentPage = !(int)$this->page && $this->page != "0" ? 1 : $this->page; if($this->currentPage > $this->pageCount){ $this->currentPage = $this->pageCount; } else { if($this->currentPage < 1) $this->currentPage = 1; } $this->currentPageNumber = $this->currentPage; $this->currentPageName = $this->currentPage; $this->direction = "+1"; $this->firstPage = 1; $this->lastPage = $this->pageCount; $this->offset = $this->pageCount ? ($this->currentPage - 1) * $this->limit : 0; } } function show($params = 0){ $sReturn = ""; if($this->pageCount >1){ if(isset($params["mode"])) $this->mode = $params["mode"]; $this->navCount = (int)$params["navCount"] ? $params["navCount"] : 5; $this->firstNav = $this->currentPageNumber - floor($this->navCount / 2); if($this->firstNav < 1) $this->firstNav = 1; $this->lastNav = $this->firstNav + $this->navCount - 1; if($this->lastNav > $this->pageCount){ $this->lastNav = $this->pageCount; $this->firstNav = $this->lastNav - $this->navCount; if($this->firstNav < 1) $this->firstNav = 1; } $this->separator = isset($params["separator"]) ? $params["separator"] : "…"; $qupos = strpos($params["targetUrl"], "?"); $this->urlSeparator = $qupos !== false ? "&" : "?"; if(isset($params["tagName"])) $sReturn .= "<" . $params["tagName"] . " " . $params["tagAttr"] . " >"; $this->title = isset($params["title"]) ? $params["title"] : "Страницы: "; if($this->mode == "html"){ $sReturn .= $this->title; } else { $sReturn = "<title>" . $this->title . "</title>"; if(isset($params["leftDivider"])) $sReturn .= "<left-divider>" . $params["leftDivider"] . "</left-divider>"; if(isset($params["rightDivider"])) $sReturn .= "<right-divider>" . $params["rightDivider"] . "</right-divider>"; } if($this->currentPage != $this->firstPage){ $backName = isset($params["backName"]) ? $params["backName"] : "← Назад"; $sReturn .= $this->_printNavItem("back", $backName, $params["targetUrl"], $this->urlSeparator, $this->currentPage - $this->direction); if($this->mode == "html" && isset($params["leftDivider"])) $sReturn .= $params["leftDivider"]; } if($this->firstNav > 1){ $sReturn .= $this->_printNavItem("first", 1, $params["targetUrl"], $this->urlSeparator, $this->firstPage); if($this->firstNav > 2) $sReturn .= $this->_printNavItem("separator", $this->separator); } for ($i = $this->firstNav; $i <= $this->lastNav; $i++) { $current = ""; $ipage = $this->direction < 0 ? $this->pageCount - $i + 1 : $i; if($ipage == $this->currentPage) $current = "current"; $sReturn .= $this->_printNavItem($current, $i, $params["targetUrl"], $this->urlSeparator, $ipage); } if($this->lastNav < $this->pageCount){ if($this->lastNav < $this->pageCount - 1) $sReturn .= $this->_printNavItem("separator", $this->separator); $sReturn .= $this->_printNavItem("last", $this->pageCount, $params["targetUrl"], $this->urlSeparator, $this->lastPage); } if($this->currentPage != $this->lastPage){ if($this->mode == "html"){ $sReturn .= isset($params["rightDivider"]) ? $params["rightDivider"] : "|"; } $forwardName = isset($params["forwardName"]) ? $params["forwardName"] : "Дальше →"; $sReturn .= $this->_printNavItem("forward", $forwardName, $params["targetUrl"], $this->urlSeparator, $this->currentPage + $this->direction); } if(isset($params["tagName"])) $sReturn .= "</" . $params["tagName"] . " >"; } return $sReturn; } function _printNavItem($type, $name, $url = "", $urlSeparator = "", $pageNum = ""){ $sReturn = ""; if($this->mode == "html"){ if($type == "separator"){ $sReturn = "\n<span class=\"separator\">".$name."</span>\n"; } elseif($type != "current" && (int)$pageNum) { $sReturn .= "\n<a href=\""; $sReturn .= !empty($url) ? $url : "./"; if($pageNum != $this->firstPage) $sReturn .= $urlSeparator.$this->formName."=".$pageNum; $sReturn .= "\""; if(empty($type) || $type == "first" || $type == "last") $sReturn .= " class=\"scrollerPage\""; $sReturn .= ">".$name."</a>\n"; } else { $sReturn = "\n<span class=\"scrollerCurrentPage\">".$name."</span>\n"; } } else { $sReturn = "<page "; if(isset($type)) $sReturn .= 'type="'.$type.'" '; if($type != "current" && !empty($pageNum)){ $sReturn .= 'href="'; !empty($url) ? $sReturn .= $url : $sReturn .= "./"; if($pageNum != $this->firstPage) $sReturn .= $urlSeparator.$this->formName.'='.$pageNum; $sReturn .= '" num="'.$name.'" '; } $sReturn .= "/>"; } return $sReturn; } } ?> примерный вызов PHP: <?php // default params $aParams = array( "lang_id" => $oSiteCurrentLanguage->id, "group_id" => $aCurrentSection['groupID'], "is_active" => 1 ); // get articles count $rowCount = Article::get($aParams + array("count" => true)); // init scroller $oScroller = new Scroller($rowCount, 10, 'page', 1); // scroller params $hScrollerParams = array( "targetUrl" => getScrollerPath('page'), "navCount" => 5, "mode" => "html", "title" => "##Pages##: ", "backName" => "##PreviousPage##", "forwardName" => "##NextPage##" ); echo $oScroller->show($hScrollerParams); $articles = Article::get($aParams + array( "limit" => $oScroller->limit, "offset" => $oScroller->offset )); ?>
аап! И еще: почему все делают нумерацию страниц новостей 1 2 3 ... а не ... 3 2 1 ? Ведь самый новый, по идее, контент располагается на первой странице. Ну гляньте как это на Хабрахабре и на любом сайте, построенном на DLE, думаю поймете, о чем я. upd: ну не все, а почти все)
Kreker знаешь хоотя б одно очень важное преимущество такого способа? 1) Контент не будет "плавающим" по страницам. Если он на 3 странице, то и с добавлением 100 новостей так и останется на 3 странице, а не "уползет" на 13-ю. секундочку, а почему же тогда мы начинаем вывод с последней новости, а не с первой?
Koc Полностью с вами согласен, осталось только придумать как решить задачу: сегодня /news/ отображает вторую страницу, завтра - третью
в моем коде это уже решено) просто передаете направление скроллера PHP: function Scroller($itemsCount, $itemsPerPage, $formName, $direction, $page = 0) параметр дайрекшн. если 1, то нумерация с конца, если -1, то с начала.
Вот мой вариант PHP: function page($all_data, $str, $po_kilk_str, $po_kilk_data) { $url="http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; $url=preg_replace("/\&str=(\d+)/isU", "", $url); $kilk_str=ceil($all_data/$po_kilk_data); $begin=$str-$po_kilk_str/2; $end=$str+$po_kilk_str/2; if ($kilk_str<=$po_kilk_str) { $begin=1; $end=$kilk_str; } else { if ($begin<=0) {$begin=1;} if ($str<$po_kilk_str/2) { $end=$po_kilk_str;} if ($str+$po_kilk_str/2>$kilk_str) {$end=$kilk_str; $begin=$kilk_str-$po_kilk_str;} } print "<table width=100%>\n"; print "<tr><td>"; for ($i=$begin;$i<=$end;$i++) { if ($str==$i) {$b_begin="<b>";$b_end="</b>";} else {$b_begin="";$b_end="";} print " <a href=$url&str=$i>$b_begin$i$b_end</a> "; } print "</td></tr>"; print "</table>\n"; } page($all_data, $str, $po_kilk_str, $po_kilk_data); $all_data - всего записей $str - текущая страница $po_kilk_str - по сколько ссылок на страници показывать $po_kilk_data - по сколько записей выводить Прошу сильно не критиковать!
Угу, и 21-я новость при 20 элементах на странице будет висеть одинеханька. Очень красиво. Эта писец, не подпускайте программистов к проектированию интерфейсов, одному "вперед - назад" достаточно, другой газеты с конца читает. Жжж...
И? Там, по-вашему, новости не уезжают со своих номеров страниц? Проверьте А то, что они нумеруются назад - никакого облегчения никому не приносит. Читаем мы с первой страницы до последней и с новейшей новости до старейшей - так уж приучены, - отсюда и нумерация с первой.
idNews: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21 Показ начинается с 3 page 3rd page: 21, 20, 19, 18, 17, 16, 15, 14, 13, 12 2nd page: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 1st page: 1 Ну и что тут такого? В большинстве случаев сейчас так: 1st page: 21, 20, 19, 18, 17, 16, 15, 14, 13, 12 2nd page: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 3rd page: 1 idNews: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 4th page: 31, 30, 29, 28, 27, 26, 25, 24, 23, 22 3rd page: 21, 20, 19, 18, 17, 16, 15, 14, 13, 12 2nd page: 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 1st page: 1 Что и куда уехало?