Нет, но было бы неплохо если бы так получилось) Вообще, у меня есть небедный опыт в PHP, Zend, yii и прочем, знаю ньюансы и подводные камни. Не все, но большинство. Может кому-то да пригодится.
есть опыт? попиарить сайт? тогда вам придётся поучаствовать в ответах на вопросы новичков и не только. велкам search.php?search_id=unreadposts
http://www.php.ru/forum/viewtopic.php?f=1&t=449&p=3670&hilit=Аватары#p3670 Swapf, посмотри, обязательно.) P.S. Нужно темы все сделать только с ответами или несколькими вариантами на решения, все остальное удалить "комментарии и мусор". =)))
Добавлю и от себя кусочек. Пагинатор немного отличается от стандартного. Например, если всего записей 42 и мы выводим по 10 элементов на страницу, то будет отображено 4 страницы, и на последней будет выведено 12 элементов, но все зависит от параметра $CountAfterMax. Массив, которые получим из функции, можно передавать в функции, которые делают выборку из БД, и использовать ключи limit и offset. Также в ключе pages содержится массив, в котором есть необходимая информация для вывода ссылок на страницы. Вывести можно примерно так: Код (Text): <?php <div class="pagin"> <?php foreach( $Pagin['pages'] as $PgRow ) : ?> <?php if ( $PgRow['islink'] ) : ?> <a href="<?=$Pagin['page'].$PgRow['link'];?>/" rel="<?=$PgRow['link']?>"><?=$PgRow['text'];?></a> <?php else : ?> <span><?=$PgRow['text'];?></span> <?php endif ; ?> <?php endforeach;?> </div> ?> Код (Text): /* <?php @param ($Page) - номер станицы @param ($Count) - количество записей всего @param ($Link) - ссылка вида http://site.ru/page/12/page/ @param ($Gets) - строка, которая идет после ? (GET-параметры) @param ($Count2Page) - количество выводимых на страницу элементов @param ($CountAfterMax) - кол-во элементов, которые могут выводиться после максимально выводимого кол-ва на страницу. Например, если на страницу выводится по пять элементов, а на последней осталось 6 элементов, то выведется 6 (ПРИ УСЛОВИИ ЧТО $CountAfterMax => 1) @param ($CountLinks) - количество ссылок выводимых в пагинаторе @param ($interval) - показывать текст ссылки в виде интервала 1-10, 11-21 ... @param ($sep) - разделитель, в случае если ссылки выводятся интервалами возвращает массив, где pages - массив: text - текст ссылки link - номер страницы islink - ссылка или span(текущая страница) page - возвращаем 3- входной параметр (сслыка) limit - кол-во выбираемых элементов из БД offset - смещение в запросе к БД gets - 4-й входной параметр (GET-параметры) */ function Pagin( $Page, $Count, $Link, $Gets='', $Count2Page=10, $CountAfterMax=3, $CountLinks=10, $interval=false, $sep='-' ){ $res = array(); $limit = $Count2Page; if ( $Count2Page >= $Count || $Page < 1 ) return $res; $allPage = ceil( $Count/$Count2Page ); $ost = $Count % $Count2Page; if ( $ost <= $CountAfterMax && $ost!=0 ) /* $Count <= ($Count2Page+$CountAfterMax) */ $allPage = $allPage-1; if ( $allPage == 1 ) return $res; $i=1; $lastPage = $allPage; if ( $lastPage > $CountLinks ) { $i = intval( $Page - ( $CountLinks/2 ) ); $lastPage = $i + $CountLinks; if ( $lastPage > $allPage ) { $lastPage = $allPage; $i = $lastPage-$CountLinks; } if ( $i < 1 ) { $i = 1; $lastPage = $CountLinks; } } if ( $lastPage==$Page ) $limit += $ost; $offset = ($Page-1) * $Count2Page; for ( ; $i<=$lastPage; $i++) { $res[$i] = array(); $disp = $i; if ( $interval ) { $disp = (($i-1)*$Count2Page+1) . $sep; if ( $i==$allPage ) $disp .= $Count; else $disp .= (($i-1)*$Count2Page+$Count2Page); } $res[$i]['text'] = $disp; $res[$i]['link'] = $i; if ( $i==$Page ) { $res[$i]['islink'] = false; continue; } $res[$i]['islink'] = true; } if ( $Page > 1 ) { $prev = array( 'text' => '<' , 'link' => $Page-1, 'islink' => true ); $first = array( 'text' => '<<' , 'link' => 1, 'islink' => true ); array_unshift( $res, $first, $prev ); } if ( $Page < $lastPage ) { $next = array( 'text' => '>' , 'link' => $Page+1, 'islink' => true ); $last = array( 'text' => '>>' , 'link' => $allPage, 'islink' => true ); array_push( $res, $next, $last ); } $res = array('pages' => $res); $res['page'] = $Link; $res['limit'] = $limit; $res['offset'] = $offset; $res['gets'] = ($Gets=='') ? '' : ('?'.$Gets); return $res; } ?>
Я уже вообще забыл, что такое постраничная навигация =))) Есть куда круче решение уже. Таже кнопка "показать еще", запомнить пост, новость и т.д. (смотря, для чего эта кнопка принадлежит). Помучили пагинацию и хватит =)
И чтож, будет^^ ООО великий программист! Да хоть 100500-это пох. Походу ты тронулся или не дочитал, или не понял или тупишь. Вариантов много, предположений тоже. Но ляпнул ты хуйню.
Т.е. ты думаешь, я полагаю, что это сложно реализовать? Как тебе такой вариант. Ты забыл подумать о людях, которые будут 500 раз тыкать "показать еще" и проклинать тебя и твоих детей. =) Ну и кто теперь тупит? Добавлено спустя 1 минуту 40 секунд: и да, "ты тупишь" тянет на оскорбление, даже в предположительной форме. Если тебя кто-то бесит - так и пиши, мол ты меня бесишь. Перестань оскорблять окружающих.
Для тебя-это не возможно. Тупишь ты и только ты. Кто сказал, что это простая кнопка тыкалка даже без сохранений и плюшек? ТЫ РЕАЛ ТРОНУЛСЯ! Что ты так будешь каждую страницу просматривать все 500 тыкать -> следующая, следующая, следующая. Я теперь понял, ты когда пишешь не читаешь и не думаешь. ТЫ ПРОСТО ПИШЕШЬ! Ой, ой, ой, еще бан дай мне, ЛОЛ! Меня никто не бесит, я не бешусь никогда, я не псих. Но когда такие как ты, конченые пытаются выражать свои мысли и у них не получается этого сделать, а потом еще и пытаются ерничать-это тупо. По-этому скажу тебе прямо, твое мнение ничего не значит как и ты сам. ОЧНИСЬ!
А я вообще по другому сделал за счёт, ajax. Я отправляю аяксом запрос сколько у меня, на странице выводится, и формирую пейджинг ну формирую, саму навигацию, а потом уже формирую исходя из нажатой кнопки навигации, то есть конечное кол-во показаных товаров, и от неё уже делаю новым запросом выборку по лимит, до того по куда установлено количество, которое нужно показывать.
Короче вчера чё то сел писать пагинацию для своего проекта... Сильно в детали не уходил. И есть местами дублёж кода из-за того что всё писал в контроллере, а после из-за не достатка времени просто побыстрому пробросил всё в функцию. Но кому не лень может убрать дублёж и разделить всю функцию ещё на под функции а так в студию класс Pagination. PHP: <?php /** * Created by PhpStorm. * User: askanim * Date: 13.09.17 * Time: 9:44 */ namespace Application\System\Facade; class Pagination { private $start = 1; private $end = Null; private $countRows = Null; private $currentPage = Null; private $countPages = Null; private $nextPage = 1; private $prevPage = 1; private $allPage = 3; private $error = []; private $first = []; private $last = []; private $maxRow = 6; public function __construct($countRows, $currentPage, $nextPage, $prevPage, $maxRow = 6) { if (!is_int($countRows) or !is_int($currentPage) or !is_int($nextPage) or !is_int($prevPage)) $this->error[] = 'input argument not integer'; if (is_int($maxRow)) $this->maxRow = $maxRow; $this->countRows = $countRows; $this->currentPage = $currentPage; $this->nextPage = $nextPage; $this->prevPage = $prevPage; $this->countPages = ceil($countRows/$maxRow); $this->end = $this->countPages; $this->allPage = ($this->nextPage+$this->prevPage)+1; } public function getError () { return $this->error; } public function getPagination () { $newPageArray = []; if($this->start == $this->end) { $newPageArray[] = [ 'numberPage' => 1, 'current' => 1 ]; } if($this->countPages > ($this->allPage)) { if($this->currentPage == $this->start) { $this->last = [ 'number' => $this->end, 'active' => 0 ]; for ($i=$this->currentPage;$i<=$this->allPage;$i++) { $newPageArray[$i]['numberPage'] = $i; if ($i==$this->currentPage){ $newPageArray[$i]['current'] = 1; } else { $newPageArray[$i]['current'] = 0; } } } if ($this->currentPage == $this->end) { $this->first['number'] = $this->start; $this->first['active'] = 0; $all = $this->currentPage - $this->all; for ($i=$this->currentPage;$i>$all;$i--) { $newPageArray[$i]['numberPage'] = $i; if ($i==$this->currentPage){ $newPageArray[$i]['current'] = 1; } else { $newPageArray[$i]['current'] = 0; } } } if ($this->currentPage > $this->start and $this->currentPage < $this->end) { $this->first['number'] = $this->start; $this->first['active'] = 0; $this->last['number'] = $this->end; $this->last['active'] = 0; $iter = 0; $prevIter = 1; $nextIter= 1; for ($i=0;$i<$this->prevPage;$i++){ $p = $this->currentPage - $prevIter; if ($p == $this->start) break; $newPageArray[$iter]['numberPage'] = $p; $iter++; $prevIter++; } $newPageArray = array_reverse($newPageArray); $iter++; $newPageArray[$iter]['numberPage'] = $this->currentPage; $newPageArray[$iter]['current'] = 1; for ($i=0;$i<$this->nextPage;$i++) { $iter++; $n = $this->currentPage + $nextIter; if($n == $this->end) break; $newPageArray[$iter]['numberPage'] = $n; $nextIter++; } } } else{ for ($i=0;$i<$this->countPages;$i++) { $newPageArray[$i]['numberPage'] = $i+1; $n = $i+1; if ($this->currentPage == $n) { $newPageArray[$i]['current'] = 1; }else { $newPageArray[$i]['current'] = 0; } } } return $newPageArray; } public function getLast () { return $this->last; } public function getFirst () { return $this->first; } } --- Добавлено --- Когда в таблице много строк, и общее число выдаваемых страницы уходит за 20 и далее. Выводить все страницы навигации глупо. Поэтому в моём классе предусмутрены произвольно задаваемые плавающие числа PHP: $this->prevPage и PHP: $this->nextPage В результате чего мы получаем центральную страницу и несколько страниц от неё вперёд и назад. А так же мы имеем свойства Класса как first и last Что это значит? Это информация о первой и последней странице в ней всего два параметра номер самой страницы и активная она или нет. Так же скажу Что когда этим массивы пусты это означает что. Текущая страница равна первой или последней в зависимости от пустоты массива.
Поубивать бы тех людей, кто делает автоматическую пагинацию, например, как в ленте вконтакте или в инстаграмме. Листаю я 20 минут, случайно не туда нажал, страница перезагрузилась и триндец.
Помогите, сейчас не выводится первая запись, то есть выводится не с 0, а с 1, почему так? PHP: $count = 1; //кличество записей на страницу if(!empty($_GET['page'])) { $start = $_GET['page'] * $count; } else { $start = 0; } $countRec = "SELECT COUNT(id) AS count FROM records"; $countRes = mysqli_query($link, $countRec) or die(mysqli_error($link)); $res = mysqli_fetch_assoc($countRes); $resZap = $res['count'] / $count; // количество всех статей //--> код пагинатора mysqli_query($link, "SET NAMES 'utf8'"); $allRecord = "SELECT * FROM `records` LIMIT " . $start. ", " . $count; PHP: if($start - 4 > 0) $page4left = '<a href=?page='. ($start - 4) .'>'. ($start - 4) .'</a> '; else $page4left = null; if($start - 3 > 0) $page3left = '<a href=?page='. ($start - 3) .'>'. ($start - 3) .'</a> '; else $page3left = null; if($start - 2 > 0) $page2left = '<a href=?page='. ($start - 2) .'>'. ($start - 2) .'</a> '; else $page2left = null; if($start - 1 > 0) $page1left = '<a href=?page='. ($start - 1 ) .'>'. ($start - 1) .'</a> '; else $page1left = null; if($start + 1 <= $resZap) $page1right = '<a href=?page='. ($start + 1) .'>'. ($start + 1) .'</a> '; else $page1right = null; if($start + 2 <= $resZap) $page2right = '<a href=?page='. ($start + 2) .'>'. ($start + 2) .'</a> '; else $page2right = null; if($start + 3 <= $resZap) $page3right = '<a href=?page='. ($start + 3) .'>'. ($start + 3) .'</a> '; else $page3right = null; if($start + 4 <= $resZap) $page4right = '<a href=?page='. ($start + 4) .'>'. ($start + 4) .'</a> '; else $page4right = null; echo $page4left . $page3left . $page2left . $page1left . ' ' . $start .' ' . $page1right . $page2right . $page3right . $page4right;
Эхехе..китайский код, ну приехали. Для начала - отрефактори второй выложенный код на нормальные функции хотя бы. А во-вторых, подключи дебаггер и протрейси логику своего кода построчно, проверяя каждый шаг и переменные в рантайме. Этот метод поиска ошибок гораздо эффективнее надежды на телепатов из интернета, гадающих по обрывкам кода.
Вот мой пагинатор, оцените PHP: $num = 2; //кличество записей на страницу if(!empty($_GET['page'])) { // 0 это пусто, так что сработает else $page = $_GET['page']; } else { $page = 1; } $start = $page * $num - $num; //если не отнять 1, то отсчёт будет не с 1, а со 2 $countRec = "SELECT COUNT(id) AS count FROM subject"; $countRes = mysqli_query($link, $countRec) or die(mysqli_error($link)); $resCount = mysqli_fetch_assoc($countRes); //если сделать без выборки, то некоторые штуки перемешаются (*) $sql = "SELECT subject.id, subject.title, subject.description, subject.author, subject.data, COUNT(answers.subject_id) AS countAnswer FROM subject LEFT JOIN answers on subject.id = answers.subject_id GROUP BY subject.title ORDER BY subject.id LIMIT " . $start. ", " . $num; $total = intval(($resCount['count'] - 1) / $num) + 1; $query = mysqli_query($link, $sql) or die(mysqli_error($link)); PHP: <?php //цифра 3 это количество следующих страниц if(!empty($_GET['page'])){ if(($_GET['page'] + 3) <= $total) { $countPag = $_GET['page'] + 3; } else { $countPag = $total; } $prev = $_GET['page'] - 1; if($_GET['page'] != 1) { echo '<a href=?page='. $prev .'>Назад</a>'; } if($_GET['page'] > 1) { //это для предыдущих страниц (можно удалить полностью условие, тогда их не будет) $prevPage = $_GET['page'] - 1; $arr = []; for($j = $prevPage; $j >= 1; $j--) { $arr[] = $j; } $newArr = array_reverse($arr); $output = array_slice($newArr, -3, 3); foreach($output as $key => $val) { echo '<a href=?page='.$val.'>'. $val .'</a>'; } } for($i = $_GET['page']; $i <= $countPag; $i++) { if($_GET['page'] == $i) { echo '<span class="active">' . $i .'</span>'; } else { echo '<a href=?page='.$i.'>'. $i .'</a>'; } } $next = $_GET['page'] + 1; if($_GET['page'] != $total) { echo '<a href=?page='. $next .'>Далее</a>'; } } else { for($i = 1; $i <= 3; $i++) { if($i == 1) { echo '<span class="active">' . $i .'</span>'; } else { echo '<a href=?page='.$i.'>'. $i .'</a>'; } } echo '<a href=?page=2>Далее</a>'; } ?>
1) Сначала научись сам кодить, а не копипастить, а потом уже выкладывай решения свои на публику. 2) А ты вопрос этот сам себе не задавал? Ну вот просто "а зачем делать die(mysqli_error)"? В чем смысл этого? В чем вообще смысл убивать скрипт при первом же непрошедшем запросе? Ну вот я на твоем сайте сижу и что-то вот пошло не так и запрос завалился. И что мне, простому пользователю, даст твое сообщение об ошибке на странице? 3) Зачем это вот countRes и resCount. Мб можно иначе сделать? Или тоже копипаста?