Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Anderson Baldner

[Resolvido] Relatórios

Recommended Posts

boa noite pra todos.

bem,eu estou desenvolvendo um sistema,em PHP e MYSQL,e eu queria exibir para cada usuário,um relatório com quantidades de cliques que ele recebeu por dia e por mês. Eu estou usando o JPGRAPH pra gerar um gráfico linha para essa finalidade.ele gera perfeitamente o grafico com arrays ficticios que eu criei dentro do proprio codigo(ou seja,não está vindo do banco de dados),mais a questão é: como eu separo a quantidade de cliques ( em arrays ) por dia do total de cliques para que ele possa exibir?

o sistema de cliques totais,ta funcinando.mais como separo por dia e mês?

desde já agradeço

abraços a todos

Anderson Baldner

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa agrupar por cada tipo de informação que deseja filtrar, mas pra isso, seu DB deve estar muito bem modelado para não gerar informações imprecisas.

 

Posta o seu MER se houver várias tabelas ou apenas a estrutura da tabela que contêm os cliques, assim, talvez seja mais fácil de ajudar.

 

Valewww...

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ai Alex

 

A estrutura do Bando de dados é mais ou menos a seguinte:

tenho uma tabela chamada dotad,que é onde será armazenado os dados dos clientes.

segue abaixo o código SQL

-- phpMyAdmin SQL Dump
-- version 2.11.4
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Fev 08, 2009 as 10:54 PM
-- Versão do Servidor: 5.0.51
-- Versão do PHP: 5.2.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `mondoo`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `dotad`
--

