Gerando gráficos pizza com dados do BD
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
Discussão (5)
Carregando comentários...