Как вывести записи из базы постранично
Короткий ответ
LIMIT задаёт размер страницы, OFFSET — сколько строк пропустить:
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE products (id INTEGER PRIMARY KEY, title TEXT, price INTEGER)');
$pdo->exec("INSERT INTO products (title, price) VALUES ('Tea', 250), ('Coffee', 400), ('Juice', 180), ('Green tea', 300)");
$page = 2;
$perPage = 2;
$statement = $pdo->prepare('SELECT title FROM products ORDER BY id LIMIT :limit OFFSET :offset');
$statement->bindValue('limit', $perPage, PDO::PARAM_INT);
$statement->bindValue('offset', ($page - 1) * $perPage, PDO::PARAM_INT);
$statement->execute();
echo implode(', ', $statement->fetchAll(PDO::FETCH_COLUMN));Результат:
Juice, Green teaЧисло страниц
Разделите общее число записей на размер страницы:
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE products (id INTEGER PRIMARY KEY, title TEXT, price INTEGER)');
$pdo->exec("INSERT INTO products (title, price) VALUES ('Tea', 250), ('Coffee', 400), ('Juice', 180), ('Green tea', 300)");
$total = (int) $pdo->query('SELECT COUNT(*) FROM products')->fetchColumn();
echo (int) ceil($total / 3);Результат:
2Два условия
Числа для LIMIT и OFFSET передавайте через bindValue() с PDO::PARAM_INT и всегда указывайте ORDER BY.
Функции из этого ответа
- PDO — Подключение к базе данных.
- PDOStatement — Подготовленный запрос и его результат.
- ceil — Округляет число вверх до целого.