pager_query
includes/pager.inc, строка 50
- Версии
- 5 – 6
pager_query($query, $limit = 10, $element = 0, $count_query = NULL)
Выполняет «постраничный» запрос к базе данных.
Используйте эту функцию, когда результирующие данные надо будет представить постранично. Функция использует SQL-конструкцию 'LIMIT'
, чтобы получать только те данные, которые нужны для отображения текущей страницы. Тем не менее, она должна получить общее количество записей, возвращаемых запросом, чтобы вычислить количество страниц (кол-во_записей / записей_на_страницу). Это реализуется вставкой 'COUNT(*)'
в начальный запрос. Например, запрос 'SELECT nid, type FROM node WHERE status = 1 ORDER BY sticky DESC, created DESC'
будет превращен в 'SELECT COUNT(*) FROM node WHERE status = 1 ORDER BY sticky DESC, created DESC'
.
К сожалению, превращение запроса не всегда работает для запросов которые уже имеют 'COUNT(*)'
или 'GROUP BY'
, и, возможно, для некоторых других сложных запросов. В этом случае, вы, по желанию, можете предоставить запрос, который будет использован для подсчета количества записей.
Например, если вы хотите разбить постранично запрос 'SELECT COUNT(*), type FROM node GROUP BY type'
, pager_query()
запустит неправильный запрос 'SELECT COUNT(*) FROM node GROUP BY type'
. Посему, вместо этого, вы должны передать 'SELECT COUNT(DISTINCT(TYPE)) FROM node'
в $count_query
аргумент функции.
Параметры
$query
SQL запрос.
$limit
Количество результатов на страницу.
$element
(опционально) Целое число для идентификации листалки (если их несколько на странице).
$count_query
SQL запрос количества элементов.
...
Переменное количество аргуметов,
Переменное количество аргументов, которые подставляются в запрос по типу printf()
. Вместо переменного количества аргументов, можно использовать один массив, содержащий необходимые аргументы.
Возвращаемое значение
Результирующий ресурс запроса или FALSE
, если запрос вызвал ошибку.
Связанные темы
Код
<?php
function pager_query($query, $limit = 10, $element = 0, $count_query = NULL) {
global $pager_page_array, $pager_total, $pager_total_items;
$page = isset($_GET['page']) ? $_GET['page'] : '';
// Substitute in query arguments.
$args = func_get_args();
$args = array_slice($args, 4);
// Alternative syntax for '...'
if (isset($args[0]) && is_array($args[0])) {
$args = $args[0];
}
// Construct a count query if none was given.
if (!isset($count_query)) {
$count_query = preg_replace(array('/SELECT.*?FROM /As', '/ORDER BY .*/'), array('SELECT COUNT(*) FROM ', ''), $query);
}
// Convert comma-separated $page to an array, used by other functions.
$pager_page_array = explode(',', $page);
// We calculate the total of pages as ceil(items / limit).
$pager_total_items[$element] = db_result(db_query($count_query, $args));
$pager_total[$element] = ceil($pager_total_items[$element] / $limit);
$pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1));
return db_query_range($query, $args, $pager_page_array[$element] * $limit, $limit);
}
?>
Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии