Ir para conteúdo

POWERED BY:

Arquivado

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

leozeferino

Gerando gráficos pizza com dados do BD

Recommended Posts

Pessoal,

 

 

Estou tentando montar um código que gere um gráfico do tipo pizza com dados do banco de dados. Para me auxiliar, achei um tutorial bom nesta página: http://www.revistaphp.com.br/artigo.php?id=73.

 

Já testei esse tutorial e funciona corretamente. Porém, quando eu pego os dados do banco de dados, ele dá erro:

"A imagem “http://www.xxx.com.br/rel_classificacao.php” contém erros e não pode ser exibida."

 

<?php// conexao com o banco de dadosinclude_once("/config/conexao.php");				// seleciona os meses				$sql = "SELECT distinct Mes FROM tab WHERE Ano=2007 ORDER BY Mes ASC"; 				$do = mysql_query($sql);												$Pmes=mysql_fetch_array($do);								// pegando dados sobre o mes						$sql = "SELECT * FROM tab WHERE Mes=". $Pmes["Mes"] ." and Ano=2007"; 				$m = mysql_query($sql);												$valores[5];				$dp[5];								$dp[0]="Vermelha";				$dp[1]="Amarela";				$dp[2]="Verde";				$dp[3]="Azul";				$dp[4]="Azul Claro";								for($i=0;$i<5;$i++)					$valores[$i]=0;									while ($dado=mysql_fetch_array($m)){										if ($dado["Cor"]=="Vermelha")					$valores[0]++;										if ($dado["Cor"]=="Amarela")					$valores[1]++;										if ($dado["Cor"]=="Verde")					$valores[2]++;										if ($dado["Cor"]=="Azul")					$valores[3]++;					if ($dado["Cor"]=="Azul Claro")					$valores[4]++;					} // SE EU COLOCO COMO COMENTÁRIO O CÓDIGO ACIMA E PEGO OS DADOS CONFORME O TUTORIAL, FUNCIONA TUDO CERTO.//-------------------- GERANDO O GRAFICO ------------------------------//// contando os valores. neste script, setei para que o limite fosse 100 valores// ou seja, 100 usuários, com seus respsctivos 100 valores.$n_valores  = 5;$total = 0;for ($z=0; $z<$n_valores; $z++) { if ($parte[$z]<0); $w=$z+1; $parte[$w] = $valores[$z]; $total += $valores[$z];}//Feito isso, começo a pré-montar o gráfico, com base nas informações conseguidas acima// calculando o diametro da pizza, no caso, 200 pixels$d = Array(); $diametro = 200; $radius = $diametro/2; // convertendo os valores, para graus, afinal, o negócio é redondo..rs for ($y=1; $y<=$n_valores; $y++) $d[$y] = ($parte[$y]/$total) * 360;$im = ImageCreate(450, 300);// cores que serão utilizadas nas fatias do gráfico$preto	 = ImageColorAllocate($im, 0, 0, 0); $branco	= ImageColorAllocate($im, 255, 255, 255); $verde	 = ImageColorAllocate($im, 0, 255, 0); $rosa	  = ImageColorAllocate($im, 255, 128, 128); $amarelo   = ImageColorAllocate($im, 255, 255, 128); $vermelho  = ImageColorAllocate($im, 255, 0, 0); $lilas	 = ImageColorAllocate($im, 128, 128, 192); $marrom	= ImageColorAllocate($im, 128, 64, 64); $laranja   = ImageColorAllocate($im, 255, 128, 64); $vinho	 = ImageColorAllocate($im, 64, 0, 64); $gelo	  = ImageColorAllocate($im, 210, 210, 210); $azul	  = ImageColorAllocate($im, 0, 0, 255); $cinza	 = ImageColorAllocate($im, 102, 102, 102); $amarelo2  = ImageColorAllocate($im, 255, 255, 0); $vermelho2 = ImageColorAllocate($im, 126, 14, 1);//Pegando mais dados informados no form, no caso, o fundo, pra continuar montando o relatório.// verificando se foi passada a variável fundo, através do form// no formato rgb, separados por traço: 255-255-255-255// se foi, mostra a cor, senão, deixa em branco.$e=0;if (isset($_REQUEST["fundo"])) { $r = explode("-",$_REQUEST["fundo"]); for ($z=0; $z<3; $z++) {  if (is_numeric($r[$z])) {   if ($r[$z] >= 0) {	if ($r[$z] <= 255) $e++;   }  } }}//Você deve estar se perguntando porque o script pega alguns dados do form, muito depois de ter começado a montar o relatório. Isso se deve mais ao fato organizacional do que qualquer outra coisa. Eu prefiro solicitar os dados que já foram passados, somente no momento em que vou utiliza-los, evitando carregar todos eles no inicio do arquivo.//Bem, vamos continuar montando o gráfico, agora montando a parte mais ‘bonitinha’.$cor[] = $branco;$cor[] = $verde;$cor[] = $rosa;$cor[] = $amarelo;$cor[] = $vermelho;$cor[] = $lilas;$cor[] = $marrom;$cor[] = $gelo;$cor[] = $azul;$cor[] = $cinza;$cor[] = $laranja;$cor[] = $vinho;$cor[] = $amarelo2;$cor[] = $vermelho2;$cor[] = $preto;// preenchendo o fundo da imagem, com a cor informada no form, ou deixando em brancoImageFill($im, 0, 0, $fundo); // desenhando a linha de base ImageArc($im, 153, 153, $diametro, $diametro, 315, 135, $preto); $u_angulo = 0;for ($z=1; $z<=$n_valores; $z++) {// calculando o arco do gráfico ImageArc($im, 150, 150, $diametro, $diametro, $u_angulo,($u_angulo+$d[$z]), $preto);  $u_angulo = $u_angulo + $d[$z];  $end_x = round(150 + ($radius * cos($u_angulo*pi()/180)));  $end_y = round(150 + ($radius * sin($u_angulo*pi()/180)));  ImageLine($im, 150, 150, $end_x, $end_y, $preto); } $a_angulo = 0;for ($z=1; $z<=$n_valores; $z++) {  $ponteiro = $a_angulo + $d[$z];  $e_angulo = ($a_angulo + $ponteiro) / 2;  $a_angulo = $ponteiro;  $end_x = round(150 + ($radius * cos($e_angulo*pi()/180)));  $end_y = round(150 + ($radius * sin($e_angulo*pi()/180)));  $mid_x = round((150+($end_x))/2);  $mid_y = round((150+($end_y))/2);  ImageFillToBorder($im,$mid_x,$mid_y,$preto,$cor[$z]);} //Agora vamos formatar a legenda lateral. Nela está contidos os nomes dos vendedores, e a porcentagem de vendas de cada um, com base nos valores previamente informados no formulário.if ($e == 3)	$fundo = ImageColorAllocate($im, $r[0], $r[1], $r[2]);else // sequencia de cores, que serão utilizadas nas fatias do gráfico	   $fundo = $branco;$sombra = $cinza;// parâmetros da legenda lateral // distancia horizontal$r_x=300; // distancia vertical$r_y=3; $e = 280/($n_valores+1);// desenhando os quadradinhosfor ($z=1; $z<=$n_valores; $z++) { $w_x = $r_x; $w_y = $r_y + ($z * $e); $parte[$z] = round($parte[$z]/$total * 100,1);  imagefilledrectangle($im, $w_x,$w_y,$w_x+15,$w_y+15,$sombra);  imagerectangle($im,$w_x-3,$w_y-3,$w_x+12,$w_y+12,$preto);  imagefilltoborder($im,$w_x-1,$w_y+11,$preto,$cor[$z]);  $w = $z - 1; if (isset($dp[$w])) $w = "% " . substr($dp[$w],0,12); else $w = "%"; imagestring($im,3,$w_x+20,$w_y,$parte[$z].$w,$preto); }//Agora sim, podemos finalizar o relatório, pegando o título informado no form, e desenhando o circulo por fora da pizza, que agora está completa.// criando a sombra do circulo da pizza ImageFillToBorder($im, 150 + 72, 150 + 72, $preto, $sombra); ImageArc($im, 153, 153, $diametro, $diametro,315,135,$sombra); // verifica se foi passado um titulo através do form// se foi, mostraif (isset($_REQUEST["titulo"])) { $x = strlen($_REQUEST["titulo"]); if ($x > 100) $w = substr($_REQUEST["titulo"],0,100); else {  $w = "";  for ($z=1; $z<((30-$x)/2); $z++) $w.=" ";  $w.=$_REQUEST["titulo"]; } // cor do titulo ImageString($im, 5, 20, 10, $w, $preto); }//Feito isso, acabou-se o trabalho, vamos apenas imprimir TUDO isso que fizemos, na tela, em formato de imagem, que no meu caso, usei PNG. (quem viu meu outro tutorial de GD, deve ter visto que também usei PNG lá. Eu prefiro png, por ser muito mais leve, e por costume mesmo... :). E já que sempre que preciso fazer transparências, acabo apanhando do gif, optei por fazer tudo em PNG! J )// impressão de tudo o que foi feito acima, em pngHeader("Content-Type: image/png"); ImagePNG($im);?>

 

Alguém tem alguma dica ou idéia o motivo de não funcionar?

 

 

 

Valewss!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

pra voce saber qual o erro que está dando, tira o Header("Content-Type: image/png"); da página e roda ela

Então, já fiz isso e não aparece erro nenhum. Quando pego os dados por GET ou POST o código funciona normalmente. Porém, quando eu pego os dados do banco de dados ocorre este erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, eu lhe recomendo o desde site:

 

http://www.amcharts.com/pie/

 

Voce pode passar os dados por parametros, ou atraves de um arquivo texto, ou atraves de xml, eu uso em um sistema que criei e tambem tem um exemplo dele no meu site:

 

www.midiaville.com.br/busca/publicidade.php

 

A única diferença que é em flash, mas é muito leve e facil de usar, se quiser uma ajuda pode contar comigo.

 

att,

 

Orides.

 

www.midiaville.com.br

Compartilhar este post


Link para o post
Compartilhar em outros sites

Orides,Adorei o esqueminha!! Até fim de semana vou testar em casa e qualquer coisa, te dou um toque! Brigadão!Aliás, parabéns pelo site! Muito bem feito!Abraços.

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.