<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luis Carlos</title>
    <description>The latest articles on DEV Community by Luis Carlos (@luis_carlos60).</description>
    <link>https://dev.to/luis_carlos60</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3182439%2F4c2a0699-bb23-4ca0-9d83-309c6e5e65d5.jpg</url>
      <title>DEV Community: Luis Carlos</title>
      <link>https://dev.to/luis_carlos60</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luis_carlos60"/>
    <language>en</language>
    <item>
      <title>Criando um Grid de Dados Simples usando MYSQL, PHP e AJAX - Paginação</title>
      <dc:creator>Luis Carlos</dc:creator>
      <pubDate>Thu, 29 May 2025 02:57:59 +0000</pubDate>
      <link>https://dev.to/luis_carlos60/criando-um-grid-de-dados-simples-contendo-paginacao-filtros-barra-de-pesquisa-classificacao-4cce</link>
      <guid>https://dev.to/luis_carlos60/criando-um-grid-de-dados-simples-contendo-paginacao-filtros-barra-de-pesquisa-classificacao-4cce</guid>
      <description>&lt;p&gt;No último post publicado, foi ensinado a maneira para poder listar os alunos e suas respectivas informações. Nesse atual post, será mostrado como fazer uma paginação padrão, limitada pelo tamanho de itens dentro da lista, podendo clicar no final se a página não for a página fim, podendo clicar no início caso a página atual não seja a página início, com espaçamento, caso seja uma paginação de uma lista grande, e tudo funcionando sem precisar recarregar a página, ou seja, utilizando AJAX e o PHP, utilizado para montar a lógica do funcionamento da paginação.&lt;/p&gt;

&lt;p&gt;Em primeiro lugar, precisamos entender como funciona uma paginação básica:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- LIMIT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O comando LIMIT no SQL limita a quantidade de dados você quer que apareça, logo, se colocar no final da query um &lt;code&gt;LIMIT 5&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$sqlAlunos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT
    aluno.id, aluno.nome, aluno.idade, aluno.media, status.nome AS status_nome, aluno.foto
    FROM aluno 
    JOIN status ON aluno.idStatus = status.id
    LIMIT 5"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nós iremos receber apenas as primeiras 5 linhas&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4loid76spgkyq2mdw4z9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4loid76spgkyq2mdw4z9.png" alt="Image description" width="632" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse dado é fixo, porém, iremos setar uma variável para armazenar seu valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$pageSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'pageSize'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'pageSize'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Se não estiver setado, define o valor para 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, ao invés de usar &lt;code&gt;LIMIT 5&lt;/code&gt;, trocaremos por &lt;code&gt;:pageSize&lt;/code&gt; e diremos para o &lt;code&gt;$stmt&lt;/code&gt; que o valor de pageSize é &lt;code&gt;$pageSize&lt;/code&gt; e é um valor do tipo &lt;code&gt;INT&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bindValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;':pageSize'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pageSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PARAM_INT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Offset&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Já cortamos a tabela em partes, mas agora, como será feito para ver as outras partes? É aí que entra o offset, ele permite que nós possamos começar a partir de um intervalo de linha, então se eu quero começar na linha 5, com um limite de 5 linhas, eu poderia usar no final da minha query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pageSize&lt;/span&gt; &lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E isso nos traria o que seria a próxima página:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9u4wrlw3uvk1jcw0q1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9u4wrlw3uvk1jcw0q1b.png" alt="Image description" width="355" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Logo, mais uma vez teremos que adicionar mais umas variáveis, nesse caso, mais duas: &lt;code&gt;$page&lt;/code&gt; para definir a página atual que estamos naquele momento e &lt;code&gt;$offset&lt;/code&gt;, em resumo, se quisermos ver a 2º parte dos dados e assim consecutivamente precisaremos fazer uma simples equação &lt;code&gt;$offset = ($page - 1) * $pageSize&lt;/code&gt;, lembrando que a primeira página é a página 1, e precisamos pegar desde a linha 0, por isso &lt;code&gt;$page - 1&lt;/code&gt; e a variável $page que será &lt;code&gt;$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora, poderemos adicionar ao final da query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pageSize&lt;/span&gt; &lt;span class="k"&gt;OFFSET&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;offset&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou simplificando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pageSize&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E por último, entregar para o &lt;code&gt;$stmt&lt;/code&gt; o valor de &lt;code&gt;:offset&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bindValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;':offset'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PARAM_INT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- LÓGICA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para começar, devemos contar qual é o total de registros que temos para descobrir a quantidade de páginas que o sistema possuirá, assim possibilitando para que nos retorne a primeira e a última página na paginação sempre.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$sqlCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT COUNT(*) FROM aluno"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$stmtCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sqlCount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$stmtCount&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$totalRegistros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$stmtCount&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetchColumn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$totalPaginas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$totalRegistros&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;$pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// a função ceil retorna o valor acima mais próximo, caso seja um número quebrado.&lt;/span&gt;

