Base de Conhecimento

Como implementar a paginação no MySQL com PHP no Ubuntu 18.04  Imprimir este Artigo

Introdução

Paginação é o conceito de restringir o número de linhas retornadas em um conjunto de registros em páginas separadas e ordenadas para facilitar a navegação entre elas; portanto, quando há um grande conjunto de dados, você pode configurar sua paginação para retornar apenas um número específico de linhas em cada página. Por exemplo, a paginação pode ajudar a evitar sobrecarregar os usuários quando uma loja virtual contém milhares de produtos, reduzindo o número de itens listados em uma página, pois é improvável que um usuário precise visualizar todos os produtos. Outro exemplo é um aplicativo que mostra registros em um dispositivo móvel; ativar a paginação nesse caso dividiria os registros em várias páginas que cabem melhor em uma tela.

Além dos benefícios visuais para usuários finais, a paginação torna os aplicativos mais rápidos, pois reduz o número de registros retornados por vez. Isso limita os dados que precisam ser transmitidos entre o cliente e o servidor, o que ajuda a preservar recursos do servidor, como RAM.

Neste tutorial, você criará um script PHP para conectar-se ao seu banco de dados e implementar a paginação no seu script usando a cláusula MySQL .LIMIT

Pré-requisitos

Antes de começar, você precisará do seguinte:

  • Um servidor Ubuntu 18.04 configurado seguindo a Configuração inicial do servidor com o Ubuntu 18.04 , incluindo um usuário sudo não root.
  • Apache, MySQL e PHP instalados no seu sistema. Você pode seguir o guia sobre Como instalar a pilha Linux, Apache, MySQL, PHP (LAMP) no Ubuntu 18.04 .

Etapa 1 - Criando um usuário de banco de dados e um banco de dados de teste

Neste tutorial, você criará um script PHP que irá se conectar a um banco de dados MySQL, buscar registros e exibi-los em uma página HTML dentro de uma tabela. Você testará o script PHP de duas maneiras diferentes no seu navegador da web. Primeiro, crie um script sem nenhum código de paginação para ver como os registros são exibidos. Segundo, adicionando código de navegação da página no arquivo PHP para entender como a paginação funciona praticamente.

O código PHP requer um usuário MySQL para fins de autenticação e um banco de dados de amostra para se conectar. Nesta etapa, você criará um usuário não raiz para o banco de dados MySQL, um banco de dados de amostra e uma tabela para testar o script PHP.

Para iniciar o login no seu servidor. Então entre no seu servidor MySQL com o seguinte comando:

  • sudo mysql -u root -p

Digite a senha root do seu servidor MySQL e pressione ENTERpara continuar. Então, você verá o prompt do MySQL. Para criar um banco de dados de amostra, que chamaremos test_dbneste tutorial, execute o seguinte comando:

  • Create database test_db;

Você verá a seguinte saída:

Output
Query OK, 1 row affected (0.00 sec)

Em seguida, crie um test_usere conceda ao usuário todos os privilégios para o test_dbSubstitua PASSWORDpor um valor forte:

  • GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Output
Query OK, 1 row affected (0.00 sec)

Recarregue os privilégios do MySQL com:

  • FLUSH PRIVILEGES;
Output
Query OK, 1 row affected (0.00 sec)

Em seguida, mude para o test_dbbanco de dados para começar a trabalhar diretamente no test_dbbanco de dados:

  • Use test_db;
Output
Database changed

Agora crie uma productstabela. A tabela conterá seus produtos de amostra. Para este tutorial, você precisará apenas de duas colunas para os dados. product_idcoluna servirá como a chave primária para identificar exclusivamente cada registro. Você usará o product_namecampo para diferenciar cada item pelo nome:

  • Create table products (product_id BIGINT PRIMARY KEY, product_name VARCHAR(50) NOT NULL ) Engine = InnoDB;
Output
Query OK, 0 rows affected (0.02 sec)

