Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как вывести записи из базы постранично

Короткий ответ

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 — Округляет число вверх до целого.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.