Я хотел бы реализовать пейджинг в PHP. У меня есть набор результатов из db, пусть это будет массив. Мне нужен пейджинг, который должен отображать 4 записи на страницу, а номера страниц должны быть следующих
"<< 1,2,3 ….. 20 >>"
и когда вы выбираете страницу 2, тогда формат должен быть следующего
"<< 3,4,5 ….. 20 >>"
можете ли вы, ребята, предложить мне некоторые концепции подкачки, чтобы реализовать это?
Вы действительно можете использовать предложение LIMIT
в SQL для этого.
Вот достойный учебник, чтобы вы начали.
Посмотрите на PEAR :: Pager .
Получение результатов достаточно просто, используя ограничение, указанное выше, на основе номера страницы. Вы можете использовать цикл для распечатки номеров страниц.
Сначала скажите, что номер страницы отправляется как page = 2 в строке запроса.
$pagenum=(int)$_GET['page']; if($pagenum<1){ $pagenum=1; }//perform a sanity check. You might also query to find the max page number and see that it's not higher than that.
Затем вы вставляете pagenum в свой SQL-запрос в качестве смещения, после умножения его на количество результатов на страницу за вычетом результатов на страницу.
Практически в каждом случае следует использовать подготовленный оператор для ввода, используя поставляемые параметры в SQL, конечно, однако в этом случае это не является строго необходимым, так как вы уверены, что переменная является int из-за кастинга (часть (int)). Просто нужно было подчеркнуть это.
Скажем, у вас есть 4 элемента на странице. Вы можете использовать два аргумента для LIMIT или LIMIT и OFFSET отдельно. Если вы используете только ограничение, первое число – это смещение, второе – количество результатов.
$offset=$pagenum*4-4;//this means for page 1, start on 0, page 2 starts on 4, etc. $sql="select * from the_table limit $offset,4";
Таким образом, вы получаете данные для заданного номера страницы. Затем печатать номера страниц – это еще одна история. Этот пример основан на том, как вы хотите, чтобы страницы выглядели так, как описано выше.
for($i=pagenum+1;$i<20;$i++){ if($i<$pagenum+4){ ?> <a href='stuff.php?page=<?php echo $i;?>'><?php echo $i;?></a> <?php } elseif($i==$pagenum+4) { ?> ... <?php } elseif($i==20){ ?> <a href='stuff.php?page=20'>20</a> <?php } ?>
Я бы рекомендовал использовать стандартизованную библиотеку. Игнасио рекомендовал библиотеку PEAR :: Pager, но я частично отношусь к Zend_Paginator в Zend Framework.
В библиотеку входит множество адаптеров, а на Github – другие, для использования разных источников данных.
Это будет наиболее эффективно, если вы справитесь с этим в Db, а в коде доступа к данным u может иметь функцию, которая принимает такие аргументы, как pageSize, PageNumber, sortOrder. Ваш sql мог бы выглядеть примерно так:
SELECT * FROM your_table WHERE condition = true ORDER BY some_field LIMIT 100, 10