Gerando gráficos com PHP + PostgreSQL + FusionCharts

  • Autor do post:
  • Categoria do post:PHP DEV

Gerando gráficos a partir do banco de dados – PHP + PostgreSQL

Gerando gráficos com PHP + PostgreSQL + FusionCharts

Pessoal, como eu havia prometido estou postando um exemplo de como gerar gráficos à partir do BD com PHP. Neste exemplo utilizaremos o PHP5 + PostgreSQL, usaremos também a classe de conexão já mostrada em outro post aqui (Classe conexão PHP + PostgreSQL).

O FusionCharts que iremos utilizar para gerar os gráficos também já foi abordado aqui de outra forma (veja o post do Fusioncharts).

Dê uma revisada nos 2 posts acima e volte aqui para não ficar perdido!

Bem, não vou abordar assuntos já discutidos em outros posts, então vamos direto ao assunto ok.

Neste exemplo estamos gerando um gráfico que mostra os usuários cadastrados por cidade.

Baixem o pacote .rar, peguem o arquivo .sql, criem a base e tabela no postgres e populem a tabela. No arquivo .sql já estão todos os dados necessários para popular a tabela bastando apenas mudar os dados para os dados desejados.

O arquivo index.php

<script language=”Javascript” src=”charts/FusionCharts.js”></script>
<?
#Incluindo a classe conexao
includeincludes/conexao.class.php‘;
#Incluindo a classe do Fusion
includeincludes/FusionCharts_Gen.php‘;
#Criando a conexao
$con = new Conexao(“localhost”,”postgres”,”postgres”,”contrib“);
#Abrindo a conexao
$con->open();
#Criando o obj fusion
$FC = new FusionCharts(“column3D“,”650“,”400“);
#Setando o diretorio que contem os  arquivos .swf
$FC->setSwfPath(“charts/“);
#  Setando os atributos para o grafico
$FC->setChartParams(“caption=Usuarios; xAxisName=Cidades; yAxisName=Usuarios; decimalPrecision=0;“);
#Selecionando/contando os usuarios por cidade
$queryCid = pg_query(“select * from cidades“);
while($row = pg_fetch_array($queryCid))
{
$idcidade = $row[‘idcidade‘];
$nomecidade = $row[nomecidade‘];
$numCidUsu = pg_num_rows(pg_query(“select * from usuarios where idcidade = $idcidade“));
#Adicionando os dados nas barras ( usuarios  a cidade)
$FC->addChartData($numCidUsu,”name=$nomecidade“);
}
#Gera/renderiza o grafico
$FC->renderChart();
?>

Note que foi utilizada a classe do FusionCharts (não abordada em posts anteriores) para criar o objeto e criar o gráfico.

Para não complicar nada, estou disponibilizando os arquivos do exemplo (sql, php, fusion e js).

Não há muito o que eu comentar neste exemplo devido aos comentários do código e os demais posts sobre o assunto. Mas sintam-se à vontade para perguntar, terei o maior prazer em responde-los.

Obs: Alterem as informações (usuario, senha, base)  da classe conexao.class.php (contida no diretório includes/ do pacote).

Links:

Download do pacote

P.S  Obrigado aqueles que comentaram e pediram esse post, sei como é, alguns só querem achar tudo pronto e pensam que o que satisfaz um cara que fica que nem loko de madrugada escrevendo artigos é a quantidade de downloads.

Abraços,

Rafael Clares