Para adicionar dez produtos de teste à productstabela, execute as seguintes instruções SQL:

  • Insert into products(product_id, product_name) values ('1', 'WIRELESS MOUSE');
  • Insert into products(product_id, product_name) values ('2', 'BLUETOOTH SPEAKER');
  • Insert into products(product_id, product_name) values ('3', 'GAMING KEYBOARD');
  • Insert into products(product_id, product_name) values ('4', '320GB FAST SSD');
  • Insert into products(product_id, product_name) values ('5', '17 INCHES TFT');
  • Insert into products(product_id, product_name) values ('6', 'SPECIAL HEADPHONES');
  • Insert into products(product_id, product_name) values ('7', 'HD GRAPHIC CARD');
  • Insert into products(product_id, product_name) values ('8', '80MM THERMAL PRINTER');
  • Insert into products(product_id, product_name) values ('9', 'HDMI TO VGA CONVERTER');
  • Insert into products(product_id, product_name) values ('10', 'FINGERPRINT SCANNER');

Você verá esta saída:

Output
Query OK, 1 row affected (0.02 sec)

Verifique se os produtos foram inseridos na tabela executando:

  • select * from products;

Você verá os produtos em sua saída nas duas colunas:

Output
+------------+-----------------------+
| product_id | product_name          |
+------------+-----------------------+
|          1 | WIRELESS MOUSE        |
|          2 | BLUETOOTH SPEAKER     |
|          3 | GAMING KEYBOARD       |
|          4 | 320GB FAST SSD        |
|          5 | 17 INCHES TFT         |
|          6 | SPECIAL HEADPHONES    |
|          7 | HD GRAPHIC CARD       |
|          8 | 80MM THERMAL PRINTER  |
|          9 | HDMI TO VGA CONVERTER |
|         10 | FINGERPRINT SCANNER   |
+------------+-----------------------+
10 rows in set (0.00 sec)

Saia do MySQL:

  • quit;

Com o banco de dados de amostra, tabela e dados de teste, você agora pode criar um script PHP para exibir dados em uma página da web.

Etapa 2 - Exibindo registros MySQL sem paginação

Agora você criará um script PHP que se conecta ao banco de dados MySQL que você criou na etapa anterior e listará os produtos em um navegador da web. Nesta etapa, seu código PHP será executado sem nenhuma forma de paginação para demonstrar como os registros não divididos são exibidos em uma única página. Embora você tenha apenas dez registros para fins de teste neste tutorial, a visualização dos registros sem paginação demonstrará por que a segmentação de dados acabará criando uma melhor experiência do usuário e sobrecarregando o servidor.

Crie o arquivo de script PHP na raiz do documento do seu site com o seguinte comando:

  • sudo nano /var/www/html/pagination_test.php

Em seguida, adicione o seguinte conteúdo ao arquivo. Lembre-se de substituir PASSWORDpelo valor correto da senha que você atribuiu test_userna etapa anterior:

/var/www/html/pagination_test.php
<?php

try {

    $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "PASSWORD");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

    $sql="select * from products";

    $stmt = $pdo->prepare($sql);

    $stmt->execute();

    echo "<table border='1' align='center'>";

    while ( ($row = $stmt->fetch(PDO::FETCH_ASSOC) ) !== false) {
        echo "<tr>";

        echo "<td>".$row['product_id']."</td>";

        echo "<td>".$row['product_name']."</td>";

        echo "</tr>";

    }

    echo "</table>";

}

  catch(PDOException $e)

{
    echo  $e->getMessage();
}

?>

Salve o arquivo pressionando CTRL+XYENTER.

Neste script, você está se conectando ao banco de dados MySQL usando a biblioteca PDO (PHP Data Object) com as credenciais do banco de dados que você criou na Etapa 1.

O PDO é uma interface leve para conectar-se a bancos de dados. A camada de acesso a dados é mais portátil e pode funcionar em diferentes bancos de dados com apenas pequenas reescritas de código. O PDO possui maior segurança, pois suporta instruções preparadas - um recurso para fazer com que as consultas sejam executadas mais rapidamente de maneira segura.

