В этом уроке вы узнаете, как выполнить пагинацию, которая разбивает большой набор данных на более мелкие страницы.
Это руководство начинается с того места, где закончилось руководство по выбору данных из таблицы с использованием 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 для выполнения разбиения на страницы.