CREATE TABLE IF NOT EXISTS `dotad` (
  `ID` int(11) NOT NULL,
  `Nome` varchar(300) NOT NULL,
  `Site` varchar(500) NOT NULL,
  `Cidade` varchar(50) NOT NULL,
  `Estado` varchar(50) NOT NULL,
  `Pais` varchar(50) NOT NULL,
  `Status` int(1) NOT NULL,
  `Email` varchar(200) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Extraindo dados da tabela `dotad`
--

INSERT INTO `dotad` (`ID`, `Nome`, `Site`, `Cidade`, `Estado`, `Pais`, `Status`, `Email`) VALUES
(16, 'Vimari Veículos', 'www.vimari.com.br', 'Rio de Janeiro', 'Rio de Janeiro', 'Brasil', 0, 'vimari@vimari.com.br');
e uma outra tabela,onde eu estou armazenando os cliques

segue o código SQL

-- phpMyAdmin SQL Dump
-- version 2.11.4
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Fev 08, 2009 as 11:03 PM
-- Versão do Servidor: 5.0.51
-- Versão do PHP: 5.2.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `mondoo`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `dotad_cam`
--

CREATE TABLE IF NOT EXISTS `dotad_cam` (
  `ID` int(11) NOT NULL auto_increment,
  `Nome` varchar(100) NOT NULL,
  `IDusu` int(11) NOT NULL,
  `Status` int(2) NOT NULL,
  `Mclick` varchar(300) NOT NULL,
  `MDiario` varchar(50) NOT NULL,
  `Mmes` varchar(50) NOT NULL,
  `Cliques` int(20) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2;

--
-- Extraindo dados da tabela `dotad_cam`
--

INSERT INTO `dotad_cam` (`ID`, `Nome`, `IDusu`, `Status`, `Mclick`, `MDiario`, `Mmes`, `Cliques`) VALUES
(1, 'Aproveite nossas promoções', 16, 0, '', '5,00', '100,00', 21);

o campo clique é alimentado por uma soma de +1 quando alguém clica na página do cliente.

qualquer ajuda é bem vinda

vlw pela força pessoal

paz!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,

 

Nem cheguei a rodar seu script pra testar e te dar uma resposta concreta, porque na minha opinião você num vai conseguir filtrar absolutamente nada.

 

Como você vai saber que dia ou qual mês e a quantidade de cliques somando +1 num campo isolado?

 

Eu faria de duas formas:

 

1 - uma inserção por clique - Quando você quiser relatoriar, bastaria agrupar GROUP BY dia ou mês e fazer uma soma simples SUM(cliques);

 

2- uma inserção por dia, somando cada clique - Quando você quiser relatoriar o dia, basta chamar a coluna do dia específico e se for tirar por mês basta agrupar GROUP BY mês com uma soma simples SUM(cliques).

 

Fica bem simples de se fazer assim, mas eu trabalharia com a opção 1.

 

Valewww...

Compartilhar este post


Link para o post
Compartilhar em outros sites

deixa eu ver se entendi.

ai no caso era só eu criar um campo DATE na minha tabela de cliques e ao invés de somar mais um ao valor de cliques,eu deveria adicionar mais um registro e depois conta-lo com o num_rows por exemplo antes de agrupar com o GROUP BY?

vlw pela atenção Alex =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

num_rows é quantidade de registros localizados.

 

O que entendi que você quer é apresentar a somatória dos cliques, certo?

 

Se você gerar um registor por clique, deverar ter um campo com um valor fixo (por exemplo "1")

 

Cada clique, seria inserido como um único registro, portanto imagine 50 cliques registrados no dia x, 20 no dia y e 100 no dia z, seriam num_rows = 170.

 

Mas o uso correto e prático seria "select dia,sum(clique) as clique from tabela group by dia", assim você terá o resultado da seguinte forma:

 

dia | clique

x -------- 50

y -------- 20

z -------- 100

 

Você ainda poderia ter a somatória total acrescentando a cláusula with rollup "select dia,sum(clique) cliques from tabela group by dia with rollup".

 

dia | clique

x -------- 50

y -------- 20

z -------- 100

NULL ---- 170

 

Se quiser relatório para dia(s) específico(s), basta acrescentar os argumentos de busca como "where dia between diainicio and diafim" e assim sucessivamente.

 

Mas se você quiser relatórios baseados na soma de cada clique por dia, terá que fazer de forma mais complexa.

 

Ao clicar, você verifica se há registro para aquele dia, se não houver, insere um registro, se houver, soma 1 ao campo clique, mas sua forma de relatório seria diferente e mais complicada. Para apresentar resultados do dia, bastaria uma consulta simples como "select dia,clique from tabela where dia between diainicio and diafim"

 

Mas para somar o total tem que fazer uma union agrupando tudo.

 

Enfim, existem várias formas de você resolver seu problema.

 

Valewww...

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais esse dia X,Y e Z seriam valor date no BD?

bem,pelo q entendi a "solução" seria eu criar uma tabela pra armazenar os cliques individualmente neh?

por exemplo: na página que uso para somar mais um ao clique na tabela dotad_cam,eu mudaria o destino dos cliques para uma tabela chamada cliques por exemplo,e quando fosse adicionar à tabela,ele checaria se já tem algum registro de clique para aquele usuário na tabela cliques para aquele dia ( no caso um campo date,q posso comparar com a data do servidor ).caso tenha, ele incremente + 1 ao valor Cliques do usuário,caso não,ele adiciona o registro do usuário para aquele dia.

é isso que você quis dizer?e caso de o usuário não receber nenhum clique em algum dia por exemplo no dia X.se ele não receber cliques,não terá registro naquela data,oq me impossibilitaria de retornar valor 0 pra quela data ou não?

po Alex,mau ae pela chateação,mais modelagem de BD ainda é meio complexo pra minha cabeça ainda...rs

vlw pela atenção kra

paz!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Relaxa cara, fórum é pra isso mesmo, uma mão lava a outra, hoje você precisa de ajuda, amanhã você pode ajudar.

 

Vamos lá.

 

Se você não tem muita intimidade com DB, é melhor criar uma tabela simples e prática, como por exemplo:

 

create table nomedatabela (

registro int(6) not null auto_increment unique key,

usuarioqueclicou varchar(30) not null default '',

clique tinyint(1) not null default '1',

diadoclique date not null default '0000-00-00',

horadoclique time not null default '00:00:00',

.

.

.

.

primary key(usuarioqueclicou,diadoclique,horadoclique),

index indusuarioqueclicou(usuarioqueclicou),

index indclique(clique),

index inddiadoclique(diadoclique),

index indhoradoclique(horadoclique)

);

 

Para inserir use:

 

insert into nomedatabela (usuarioqueclicou,diadoclique,horadoclique) values ('josé',curdate(),curtime());

 

ou simplesmente,

 

insert into nomedatabela values ('','usuário1',1,curdate(),curtime());

 

Eu adicionei horadoclique para evitar duplicidade porque o primary key faz isso.

 

Quando você for consultar os dados, use:

 

select diadoclique,usuarioqueclicou,sum(clique) cliques from nomedatabela group by diadoclique,usuarioqueclicou with rollup;

 

diadoclique | usuarioqueclicou | cliques

2009-02-13 usuário1 50

2009-02-14 usuário1 10

2009-02-15 usuário1 12

NULL usuario1 72

 

ou

 

diadoclique | usuarioqueclicou | cliques

2009-02-13 usuário1 50

2009-02-13 usuário2 65

2009-02-13 usuário3 40

2009-02-13 NULL 155

 

Para filtragens use:

 

PARA CADA DIA

select diadoclique,usuarioqueclicou,sum(clique) cliques from nomedatabela where usuarioqueclicou='usuario1' and diadoclique between '2009-02-13' and '2009-02-15' group by diadoclique,usuarioqueclicou with rollup;

 

diadoclique | usuarioqueclicou | cliques

2009-02-13 usuário1 50

2009-02-13 usuário2 65

2009-02-13 usuário3 40

2009-02-13 NULL 155

2009-02-14 usuário1 10

2009-02-14 usuário2 15

2009-02-14 usuário3 2

2009-02-14 NULL 27

2009-02-15 usuário2 120

2009-02-15 usuário3 50

2009-02-15 NULL 170

NULL NULL 352

 

PARA CADA MÊS

select date_format(diadoclique,'%m') mes,usuarioqueclicou,sum(clique) cliques from nomedatabela where group by mes,usuarioqueclicou with rollup;

 

mes | usuarioqueclicou | cliques

02 usuário1 60

02 usuário2 200

02 usuário3 92

02 NULL 352

 

Entendeu como é simples?

 

Valewww...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alex,desse jeito eu achei uma ótima ideia,porém eu queria "arrecadar" mais informações nos cliques,oq me complicou um pouco na hora de tentar implementar o código. enfim,optei por proucurar uma alternativa,usando o num_rows como eu tinha falado no principio.

eu fiz o seguinte:

 

isso foi pra pegar os cliques de hoje ->

$hj = date("y/m/d");
$sql = "SELECT * FROM dotad_cliques WHERE  DotID = $userid AND Data = '$hj' "; //aqui só os de hoje
$sql_query = mysql_query($sql);
$adtota = mysql_num_rows($sql_query);
$sqll = mysql_query("SELECT * FROM dotad_cliques WHERE  DotID = $userid");  //aqui pego todos os cliques do usuário.
$adtotal = mysql_num_rows($sqll);
desse modo,me permitiu guardar também o valor do usuário que clicou no link.

a minha SQL pra nova tabela que construi chamada dotad_cliques, é a seguinte:

CREATE TABLE IF NOT EXISTS `dotad_cliques` (
  `ID` int(11) NOT NULL auto_increment,
  `IDusu` int(20) NOT NULL,
  `DotID` int(11) NOT NULL,
  `AdId` int(11) NOT NULL,
  `Data` date NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3;

creio que desse modo vá ser ser eficiente o funcionamento do script,oq você pensa?

 

outra coisa...caso eu opte por fazer as estatísticas dessa forma,eu teria que lidar com datas,para "desmonta-las" com um explode e usar os arrays com os pedacinhos da data,pra assim eu chegar até o mês que no caso seria o Array[1](se não me engano) e o dia que seria o Array[2](se não me engano tb).

oq acha dessa forma?viavel ou muita complicação pra pouca coisa?

[]'s

paz!

 

 

kra,to editando esse post,pra te pedir mais uma orientação. como q eu faço pra copntar esses valores?

 

2009-02-13 00:00:00 8 17

2009-02-14 00:00:00 7 17

2009-02-14 00:00:00 7 16

2009-02-14 00:00:00 7 17

2009-02-14 00:00:00 7 16

2009-02-14 00:00:00 7 18

2009-02-14 00:00:00 7 18

2009-02-15 00:00:00 7 16

2009-02-15 04:00:12 7 18

2009-02-15 04:00:52 7 16

Total de 10 cliques

mais exibir dessa forma

2009-02-13 1

2009-02-14 6

2009-02-15 3

 

com num_rows? ou tem algo q some automaticamente?acho q o sum não serviria neh? =/

Total de 10 cliques

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

po kra,é quase isso q eu preciso,só oq eu preciso não é q ele retorne o valor total total,e sim total separado pelas datas

seria tp um num_rows filtrando pela data,e separando os totais em arrays,q é pra eu pegar esses arrays e desenhar o gráfico de cliques por dia

tem como fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

select date(campo_do_dia) , count(*) qtde_clicks

from tabela

Group by date(campo_do_dia) with rollup

 

te traz o seguinte resultado:

 

2009-02-13 1

2009-02-14 6

2009-02-15 3

10

 

Agora o q você quer fazer com array eu ainda nao entendi

Compartilhar este post


Link para o post
Compartilhar em outros sites

o JPGraph,precisa d arrays rpa gerar os gráficos.

por exemplo: pra gerar um gra´fico pizza,eu preciso de um ou mais arrays com valores diferentes,pra q ele monte esse gráfico pra mim.

pra eu exibir esses valores que você disse q o filtro retornaria,eu precisaria fazer como?

 

$sql = @mysql_query("select date(Data) , count(*) qtde_clicks  
from dotad_cam Group by date(Data) with rollup");
$adtot = mysql_num_rows($sql);
echo"adtot";

dessa forma não mostra separado.

como seria a exibição?

e no caso esse qtde_clicks é só o valor "figurativo" do COUNT ou seria algum valor do DB?

Compartilhar este post


Link para o post
Compartilhar em outros sites

a falta de vodka nos analistas de hj em dia eh um problema mto serio...

 

vamos lah...

 

$sql = "select date(Data) , count(*) qtde_clicks

from dotad_cam Group by date(Data)";

 

$array_valores = mysql_query($sql) or die(mysql_error());

 

$k=0;

 

while($valores = mysql_fetch_array($array_valores))

{

$array_dia[k] = $valores[0];

$array_qtde[k] = $valores[1];

$k++;

}

 

 

 

 

pronto, agora você montou dois arrays, um com os dias e outro com a qtde de clicks, eh isso q você quera?

Compartilhar este post


Link para o post
Compartilhar em outros sites

só não está perfeito,pq perfeito so Jesus! uaheIUHEIA

não está gerando o loop,mais vou ver aqui oq pode estar acontecendo,mais ta retornando os valores exatamente do jeito q eu queria,separado por dias e td mais

muito obrigado amigo

muita paz! :D

 

ps:pode deixar q vou comprar uma garrafa d vodka pra deixar em ksa uiaehIUEHUIAE http://forum.imasters.com.br/public/style_emoticons/default/yay.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.