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 ENTER
para continuar. Então, você verá o prompt do MySQL. Para criar um banco de dados de amostra, que chamaremos test_db
neste tutorial, execute o seguinte comando:
- Create database test_db;
Você verá a seguinte saída:
Query OK, 1 row affected (0.00 sec)
Em seguida, crie um test_user
e conceda ao usuário todos os privilégios para o test_db
. Substitua PASSWORD
por um valor forte:
- GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Query OK, 1 row affected (0.00 sec)
Recarregue os privilégios do MySQL com:
- FLUSH PRIVILEGES;
Query OK, 1 row affected (0.00 sec)
Em seguida, mude para o test_db
banco de dados para começar a trabalhar diretamente no test_db
banco de dados:
- Use test_db;
Database changed
Agora crie uma products
tabela. A tabela conterá seus produtos de amostra. Para este tutorial, você precisará apenas de duas colunas para os dados. A product_id
coluna servirá como a chave primária para identificar exclusivamente cada registro. Você usará o product_name
campo para diferenciar cada item pelo nome:
- Create table products (product_id BIGINT PRIMARY KEY, product_name VARCHAR(50) NOT NULL ) Engine = InnoDB;
Query OK, 0 rows affected (0.02 sec)
Para adicionar dez produtos de teste à products
tabela, 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:
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:
+------------+-----------------------+
| 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 PASSWORD
pelo valor correto da senha que você atribuiu test_user
na etapa anterior:
<?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+X
, Y
e ENTER
.
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 products
instruçã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_id
como um número inteiro e product_name
como 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.php
arquivo de script PHP que você criou, visite o seguinte URL, substituindo your-server-IP
o 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.
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 LIMIT
clá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 LIMIT
cláusula MySQL . Antes de adicionar isso ao script, vamos ver um exemplo da LIMIT
sintaxe do MySQL :
- Select [column1, column2, column n...] from [table name] LIMIT offset, records;
A LIMIT
cláusula aceita dois argumentos, conforme mostrado no final desta declaração. O offset
valor é o número de registros a serem ignorados antes da primeira linha. records
define 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 Ceil
funçã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.php
arquivo:
- sudo nano /var/www/html/pagination_test.php
Em seguida, adicione o seguinte código destacado ao seu arquivo:
<?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 nomeadopage
usando 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_records
variá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_page
. Você pode adaptar essa fórmula aos seus projetos de paginação PHP. Lembre-se de que você pode alterar a$per_page
variável para atender às suas necessidades. Por exemplo, você pode alterá-lo para um valor de50
para 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_ip
pelo 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 page
parâmetro URL muda conforme você visita cada página.
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:
. . .
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 $page
variável representa o número da página atual. Então, para obter a página anterior, o código será menos 1
da variável. Portanto, se você estiver na página 2, a fórmula (2-1)
fornecerá um resultado 1
e 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 à $page
variável e também deve garantir que o $page
resultado que anexamos ao page
parâ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 LIMIT
clá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
Introdução Uma função é uma seção de código que, uma vez definida, pode ser reutilizada. As...
Introdução Instruções condicionais fazem parte de toda linguagem de programação. Com instruções...
Introdução O controle de versão não é apenas para código. É para qualquer coisa que você queira...
Introdução Adicionar e remover usuários em um sistema Linux é uma das tarefas mais importantes...
Introdução O MTA-STS (Security Strict Transport Security) do Mail Transport Agent é um novo...