Este post tem 35 comentários

  1. Elton Minetto

    Parabéns pelo blog. Posts de grande utilidade

  2. Liz

    Opa…achei o post

    Valew Rafael!!!!!!!!

  3. beatriz

    Olá adorei o post!
    a ferramenta é bem interessante, estou procurando a tempos uma ferramenta de grafico para trabalhar com php que seja free.
    Vi os exemplos em php, mas nao encontrei nenhum com legenda, vc sabe ajeitar a legenda do grafico de multi-séries para que ela fique do lado direito do grafico?
    muito obrigada
    beatriz

  4. Daniel

    muito obrigado pelo post, esta a precisando muito desse grafico…
    vc é o cara!!!
    valeu

  5. Luiz

    VAleu cara me ajudou muito

  6. Dionete

    Parabéns pelo blog!
    Sou iniciante, estou tentando fazer o gráfico AngularGauge,até então nada.
    Pode me dar alguma dica sobre?
    Agradeço

    1. Rafael Clares

      Dionete, neste post é abordado o tema “gráficos com php” mas não conheço os tipo de gráficos, bem, o código proposto funciona, se tiver alguma dificuldade com o código você pode informar os erros e detalhes para eu tentar de ajudar…
      abraços

  7. MARA

    haeee!!!! otimo post, mas assim, tem como interagir o codigo com html, ou melhor, dentro de um formulario? É que estou tentando criar um formulario (html), e no mesmo quero colocar o grafico, só que ate agora não encontrei uma classe que funcione em pagina que tenha codigo em htmt.

  8. Danilo Tavares

    parabéns! é a primeira vez que comento num post, gostei da sinceridade no fim do tópico.rs =D abraço

  9. michelmatos

    Rafael, muito bom seu post!!!

    Estou tentando fazer um com consulta SQL, gostaria que vc me ajudasse!!!

    Tenho uma tabela com os campos, equipe, mes, idpedidos.
    Tenho que gerar um grafico onde mostre no mes as equipe e total de pedidos, até consegui fazer, porém ele esta bagunçando os valore. por exemplo o total da equipe “Adminitrativo” esta saindo no mês de novembro e deveria sair no mês de Abril.

    Segue o codigo que estou usando:

    $strQueryCategories = ” select distinct mes as mes from medicao ORDER BY equipe, mes “;

    $resultCategories = mysql_query($strQueryCategories) or die(mysql_error());

    $strQueryData = ” select equipe, mes, count(idpedido) as total from medicao group by equipe, mes order by equipe, mes “;

    $resultData = mysql_query($strQueryData) or die(mysql_error());

    $strXML = “”;
    // Build category XML
    $strXML .= buildCategories ($resultCategories, “mes” );
    // Build datasets XML
    $strXML .= buildDatasets ( $resultData, “total”, “equipe”);

    //Finally, close element
    $strXML .= “”;

    //Create the chart – Pie 3D Chart with data from strXML
    echo renderChart(“../../FusionCharts/StackedColumn3D.swf”, “”, $strXML, “FactorySum”, 700, 400, false, true);
    // Free database resource

    mysql_close($con);

    /***********************************************************************************************
    * Function to build XML for categories
    * @param $result Database resource
    * @param $labelField Field name as String that contains value for chart category labels
    *
    * @return categories XML node
    */
    function buildCategories ( $result, $labelField )
    {
    $strXML = “”;
    if ($result) {
    $strXML = “”;
    while($ors = mysql_fetch_array($result)) {
    $strXML .= “”;
    }
    $strXML .= “”;
    }
    return $strXML;
    }

    /***********************************************************************************************
    * Function to build XML for datesets that would contain chart data
    * @param $result Database resource. The data should come ordered by a control break
    field which would require to identify datasets and set its value to
    dataset’s series name
    * @param $valueField Field name as String that contains value for chart dataplots
    * @param $controlBreak Field name as String that contains value for chart dataplots
    *
    * @return Dataset XML node
    */
    function buildDatasets ($result, $valueField, $controlBreak )
    {
    $strXML = “”;
    if ($result) {
    $controlBreakValue =””;
    while( $ors = mysql_fetch_array($result) ) {
    if( $controlBreakValue != $ors[$controlBreak] )
    {
    $controlBreakValue = $ors[$controlBreak];
    $strXML .= ( $strXML ==”” ? “” : “”) . ( “” ) ;
    }
    $strXML .= “”;
    }
    $strXML .= “”;
    }
    return $strXML;
    }
    ?>

    1. Rafael Clares

      Michel acredito que a dificuldade esteja na cláusula SQL, o ideal é verificar no seu SGBD se o retorno da query está correto e só aí colocar a query na aplicação.
      Verifique no seu editor sql se os dados retornados estão vindo corretamente. E se a função buildDatasets está formando o xml corretamente.

  10. michelmatos

    Fala Rafael.

    Estou precisando muito da sua ajuda!
    Até hj, não consegui gerar o grafico.
    Estou usando o foreach em vez de função porém também não estou tendo sucesso, gostaria que vc me ajudasse. veja o código abaixo.
    Tenho uma tabela onde temos equipe, mes, total de medições.
    Preciso que mostre o total de medições no mes de cada equipe, por exmplo no mês de janeiro a equipe ADM teria 20 medições, a equipe Leves teria 50 e a equipe de Pesados teria 35.
    Isso seria feito num grafico de colunas.

    FusionCharts – Array Example using Multi Series Column 3D Chart

    <?php

    $servidor = "localhost";
    $usuario = "root";
    $senha = "";
    $banco = "plantap";

    $con = mysql_connect($servidor, $usuario, $senha);
    mysql_select_db ($banco);

    $busca=mysql_query("select distinct mes, equipe, count(*) as total from medicao group by mes, equipe ");

    while ($dados=mysql_fetch_array($busca))
    {
    $time[$dados['equipe']][$dados['mes']]=$dados['total'];

    }

    //Initialize element
    $strXML = “”;
    //Initialize element – necessary to generate a multi-series chart
    $strCategories = “”;
    //Initiate elements

    foreach($time as $equipe=>$meses){
    $strDataCurr = “”;
    // echo $equipe;
    }

    //Iterate through the data
    foreach($time as $equipe=>$meses){
    foreach($meses as $mes=>$total){

    //Append to strCategories
    $strCategories .= “”;
    // echo $mes;
    //Add to both the datasets
    $strDataCurr .= “”;
    //echo $total;
    }

    }

    //Close element
    $strCategories .= “”;
    //Close elements
    $strDataCurr .= “”;
    //Assemble the entire XML now
    $strXML .= $strCategories . $strDataCurr . “”;

    //Create the chart – MS Column 3D Chart with data contained in strXML
    echo renderChart(“../../FusionCharts/StackedColumn3D.swf”, “”, $strXML, “productSales”, 900, 400, false, true);
    ?>

    1. Rafael Clares

      Michel, cara essa query está correta ? Digo, se você executar essa query no SGBD ela retorna o resultado corretamente ?
      Faça um dump apenas das tabelas usadas para gerar o gráfico e me mande juntamente como arquivo php que está tentando gerar o gráfico, também a descrição do problema.
      [email protected]
      Só que essa semana brother eu to ferrado aqui de trabalho!
      Abraço

  11. Thiago Alexandre

    Olá Rafael !
    Primeiro queria agradecer pela ajuda. Li seus posts foram essenciais para mim.
    Consegui gerar um gráfico dinâmico com PHP+PostgreSQL+FusionCharts. Ficou Show !

    1. Rafael Clares

      Aê brother, que firmeza!
      Fico muito feliz quando alguém volta para escrever que “deu certo”. No geral só escrevem os “erros” mas quando funciona ninguém diz;
      Esse tipo de atitude me motiva a manter o blog.
      Muito obrigado e todo sucesso para você irmão. Vlw ;D

  12. Pedro Podsclan Neto

    Ola Rafael, primeiramente gostaria muito de agradecer os seus posts, eles foram de suma importancia para eu conseguir fazer os meus graficos, apenas gostaria de uma ajuda sua. Quando se plota um grafico do tipo Line, passando por parametro FCF_Line.swf, ao criar o grafico, ele coloca o valor de todos os parametros passados no campo set name do XML no eixo X, teria como não mostrar esses valores, já que o valor é mostrado em cada ponto do grafico quando se coloca o mouse encima.

      1. Pedro Podsclan Neto

        Obrigado pelo feedback tão rápido, tentei passando o parametro showValues=’0′ e dessa forma ele não exibe os valores nos pontos do gráfico, eu quero é não exibir o valor do set name no eixo X, voce pode esta se perguntanodo pq? Porque o meu valor é uma string grande, quando o gráfico é plotado uma string sobrepoem outra. Aproveitando o reply, sabe como se mexe na escala? É automaticamente de 10 em 10? Não da pra diminuir?

        1. Rafael Clares

          Pedro, esse nível de detalhe você só vai encontrar na documentação do fc. Acho que seria legal você perder um tempinho lá! Infelizmente eu também não tive tempo de testar todas as possibilidades;

  13. Valderli

    Olá Rafael,

    Parabéns pelo seu Blog, pois tem muita coisa interessante.

    Eu estou precisando fazer alguns gráficos a partir de dados geoespaciais. Os dados geoespaciais são de focos de calor na Amazônia. A intenção é obter gráficos por estados e/ou por municípios dessses dados, eu os tenho em tabela no formato shapefile e os mesmos estão no banco de dados Postgres. Com as informações do seu blog consegui efetuar a conexão, porém não consegui gerar o gráfico mesmo seguindo as orientações suas sobre gerar gráficos com PHP + PostgreSQL + FusionCharts .

    Vc poderia me ajudar fornecendo mas algumas informações de como posso proceder para fazer esses gráficos?

    Desde já agradeço

    1. Rafael Clares

      Valderli, obrigado pelo comentário;
      Nesse caso é preciso que você informe onde está havendo a dificuldade, se exibe alguma mensagem de erro ou até mesmo como está se comportando seu script;
      Tente copiar o trecho do código que você montou no pastebin.com e me mande o link aqui no comentário, assim eu consigo dar uma olhada no código.
      Não cole o código nos comentários porque geralmente não aparecem.;
      Abs

      1. Valderli

        Rafael, obrigado pela atenção.
        Consegui encontrar o erro estava na parte que trata sobre:
        #Selecionando/contando os usuários por cidade
        $queryCid = pg_query(“select * from cidades“);
        while($row = pg_fetch_array($queryCid))
        {
        $idcidade = $row[‘idcidade’];
        $nomecidade = $row[‘nomecidade’];
        $numCidUsu = pg_num_rows(pg_query(“select * from usuarios where idcidade = $idcidade“));
        #Adicionando os dados nas barras ( usuarios a cidade)
        $FC->addChartData($numCidUsu,”name=$nomecidade“);
        }
        Que no meu caso no lugar de cidade eu coloquei os estados e no lugar de usuários eu coloquei os focos de calor. Antes não estava dando certo pq eu não havia selecionado corretamente os “ids” de cada tabela (shapefile).

        Eu gostaria de tirar mais uma dúvida. É pq como alguns nomes de estados têm acentos e estes no gráfico aparecem com caracteres diferentes (exemplo: o estado de Rondônia que tem o acento circunflexo. No gráfico fica assim: Rondã”nia. É possível resolver isso?

        Obrigado mais uma vez.

        1. Rafael Clares

          Derlli, use o utf8_decode();
          Ex:

          $uf – utf8_decode( $rows[‘uf’] );

          abs

  14. Valderli

    Obrigado Rafael.

    Funcionou. Só lembrando que no lugar do sinal – tive que colocar um símbolo de = pra funcionar corretamente.

    Valeu..

    1. Rafael Clares

      kkkkkkkkkkk foi falha de digitação, que mancada a minha!
      Abs

  15. Valderli

    Rafael queria mais uma ajuda sua.

    É o seguinte, no exemplo que vc colocou (corrige-me se eu estiver errado) a função “pg_num_rows” retorna a quantidade de linha para cada “$idcidade”. Eu gostaria de saber como faço para retornar o valor de cada linha referente ao idcidade, ou seja, eu quero que retorne o valor e não a quantidade de linhas com o mesmo valor. Até pq o que pretendo fazer agora é que cada linha apresenta um valor diferente.

    Nesse caso como ficaria a consulta sql para o banco de dados PostgreSQL para gerar o gráfico?

    Obrigado mais uma vez Rafael.

    1. Rafael Clares

      Valderli, o id da cidade já está sendo retornado na linha:
      $idcidade = $row[‘idcidade’];

      Basta usa-lo onde desejar, se não vai usar pg_num_rows, poderá remover a linha que contém tal comando;

      1. Valderli

        Rafael,

        Ao remover não aparece nada no gráfico

        Deixa eu explicar melhor o que eu quero

        Seria uma tabela assim:

        idcidade nome_cidade usuarios_cidades
        1 Angra dos Reis 100
        2 Buzios 300
        3 Seropédica 500

        Apartir dessa tabela que está no bando de dados PostgresSQL gerar uma gráfico mostrando a quantidade de usúarios por cidade

        Como ficaria a consulta sql para gerar o gráfico?

        Obrigado

  16. Valderli

    Rafael,

    Descobri o que estava acontecendo. Era exatamente o que vc falou, porém eu havia esquecido de alterar como por exemplo o $numCidUsu para $idcidade em $FC->addChartData($numCidUsu,”name=$nomecidade“);

    Obrigado…..valeu até mais….

  17. Ronaldo Ramos

    Valeu Rafael. Estou começando agora a trabalhar com gráficos e seus post estão me ajudando muito.
    Muito obrigado mesmo!

  18. Isabel

    Olá, Rafael. Parabéns pelo post. Consigo criar gráficos com PHP + Fusioncharts perfeitamente, porém, preciso colocar mais de um gráfico na mesma página e não estou conseguindo. Qual é a melhor maneira de fazer isso?

    1. Rafael Clares

      Dá uma olhada nos fontes do exemplo

  19. Ana

    Boa tarde rafael
    preciso gerar um grafico, onde seleciono no banco mysql o registro mais antigo e o mais recente do usuario e ao gerar o grafico uma barra do grafico é o primeiro registro e outra barra o registro mais recente.
    Mas todos os exemplos que vi são select sem condicao, teria alguma dica para me ajudar?

    Obrigada

Os comentários estão encerrados.