O documento discute a criação de relatórios personalizados em PHP usando tabelas. Ele mostra como gerar uma tabela simples com dados, adicionar estilos de linha alternados, ordenar colunas por links, e criar relatórios paginados usando LIMIT no MySQL.
Tese de doutorado - Dalton Lopes Martins - Análise de Redes Sociais de colabo...
Relatório paginado de clientes
1. Programação Web
Fatec Ipiranga
Análise e Desenvolvimento de Sistemas
Aula 12 – Customização de relatórios – parte I (Tabelas)
Dalton Martins
dmartins@gmail.com
São Paulo, Novembro, 2011
2. Bibliotecas de Apoio - PEAR
Há um conjunto de bibliotecas chamado PEAR (PHP
extension and application repository) que são muito úteis
na extensão das funcionalidades nativas do PHP;
O repositório é disponível online: http://pear.php.net/
São mais de 550 pacotes representando funcionalidades
em mais de 37 áreas diferentes;
Normalmente, esse conjunto de bibliotecas já vem
instalado com o XAMPP, no diretório phpPEAR...
3. <?php
// Inclui a biblioteca de tratamento de tabelas
require_once "HTML/Table.php";
// monta os dados no vetor
$dados = array(
'0' => array("12309","45633","2010-12-19 01:13:42","$22.04","$5.67","$27.71"),
'1' => array("12310","942","2010-12-19 01:15:12","$11.50","$3.40","$14.90"),
'2' => array("12311","7879","2010-12-19 01:15:22","$95.99","$15.00","$110.99"),
'3' => array("12312","55521","2010-12-19 01:30:45","$10.75","$3.00","$13.75")
);
// Cria um vetor com os atributos da tabela
$atributos = array('border' => '1');
// Cria o objeto tabela
$tabela = new HTML_Table($atributos);
Criando uma
// configura os cabeçalhos
$tabela->setHeaderContents(0, 0, "Pedido");
tabela simples
$tabela->setHeaderContents(0, 1, "Cliente");
$tabela->setHeaderContents(0, 2, "Data do pedido");
$tabela->setHeaderContents(0, 3, "Sub Total");
$tabela->setHeaderContents(0, 4, "Custo de envio");
$tabela->setHeaderContents(0, 5, "Custo total");
// Itera pelo vetor de dados para produzir as linhas da tabela
for($linhanum = 0; $linhanum < count($dados); $linhanum++) {
for($colnum = 0; $colnum < 6; $colnum++) {
$tabela->setCellContents($linhanum+1, $colnum,
$dados[$linhanum][$colnum]);
}
}
// exibe os dados na tela
echo $tabela->toHTML();
?>
4. Melhorando a visibilidade dos
resultados
// Itera pelo vetor de dados para produzir as linhas da tabela
for($linhanum = 0; $linhanum < count($dados); $linhanum++) {
for($colnum = 0; $colnum < 6; $colnum++) {
$tabela->setCellContents($linhanum+1, $colnum,
$dados[$linhanum][$colnum]);
}
}
$tabela->altRowAttributes(1,"bgcolor=#CCC99");
// exibe os dados na tela
echo $tabela->toHTML();
Obs.: tutorial de outras opções sobre como usar a biblioteca Table
http://dev.obliquid.com/docs/pear_table.html
5. Trabalhando com banco de dados
Criamos o banco de dados usuarios e a tabela pessoas abaixo para apoiar
os próximos passos que veremos...
CREATE TABLE `usuarios`.`pessoas` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nome` VARCHAR( 30 ) NOT NULL
);
6. Tabela simples a partir do banco
<?php
require_once "HTML/Table.php";
$mysqli = new mysqli("localhost", "root", "", "usuarios");
$attributes = array('border' => '1');
$table = new HTML_Table($attributes);
$table->setHeaderContents(0, 0, "ID");
$table->setHeaderContents(0, 1, "Pessoas");
$query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM pessoas ORDER BY id";
$stmt = $mysqli->prepare($query);
$stmt->execute();
$stmt->bind_result($ID, $nomeID);
$rownum = 1;
while ($stmt->fetch()) {
$table->setCellContents($rownum, 0, $ID);
$table->setCellContents($rownum, 1, $nomeID);
$rownum++;
}
echo $table->toHTML();
$mysqli->close();
?>
7. <?php
require_once "HTML/Table.php";
$mysqli = new mysqli("localhost", "root", "", "usuarios");
$attributes = array('border' => '1');
$table = new HTML_Table($attributes);
// Montando os cabeçalhos das colunas linkáveis utilizando o método GET do HTTP!
$IDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=id'>ID</a>";
$nomeIDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=nome'>Pessoas</a>";
$table->setHeaderContents(0, 0, $IDcoluna);
$table->setHeaderContents(0, 1, $nomeIDcoluna);
// selecionando o campo de indexação conforme o retorno do método GET
$campo = (isset($_GET['campo'])) ? $_GET['campo'] : "id";
$query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM pessoas ORDER BY ".$campo." ASC";
$stmt = $mysqli->prepare($query);
$stmt->execute();
$stmt->bind_result($ID,$nomeID);
$rownum = 1;
while ($stmt->fetch()) {
$table->setCellContents($rownum, 0, $ID);
$table->setCellContents($rownum, 1, $nomeID); Ordenando o
}
$rownum++;
relatório pelas
?>
echo $table->toHTML();
$mysqli->close(); colunas
8. Criando relatórios paginados
O MySQL possui uma cláusula LIMIT, que permite extrairmos
dados limitados por um valor de linha inicial e o número de linhas
a partir desse valor que deve ser extraído.
Exemplo:
SELECT nome FROM pessoas ORDER BY nome ASC LIMIT 0,2;
recupera apenas as duas primeiras linhas.
Para utilizarmos na criação de relatórios, precisamos determinar 3
variáveis:
– Número de linhas por página;
– Faixa de linhas a extrair do banco;
– Número de linhas totais de resultado.
9. Criando relatórios paginados - (i)
<?php
require_once "HTML/Table.php";
$mysqli = new mysqli("localhost", "root", "Dm%512p", "usuarios");
$tamanhodapagina=2;
$registroinicial = (int) $_GET['registroinicial'];
$registroinicial = (isset($_GET['registroinicial'])) ? $registroinicial : 0;
$attributes = array('border' => '1');
$table = new HTML_Table($attributes);
// Montando os cabeçalhos das colunas linkáveis utilizando o método GET do HTTP!
$IDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=id'>ID</a>";
$nomeIDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=nome'>Pessoas</a>";
$table->setHeaderContents(0, 0, $IDcoluna);
$table->setHeaderContents(0, 1, $nomeIDcoluna);
// selecionando o campo de indexação conforme o retorno do método GET
$campo = (isset($_GET['campo'])) ? $_GET['campo'] : "id";
10. Criando relatórios paginados - (ii)
// seleciona o número total de registros na tabela
$resultado = $mysqli->query("SELECT count(id) AS id FROM pessoas");
list($totalregistros)=$resultado->fetch_row();
$query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM
pessoas ORDER BY ".$campo." ASC LIMIT ".$registroinicial.",".$tamanhodapagina;
$stmt = $mysqli->prepare($query);
$stmt->execute();
$stmt->bind_result($ID,$nomeID);
$rownum = 1;
while ($stmt->fetch()) {
$table->setCellContents($rownum, 0, $ID);
$table->setCellContents($rownum, 1, $nomeID);
$rownum++;
}
echo $table->toHTML();
11. Criando relatórios paginados - (iii)
// cria o link de anterior
if ($registroinicial > 0) {
$prev = $registroinicial - $tamanhodapagina;
$url = $_SERVER['PHP_SELF']."?registroinicial=$prev";
printf("<a href='%s'> Pagina anterior </a>",$url);
}
// cria o link posterior
if ($totalregistros > ($registroinicial + $tamanhodapagina)) {
$next = $registroinicial+$tamanhodapagina;
$url = $_SERVER['PHP_SELF']."?registroinicial=$next";
printf("<a href='%s'> Pagina posterior </a>",$url);
}
$mysqli->close();
?>