В этом уроке вы узнаете, как выполнить пагинацию, которая разбивает большой набор данных на более мелкие страницы.
Это руководство начинается с того места, где закончилось руководство по выбору данных из таблицы с использованием PHP.
Разбивка набора результатов на страницы
Шаг 1. Определите новый метод в классе AuthorDB, который разбивает данные из таблицы Authors на страницы:
function paginate(int $limit, int $offset=0)
{
$sql = 'SELECT * FROM Authors
ORDER BY FirstName
OFFSET :offset ROWS
FETCH NEXT :limit ROWS ONLY';
$stmt = $this->conn->prepare($sql);
$stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, \PDO::PARAM_INT);
$stmt->execute();
$authors = [];
while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
$authors[] = new Author($row['FirstName'], $row['LastName'], $row['BirthDate'], $row['AuthorID']);
}
return $authors;
}
Сначала определите метод findById, который принимает $authorId в качестве параметра:
function findById(int $authorId)
Во-вторых, создайте оператор SELECT, который извлекает несколько строк из всех столбцов таблицы Authors, используя предложения FETCH и OFFSET :
$sql = 'SELECT * FROM Authors
ORDER BY FirstName
OFFSET :offset ROWS
FETCH NEXT :limit ROWS ONLY';
В запросе :offset и :limit являются именованными заполнителями. Использование параметризованного запроса с именованными заполнителями может помочь предотвратить SQL-инъекцию.
В-третьих, создайте подготовленный оператор для выполнения оператора SELECT:
$stmt = $this->conn->prepare($sql);
В-четвертых, привяжите значения из переменных $limit и $offset к параметрам :limit и :offset:
$stmt->bindValue(':limit', $limit, \PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, \PDO::PARAM_INT);
В-пятых, выполните подготовленное заявление:
$stmt->execute();
В-шестых, извлеките строки из набора результатов в виде ассоциативного массива с именами столбцов в качестве ключей, создайте объект Author из каждой строки и добавьте объект Author в массив $authors:
$authors = [];
while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
$authors[] = new Author($row['FirstName'], $row['LastName'], $row['BirthDate'], $row['AuthorID']);
}
Обратите внимание, что режим выборки \PDO::FETCH_ASSOC предписывает PDO возвращать набор результатов в виде ассоциативного массива.
Наконец, верните массив $authors:
return $authors;
Шаг 2. Измените index.php для использования метода paginate():
paginate(5, 0);
foreach($authors as $author) {
echo $author->getFirstName() . ' ' . $author->getLastName() . '
';
}
Как это работает.
Сначала включите authordb.php, чтобы гарантировать доступность класса AuthorDB в скрипте:
require_once 'authordb.php';
Во-вторых, подключитесь к SQL Server и назначьте объект PDO переменной $conn:
$conn = require_once 'connect.php';
В-третьих, создайте новый объект AuthorDB с объектом $conn:
$authorDB = new AuthorDB($conn);
В-четвертых, извлеките первых пять авторов из таблицы «Авторы», отсортировав их по именам:
$authors = $authorDB->paginate(5, 0);
Наконец, отобразите имя и фамилию каждого автора:
foreach($authors as $author) {
echo $author->getFirstName() . ' ' . $author->getLastName() . '
';
}
Шаг 3. Запустите index.php в веб-браузере.
Он должен вернуть первых пять авторов, отсортированных по имени:
Alexander Turner Ann Kelly Anthony Pham Barbara Lopez Charles Nicholson ...
Если вы хотите получить следующих пять авторов, вам необходимо изменить параметр смещения:
$authors = $authorDB->paginate(5, 5);
Выход:
Craig Hart Daniel Wilson David Hunter Donna Bailey Jade Tate ...
Краткое содержание
- Выполните оператор SELECT с предложениями FETCH и OFFSET для выполнения разбиения на страницы.

