PHP Magazine 006

download PHP Magazine 006

of 31

Transcript of PHP Magazine 006

  • 8/8/2019 PHP Magazine 006

    1/31PHP Magazine - 6a Edio -

  • 8/8/2019 PHP Magazine 006

    2/312 - 6a Edio - PHP Magazine

    sumrio

    No esquecer

    Sombra no fundoDa imagem

    editorial

    artigos

    Apresentao

    Equipe

    Caixa de Entrada

    Um gerenciador de downloads em PHP-GTKpor Pablo Dall'Oglio

    Upload seguro de arquivos usando FTP verificando vruspor Helton Ritter

    Mapeamento objeto-relacional usando PHP e MySQLpor Alexsandro Assis

    Mapas temticos gerados com PHPpor Raquel Dezidrio Souto

    Integrando ferramentas na construo de um calendriopor Leandro Schwarz

    PHP-GTK

    FTP

    ORM

    GDLib

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    3/31PHP Magazine - 6a Edio - 3

    EditoresFlvio Zacharias Fagundes, [email protected] Arago, [email protected]

    AdministraoFlvio Zacharias Fagundes, [email protected] Arago, [email protected]

    ComercialFlvio Zacharias FagundesRicardo Arago

    Projeto grficoFlvio Zacharias FagundesRicardo Arago

    Reviso tcnicaRicardo Arago da SilvaFlvio Zacharias FagundesHelton Eduardo Ritter

    Reviso - Lngua PortuguesaCamilla Carvalho, [email protected]

    www.phpmagazine.org.br

    [email protected]

    Contato/[email protected]

    Marketing

    [email protected]

    apresentao

    Amigo leitor,

    com grande alegria que lhe apresentamos a 6 edio da PHP Magazine! Mais uma vez, a sua PHP Magazine estrepleta de artigos especialmente selecionados para voc.

    Em nossas pginas, o leitor poder desfrutar de cinco excelente artigos dos nossos colaboradores. Pablo Dall'Oglio, ocriador do PHP-GTK Brasil, nos presentiou com um artigo sobre o gerenciamento de downloads PHP-GTK. Focando em

    segurana, Helton Eduardo Ritter, membro da equipe PHP Magazine, nos apresenta um artigo sobre Upload seguro dearquivos, via FTP, mediante prvia verificao do antivrus. O artigo Mapeamento objeto-relacional usando PHP eMySQL, de Alexsandro Assis, abordar a rea de banco de dados e o ajudar a manter a padronizao, produtividade eportalibilidade entre diferentes bancos de dados. Na sequncia, Leandro Schwarz abordar todos os passos para acriao de um mdulo de calendrio. Por ltimo, Raquel Dezidrio Souto demostra como programar em PHP paragerao de mapas temticos.

    Novamente, aproveitamos para agradecer aos quase 11.000 leitores que nos acompanham no portal e contribuemcom sugestes, artigos, e-mails de incentivo e cobranas. Vocs so nossos incentivadores e podem participar ativa-mente da revista. Estamos esperando o seu artigo!

    Boa leitura!

    Equipe da PHP Magazine

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    4/314 - 6a Edio - PHP Magazine

    caixa de entrada

    ElogiosParabns pelo trabalho e pelo sucesso da revista. Aquino Brasil, ter um trabalho destes j motivo de orgulho.

    Ricardo Chiavelli

    A equipe PHP Magazine agradece o elogio. Voc a par-te principal da nossa publicao, Magazine: o leitor.Sem voc a revista no sobrevive.

    OpensourcePoderiam me informar o software que usam para forma-tar a revista? Opensource?

    Guilherme Machado - Curitiba - PR

    Atualmente utilizamos o Microsoft Publisher, com outrossoftwares de apoio pra edio de imagens, que infeliz-mente, no so opensource. Em alguns casos se faz ne-cessrio aplicar realce de sintaxe, ao cdigo fonte algunsartigos. Isso feito atravs da funo show_sourcedoprprio PHP.

    CrticasGosto da revista, porm os intervalos so muito grandes.

    Quero fazer uma crtica construtiva: algumas imagensesto simplesmente horrveis.

    Bruno Merlin

    Sempre procuramos incluir imagens de boa qualidadenos artigos, no entanto, alguns artigos so submetidoscom as imagens em baixa qualidade e no h tempohbil para obter outras imagens, com melhor qualidade,

    junto aos autores.

    ENVIE E-MAIL [email protected] o envio de mensagens com os seguintes dados do remetente: nome completo, cidade e estado.

    A redao se reserva o direito de selecionar e adaptar as mensagens sem alterar o contedo geral.

    Novos ArtigosAcompanho a revista desde a primeira edio e visvel o salto de qualidade que vem a- presentando a cada edio. Na edio de nmero 5, gostei especialmente do artigo"Desenvolvendo em trs camadas com PHP, MVC e Ajax". Meus parabns aos autores.Gostaria de saber se tm interesse em publicar artigos focados no Zend Framework, pois nesta rea que gostaria de compartilhar informaes.

    Leandro LagesAgradecemos os elogios. Todo artigo bem-vindo! Lembramos que voc pode submeterseus artigos pelo portal www.phpmagazine.org.br.

    Edio impressa da revistaSou desenvolvedor web e gostaria de saber se vocstem a verso impressa da revista.

    Edbraulio Vieira

    Ainda no dispomos de uma verso impressa da revista.Estamos trabalhando para divulgar mais o projeto, ex-pandindo-o sobre outras meios, principalmente atravsde nosso portal e das edies digitais.

    Edio 6Pessoal, gostaria de saber quando estar disponvel asexta edio da revista? Est demorando! Adorei as ou-

    tras edies, muito bom o trabalho de vocs, parabns!

    Marcelo Ferreira

    Sofremos algum atraso no lanamento da edio, poisestvamos buscando melhorar os servios oferecidos emnosso portal. Pedimos a compreenso de nossos leitorese firmamos o compromisso de sempre buscar oferecercontedos com a qualidade de sempre.

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    5/31PHP Magazine - 6a Edio - 5

    Todo programador j deve ter ouvido falar sobre PHP, uma das linguagens maisutilizadas no mundo. A popularidade do PHP deve-se sua facilidade em criaraplicaes dinmicas para a internet, com suporte maioria dos gerenciadoresde bancos de dados existentes, alm de um conjunto de funes que permitem

    desde a criao de simples portais at complexas aplicaes de comrcio eletr-nico.

    O que poucos entenderiam at alguns anos atrs a possibilidade de criar apli-caes-cliente, com janelas, botes, listas e painis em PHP. Pois este justa-mente o foco de PHP-GTK Criando Aplicaes Grficas com PHP. O PHP temcrescido muito nos ltimos anos e se tornou uma linguagem de propsitos ge-rais. Este livro prova disto. Por intermdio do PHP-GTK, voc pode utilizar oPHP para desenvolver aplicaes com visual atraente e nativo para vrias plata-

    formas, como Linux, Windows e Mac, utilizando a mesma linguagem que utilizapara criar aplicaes para a Web.

    Principais tpicos abordados no livro:- Introduo ao PHP, arrays, strings, bancos de dados- Tutorial completo sobre orientao a objetos- Exemplos de utilizao de janelas, rvores, listas, botes- Exemplos de utilizao de menus, dilogos, formulrios- Crie suas prprias classes, estendendo o GTK- Exemplos com bancos de dados (insero, listagem, navegao)- Utilizao da ferramenta Glade (gerao de notas fiscais)

    www.novatec.com.br

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    6/316 - 6a Edio - PHP Magazine

    PHP-GTK

    Um gerenciador de

    Downloads em PHPDownloads em PHPDownloads em PHP---GTKGTKGTK

    por Pablo DallOglio

    Neste artigo iremos desenvolver um pequeno utilitrio em PHP-GTK para baixar arqui-vos remotos. Assim como nos artigos anteriores, nosso objetivo no desenvolvernenhuma ferramenta profissional, mas mostrar de forma didtica como utilizar os re-cursos do PHP em conjunto com o GTK.

    1. O Programa

    A interface do programa ser bastante simples. Comopode ser visto na Figura 1, a janela composta de umcampo onde o usurio ir digitar o endereo remoto doarquivo a ser baixado (objeto $file), um boto OK pa-ra iniciar o download (objeto $inicia_btn) e um boto

    Cancelar (objeto $cancel_btn) para interromper odownload. Logo a seguir, tem-se uma barra de progres-so (objeto $progress) que indica o percentual que j foibaixado do arquivo at o momento.

    Para criar a interface do programa, a classe GtkWin-dow, que representa uma janela, ser estendida. Destaforma, em seu mtodo construtor, definiremos quaisobjetos estaro contidos na janela principal e tambm asaes do boto OK, que executar o mtodo downlo-ad() e do boto Cancelar que executar o mtodoabort().

  • 8/8/2019 PHP Magazine 006

    7/31PHP Magazine - 6a Edio - 7

    Warning, alertando que o download foi cancelado.

    /**

    * aborta o processamento

    */

    function abort()

    {

    // define o valor desta propriedade

    $this->aborted = TRUE;

    // exibe mensagem de warning

    $dialog = new GtkMessageDialog(null,

    Gtk::DIALOG_MODAL, Gtk::MESSAGE_WARNING,

    Gtk::BUTTONS_OK, 'Download Abortado !!');

    $response = $dialog->run();

    $dialog->destroy();

    }

    2. Baixando o arquivo

    O mtodo download() ser responsvel por baixar oarquivo. Para tal, ele ir abrir ambos arquivos remoto elocal por meio do mtodo fopen(). Em um lao de repe-

    ties, utilizaremos o mtodo fgets() para ler os dadosremotos e o mtodo fwrite() para gravar no arquivolocal. A funo events_pending() e main_iteration()so utilizadas para que o GTK atualize a interface princi-pal com o percentual de andamento do download e paraque a mesma no fique congelada at o final do proces-so.

    Neste mtodo utilizamos a funo get_headers()para obter a informao do tamanho do arquivo, antesde iniciar o download, para poder calcular o percentualconcludo, e a funo pathinfo(), para extrair somenteo nome do arquivo da URL. Assim, o arquivo remoto se-

    r salvo na pasta /tmp, mantendo o mesmo nome.O ndice de concluso do download (varivel $indi-

    ce) ser obtido acumulando a quantidade de bytes jbaixados, por meio da varivel $downloaded e fazendoa sua proporo em relao ao tamanho total do arquivo(varivel $filesize).

    /**

    * baixa um arquivo e salva na pasta /tmp

    */

    function download()

    {

    // obtm o nome do arquivo$url = $this->file->get_text();

    // obtm o tamanho do arquivo

    $header = get_headers($url, 1);

    $filesize = $header['Content-Length'];

    $remote = fopen($url,"r"); // abre o arquivo

    if (!$remote) // se arquivo no existe

    {

    return;

    }

    // obtm somente o nome do arquivo

    $pathinfo = pathinfo($url);

    $basename = $pathinfo['basename'];

    // cria um arquivo localmente$local = fopen ("/tmp/{$basename}", 'w');

    $downloaded =0;

    // lao de repeties para baixar o arquivo

    while(!feof($remote) and !$this->aborted)

    {

    // atualiza a interface

    while (gtk::events_pending())

    {

    gtk::main_iteration();

    }

    // baixa at 1kb

    $var = fgets($remote, 1024);

    // grava o contedo localmentefwrite($local, $var);

    // total de bytes baixados

    $downloaded += strlen($var);

    // calcula ndice para barra de progresso

    $indice = $downloaded/$filesize;

    $percent = ((int) ($indice * 10000))/100;

    // atualiza barra de progresso

    $this->progress->set_fraction($indice);

    $this->progress->set_text("{$percent}%");

    }

    $this->aborted=FALSE;

    // fecha arquivos

    fclose($remote);

    fclose($local);}

    }

    3. Instanciando a classe principal

    Para finalizar o programa, basta instanciarmos a clas-se principal para que a janela seja exibida na tela.

    // instancia classe

    new Downloader;

    Gtk::main();

    ?>

    Consideraes finais

    Neste artigo, demos continuidade nossa srie deartigos sobre PHP-GTK, sempre demonstrando uma fun-cionalidade especfica da linguagem PHP til no dia-a-dia. Devido ao espao restrito aqui, algumas linhas fo-ram truncadas. Logo a seguir, na seo referncias, en-contra-se o [Site do Programa], onde o mesmo poderser baixado integralmente.

    Referncias e links sugeridos

    [PHP-GTK Brasil] http://www.php-gtk.com.br[Livro PHP-GTK] http://www.php-gtk.com.br/book[Site do Autor] http://www.pablo.blog.br[Site do Programa] http://downloader.php-gtk.com.br

    Pablo DallOglio [email protected] Dall'Oglio bacharel em Informtica pela UNI-SINOS. Autor dos livros "PHP Programando com Ori-entao a Objetos" e "PHP-GTK - Criando AplicaesGrficas com PHP", pela editora Novatec. Tambm

    foi o criador do PHP-GTK Brasil. Atualmente, dire-tor de tecnologia e proprietrio da Adianti Solutions(www.adianti.com.br).

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    8/318 - 6a Edio - PHP Magazine

    FTP

    Upload seguro de

    arquivos usando FTParquivos usando FTParquivos usando FTPverificando vrus

    por Helton Eduardo Ritter

    Este artigo apresenta uma tcnica no usual de fazer upload de arquivos para o servi-dor. Essa forma no garante, mas auxilia a segurana do servidor. Da maneira propos-ta, o daemon do apache no precisa ter permisso de gravao em um diretrio ouarquivo em uma URL pblica para fazer a transferncia.

    Segurana no brincadeira, no de simples imple-mentao, mas necessria e, em algumas situaes, crtica. Vale ressaltar que segurana total no existe. Omximo que podemos fazer aplicar boas tcnicas emonitorar sempre os sites que gerenciamos.

    O que define tudo o conhecimento. Se o invasor,ou quem quer que seja, que esteja tentando burlar osistema souber mais do quem o projetou/desenvolveu,ento ele conseguir.

    Da tentativa de dificultar a concretizao da m in-teno que surgem as prticas. Uma delas ouploadusando FTP e a verificao de vrus no arquivo carrega-do.

    1. Mdulo php_clamavlib

    ClamAV um anti-vrus conhecido do mundo Linux,principalmente por integrar-se com diversos outros servi-os como o Postfix, SendMail, Samba e, dentre outros, o

    Apache.

    Para PHP tambm h um mdulo que pode ser insta-lado atravs do gerenciador de pacotes de sua distribui-o.

    Com o mdulo do ClamAV disponvel em PHP pode-mos verificar vrus em um arquivo antes de servi-lo aocliente ou carreg-lo do cliente para a aplicao.

    O comportamento de verificao de vrus pode serhabilitado no php.ini (se o PHP estiver compilado comsuporte) para fazer a anlise sempre que um arquivo forcarregado, pois esta opo no est ativa por padro.Caso detecte um vrus, o arquivo do upload apagado eem $_FILES[file_field][error] o erro registrado.

    2. Upload por FTP

    Esse mtodo soa estranho aos ouvidos de muitos,pois afinal o script PHP que est em um servidor no

    consegue se conectar a mquina do cliente e carregar del o arquivo necessrio.

    O que acontece no propriamente um upload. basicamente uma cpia, pois o upload feito da maneiratradicional (por http). Esse mtodo, entretanto, inse-guro, pois precisamos dar permisso de gravao para ousurio que roda o daemondo Apache. O problema no propriamente a permisso de gravao, mas o fato decostumarmos faz-la em um diretrio pblico que, seno for monitorado, pode virar um servidor gratuito detudo quanto arquivo, exceto os esperados pela aplica-o.

    Uma forma de melhorar isso sem usar-se do FTP nunca fazer upload para um diretrio pblico e uma p-gina PHP (que tem acesso a esse diretrio) fazer o strea-ming desse arquivo (com file_get_contents() porexemplo).

    O mtodo proposto consiste em colocar o arquivo emuma local temporrio no servidor durante o upload, fazeras verificaes e, se passar, transferi-lo por FTP para odiretrio definitivo.

    3. Vantagens do mtodo

    A primeira e mais importante delas que no preci-samos ter nenhum arquivo pblico com permisso degravao.

    Uma segunda vantagem: podemos colocar o arquivoem um diretrio pblico diretamente e depois no preci-samos usar funes para ler o arquivo de um local nopblico ao exibi-lo na Web. Usa-se menos processamen-to, uma vez que o carregamento (que agora tem umacarga maior) feito uma vez e a exibio ocorre em v-rios momentos.

    Podemos criar uma organizao maior em nossosservidores. Pode-se ter um servidor que receba o arqui-vo via upload http, faa as verificaes e se estiver lim-po, passe o arquivo para outro servidor (por FTP). Assim

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    9/31PHP Magazine - 6a Edio - 9

    estamos expondo apenas uma mquina e protegendo asinformaes j consolidadas.

    No caso de termos dois servidores ou mais, o mtodopode ser ainda otimizado, fazendo a transferncia doarquivo por SSH usando ssh2_scp_send(). Umaregra interna de firewallpoderia liberar a conexo SSHapenas para o servidor que enviar o arquivo. Essa mes-

    ma regra poderia ser aplicada ao caso do FTP.FTP no um protocolo seguro. Assim, se na rede

    (dos servidores) estiver rodando algum sniffer, aindaexiste a possibilidade de interceptao/adulterao doarquivo quando transferido de um para outro.

    Com apenas um servidor e fazendo conexo FTP para127.0.0.1 ou localhost no samos para a rede, logo,um possvel snifferneste ambiente no tem ao.

    4. Implementao

    O objetivo desse artigo mais didtico do que prti-co, visto que ele pode no ser totalmente implementvel

    em seu ambiente, caso no se tenha acesso administra-tivo ao servidor para instalar/configurar SSH, ClamAV...Abaixo uma funo que analisada rapidamente na se-qncia:

    function upload($form_field,

    $tam_max,

    $tam_min,

    $ftp_server,

    $ftp_user,

    $ftp_passwd,

    $acept_files,

    $ftp_folder){

    $conn = @ftp_connect($ftp_server);

    if(!$conn)

    return "ERRO: Falhou ao conectar com o servidor FTP";

    $login = @ftp_login($conn,$ftp_user,$ftp_passwd);

    if(!$login)

    return "ERRO: Usuario ou senha invalida, nao conseguiu logar";

    $original_name_file = $_FILES[$form_field]['name'];

    $e = explode('.',$original_name_file);

    $cnt = count($e);

    $ext = $e[$cnt-1];

    if(!in_array($ext,$acept_files))

    return "ERRO: O arquivo fornecido no de um tipo vlido!";

    // *1024 porque o size em bytes por padro

    if($_FILES[$form_field]['size'] < ($tam_min*1024) or

    $_FILES[$form_field]['size'] > ($tam_max*1024)){

    @ftp_close($conn);

    return "ERRO: O tamanho do arquivo no vlido";}

    // move do diretrio temporrio de upload para outro diretrio temporrio

    if(!@move_uploaded_file($_FILES[$form_field]['tmp_name'],'/tmp/'.$_FILES[$form_field]['name'])){

    @ftp_close($conn);return "ERRO: Problema ao gravar o arquivo no diretrio temporrio";

    }

    // verificao de vrus

    $virus = cl_scanfile('/tmp/'.$_FILES[$form_field]['name']);

    if($virus != ''){

    @ftp_close($conn);

    @unlink("/tmp/{$_FILES[$form_field]['name']}");

    return 'ERRO: Vrus "'.$virus.'" encontrado no arquivo! Upload apagado do servidor!';}

    // copia por ftp para o diretorio definitivo

    $put_file = ftp_put($conn,$ftp_folder.'/'.$_FILES[$form_field]['name'],

    '/tmp/'.$_FILES[$form_field]['name'],FTP_ASCII);

    if(!$put_file)

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    10/3110 - 6a Edio - PHP Magazine

    return "Erro ao enviar para o servidor definitivo";

    @unlink("/tmp/{$_FILES[$form_field]['name']}");

    @ftp_close($conn); // suprimir o erro com @ no performtico

    return 'ok';

    }// fim da funo de upload

    Os parmetros da funo so os seguintes:- Nome do form field do formulrio que submete a

    pgina ao servidor;

    - Tamanho mximo em Kb que o arquivo a ser carre-gado pode ter;

    - Tamanho mnimo, em Kb;

    - IP ou nome do servidor de FTP, localhost ou onome do seu servidor, lembrando a questo da transfe-rncia no segura;

    - Usurio de FTP. Apenas o usurio, sem @server;

    - Senha de FTP;

    -Arrayno formato $a = array(gif.jpg,pngdasextenses de arquivos que o upload deve ser permitido;

    - Diretrio em que os arquivos depois de passarempela verificao devero ser colocados;

    A funomove_uploaded_file()recebe o arquivocarregado e o deixa em um diretrio temporrio nopblico em que h permisso de gravao, ao contrrioda prtica comum que mov-lo para o diretrio defini-tivo e pblico do site (gravvel pelo usurio que roda o

    apache).Para fazer a verificao de vrus, usa-se

    cl_scanfile() que, ao encontrar um vrus, devolveuma string com o nome dele. Caso contrrio, retornarvazio. Use o Eicar para testes ou outro vrus que vocsaiba anular sua ao e talvez limpar sua mquina.

    Passando por todas as verificaes, o arquivo ento transferido ftp_put(), para o seu local definitivo. Afuno upload() retorna uma string informando o erro,ou retorna ok no caso de nenhum ter havido.

    Consideraes finaisA metodologia discutida neste artigo melhor que a

    tradicional, mas ainda oferece riscos, pois poderemos teralteraes no arquivo ou na leitura destas informaesentre a mquina do cliente e o servidor. Neste caso ouso de HTTPS possivelmente ajudaria.

    A partir do momento em que o arquivo sai da suarede at ele chegar ao servidor, ele est em um ambien-te fora de seu controle. O ideal seria comparar se oarquivo que chegou no servidor exatamente i-gual quele que saiu do cliente. Mas de uma ma-

    neira transparente, sem que o usurio tenha quegerar uma MD5 do arquivo e depois compar-la.

    As dependncias de softwares e configuraes noservidor so maiores. Tambm haver maior processa-

    mento e, conseqentemente, o processo ficar mais len-to como um todo. Tal fato agravado quando h trans-ferncia do arquivo de um servidor para outro (FTP ouSSH). Entretanto ocorre somente uma vez e, no futuro,temos mais garantias. Prs e contras pesados. Se foriniciar um projeto, sugiro que pense bastante em segu-rana.

    Referncias e links sugeridos

    PESSOA, Mrcio. Segurana em PHP. So Paulo: No-vatec, 2007.

    [Eicar] http://www.eicar.org/download/[Mod_clamav] - http://software.othello.ch/mod_clamav/[ClamAV] - http://www.clamav.net/download/third-party-tools/3rdparty-library/

    Helton Eduardo Ritter [email protected] em Sistemas de Informao. Tcnicoem Informtica, professor adjunto e funcionrio daSETREM, atuando na mesma como desenvolvedorWeb desde 2006. Membro da equipe da PHP Magazi-

    ne deste maro de 2008. Mantm um site portflio:www.sourcedreams.eti.br

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    11/31PHP Magazine - 6a Edio - 11

    ORM

    Mapeamento

    objetoobjetoobjeto---relacionalrelacionalrelacionalusando PHP e MySQL

    por Alexsandro Assis

    Conceituar e demonstrar o desenvolvimento e uso de classes em PHP para efetuar omapeamento objeto-relacional, visando padronizao, produtividade e portalibilidadeentre diferentes bancos de dados. Tornando, dessa forma, o uso de programao ori-entada a objetos transparente nas tarefas de manuteno de registros em banco de

    dados.Mapeamento objeto-relacional uma tcnica que

    consiste em tratar os registros de uma tabela do bancode dados como objeto, visando tornar mais amigvel ouso de um banco de dados relacional com linguagens ouprojetos que utilizam a orientao a objetos. No mapea-mento objeto-relacional no ser utilizada a linguagemSQL para fazer manuteno dos registros do banco, maschamadas a mtodos que estaro encapsulando os co-mandos SQL que faro a manuteno nos registros.

    O funcionamento do mapeamento objeto-relacional mais complexo do que o descrito neste artigo. A idia construir classes em PHP que nos permita inserir, alterare apagar registros do banco de dados MySQL, utilizandoa idia de mapeamento objeto-relacional.

    1. Classes

    Sero usadas trs classes para executar o mapea-mento objeto-relacional:

    Classe db classeDados.php tem como objetivo aconexo e execuo dos comandos no banco MySQL.

    Classe tabela classeTabela.php tem como obje-tivo a montagem dos comandos de insert, update e de-lete que sero executados em uma determinada tabelado banco de dados.

    Classe coluna classeColuna.php esta classe tra-ta as informaes referentes as colunas de uma determi-nada tabela.

    Esclarecendo, este artigo tem como objetivo demons-trar a tcnica de mapeamento objeto relacional. No oobjetivo dar uma soluo completamente pronta. Os

    exemplos so meramente demonstrativos, pois no hou-ve tratamento de erros e os scripts foram simplificadosao mximo visando diminuir o tamanho do artigo. Ficacomo desafio melhorar as classes tornado-as 100% utili-

    zveis.

  • 8/8/2019 PHP Magazine 006

    12/3112 - 6a Edio - PHP Magazine

    }

    O cdigo descrito acima pertence ao arquivo classe-Dados.php, e possui trs mtodos (executar, conectar edesconectar) responsveis por fazer a integrao/utilizao do banco de dados MySQL.

    Esta classe pode ser expandida para tratar outrosbancos (SGBDs) se tornando tambm uma classe de

    abstrao de dados, o que amplia muito sua utilidade.Tambm pode ser usada para implementar mtodos pa-ra tratar as pesquisas e as selees do banco de dados.

    O cdigo descrito acima pertence ao arquivo classe-Coluna.php e possui vrios mtodos responsveis porfazer o mapeamento das colunas da tabela. Para issocria-se objetos coluna para cada coluna da tabela.Nesta classe existem mtodos para armazenar (set),pegar (get) valores das colunas e identificar quais colu-nas fazem parte da chave da tabela.

  • 8/8/2019 PHP Magazine 006

    13/31PHP Magazine - 6a Edio - 13

    tabela a classe coluna.

    Ex.: $tabela->id_grupo->isChave();

    Os fragmentos de cdigos descritos abaixo so a par-te mais importante da classe tabela. Estes fragmentosso os responsveis por executar as aes de INSERT,

    UPDATE e DELETE, respectivamente, no banco de da-dos.

    Os trs mtodos abaixo (inserir, alterar e deletar)seguem os mesmos princpios:

    1 - Abre a conexo com o banco de dados;

    2 - Atravs de um looppelo array de colunas, buscaos atributos em cada objeto coluna e concatena os da-dos, montando a string SQL que ser executada no ban-co de dados;

    3 - Executa a string SQL no banco de dados.

    # Cria metodo para montar o comando de insert

    public functioninserir(){$this->conexao = $this->conectar();# Monta o comando SQL

    $campos= '';$valores= '';foreach ($this->coluna as $v){

    $campos.= $this->$v->getNome() . ',';$valores.= $this->formataTipo($this->$v->getValor(),$this->$v->getTipo()) . ',';

    }

    $campos= substr($campos,0,strlen($campos)-1);

    $valores= substr($valores,0,strlen($valores)-1);$this->sql .= 'insert into ' . $this->nome . '('. $campos.') values ('. $valores.');';$this->executar($this->sql, $this->conexao);

    }

    # Cria metodo para montar o comando de update

    public functionalterar(){$this->conexao = $this->conectar();# Monta o comando SQL

    $valores= '';$clausulas= '';foreach ($this->coluna as $v){

    $valores.= $this->$v->getNome() . '=';$valores.= $this->formataTipo($this->$v->getValor(),$this->$v->getTipo()) . ',';if($this->$v->getChave() == 'S'){

    $clausulas.= ' and ' . $this->$v->getNome() . '=';$clausulas.= $this->formataTipo($this->$v->getValor(),$this->$v->getTipo());

    }

    }

    $valores= substr($valores,0,strlen($valores)-1);$this->sql .= 'update '.$this->nome . ' set '.$valores.' where 1=1'.$clausulas. ';';$this->executar($this->sql, $this->conexao);

    }

    # Monta a string e deleta os dados que esto no objeto na tabela

    public functiondeletar(){$this->conexao = $this->conectar();# Monta String SQL

    $clausulas= '';

    foreach ($this->coluna as $v){if($this->$v->getChave() == 'S'){$clausulas.= ' and ' . $this->$v->getNome() . '=';$clausulas.= $this->formataTipo($this->$v->getValor(),$this->$v->getTipo());

    }

    }

    $this->sql .= 'delete from ' . $this->nome . ' where 1=1' . $clausulas. ';';$this->executar($this->sql, $this->conexao);

    }

    # Formata os dados conforme o tipo de dado da tabela

    public private functionformataTipo($vl,$tp){$valor= '';switch($tp){

    case'char':

    $valor= '\'' . $vl. '\'';break;

    case'int':$valor= $vl;

    break;

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    14/3114 - 6a Edio - PHP Magazine

    case'data':$data= explode('/',$vl);$vl= date("Y-m-d", mktime(0, 0, 0, $data[1], $data[0], $data[2]));$valor= '\'' . $vl. '\'';

    break;}

    return$valor;}

    # Destruidor da classepublic function__destruct(){$this->desconectar($this->conexao);

    }

    }

    ?>

    No final da classe tabela existe o mtodoformataTipo(), que formata os dados conforme a ne-cessidade e o tipo de dados.

    Ex.: coloca os dados em formato de data compatvelcom o banco de dados, como 09/25/2008, por exemplo.

    Vamos ver como funciona na prtica esta classe. Paraexemplificar, usaremos duas tabelas conforme (Figura1).

    Figura 1 Diagrama de entidade relacionamento

    1

    O cdigo acima descreve a simplicidade para execu-tar manuteno nos registros do banco de dados.

    Na linha 4 realizada a incluso do script da classe.Na linha 9 instanciado o objeto tabela e passado viaparmetro o nome da tabela. Das linhas 10 a 12 socriadas as colunas (objeto) da tabela conforme a estru-tura da tabela.

    Na linha 14, indica-se o campo que faz parte da cha-ve primaria da tabela. Esta informao essencial paraos mtodos de alterar e deletar, pois estas aes seroefetuadas com base nesta informao. Ex.: alterar o re-gistro quando o id_grupo = 1.

    Nas linhas 15 a 17, os valores de cada coluna sero

    atribudos e, nas linhas de 19 a 21, so chamados osmtodos para o tipo de manuteno que ser efetuadano registro.

    Esta a idia de uso de mapeamento objeto-relacional usando PHP e MySql para alterar sua aplicaopara o uso de um banco de dados diferente, como oOracle, basta alterar a classe db para usar Oracle em vezde MySql.

    Referncias e links sugeridos[PHP Magazine] http://www.phpmagazine.org.br[Point da Informao] -

    http://www.pointdainformacao.com.br

    Alexsandro Assis [email protected] de banco de dados, possui 8 anos de experi-ncia com banco de dados SQL Server e 6 anos deexperincia em desenvolvimento de aplicaes Web.Cursando o sexto perodo de Sistema de Informaopela Uniarax - Centro Universitrio do Planalto de

    Arax.

    Exemplar do assinante: 005765 - ubuntero loko

    mailto:[email protected]:[email protected]
  • 8/8/2019 PHP Magazine 006

    15/31PHP Magazine - 6a Edio - 15

    GDLib

    Mapas temticosMapas temticosMapas temticosgerados com PHP

    por Raquel Deizrio Souto

    Neste artigo, por meio de um exemplo prtico, demonstraremos como programar emPHP para gerao de mapas temticos. Diversos sistemas de informaes geogrficasj foram desenvolvidos e oferecem o recurso de gerao de mapas temticos. Entre-tanto, o tempo gasto na aprendizagem do funcionamento de tais sistemas pode sereconomizado quando seguimos os passos simples deste breve tutorial.

    A linguagem PHP tem uma biblioteca de funes mui-to til, mas ainda pouca usada: a GDLib, uma bibliotecade exibio grfica (em ingls: Graphics Display Library).

    A GDLib tem sido utilizada principalmente em aplicaesde gerao de grficos, mas seu potencial para desen-volvimento de mapas digitais grande e no deve sernegligenciado. Leia a apresentao da biblioteca GDLibcontida no site oficial do PHP [1]:

    O PHP no est limitado a criar apenas sada emHTML. Ele tambm pode ser usado para criar e manipu-lar arquivos de imagem em uma diversidade de forma-tos, incluindo gif, png, jpg, wbmp, e xpm. E ainda mais

    convenientemente, o PHP pode enviar streams de sadade imagem diretamente para o browser. Voc precisarcompilar o PHP com a biblioteca GD de imagens de fun-es para isto funcionar. O PHP e GD tambm podemrequerer outras bibliotecas, dependendo dos formatosde imagens com os quais voc queira trabalhar.

    Todas as funes grficas da biblioteca GDLib possu-em descrio detalhada no site oficial do PHP [2] e oleitor pode fazer uso dele para consultas eventuais du-rante o desenvolvimento do projeto.

    1. Algumas funcionalidades disponveis

    na GDLib

    Abaixo esto listadas as funes utilizadas nesse tu-torial e a respectiva descrio da sintaxe.

    1) ImageCreate Cria uma nova imagem;

    ImageCreate (int $width , int $height)

    Onde: $width = largura em pixels; $height = alturaem pixels.

    2) ImageColorAllocate - Aloca uma cor em uma

    varivel;imagecolorallocate (resource $image , int $red , int

    $green , int $blue )

    Onde: $image = imagem criada com imagecreate;

    $red, $green e $blue = cdigos RGB para vermelho (R),

    verde (G) e azul (B).3) Imagerectangle Desenha um retngulo sem

    preenchimento;

    Imagerectangle (resource $image , int $x1 , int $y1 ,int $x2 , int $y2 , int $color)

    Onde: $image = imagem criada com imagecreate;$x1,$y1 = coordenada superior esquerda; $x2,$y2 =coordenada inferior direita; $color = identificador da corda linha.

    4) Imagefilledrectangle Desenha um retngulo

    preenchido;imagefilledrectangle (resource $image , int $x1 , int

    $y1 , int $x2 , int $y2 , int $color)

    Onde: $image = imagem criada com imagecreate;$x1,$y1 = coordenada superior esquerda; $x2,$y2 =coordenada inferior direita; $color = identificador da cordo preenchimento.

    5) Imagepolygon Desenha um polgono sem pre-enchimento;

    Imagepolygon (resource $image , array $points , int$num_points , int $color)

    Onde: $image = imagem criada com imagecreate;$points = matriz de vrtices do polgono; $num_points =nmero de vrtices do polgono; $color = identificadorda cor de preenchimento.

    Exemplo de matriz: points[0] = x0, points[1] = y0,points[2] = x1, points[3] = y1, ...

    6) Imagefilledpolygon Desenha um polgonopreenchido;

    Imagefilledpolygon (resource $image , array $points ,int $num_points , int $color)

    Onde: $image = imagem criada com imagecreate;$points = matriz de vrtices do polgono; $num_points =nmero de vrtices do polgono; $color = identificadorda cor da linha.

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    16/3116 - 6a Edio - PHP Magazine

    7) Imagestring Desenha uma string horizontal-mente;

    Imagestring (resource $image , int $font , int $x , int$y , string $string , int $color)

    Onde: $image = imagem criada com imagecreate;$font = valores que podem variar de 1 a 5, dependendodo tamanho da fonte (por default, a codificao

    latin2), onde nmeros maiores correspondem a fontesmais largas; $x = coordenada x superior esquerda; $y= coordenada y superior esquerda; $string = string aser desenhada; $color = identificador da cor da letra.

    8) Imageline Desenha uma linha;

    Imageline (resource $image , int $x1 , int $y1 , int$x2 , int $y2 , int $color)

    Onde: $image = imagem criada com imagecreate;$x1,$y1 = coordenadas de incio da linha; $x2,$y2 =coordenadas de fim da linha; $color = identificador dacor da linha.

    9) ImagePNG - Envia uma imagem PNG para obrowser ou para um arquivo;

    ImagePNG ( resource $image [, string $filename ] )

    Onde: $image = imagem criada com imagecreate;$filename = se indicado o caminho, ser enviada a ima-gem para um arquivo.

    10) Imagedestroy Destri uma imagem, liberan-do a memria associada a ela.

    Imagedestroy ( resource $image )

    Onde: $image = imagem criada com imagecreate.O tutorial de programao de scripts em PHP para

    gerao de mapas temticos segue os passos bsicoslistados a seguir. A execuo demonstrada nesse artigofundamenta-se no trabalho de classificao de munic-pios do Rio de Janeiro, onde foram gerados mapas te-mticos que so visualizados diretamente no navegador[3].

    2 . Preparao do PHP para execuo dasfunes grficas GD

    Para comear a desenvolver projetos com GD, o pro-gramador deve estar atento compilao do PHP com aGDLib para que as funes possam ser interpretadascorretamente. Alm disso, se precisar expandir os recur-sos da GD, o programador deve estar atento instalaode outras bibliotecas. A lista bsica de bibliotecas a se-rem instaladas para que tenha mnimo de independnciana programao segue adiante:

    - GDLib - http://www.libgd.org/releases/

    - Lib JPEG Para gerar imagens JPEG a partir descripts PHP com GD - ftp://ftp.uu.net/graphics/jpeg.

    - FreeType 2 - http://www.freetype.org.

    No tutorial, a imagem a ser criada possui extensoPNG, que suportada em verses de GD superiores gd-1.6. Com relao a outras extenses de imagens supor-

    tadas pela GD, observe que:

    - GIF - Suportado apenas em verses do GD anterio-res a gd-1.6. Suporte apenas para leitura est disponvelcom o PHP 4.3.0 e a biblioteca GD empacotada. Suportepara escrita est disponvel desde o PHP 4.3.9 e PHP5.0.1.

    - JPG - Quando compilando a biblioteca jpeg-v6b

    (antes de compilar o PHP) voc precisa usar a opo --enable-shared no passo de configurao. Se voc nofizer, ir receber um erro alertando libjpeg.(a|so) notfound quando voc estiver no passo de configuraopara compilar o PHP.

    -XPM - se o sistema tiver um ambiente X instalado, provvel que a biblioteca j esteja disponvel.

    Descomprima e instale os pacotes no diretrio debibliotecas do seu sistema. Todos os trechos que estoentre colchetes devem ser substitudos pelas informa-es relativas sua instalao.

    Instale o GD:

    # cd [diretorio do pacote gd]

    # ./configure --with-jpeg-dir=[caminho do di-

    retorio da biblioteca Libjpeg] --with-png-dir=

    [caminho do diretorio da biblioteca Libjpeg]

    -- with-freetype-dir=[caminho do diretrio da

    biblioteca freetype]# make

    # make install WITH_XPM=yes WITHOUT_X11=yes

    Pare o servidor Apache se ele ainda estiver sendo

    executado:# /usr/local/apache2/bin/apachectl stop

    Recompile o PHP:

    # ./configure - -with-apxs2 = [caminho do di-

    retrio apxs] --enable-track-vars --with-mysql

    --enable-ftp --with-zlib --with-gd with-jpeg

    -dir=[caminho do diretrio da biblioteca jpeg]

    --with-png-dir=[caminho do diretrio da bibli-

    oteca png] --with-freetype-dir=[caminho dire-

    trio da biblioteca Freetype]

    # make# make install

    Reinicie o Apache:

    # /usr/local/apache2/bin/apachectl start

    Execute a funo phpinfo( ) para verificar se as bi-bliotecas foram instaladas corretamente.

    Muitos documentos na web versam sobre como com-

    pilar o PHP com GD. Outras configuraes de compilaoso possveis dependendo do servidor e/ou da versodas bibliotecas adquiridas e do PHP em uso. Aconselha-se que os pacotes de bibliotecas sejam baixados e que

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    17/31PHP Magazine - 6a Edio - 17

    se procure um tutorial especfico na rede para a versodo Apache e do PHP que estiver utilizando, antes de co-mear a instalao.

    3 . Planejamento do projeto

    Muitas aplicaes podem ser desenvolvidas com usode mapas temticos. Atualmente a informao geogrfi-

    ca tem lugar cada vez maior nos projetos de Internet.Este artigo apresenta o exemplo de uma classificaotemtica realizada em 34 municpios do Rio de Janeiro,envolvendo 22 temas. Para planejar o projeto, o progra-mador deve ter em mente as necessidades de cada pro-posta. No exemplo, as principais caractersticas levadasem conta foram as seguintes:

    - Temas: como so muito temas, foi criada uma codi-ficao para facilitar a busca em banco de dados;

    - Unidade geogrfica de anlise utilizada: Municipal.

    - Meta-informaes: Tambm armazenadas em banco

    de dados para exibio automtica Ttulos de mapas,descrio dos temas, nomes dos municpios, nomes defontes de dados etc.

    4 . Planejamento do banco de dados

    O tamanho e complexidade do banco de dados de-pendero das caractersticas do projeto. Aqui, apresen-tada uma estrutura de banco de dados simples, apenaspara entendimento bsico do processamento de informa-es na gerao de um mapa temtico com unidade ge-ogrfica municipal. Daqui, poder ser personalizado eexpandido, de acordo com cada projeto.

    Tabelas:

    - mun: tabela com meta-informaes dos municpios.Campos: cod_mun (cdigo do municpio), nome (nomedo municpio);

    - temas: tabela com meta-informaes dos temasadotados. Campos: cod_tema (cdigo de identificaodo tema), desc_tema (descrio do tema);

    - fator: tabela com os limites de intervalos de classesutilizados e com os valores mnimo e mximo de cada

    srie de dados temticos. No exemplo, foram usadastrs classes, denominadas como alto impacto, mdioimpacto e baixo impacto. Assim, a tabela contm oscampos: cod_tema (cdigo de identificao do tema), L1(valor numrico do limite entre as classes baixo impacto

    e mdio impacto), L2 ( valor numrico do limite entreas classes mdio impacto e alto impacto), min (valornumrico mnimo encontrado na srie de dados de de-terminado tema), max (valor numrico mximo encon-trado na srie de dados de determinado tema).

    Para armazenar os dados referentes a cada tema,deve ser criada uma tabela para cada qual, com os se-guintes campos: cod_mun (cdigo de identificao domunicpio) e valor (valor numrico do tema referente adeterminado municpio). Esta medida torna mais gil aconsulta de dados pelo programa de gerao do mapa

    digital.

    5 . Programando o script de gerao dosmapas

    O script de gerao do mapa deve claro, destinadoexclusivamente a esse fim. Se o programador inserir oscript em uma pgina que j tem um cabealho HTML,

    incorrer em erro. O uso da funo include( ) do PHPtambm no permitido.

    A estrutura do programa PHP para gerao de mapasdigitais consiste das partes: 1) Cabealho do arquivo; 2)Conexo com o banco de dados; 3) Definio das cores;4) Desenho da moldura do mapa; 5) Desenho do Ttuloe do rodap; 6) Desenho da legenda; 7) Desenho dospolgonos e 8) Gerao, exibio e destruio da ima-gem.

    A seguir, os trechos do cdigo que correspondem acada item e a explicao. Todos os trechos que esto

    em negrito devem ser substitudos com informaes re-ferentes ao seu projeto.

    1) Cabealho do arquivo

    header("Content-type:image/png");

    $cod = cdigo do tema que serve de base para essemapa;$im = ImageCreate(890,650);/Criao da imagem.

    2) Conexo com o banco de dados

    $con = mysql_connect ("endereo do host do banco de dados", "usurio", "senha");

    $db = "nome do banco de dados";

    mysql_select_db ($db);

    //Seleciona a tabela correspondente

    //ao tema em questo.

    $tab = $cod;

    Visite nosso Portal

    www.phpmagazine.org.br

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    18/3118 - 6a Edio - PHP Magazine

    3) Definio das cores

    //cores da legenda

    //cor amarela

    $cor_02['R']=249;$cor_02['G']=248;$cor_02['B']=191;

    //cor verde

    $cor_01['R']=165;$cor_01['G']=200;$cor_01['B']=165;

    //cor vermelha

    $cor_03['R']=244;$cor_03['G']=150;$cor_03['B']=150;

    //cor azul$cor_04['R']=79;$cor_04['G']=191;$cor_04['B']=232;

    //cor bege do fundo

    $cor_05['R']=248;$cor_05['G']=244;$cor_05['B']=228;

    //aloca as cores

    $cor01 = ImageColorAllocate($im, $cor_01['R'],$cor_01['G'],$cor_01['B']);

    $cor02 = ImageColorAllocate($im, $cor_02['R'],$cor_02['G'],$cor_02['B']);

    $cor03 = ImageColorAllocate($im, $cor_03['R'],$cor_03['G'],$cor_03['B']);

    $cor04 = ImageColorAllocate($im, $cor_04['R'],$cor_04['G'],$cor_04['B']);

    $cor05 = ImageColorAllocate($im, $cor_05['R'],$cor_05['G'],$cor_05['B']);

    $white = ImageColorAllocate($im, 255, 255, 255);

    $black = ImageColorAllocate($im, 0, 0, 0);

    4) Desenho da moldura do mapa

    Imagerectangle($im,5,5,880,640,$black);

    5) Desenho do ttulo e do rodap

    //Escreve o titulo

    //Pesquisa o nome do indicador no banco de dados

    $result0 = mysql_query("SELECT desc_tema FROM temas WHERE cod_tema = '$cod'"

    or die ("Nao pude pesquisar ". mysql_error());

    while ($row0 = mysql_fetch_array($result0)){

    $desc_tema = $row0[0];

    }

    Imagestring($im,6,20,40,$desc_tema,$black);//Escreve o rodap

    $tring_fonte = "Fonte: Atlas de Indicadores de Sustentabilidade para os Municpios Costeiros do Es

    tado do Rio de Janeiro, Brasil.";

    imagestring($im,3,20,570,$string_fonte,$black);

    $string_end = "http://www.ivides.org/atlas/mapas_ind.php, acessado em " . date("d") . "/" . date

    ("n") . "/" . date("Y");

    imagestring($im,3,20,590,$string_end,$black);

    $string_mail = "Contacte a autora: Raquel Dezidrio ([email protected])";

    imagestring($im,3,20,610,$string_mail,$black);

    6) Desenho da legenda//Cria o box da legenda

    Imagefilledrectangle($im,712,340,872,560,$white);

    //Cria a moldura do box da legenda

    Imagerectangle($im,712,340,872,560,$black);

    //Escreve a palavra "LEGENDA"

    $string = "LEGENDA";

    imagestring($im,5,765,350,$string,$black);

    //Cria a linha que sublinha a legenda

    ImageLine($im, 750, 370, 840, 370, $black);

    //Pesquisa os intervalos das classes

    $result0 = mysql_query("SELECT max, min, L1, L2 FROM fator WHERE cod_tema = '$cod'")or die

    (Nao pude pesquisar . mysql_error());

    while ($row0 = mysql_fetch_array($result0)){

    $max = $row0[0];

    $max_aux = $max;

    $max = $max + 0.0100;

    $min = $row0[1];

    $min_exibe = $min;$min = $min - 0.0100;

    $L1 = $row0[2];

    $L1_aux = $L1 + 0.0001;

    $L2 = $row0[3];

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    19/31PHP Magazine - 6a Edio - 19

    $L2_aux = $L2 + 0.0001;

    }

    //Desenha os retngulos dos intervalos

    //Escreve o primeiro intervalo

    $string1 = "Impacto Baixo";

    $string1c = "(" . $min_exibe . " - " . $L1 . ")";

    imagestring($im, 5, 748, 396, $string1,$black);

    imagestring($im, 3, 748, 411, $string1c,$black);

    //Escreve o segundo intervalo$string2 = "Impacto Mdio";

    $string2c = "(" . $L1_aux . " - " . $L2 . ")";

    imagestring($im,5,748,456,$string2,$black);

    imagestring($im,3,748,471,$string2c,$black);

    //Escreve o terceiro intervalo

    $string3 = "Impacto Alto";

    $string3c = "(" . $L2_aux . " - " . $max_aux . ")";

    imagestring($im, 5, 748, 516, $string3, $black);

    imagestring($im, 3, 748, 531, $string3c, $black);

    //Desenha os quadradinhos

    imagefilledrectangle( $im, 720, 400, 740, 420, $cor01);

    imagerectangle( $im, 720, 400, 740, 420, $black);

    imagefilledrectangle( $im, 720, 460, 740, 480, $cor02);

    imagerectangle( $im, 720, 460, 740, 480, $black);imagefilledrectangle( $im, 720, 520, 740, 540, $cor03);

    imagerectangle( $im, 720, 520, 740, 540, $black);

    7) Desenho dos polgonos

    //Cria o polgono do mar atravs do vetor abaixo

    $values_mar = array(

    0 => 5,

    1 => 544,

    2 => 5,

    3 => 640,

    4 => 880,

    5 => 640,

    6 => 880,7 => 84,

    8 => 736,

    9 => 133,

    10 => 739,

    11 => 232,

    12 => 500,

    13 => 413,

    14 => 430,

    15 => 443,

    16 => 380,

    17 => 382,

    18 => 340,

    19 => 390,

    20 => 286,

    21 => 453,22 => 215,

    23 => 430,

    24 => 151,

    25 => 452,

    26 => 120,

    27 => 437,

    28 => 49,

    29 => 459,

    30 => 5,

    31 => 544,

    );

    $n_mar = 16;

    //Desenha o polgono do marimagefilledpolygon($im,$values_mar,$n_mar,$cor04);

    imagepolygon($im,$values_mar,$n_mar,$black);

    //Desenha o polgono do municpio 31 e atribui a cor adequada

    $cod_mun = 31;

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    20/3120 - 6a Edio - PHP Magazine

    //Pesquisa o valor do tema referente

    //ao municipio 31

    $result31 = mysql_query

    ("SELECT valor FROM $tab WHERE

    cod_mun = '$cod_mun'")

    or die ("Nao pude pesquisar " . mysql_error

    ());

    while ($row31 = mysql_fetch_array($result31)){

    $valor31 = $row31[0];

    $valor31_aux = $valor31;$valor31 = number_format($valor31,2,".",".");

    }

    //Define o poligono para o municipio 31

    $values_31 = array(

    0 => 294,

    1 => 423,

    2 => 296,

    3 => 423,

    4 => 297,

    5 => 422,

    6 => 298,

    7 => 422,

    8 => 299,

    9 => 421,

    10 => 306,11 => 421,

    12 => 305,

    13 => 412,

    14 => 301,

    15 => 412,

    16 => 300,

    17 => 413,

    18 => 297,

    19 => 413,

    20 => 295,

    21 => 414,

    22 => 295,

    23 => 416,

    24 => 293,

    25 => 416,

    26 => 292,

    27 => 417,

    28 => 291,

    29 => 418,

    30 => 291,

    31 => 419,

    32 => 294,

    33 => 422,

    34 => 294,

    35 => 423,

    );

    $n_31 = 18;

    //Testa em que intervalo est o valor

    //recuperado para o municpioif (($valor31 > $min)&&($valor31 < $L1)){

    imagefilledpolygon

    ($im,$values_31,$n_31,$cor01);

    }

    if (($valor31 >= $L1)&&($valor31

  • 8/8/2019 PHP Magazine 006

    21/31PHP Magazine - 6a Edio - 21

    Submisso de ArtigosVoc tambm pode participar das edies da PHP Magazine. A sua participao de interesse de toda a comunida-de, portanto, visitante, efetue seu cadastro e envie-nos algum artigo sobre os tpicos disponveis. Seu trabalho seravaliado e os melhores sero publicados na revista.

    Temas propostos:- segurana;

    - banco de dados;- configurao;- tendncias;- frameworks;- aplicaes (cms, wiki, genricas de projeto, erp);- IDEs;- compiladores;- engines (e-acelarator, ZEND);- webservices;- paradigmas de programao;- miscelnia (xml, impresso, ajax, certificao, mercado );- GTKs- ferramentas/projetos (no apenas os opensources);

    O artigo dever ser redigido em portugus, inclusive o resumo, ou seja, no possui abstract. Estamos recebendoarquivos no formato do Microsoft Office e Open Office, para isso, sugerimos um template especfico. Os autores de-vero se basear nos estilos aplicados na formatao deste modelo.

    Teremos o imenso prazer em analisar o seu trabalho e disponibiliz-lo em nossa revista.Mais informaes sobre a submisso de artigos esto disponveis no portal da revista.

    Participe!

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    22/31

  • 8/8/2019 PHP Magazine 006

    23/31PHP Magazine - 6a Edio - 23

    do desta linguagem, de carter fundamental para quemdeseja programar em PHP para a Internet. A especifica-o da W3C para o HTML 4.01 est disponvel em portu-gus no website do consrcio.

    O cdigo HTML utilizado neste artigo est reproduzi-do na seqncia. As regies marcadas com a seta segui-da de um nmero ( X) representam reas onde sero

    inseridos scripts. A tabela pode parecer confusa, mas, se

    o leitor analisar atentamente, perceber que se trata deuma tabela inserida em uma clula de outra tabela.

    O formulrio e seus elementos possuem nomes atri-budos atravs da propriedade name. atravs do no-me que o JavaScript ir atuar sobre a pgina. Os nomesiniciam com fpara formulrio e hpara campos tipo ocul-to (hidden) por conveno do autor.

    01

    02

    03

    Ttulo da Pgina

    05

    D

    S

    T

    Q

    QS

    S

    07

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    24/3124 - 6a Edio - PHP Magazine

    4. JavaScript

    A linguagem de programao JavaScript foi desenvol-vida pela Netscape em 1995 para realizar a validaodos formulrios no lado do cliente e para interagir comos elementos da pgina. O mtodo AJAX (AsynchronousJavascript And XML) faz uso desta linguagem para pro-

    duzir efeitos como os do Gmail.Quando se deseja alterar o ms, preciso enviar u-

    ma requisio ao servidor indicando qual o ms deseja-do. Isto pode ser feito atravs de botes HTML dentrodo formulrio. Porm, desejou-se uma interface maisagradvel, obtida atravs do JavaScript.

    Conforme mencionado, a identificao do elementoalvo na pgina feita atravs da propriedade name doHTML. Foram criadas duas funes, MesAnterior() eMesPosterior(). Estas funes so definidas dentro da

    rea 03 e chamadas nas reas 04 e 06. A definio dasfunes e as chamadas so reproduzidas na seqncia.

    A lgica empregada a seguinte: O cdigo PHP irpreencher os campos hanoe hmes. Ao clicar nos hiper-links () e (), so ativadas as fun-es especficas que modificam os campos hacao (paraa ou p) e henviado(para 1). O campo hacaoindica se o

    ms desejado o anterior ou o posterior. O campo hen-viado um campo de controle, inserido para enviar re-quisies eu no tenham sido enviadas atravs dos hi-perlinks.

    Outros dispositivos de segurana podem ser inseridosno script, entretanto, neste artigo apenas ser abordadoeste.

    O processamento do formulrio enviado ser feitoatravs do PHP na mesma pgina, na rea marcada como nmero 01.

    rea 03

    function MesAnterior()

    {

    document.fcalendario.hacao.value = "a";

    document.fcalendario.henviado.value = 1;

    document.fcalendario.submit();

    }

    function MesPosterior()

    {

    document.fcalendario.hacao.value = "p";

    document.fcalendario.henviado.value = 1;

    document.fcalendario.submit();}

    rea 04

    javascript:MesAnterior();

    rea 06

    javascript:MesPosterior();

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    25/31PHP Magazine - 6a Edio - 25

    5. MySQL

    Neste exemplo puramente didtico, uma base de da-dos bastante simples foi implementada com apenas umatabela MySQL de quatro campos, conforme listado a se-guir. Cabe salientar que o sistema pode ser melhoradoatravs da implementao de um banco de dados mais

    completo. A data e a hora poderiam ter sido inseridasdentro de um mesmo campo DATETIME, porm, parafacilitar a busca na base, foi prefervel separar estescampos.

    compromissos latin1_general_ci

    =============

    codigo INT(10) UNSIGNED PRIMARY

    data DATE

    hora TIME

    descricao TEXT latin1_general_ci

    6. PHP

    O cdigo PHP pode ser includo em praticamente to-dos os pontos da pgina. Entretanto, uma boa prticade programao criar-se as variveis no incio do script echam-las quando necessrio. Ateno, a utilizao dasboas prticas de programao facilita o entendimento do

    script, tanto pelo prprio programador, quanto por ter-ceiros; isto no significa que as outras tcnicas no se- jam vlidas. Antes de seguir quaisquer recomendaes,o mais importante que o programador possua um pa-dro pessoal de programao e o utilize sempre.

    Normalmente, as primeiras funes a serem executa-das num script so: abertura de sesses, validao dousurio e comunicao com o banco de dados. Uma vezque o script em questo no lida com sesses, nem pos-sui usurios, deve-se conectar o banco de dados, confor-me script a seguir.

    rea 01

  • 8/8/2019 PHP Magazine 006

    26/3126 - 6a Edio - PHP Magazine

    A chamada das datas feita atravs da funo date(). Para selecionar uma data especfica, utiliza-se a fun-o mktime(). preciso ser bastante cauteloso ao utili-zar esta funo, pois a ordem dos argumentos no muito ortodoxa: hora, minuto, segundo, ms, dia e ano.

    H um aspecto bastante peculiar na formao da lin-guagem PHP. Nas linguagens fortemente tipadas, as

    variveis devem ser declaradas antes de sua utilizao eo tipo de dados que elas iro armazenar deve ser especi-

    ficado. Este o caso das linguagens C, C++ e suas deri-vadas. A linguagem PHP, entretanto, permite que o usu-rio utilize uma varivel sem especificar o tipo. Apesarde ser bastante fcil trabalhar desta forma, pois as vari-veis podem ser convertidas do tipo numrico para o tipostring com grande facilidade, a converso reversa no automtica.

    Continuao da rea 01

    // Textos

    $meses[1]="janeiro";

    $meses[2]="fevereiro";

    $meses[3]="maro";

    $meses[4]="abril";

    $meses[5]="maio";

    $meses[6]="junho";

    $meses[7]="julho";$meses[8]="agosto";

    $meses[9]="setembro";

    $meses[10]="outubro";

    $meses[11]="novembro";

    $meses[12]="dezembro";

    // Recebe os dados

    if(isset($_REQUEST['henviado']))

    {

    if($_REQUEST['hacao']=='a')

    {

    $data['mes']=(int)(date('m',mktime(1,1,1,(int)($_REQUEST['hmes'])-1,1,(int)($_REQUEST['hano']))));

    $data['ano']=(int)(date('Y',mktime(1,1,1,(int)($_REQUEST['hmes'])-1,1,(int)($_REQUEST['hano']))));

    }

    if($_REQUEST['hacao']=='p')

    {

    $data['mes']=(int)(date('m',mktime(1,1,1,(int)($_REQUEST['hmes'])+1,1,(int)($_REQUEST['hano']))));

    $data['ano']=(int)(date('Y',mktime(1,1,1,(int)($_REQUEST['hmes'])+1,1,(int)($_REQUEST['hano']))));

    }

    }

    else

    {

    // Data atual

    $data['mes']=(int)(date('m'));

    $data['ano']=(int)(date('Y'));

    }

    // Dados complementares

    $data['bissexto']=(($data['ano']%4)==0)?1:0;

    if(($data['mes']==1)||($data['mes']==3)||($data['mes']==5)||($data['mes']==7)||($data['mes']==8)||($data['mes']==10)||($data['mes']==12))

    $data['dias_no_mes']=31;

    elseif(($data['mes']==2)&&($data['bissexto']))

    $data['dias_no_mes']=29;

    elseif(($data['mes']==2))

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    27/31PHP Magazine - 6a Edio - 27

    $data['dias_no_mes']=28;

    else

    $data['dias_no_mes']=30;

    Os dados armazenados pela varivel $_REQUESTso provenientes de um campo hidden do formulrio e,portanto, so do tipo string. Entretanto, a funo mkti-

    me() requer que um dado numrico seja passado. Pararealizar a converso, a fim de poder somar ou subtrair 1do ms, conveniente antes garantir que o dado este-

    ja convertido para o tipo inteiro. Isto conseguido atra-vs de um typecast (int).

    Nesta seo inicial, ainda falta definir quais as dataspossuem compromissos marcados. Este procedimentopode ser realizado de diversas formas. No entanto, comopara este exemplo no necessrio especificar a quanti-dade nem mesmo descrever o compromisso marcadopara o dia. possvel pesquisar-se apenas se h com-

    promissos marcados para cada um dos dias do ms.

    No exemplo, foi criado um vetor cujo valor inicial foifalse. Este vetor ser o responsvel por armazenar os

    dias com compromissos marcados. Se o banco de dadosretornar um ou mais elementos registrados para a dataespecificada, ento o elemento criado. Utilizando comoexemplo a figura 1, este pedao do script ir criar umvetor esparso com apenas os elementos 10, 18, 22 e 28,marcados com o valor true. O script em questo estreproduzido na seqncia.

    Todos os dados necessrios j foram criados e pro-cessados, portanto, as reas 05, 08, 09 e 10 podem serinseridas por entre as marcaes HTML.

    Continuao da rea 01// Busca as datas marcadas

    $marcado =false;

    for($i =1;$i

    O uso da orientao a objetos juntamente com o emprego de boas pr-ticas de programao nos possibilita manter um ritmo sustentvel nodesenvolvimento de aplicaes. O foco deste livro demonstrar comose d a construo de uma aplicao totalmente orientada a objetos.Para isso, implementaremos alguns padres de projeto (design pat-terns) e algumas tcnicas de mapeamento objeto-relacional, alm decriarmos vrios componentes para que voc possa criar complexas apli-caes de negcio com PHP.

    www.novatec.com.br

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    28/3128 - 6a Edio - PHP Magazine

    A rea 05 escreve o ms e o ano. A rea 08 o no-me da pgina atual para onde o formulrio ser enviado.

    As reas 09 e 10 armazenam o ms e o ano nos camposdo formulrio.

    rea 05

    rea 08

    rea 09

    rea 10

    O calendrio montado na tabela atravs do scriptna rea 07. Basicamente, um lao while utilizado para

    percorrer os dias do ms e uma srie de condicionais ifposicionam os dias do ms em suas posies corretas natabela. Para facilitar a visualizao do cdigo, a rea 07possui os textos 07a, 07b e 07c, reproduzidos na se-qncia.

    Dentro do lao while montada cada linha da tabe-la, onde os dias da semana so verificados com o con-

    junto de condies if. A tabela deve ser preenchida comcaracteres vazios &nbsp at que o primeiro dia do msseja encontrado. As reas 07a, 07b e 07c so muito pa-recidas, pois a lgica empregada praticamente a mes-ma. Nas trs reas, o valor X simboliza o dia da semana:

    de 0 (para domingo) at 6 (para sbado).

    A clusula if($i

    Outro aspecto importante diz respeito s marcaesHTML. As tabulaes e espaos so representados nocdigo HTML, entretanto, visualmente, apenas um espa-o apresentado na tela. Isto causa a falsa impressode que o cdigo HTML no sensvel endentao.

    Isto se torna bastante perceptvel quando formata-mos a pgina atravs de tabelas. O contedo entre asmarcaes e e e noapresentam problemas com a formatao, pois elas no

    guardam contedos. Porm, as marcaes e devem ser escritas juntas, isto , na mesma linha esem espaos ou tabulaes separando-as. Como exem-plo, reproduza o cdigo a seguir para verificar a difer-ena.

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    29/31PHP Magazine - 6a Edio - 29

    Cdigo exemplo

    Algo escrito

    Algo escrito

    Na segunda tabela, as linhas 1 e 3 no possuiro al-tura de apenas um pixel, pois o navegador consideraque a quebra de linha um caractere que deve ser im-presso. O resultado pode no parecer muito significativo,

    porm, quando o layout do Website inteiro baseadoem tabelas , o resultado pode ser bem diferente do de-sejado.

    rea 07a

    class="marcado"class="domingo"

    rea 07b

    class="marcado"

    rea 07c

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    30/3130 - 6a Edio - PHP Magazine

    7. CSS

    As folhas de estilo em cascata (CSS) foram desenvol-vidas para criar uma abordagem consistente que forne-cesse informao de estilos para documentos na Web. Aidia formatar vrios aspectos da pgina e de vriaspginas com apenas a insero de uma instruo, geral-

    mente na forma de classe. A maneira mais prtica de seutilizar uma formatao CSS colocar toda a formataoem um documento parte, com a extenso css, e anex-lo a cada pgina com o comando HTML . Nesteartigo, foi prefervel utiliz-lo dentro do prprio cdigoHTML por meio da marcao , na rea 02.

    rea 02

    a.domingo:link{

    font-family: Verdana, Arial, Helvetica, sans-serif;

    font-size: 10px;

    font-weight: bold;

    color: #ff0000;

    }

    a.domingo:visited

    {

    font-family: Verdana, Arial, Helvetica, sans-serif;

    font-size: 10px;

    font-weight: bold;

    color: #ff0000;

    }

    a.domingo:hover

    {

    font-family: Verdana, Arial, Helvetica, sans-serif;

    font-size: 10px;

    font-weight: bold;

    color: #008000;

    }

    td

    {

    Exemplar do assinante: 005765 - ubuntero loko

  • 8/8/2019 PHP Magazine 006

    31/31

    font-family: Verdana, Arial, Helvetica, sans-serif;

    font-size: 10px;

    font-weight: bold;

    }

    td.domingo

    {

    font-family: Verdana, Arial, Helvetica, sans-serif;

    font-size: 10px;

    font-weight: bold;

    color: #ff0000;

    }

    td.marcado

    {

    font-family: Verdana, Arial, Helvetica, sans-serif;

    font-size: 10px;

    font-weight: bold;

    color: #008000;

    }

    O cdigo CSS trabalha atravs de classes e marca-es HTML. As classes, quando presentes, so definidasaps o ponto (domingo, marcado). As marcaes,quando presentes, so definidas antes das classes(td.marcado, td.domingo e a.domingo) ou sem ne-nhuma classe associada (td). Neste ltimo caso, serconsiderada como formatao padro para aquela mar-cao HTML. Os dois pontos definem os eventos associa-dos aos hyperlinks (link, visited, active e hover).Dentro de cada bloco so definidas diversas proprieda-

    des de cada classe ou marcao, como por exemplo,tipo, tamanho, formatao e cor da fonte. Outras propri-edades dos mais diversos elementos HTML esto dispo-nveis, o que torna esta ferramenta bastante prtica everstil.

    Consideraes finais

    Espera-se que este artigo tenha guiado o leitor pordurante todo o processo de desenvolvimento de umWebsite dinmico. As ferramentas mais consolidadasforam apresentadas, bem como uma forma de integr-

    las em um mesmo projeto.Salienta-se ao leitor que a formatao, as tcnicas de

    programao e o modo de escrever o cdigo no pre-sente documento no devem ser considerados comonicas fontes, nem como as mais corretas. Estes quesi-tos so pessoais e cada programador possuir ou desen-volver a maneira que melhor lhe convier.

    Referncias e links sugeridos[W3C] http://www.w3c.br[PHP Manual] http://www.php.net

    Leandro Schwarz [email protected] eletricista pela Universidade Federal deSanta Catarina (UFSC) e Mestre em Engenharia El-trica (rea de concentrao: Engenharia Biomdica)pela UFSC, Leandro atua desde 2000 com desenvol-vimento Web e possui slidos conhecimentos emPHP e MySQL.