Dividir resultados de query no PHP



Recentemente precisei ver um jeito para dividir os resultados retornados do MySql, como eram muitos, procurei um modo de paginação.
Encontrei algo na internet por Rafael Costa, adaptei o código pra's minhas necessidades e resolvi compartilhar aqui. ;)



<?php
//Define a variável recebida (p=página. via URL, exemplo: home.php?p=1)
$p = $_GET["p"];

// Verifica se a variável tá declarada, senão deixa
//na primeira página como padrão.
if(!isset($p)) $p = 1;

// Define aqui a quantidade máxima de registros por página.
$qnt = 10;

// A função calcula o início da seleção, calculando:
// (página atual * quantidade por página) - quantidade por página
$inicio = ($p*$qnt) - $qnt;

// Seleciona no banco de dados com o LIMIT indicado pelos
//números acima.
$sql_select = "SELECT cliente, email, telefone, endereco, id, ativo FROM tbl_clientes LIMIT $inicio, $qnt";

// Executa o Query
$sql_query = mysql_query($sql_select);

// Faz uma nova seleção no banco de dados, desta vez sem LIMIT para
//pegarmos o número total de registros
$sql_select_all = "SELECT cliente, email, telefone, endereco, id, ativo FROM tbl_clientes";

// Executa o query da seleção acima
$sql_query_all = mysql_query($sql_select_all);

// Gera uma variável com o número total de registros no banco de dados
$total_registros = mysql_num_rows($sql_query_all);

// Gera outra variável, desta vez com o número de
//páginas que será preciso. O comando ceil() arredonda
//"para cima" o valor
$pags = ceil($total_registros/$qnt);

// Número máximos de botões de paginação
$max_links = 5;

// Exibe registro inicial
$reg_inicial = ($inicio+1);

//Exibe registro final
$reg_final = ($reg_inicial + 9);
if ($reg_final > $total_registros){
$reg_final = $total_registros;
}else{
$reg_final = ($reg_inicial + 9);};
?>

//Inicia tabela de exibição de registros
<table width="100%" border="0px">
<tr>
<td class="h5">Exibindo registros<?php echo $reg_inicial." - ".$reg_final; ?></td>
</tr>
</table>

//Inicia tabela de cabeçalho dos dados do cliente
<table cellspacing="1" cellspadding="0" border="0" style="margin-left:2px;">
<tbody>
<thead class="S_thead">
<tr class="tbl_tr">
<th class="tbl_td">Nome do cliente: </th>
<th class="tbl_td">E-mail: </th>
<th class="tbl_td">Telefone: </th>
<th class="tbl_td">Endere&ccedil;o: </th>
<th class='tbl_td'></th>
</tr>
</thead>
</tbody>
</table>

<?php
// Cria um while para pegar as informações do BD
while($array = mysql_fetch_array($sql_query)) {

// Variável para capturar os campos no banco de dados
$cliente = $array["cliente"];
$email = $array["email"];
$telefone = $array["telefone"];
$id = $array["id"];
$endereco = $array["endereco"];
$ativo = $array["ativo"];

//Encurtar variáveis longas para aparecer na td da tabela
if (strlen($email)>15)
$email = substr($email, 0, 15)."...";
if (strlen($cliente)>15)
$cliente = substr($cliente, 0, 15)."...";
if (strlen($endereco)>15)
$endereco = substr($endereco, 0, 15)."...";

//Define a cor da linha e o ícone se inativo
if($ativo == 0){
$backg_inativo = "#FFBFCB"; $alerta = "<img src='images/warningicon.png'>&nbsp;<span style='color:red;font-weight:bold;'>Inativo</span>";
}else{$backg_inativo = "white"; $alerta = "";};

//Aqui começa o formulário de exibição dos clientes
echo " <table cellspacing='1' cellspadding='0'>";
echo " <tbody>";
echo " <tr class='tbl_tr' bgcolor='".$backg_inativo."'>";
echo " <td class='tbl_td'>$cliente</td>";
echo " <td class='tbl_td'>$email</td>";
echo " <td class='tbl_td'>$telefone</td>";
echo " <td class='tbl_td'>$endereco</td>";

//Bot&atilde;o Exibir
echo " <td class='tbl_td'><a href='exibircliente.php?view=".$id."'>Exibir</a>&nbsp;&nbsp;&nbsp;".$alerta."</td>";
echo " </tr>";
echo " </tbody>";
echo " </table>";
}

// Depois que selecionou todos os campos, pula uma
//linha para exibir os links(próxima, última...)
echo "<br />";

//Se a página for =1 o link fica desativado
if ($p == 1){
echo ""&lt;&lt;&lt;Primeira página";} else {
// Exibe o primeiro link "primeira página", que não
//entra na contagem acima($max_links=5)
echo "<a href='controleclientes.php?p=1' target='_self'>&lt;&lt;&lt;Primeira p&aacute;gina</a> ";
};

// Cria um for() para exibir os 3 links antes da página atual
for($i = $p-$max_links; $i <= $p-1; $i++) {
// Se o número da página for menor ou igual a zero, não faz nada
// (afinal, não existe página 0, -1, -2..)
if($i <=0) {
//faz nada
// Se estiver tudo OK, cria o link para outra página
} else { echo "<a href='controleclientes.php?p=".$i."' target='_self'>".$i."</a> "; } }

// Exibe a página atual, sem link, apenas o número
echo $p." ";
// Cria outro for(), desta vez para exibir 3 links após a página atual
for($i = $p+1; $i <= $p+$max_links; $i++) {
// Verifica se a página atual é maior do que
//a última página. Se for, não faz nada.
if($i > $pags) {
//faz nada
}
// Se tiver tudo Ok gera os links.
else { echo "<a href='controleclientes.php?p=".$i."' target='_self'>".$i."</a> "; } }

//Se a página for igual a $pags o link fica desativado
if ($p == $pags){
echo "Última p&aacute;gina&gt;&gt;&gt;";} else {
// Exibe o link "última página"
echo "<a href='controleclientes.php?p=".$pags."' target='_self'>Última p&aacute;gina&gt;&gt;&gt;</a> ";
};
?>


Qualquer dúvida, comente logo abaixo.

Um comentário:

  1. Deixa eu perguntar.. vamos supor que essa query vai gerar 10 paginas.... eu consigo fazer a impressão disso de uma só vez?
    Por exemplo, eu preciso criar boletos em massa... pensei em adaptar o seu codigo para isso, porém, preciso imprimir tudo isso de uma só vez.... Tem algum ideia? Gerar PDF não dá... já tentei fazer de tudo para gerar pdf com codigo de barras e naum funfou.... Pode me ajudar?

    ResponderExcluir