Paging code php mysql
Постраничный вывод на PHP и MySQL
Пагинация PHP позволяет разделять данные по частям и получить ссылки на страницы. В этом руководстве мы расскажем, как создать простое разбиение на страницы в PHP и MySQL . Чтобы обеспечить повторное использование скрипта, мы создадим класс Pagination .
В примере мы получим данные из таблицы постов в базе данных MySQL и отобразим их со ссылками на другие публикации. На странице будет запрашиваться и отображаться только часть записей из базы данных MySQL .
Перед тем, как мы начнём, взгляните на структуру файлов проекта.
Создание таблицы базы данных
Следующий SQL-запрос создаёт таблицу posts в базе данных MySQL с основными столбцами.
CREATE TABLE `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1=Active, 0=Inactive', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Класс Pagination генерирует ссылки на страницы. Для настройки вида ссылок доступны различные параметры конфигурации PHP пагинации страниц.
- $baseURL–URL веб-страницы.
- $totalRows–общееколичествоэлементов.
- $perPage–количествозаписейнастранице.
- $numLinks–количествоотображаемыхссылок.
- $firstLink–текстссылкинапервуюстраницу.
- $nextLink–текстссылкинаследующуюстраницу.
- $prevLink–текстссылкинапредыдущуюстраницу.
- $lastLink–текстссылкинапоследнююстраницу.
- $fullTagOpen–открывающийтэгблокассылок.
- $fullTagClose–закрывающийтэгблокассылок.
- $firstTagOpen–открывающийтэгпервогоэлемента.
- $firstTagClose–закрывающийтэгпервогоэлемента.
- $lastTagOpen–открывающийтэгпоследнегоэлемента.
- $lastTagClose–закрывающийтэгпоследнегоэлемента.
- $curTagOpen–открывающийтэгтекущегоэлемента.
- $curTagClose–закрывающийтэгтекущегоэлемента.
- $nextTagOpen–открывающийтэгследующегоэлемента.
- $nextTagClose–закрывающийтэгследующегоэлемента.
- $prevTagOpen–открывающийтэгпредыдущегоэлемента.
- $prevTagClose–закрывающийтэгпредыдущегоэлемента.
- $numTagOpen–открывающийтэгчисловогоэлемента.
- $numTagClose–закрывающийтэгчисловогоэлемента.
- $showCount–показыватьколичествостраниц.
- $queryStringSegment–флагстрокизапросастраницыпри пагинации PHP MySQL .
'; protected $fullTagClose = '
'; protected $firstTagOpen = ''; protected $firstTagClose= ' '; protected $lastTagOpen = ' '; protected $lastTagClose = ''; protected $curTagOpen = ' '; protected $curTagClose = ''; protected $nextTagOpen = ' '; protected $nextTagClose = ' '; protected $prevTagOpen = ' '; protected $prevTagClose = ''; protected $numTagOpen = ' '; protected $numTagClose = ''; protected $showCount = true; protected $currentOffset= 0; protected $queryStringSegment = 'page'; function __construct($params = array()) < if (count($params) >0)< $this->initialize($params); > > function initialize($params = array()) < if (count($params) >0) < foreach ($params as $key =>$val)< if (isset($this->$key))< $this->$key = $val; > > > > /** * Генерируем ссылки на страницы */ function createLinks()< // Если общее количество записей 0, не продолжать if ($this->totalRows == 0 || $this->perPage == 0) < return ''; >// Считаем общее количество страниц $numPages = ceil($this->totalRows / $this->perPage); // Если страница только одна, не продолжать if ($numPages == 1)< if ($this->showCount)< $info = 'Showing : ' . $this->totalRows; return $info; >else < return ''; >> // Определяем строку запроса $query_string_sep = (strpos($this->baseURL, '?') === FALSE) ? '?page=' : '&page='; $this->baseURL = $this->baseURL.$query_string_sep; // Определяем текущую страницу $this->currentPage = $_GET[$this->queryStringSegment]; if (!is_numeric($this->currentPage) || $this->currentPage == 0)< $this->currentPage = 1; > // Строковая переменная вывода контента $output = ''; // Отображаем сообщение о ссылках на другие страницы if ($this->showCount)< $currentOffset = ($this->currentPage > 1)?($this->currentPage - 1)*$this->perPage:$this->currentPage; $info = 'Показаны элементы с ' . $currentOffset . ' по ' ; if( ($currentOffset + $this->perPage) < $this->totalRows ) $info .= $this->currentPage * $this->perPage; else $info .= $this->totalRows; $info .= ' из ' . $this->totalRows . ' | '; $output .= $info; > $this->numLinks = (int)$this->numLinks; // Если номер страницы больше максимального значения, отображаем последнюю страницу if($this->currentPage > $this->totalRows)< $this->currentPage = $numPages; > $uriPageNum = $this->currentPage; // Рассчитываем первый и последний элементы $start = (($this->currentPage - $this->numLinks) > 0) ? $this->currentPage - ($this->numLinks - 1) : 1; $end = (($this->currentPage + $this->numLinks) < $numPages) ? $this->currentPage + $this->numLinks : $numPages; // Выводим ссылку на первую страницу if($this->currentPage > $this->numLinks)< $firstPageURL = str_replace($query_string_sep,'',$this->baseURL); $output .= $this->firstTagOpen.''.$this->firstLink.''.$this->firstTagClose; > // Выводим ссылку на предыдущую страницу if($this->currentPage != 1)< $i = ($uriPageNum - 1); if($i == 0) $i = ''; $output .= $this->prevTagOpen.'baseURL.$i.'">'.$this->prevLink.''.$this->prevTagClose; > // Выводим цифровые ссылки for($loop = $start -1; $loop = 1)< if($this->currentPage == $loop)< $output .= $this->curTagOpen.$loop.$this->curTagClose; >else< $output .= $this->numTagOpen.'baseURL.$i.'">'.$loop.''.$this->numTagClose; > > > // Выводим ссылку на следующую страницу if($this->currentPage < $numPages)< $i = ($this->currentPage + 1); $output .= $this->nextTagOpen.'baseURL.$i.'">'.$this->nextLink.''.$this->nextTagClose; > // Выводим ссылку на последнюю страницу if(($this->currentPage + $this->numLinks) < $numPages)< $i = $numPages; $output .= $this->lastTagOpen.'baseURL.$i.'">'.$this->lastLink.''.$this->lastTagClose; > // Удаляем двойные косые $output = preg_replace("#([^:])//+#", "\1/", $output); // Добавляем открывающий и закрывающий тэги блока $output = $this->fullTagOpen.$output.$this->fullTagClose; return $output; > > Простой пример использования класса пагинации PHP . Сначала включите и инициализируйте класс Pagination с некоторыми базовыми настройками.
'http://localhost/php_pagination/index.php', 'totalRows'=>$rowCount, 'perPage'=>$limit ); $pagination = new Pagination($pagConfig); ?>
Чтобы отобразить ссылки на страницы, используйте метод createLinks() .
Конфигурация базы данных (dbConfig.php)
Файл dbConfig.php используется для соединения с MySQL и выбора базы данных для пагинации PHP . Укажите параметры хост ( $dbHost ), имя пользователя ( $dbUsername ), пароль ( $dbPassword ), и имя базы данных ( $dbName ) в соответствии с требованиями вашего сервера баз данных.
connect_error) < die("Connection failed: " . $db->connect_error); > ?>
Отображение данных с разбиением на страницы (index.php)
В файле index.php ограниченный набор постов будет запрашиваться из базы данных, и отображаться вместе со ссылками на другие страницы. Для PHP пагинации страниц нужно создать объект класса Pagination и передать базовые параметры, чтобы сгенерировать ссылки на страницы. Чтобы отобразить ссылки, используйте метод createLinks() .
query("SELECT COUNT(*) as postNum FROM posts"); $resultNum = $queryNum->fetch_assoc(); $rowCount = $resultNum['postNum']; //инициализируем класс pagination $pagConfig = array( 'baseURL'=>'http://localhost/php_pagination/index.php', 'totalRows'=>$rowCount, 'perPage'=>$limit ); $pagination = new Pagination($pagConfig); //получаем записи $query = $db->query("SELECT * FROM posts ORDER BY id DESC LIMIT $offset,$limit"); if($query->num_rows > 0) < ?> fetch_assoc()) < ?>
?>
createLinks(); ?> ?>
Заключение
Мы реализовали постраничный вывод на PHP и MySQL настолько просто, насколько это только возможно. Вы можете расширить функциональность этого класса.
Источник
Как разбить вывод из mysql постранично
Как сделать постраничный вывод из mysql «как в яндексе»?
по 10 записей на страницу, внизу — ссылки на остальные страницы?
Сначала научимся получать из базы нужные записи.
Их получение в mysql обеспечивается оператором LIMIT, который вызывается с двумя параметрами — с какой записи начинать, и сколько выводить (внимание! не по какую, а сколько!)
SELECT * FROM table LIMIT 0,10
этот запрос вернет записи с первой по 10, поскольку нумерация начинается с 0
соответственно, запрос для третьей страницы будет выглядеть, как
SELECT * FROM table LIMIT 20,10
получается, что нам всего лишь надо передать в скрипт число, которое потом подставить в запрос.
Этим будет заниматься код, который выводит ссылки на страницы.
Естественно, в цикле.
Для цикла нам понадобится количество записей, которое возвращает запрос без лимита.
Это число можно получить двумя путями. Либо отдельным запросом, в котором отсутствует оператор LIMIT, а вместо перечисления полей после оператора SELECT запрашивается только count(*):
$sql = «SELECT count(*) FROM table»;
$res = mysqli_query($db, $sql);
$row = mysqli_fetch_row($res);
$total_rows=$row[0];
Для тех, кто предпочитает думать самостоятельно, этой информации достаточно.
Вывод ссылок — это простейшая арифметическая операция и никаких особенных знаний для нее не требуется.
Для тех, же, кто ищет готовый код, продолжим.
Для начала определим, сколько всего получится страниц. Для этого надо поделить общее число записей на количество оных на одной странице и округлить результат в большую сторону. Таким округлением занимается в пхп функция ceil()
$num_pages = ceil($total_rows/$per_page);
В этом выражении участвует переменная $per_page , в которую мы положим количество выводимых на странице записей.
Ведь, если это количество изменится, мы же не хотим ползать по всему коду и исправлять цифры? Проще сделать это один раз в начале скрипта при объявлении переменной. В запрос, вторым параметром LIMIT, подставлять нужно, конечно же, тоже ее.
Ну, а дальше, собственно, вывод ссылок.
for($i=1;$i <=$num_pages;$i++) <
echo ».$i.»\n»;
>
в цикле от 1 до $num_pages выводим ссылку с параметром num, равным числу, которое надо передать в LIMIT, а в тексте ссылки пишем номер страницы, поскольку людям понятнее видеть номер страницы, а не записи. На код это не влияет, а людям приятно.
Дальше пойдут украшения.
Во-первых, некрасиво, что номер страницы не совпадает с тем, что видно в адресной строке. Эту проблему можно решить, передавая по ссылке номер страницы в человекопонятном формате, а в скрипте вычислять первый операнд для LIMIT.
Во-вторых, мы явно захотим выделить текущую страницу, не оформляя ее ссылкой.
В-третьих, мы захотим нумеровать записи
Старая версия, классический говнокод
что у нас в результате получилось?
// количество записей, выводимых на странице
$per_page=10;
// получаем номер страницы
if (isset($_GET[‘page’])) $page=($_GET[‘page’]-1); else $page=0;
// вычисляем первый оператор для LIMIT
$start=abs($page*$per_page);
// составляем запрос и выводим записи
// переменную $start используем, как нумератор записей.
$sql =»SELECT * FROM `table` ORDER BY field LIMIT $start,$per_page»;
$res = mysql_query($q);
while($row=mysql_fetch_array($res)) echo ++$start.». «.$row[‘field’].»
\n»;
>
// дальше выводим ссылки на страницы:
$sql = «SELECT count(*) FROM table»;
$res = mysqli_query($db, $sql);
$row = mysqli_fetch_row($res);
$total_rows=$row[0];
Разумеется, вышеприведённый код подходит только как учебное пособие. С его помощью становится понятным принцип, но в реальных условиях мы сразу же столкнемся, как минимум, с двумя проблемами:
Во-первых, кроме переменной $page нашему cкрипту явно будут переданы и другие переменные, да и адрес может совсем не совпадать с именем скрипта. А мы это при формировании ссылок не учитываем.
Во-вторых, нормальный современный сайт немыслим без шаблонов. И такая ужасная лапша из SQL запросов, PHP кода и HTML тегов никуда не годится.
Займемся решением этих проблем.
Первая решается очень просто при использовании функции http_build_query()
Вторая — тоже несложно. Шаблонизаторов много, но мы воспользуемся самым универсальным — PHP.
Что же у нас получилось? А получился у нас — рефакторинг! Переделка старого кода в соответствии с требованиями современности, плюс мелкое причесывание:
include ‘safemysql.class.php’ ;
$db = new safeMysql ();
//получаем номер страницы и значение для лимита
$cur_page = 1 ;
if (isset( $_GET [ ‘page’ ]) && $_GET [ ‘page’ ] > 0 )
$cur_page = $_GET [ ‘page’ ];
>
$start = ( $cur_page — 1 ) * $per_page ;
//выполняем запрос и получаем данные для вывода
$sql = «SELECT SQL_CALC_FOUND_ROWS * FROM Board LIMIT ?i, ?i» ;
$data = $db -> getAll ( $sql , $start , $per_page );
$rows = $db -> getOne ( «SELECT FOUND_ROWS()» );
//узнаем общее количество страниц и заполняем массив со ссылками
$num_pages = ceil ( $rows / $per_page );
// зададим переменную, которую будем использовать для вывода номеров страниц
$page = 0 ;
Источник