Em seguida, você instrui a API do PDO para executar a select * from productsinstrução e listar produtos em uma tabela HTML sem paginação. A linha $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);garante que os tipos de dados sejam retornados conforme aparecem no banco de dados. Isso significa que o PDO retornará product_idcomo um número inteiro e product_namecomo uma seqüência de caracteres. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);instrui o PDO a lançar uma exceção se um erro for encontrado. Para uma depuração mais fácil, você está capturando o erro dentro do try{}...catch{}bloco PHP .

Para executar o /var/www/html/pagination_test.phparquivo de script PHP que você criou, visite o seguinte URL, substituindo your-server-IPo endereço IP público do seu servidor:

http://your-server-IP/pagination_test.php

Você verá uma página com uma tabela de seus produtos.

Registros MySQL exibidos com um script PHP - Sem paginação

Seu script PHP está funcionando como esperado; listando todos os produtos em uma página. Se você tivesse milhares de produtos, isso resultaria em um longo loop, pois os produtos são buscados no banco de dados e renderizados na página PHP.

Para superar essa limitação, você modificará o script PHP e incluirá a LIMITcláusula MySQL e alguns links de navegação na parte inferior da tabela para adicionar a funcionalidade de paginação.

Etapa 3 - Implementando a paginação com PHP

Nesta etapa, seu objetivo é dividir os dados de teste em várias páginas gerenciáveis. Isso não apenas aumentará a legibilidade, mas também usará os recursos do servidor com mais eficiência. Você modificará o script PHP que você criou na etapa anterior para acomodar a paginação.

Para fazer isso, você estará implementando a LIMITcláusula MySQL Antes de adicionar isso ao script, vamos ver um exemplo da LIMITsintaxe do MySQL :

  • Select [column1, column2, column n...] from [table name] LIMIT offset, records;

LIMITcláusula aceita dois argumentos, conforme mostrado no final desta declaração. offsetvalor é o número de registros a serem ignorados antes da primeira linha. recordsdefine o número máximo de registros a serem exibidos por página.

Para testar a paginação, você exibirá três registros por página. Para obter o número total de páginas, você deve dividir o total de registros da sua tabela com as linhas que deseja exibir por página. Você então arredonda o valor resultante para o número inteiro mais próximo usando a Ceilfunção PHP , conforme mostrado no seguinte exemplo de trecho de código PHP:

$total_pages=ceil($total_records/$per_page);

A seguir está a versão modificada do script PHP com o código de paginação completo. Para incluir os códigos de paginação e navegação, abra o /var/www/html/pagination_test.phparquivo:

  • sudo nano /var/www/html/pagination_test.php

Em seguida, adicione o seguinte código destacado ao seu arquivo:

/var/www/html/pagination_test.php
<?php

try {

    $pdo = new PDO("mysql:host=localhost;dbname=test_db", "test_user", "PASSWORD");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);

    /* Begin Paging Info */

    $page=1;

    if (isset($_GET['page'])) {
        $page=filter_var($_GET['page'], FILTER_SANITIZE_NUMBER_INT);
    }

    $per_page=3;

    $sqlcount="select count(*) as total_records from products";
    $stmt = $pdo->prepare($sqlcount);
    $stmt->execute();
    $row = $stmt->fetch();
    $total_records= $row['total_records'];

    $total_pages=ceil($total_records/$per_page);

    $offset=($page-1)*$per_page;

    /* End Paging Info */

    $sql="select * from products limit $offset,$per_page";

    $stmt = $pdo->prepare($sql);

    $stmt->execute();


    echo "<table border='1' align='center'>";

    while ( ($row = $stmt->fetch(PDO::FETCH_ASSOC) ) !== false) {
        echo "<tr>";

        echo "<td>".$row['product_id']."</td>";

        echo "<td>".$row['product_name']."</td>";

        echo "</tr>";

    }

    echo "</table>";

    /* Begin Navigation */

    echo "<table border='1' align='center'>";

    echo "<tr>";

    if( $page-1>=1) {
        echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">Previous</a></td>";
    }

    if( $page+1<=$total_pages) {
        echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page+1).">Next</a></td>";
    }

    echo "</tr>";

    echo "</table>";

    /* End Navigation */

}

