CodePráticov3.3.0
PHP

Paginação em PHP com PDO e LIMIT/OFFSET

Monte paginação com PHP e PDO usando LIMIT, OFFSET, contagem total e validação dos parâmetros da página.

Calcular LIMIT e OFFSET

$pagina = max(1, (int) ($_GET['pagina'] ?? 1));
$porPagina = 20;
$offset = ($pagina - 1) * $porPagina;

Consulta paginada

$sql = '
    SELECT id, nome, email
    FROM clientes
    ORDER BY nome
    LIMIT :limite OFFSET :offset
';

$stmt = $pdo->prepare($sql);
$stmt->bindValue(':limite', $porPagina, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();

$clientes = $stmt->fetchAll(PDO::FETCH_ASSOC);

Descobrir o total de páginas

$total = (int) $pdo
    ->query('SELECT COUNT(*) FROM clientes')
    ->fetchColumn();

$totalPaginas = (int) ceil($total / $porPagina);

Quando OFFSET fica caro

Em tabelas muito grandes e páginas profundas, OFFSET pode exigir que o banco percorra muitas linhas. Nesses casos, considere paginação por cursor, usando a última chave exibida.