&lt;span class="c1"&gt;// vão ser o intervalo do meu for loop&lt;/span&gt;
&lt;span class="nv"&gt;$start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$totalPaginas&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que é necessário saber sobre a lógica a seguir:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Se a página atual for maior do que 3, então ele volta com o 1 no início, já que é a partir do 3 que o intervalo entre &lt;code&gt;$start&lt;/code&gt; e &lt;code&gt;$end&lt;/code&gt; não pegam mais o número 1;&lt;/li&gt;
&lt;li&gt;Entre &lt;code&gt;$start&lt;/code&gt; e &lt;code&gt;$end&lt;/code&gt;, ele deve imprimir todos os números presentes dentro do intervalo. Se a variável do loop &lt;code&gt;$i&lt;/code&gt; for igual à página atual &lt;code&gt;$page&lt;/code&gt;, logo, o número fica em destaque dos outros. Se não, ele apenas printa o número na tela&lt;/li&gt;
&lt;li&gt;Enquanto a página atual &lt;code&gt;$page&lt;/code&gt; é menor que o total de páginas - 3, ele irá printar "..." em seguida, representando que tem continuidade.&lt;/li&gt;
&lt;li&gt;Se o total de páginas &lt;code&gt;$totalPaginas&lt;/code&gt; for maior do que 1 e a página atual for diferente da última página que também é representado pela variável &lt;code&gt;$totalPaginas&lt;/code&gt;, ele irá printar a página final, sem estar em destaque.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;div class='paginacao'&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;a href='#' data-page='1'&amp;gt; 1 &amp;lt;/a&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;span&amp;gt; ... &amp;lt;/span&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nv"&gt;$end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;$page&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;a href='#' data-page='&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;'&amp;gt;
        &amp;lt;strong&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;
        &amp;lt;/strong&amp;gt;&amp;lt;/a&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;a href='#' data-page='&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;'&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;/a&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nv"&gt;$totalPaginas&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;span&amp;gt; ... &amp;lt;/span&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$totalPaginas&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nv"&gt;$totalPaginas&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;a href='#' data-page='&lt;/span&gt;&lt;span class="nv"&gt;$totalPaginas&lt;/span&gt;&lt;span class="s2"&gt;'&amp;gt; &lt;/span&gt;&lt;span class="nv"&gt;$totalPaginas&lt;/span&gt;&lt;span class="s2"&gt; &amp;lt;/a&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;/div&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como resultado, teremos isso aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5uoqziqlboi7qda2xfpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5uoqziqlboi7qda2xfpi.png" alt="Image description" width="93" height="31"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém, ele ainda não está completo, ainda precisamos inserir a lógica com ajax para que ele funcione e não precise recarregar a página toda vez&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- AJAX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AJAX é "JavaScript Assíncrono e XML", ele faz requisições em segundo plano para o servidor sem que seja necessário recarregar todo o html da página, permitindo que o usuário, no caso atual, acesse os outros dados de maneira assíncrona, recebendo apenas os dados que foram pedidos instantaneamente. &lt;/p&gt;