catch(PDOException $e) {
        echo  $e->getMessage();
}

?>

No seu arquivo, você usou parâmetros adicionais para executar a paginação:

  • $page: Essa variável mantém a página atual em seu script. Ao se mover entre as páginas, seu script recupera um parâmetro de URL nomeado pageusando a $_GET['page']variável
  • $per_page: Essa variável contém o máximo de registros que você deseja exibir por página. No seu caso, você deseja listar três produtos em cada página.
  • $total_records: Antes de listar os produtos, você está executando uma instrução SQL para obter uma contagem total de registros em sua tabela de destino e atribuindo-a à $total_recordsvariável.
  • $offset: Essa variável representa o total de registros a serem ignorados antes da primeira linha. Este valor é calculado dinamicamente pelo seu script PHP usando a fórmula $offset=($page-1)*$per_pageVocê pode adaptar essa fórmula aos seus projetos de paginação PHP. Lembre-se de que você pode alterar a $per_pagevariável para atender às suas necessidades. Por exemplo, você pode alterá-lo para um valor de 50para exibir cinquenta itens por página se estiver executando um site ou outro valor para um dispositivo móvel.

Novamente, visite seu endereço IP em um navegador e substitua your_server_ippelo endereço IP público do seu servidor:

http://your_server_ip/pagination_test.php

Agora você verá alguns botões de navegação na parte inferior da página. Na primeira página, você não receberá o botão Anterior . O mesmo caso acontece na última página em que você não receberá o botão Próxima página. Observe também como o pageparâmetro URL muda conforme você visita cada página.

Registros MySQL exibidos com um script PHP com paginação - Página 1

Registros MySQL exibidos com um script PHP com paginação - Página 2

Página final dos registros MySQL exibida com um script PHP com paginação - Página 4

Os links de navegação na parte inferior da página são obtidos usando o seguinte snippet de código PHP do seu arquivo:

/var/www/html/pagination_test.php
. . .
    if( $page-1>=1) {
        echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">Previous</a></td>";
    }

    if( $page+1<=$total_pages) {
        echo "<td><a href=".$_SERVER['PHP_SELF']."?page=".($page+1).">Next</a></td>";
    }
. . .

Aqui, a $pagevariável representa o número da página atual. Então, para obter a página anterior, o código será menos 1da variável. Portanto, se você estiver na página 2, a fórmula (2-1)fornecerá um resultado 1e essa será a página anterior que aparecerá no link. No entanto, lembre-se de que ela só mostrará a página anterior se houver um resultado maior ou igual a 1.

Da mesma forma, para chegar à próxima página, você adiciona uma à $pagevariável e também deve garantir que o $pageresultado que anexamos ao pageparâmetro URL não seja maior que o total de páginas calculadas em seu código PHP.

Neste ponto, seu script PHP está funcionando com paginação e você pode implementar a LIMITcláusula MySQL para melhorar a navegação de registros.

Conclusão

Neste tutorial, você implementou a paginação no MySQL com PHP em um servidor Ubuntu 18.04. Você pode usar essas etapas com um conjunto de registros maior usando o script PHP para incluir paginação. Ao usar a paginação em seu site ou aplicativo, você pode criar melhor navegação do usuário e melhor utilização de recursos em seu servidor.

Esta resposta lhe foi útil?

Veja também

Como instalar o Python 3 e configurar um ambiente de programação local no Windows 10
Introdução Python é uma linguagem de programação versátil que pode ser usada para muitos...
Tutorial de como instalar Apache, PHP e MySQL
1º Passo - Instalação MySQL # Entre em seu Servidor via SSH e digite:  yum install mysql...
Como Instalar iftop
O Iftop é uma ferramenta de monitoramento de rede para Servidores Linux, através do Iftop você...
Como configurar os relatórios MTA-STS e TLS para o seu domínio usando o Apache no Ubuntu 18.04
Introdução O MTA-STS (Security Strict Transport Security) do Mail Transport Agent é um novo...
Como configurar um aplicativo Node.js para produção no CentOS 7
Introdução O Node.js é um ambiente de tempo de execução Javascript de código aberto para a...