PHP SQL Server: разбиение на страницы

В этом уроке вы узнаете, как выполнить пагинацию, которая разбивает большой набор данных на более мелкие страницы.

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

Автор статей, ИБ-специалист