&lt;p&gt;Para isso, crie dois arquivos. Um que será parte do front: &lt;code&gt;index.php&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Lista de Alunos&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Alunos&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"resultado"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;&amp;lt;?php include 'artigos.php'; ?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E outro de nome &lt;code&gt;app.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DOMContentLoaded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resultado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-page]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data-page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`artigos.php?page=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;ajax=1`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele funciona da seguinte forma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;document.addEventListener('DOMContentLoaded', function ()&lt;/code&gt;: espera o carregamento completo da página para executar alguma função;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;const resultado = document.getElementById("resultado");&lt;/code&gt;: seleciona onde serão feitas as requisições que irão envolver o ajax;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;document.addEventListener('click', function (e)&lt;/code&gt;: adiciona um listener para todos os botões na página, isso se chama &lt;strong&gt;event delegation&lt;/strong&gt;, ao invés de pegar botão por botão, ele pega todos os botões para depois tratar eles;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;if (e.target.matches('[data-page]'))&lt;/code&gt;: se o elemento clicado tiver o atributo &lt;code&gt;data-page&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;e.preventDefault();&lt;/code&gt;: evita comportamento padrão de recarregar a página;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;const page = e.target.getAttribute('data-page');&lt;/code&gt;: pega o valor do atributo &lt;code&gt;data-page&lt;/code&gt; para adicioná-lo na requisição ajax;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;fetch('artigos.php?page=${page}&amp;amp;ajax=1\')&lt;/code&gt;: faz a requisição a página de artigo correspondente, o &lt;code&gt;ajax&lt;/code&gt; é para dizer que somente deve ser entregue o conteúdo solicitado;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.then(res =&amp;gt; res.text())&lt;/code&gt;: como a resposta não é em JSON, usamos .text;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.then(html =&amp;gt; {resultado.innerHTML = html;})&lt;/code&gt;: atualiza a div resultado.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por fim, a paginação após isso deve estar funcionando de forma assíncrona, sem recarregar a página e entregando todos os conteúdos solicitados.&lt;/p&gt;

&lt;p&gt;Na próxima parte, irei mostrar como fazer uma barra de pesquisa usando também ajax. Muito obrigado por lerem até aqui!&lt;/p&gt;

&lt;p&gt;O repositório oficial do projeto se encontra aqui: &lt;a href="https://github.com/Luis-60/lista-de-alunos" rel="noopener noreferrer"&gt;https://github.com/Luis-60/lista-de-alunos&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>php</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Criando um Grid de Dados Simples usando MYSQL, PHP e AJAX - Listar Dados</title>
      <dc:creator>Luis Carlos</dc:creator>
      <pubDate>Tue, 20 May 2025 04:47:12 +0000</pubDate>
      <link>https://dev.to/luis_carlos60/criando-um-grid-de-dados-simples-contendo-paginacao-filtros-barra-de-pesquisa-classificacao-9j1</link>
      <guid>https://dev.to/luis_carlos60/criando-um-grid-de-dados-simples-contendo-paginacao-filtros-barra-de-pesquisa-classificacao-9j1</guid>
      <description>&lt;p&gt;De iniciante para iniciante, gostaria de compartilhar uma maneira de como fazer um grid de dados, ou seja, uma página contendo uma lista de itens, com ferramentas de filtro, pesquisa e futuramente classificação, tudo isso utilizando MYSQL, PHP e AJAX. Os detalhes de cada ferramenta serão explicados logo embaixo.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FERRAMENTAS UTILIZADAS&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;MYSQL&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Versão: 8.0&lt;/p&gt;

&lt;p&gt;O MYSQL será o Gerenciador de Banco de Dados Relacionais utilizado pela sua facilidade de aprendizado e ferramentas embutidas que auxiliam o desenvolvedor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Versão: 8.4.7&lt;/p&gt;

&lt;p&gt;O PHP é uma linguagem de programação e, será usado para fazer conexão com o banco de dados, utilizando PDO, extensão de acesso a banco de dados do PHP.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AJAX&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AJAX é um padrão de programação que envolve javascript e xml e que torna páginas mais interativas com o usuário pois como o próprio nome já diz, é assíncrono, ou seja, permite que parte de uma página se atualize assíncronamente, sem precisar recarregar toda a página. Quando um evento ocorre, ele cria um objeto XMLHttpRequest e envia para o servidor, o servidor cria a resposta e envia os dados de volta para o browser, atualizando o conteúdo da página após ser processado pelo browser. Ele será importante, pois irá facilitar o cenário de busca, de filtragem e listagem para o usuário, sem precisar recarregar a página sempre.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;CENÁRIO E BANCO DE DADOS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Criado pensando em um cenário simples e fictício, apenas para fins educativos. O caso se baseia numa lista de alunos, onde dará para listar todos os alunos de uma única matéria não especificada, contendo nome, idade, notas, média, imagem e status (Reprovado, Aprovado)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiywre4iwp3ugoyuyck24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiywre4iwp3ugoyuyck24.png" alt="Image description" width="583" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar as tabelas no banco de dados (MYSQL)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Tabela de Status
CREATE TABLE status (
    id INT NOT NULL AUTO_INCREMENT,
    nome VARCHAR(255),
    PRIMARY KEY (id)
);

-- Tabela de Aluno
CREATE TABLE aluno (
    id INT NOT NULL AUTO_INCREMENT,
    nome VARCHAR(255),
    idade INT,
    media FLOAT,
    idStatus INT,
    foto VARCHAR(255),
    PRIMARY KEY (id),
    FOREIGN KEY (idStatus) REFERENCES status(id)
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Popular as tabelas (MYSQL)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Tabela de Status
INSERT INTO status (id, nome) VALUES
(1, 'APROVADO'),
(2, 'REPROVADO');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Tabela de Alunos
INSERT INTO aluno (nome, idade, media, idStatus, foto) VALUES
('Ana Clara', 18, 8.5, 1, 'profile.jpg'),
('Bruno Silva', 20, 6.9, 1, 'profile.jpg'),
('Carlos Eduardo', 22, 7.4, 1, 'profile.jpg'),
('Daniela Rocha', 19, 9.1, 1, 'profile.jpg'),
('Eduardo Lima', 21, 5.8, 2, 'profile.jpg'),
('Fernanda Souza', 20, 7.9, 1, 'profile.jpg'),
('Gabriel Costa', 18, 6.4, 1, 'profile.jpg'),
('Helena Martins', 19, 8.7, 1, 'profile.jpg'),
('Igor Pereira', 22, 7.2, 1, 'profile.jpg'),
('Julia Fernandes', 20, 9.4, 1, 'profile.jpg'),
('Kauã Almeida', 21, 5.2, 2, 'profile.jpg'),
('Lara Gonçalves', 18, 8.0, 1, 'profile.jpg'),
('Lucas Melo', 19, 7.1, 1, 'profile.jpg'),
('Mariana Castro', 22, 9.0, 1, 'profile.jpg'),
('Nicolas Duarte', 20, 6.5, 1, 'profile.jpg'),
('Olívia Braga', 21, 8.9, 1, 'profile.jpg'),
('Pedro Henrique', 18, 5.9, 2, 'profile.jpg'),
('Queila Nascimento', 20, 7.8, 1, 'profile.jpg'),
('Rafael Teixeira', 22, 6.7, 1, 'profile.jpg'),
('Sara Lopes', 19, 9.5, 1, 'profile.jpg'),
('Tiago Amorim', 21, 4.8, 2, 'profile.jpg'),
('Ursula Neves', 20, 8.3, 1, 'profile.jpg'),
('Vinícius Moreira', 19, 7.6, 1, 'profile.jpg'),
('Wesley Barbosa', 22, 6.3, 1, 'profile.jpg'),
('Xuxa Andrade', 18, 8.2, 1, 'profile.jpg'),
('Yasmin Torres', 20, 7.0, 1, 'profile.jpg'),
('Zeca Pagodinho', 23, 5.7, 2, 'profile.jpg'),
('Arthur Lima', 21, 9.1, 1, 'profile.jpg'),
('Beatriz Ramos', 20, 8.6, 1, 'profile.jpg'),
('César Vieira', 22, 7.3, 1, 'profile.jpg');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;LISTA DE ALUNOS&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Conexão com o Banco de Dados (PHP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Será necessário para fazer a conexão com o banco de dados criar duas pastas e um arquivo de conexão no root do projeto de nome /app/database/connection.php&lt;/p&gt;

&lt;p&gt;Dentro do arquivo, configuraremos a conexão da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
namespace app\database;
use PDO;

class Connection {
    private static $pdoInstance = null;

    public static function getConnection()
    {
        if (empty(self::$pdoInstance)) {
            self::$pdoInstance = new PDO(
                "mysql:host=localhost;dbname=app_db",
                "user",
                "secret", // mude de acordo com sua demanda
                [
                    PDO::ATTR_DEFAULT_FETCH_MODE =&amp;gt; PDO::FETCH_OBJ,
                    PDO::ATTR_ERRMODE =&amp;gt; PDO::ERRMODE_EXCEPTION // boa prática: mostrar erros PDO
                ]
            );
        }
        return self::$pdoInstance;
    }
}

$pdo = Connection::getConnection();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Testar para saber se a conexão deu certo (PHP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dentro da pasta root do projeto, crie um arquivo de nome index.php e dentro dele, chame o diretório que contém o arquivo que possui a conexão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
require_once __DIR__ . '/app/database/connection.php';
use app\database\Connection;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida, monte sua Query e adicione-a em uma lista&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$sqlAlunos = "SELECT
 aluno.id, aluno.nome, aluno.idade, aluno.media, status.nome
 AS status_nome, aluno.foto 
 FROM aluno 
 JOIN status ON aluno.idStatus = status.id";
$stmt = $pdo-&amp;gt;prepare($sqlAlunos); // Prepara o sql com stakeholders
$stmt-&amp;gt;execute(); // Executa a consulta no banco
$alunos = $stmt-&amp;gt;fetchAll(PDO::FETCH_OBJ); // Adiciona tudo em uma lista
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs.: O stmt é uma variavel com nome arbitrário, mas que signica "Statement", ela prepara a query com placeholders, que representam valores que serão usados depois protegendo de SQL Injection&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Montar o foreach para listar os alunos
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach ($alunos as $aluno) {
    echo "&amp;lt;p&amp;gt;";
    echo "&amp;lt;b&amp;gt;Nome&amp;lt;/b&amp;gt;: {$aluno-&amp;gt;nome}&amp;lt;br&amp;gt;";
    echo "&amp;lt;b&amp;gt;Status:&amp;lt;/b&amp;gt; {$aluno-&amp;gt;status_nome}&amp;lt;br&amp;gt;";
    echo "&amp;lt;b&amp;gt;Idade&amp;lt;/b&amp;gt;: {$aluno-&amp;gt;idade}&amp;lt;br&amp;gt;";
    echo "&amp;lt;b&amp;gt;Média&amp;lt;/b&amp;gt;: {$aluno-&amp;gt;media}&amp;lt;br&amp;gt;";
    echo"&amp;lt;/p&amp;gt;&amp;lt;hr&amp;gt;";
}

?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto! Agora nós listamos todos os alunos e seus dados mais importantes (mesmo que esteja bem feinho).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80ydl7ufcs6pbkauffa9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F80ydl7ufcs6pbkauffa9.png" alt="Image description" width="597" height="866"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por enquanto foi só isso, no próximo será feita a paginação, onde já começaremos a trabalhar com AJAX.&lt;/p&gt;

&lt;p&gt;Caso queira dar alguma sugestão, por favor, digite em baixo.&lt;br&gt;
O código fonte se encontra no repositório: &lt;a href="https://github.com/Luis-60/lista-de-alunos" rel="noopener noreferrer"&gt;lista-de-alunos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>php</category>
    </item>
  </channel>
</rss>
