Вы находитесь на странице: 1из 31

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.

com>

PHP Magazine - 6a Edio -

sumrio

No esquecer Sombra no fundo Da imagem

PHP-GTK FTP ORM GDLib

editorial
Apresentao Equipe Caixa de Entrada

artigos
Um gerenciador de downloads em PHP-GTK
por Pablo Dall'Oglio

Upload seguro de arquivos usando FTP verificando vrus


por Helton Ritter

Mapeamento objeto-relacional usando PHP e MySQL


por Alexsandro Assis

Mapas temticos gerados com PHP


por Raquel Dezidrio Souto

Integrando ferramentas na construo de um calendrio


por Leandro Schwarz

2 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

apresentao
Amigo leitor, com grande alegria que lhe apresentamos a 6 edio da PHP Magazine! Mais uma vez, a sua PHP Magazine est repleta de artigos especialmente selecionados para voc. Em nossas pginas, o leitor poder desfrutar de cinco excelente artigos dos nossos colaboradores. Pablo Dall'Oglio, o criador 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 de arquivos, via FTP, mediante prvia verificao do antivrus. O artigo Mapeamento objeto-relacional usando PHP e MySQL, de Alexsandro Assis, abordar a rea de banco de dados e o ajudar a manter a padronizao, produtividade e portalibilidade entre diferentes bancos de dados. Na sequncia, Leandro Schwarz abordar todos os passos para a criao de um mdulo de calendrio. Por ltimo, Raquel Dezidrio Souto demostra como programar em PHP para gerao de mapas temticos. Novamente, aproveitamos para agradecer aos quase 11.000 leitores que nos acompanham no portal e contribuem com sugestes, artigos, e-mails de incentivo e cobranas. Vocs so nossos incentivadores e podem participar ativamente da revista. Estamos esperando o seu artigo!

Boa leitura!

Equipe da PHP Magazine

Editores Flvio Zacharias Fagundes, zach@phpmagazine.org.br Ricardo Arago, ricardoaragao@phpmagazine.org.br Administrao Flvio Zacharias Fagundes, zach@phpmagazine.org.br Ricardo Arago, ricardoaragao@phpmagazine.org.br Comercial Flvio Zacharias Fagundes Ricardo Arago Projeto grfico Flvio Zacharias Fagundes Ricardo Arago Reviso tcnica Ricardo Arago da Silva Flvio Zacharias Fagundes Helton Eduardo Ritter Reviso - Lngua Portuguesa Camilla Carvalho, camilla@phpmagazine.org.br

www.phpmagazine.org.br
Comercial comercial@phpmagazine.org.br Contato/Suporte contato@phpmagazine.org.br Marketing mkt@phpmagazine.org.br

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 3

caixa de entrada
Novos Artigos
Acompanho a revista desde a primeira edio e visvel o salto de qualidade que vem apresentando 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 Lages
Agradecemos os elogios. Todo artigo bem-vindo! Lembramos que voc pode submeter seus artigos pelo portal www.phpmagazine.org.br.

Elogios
Parabns pelo trabalho e pelo sucesso da revista. Aqui no Brasil, ter um trabalho destes j motivo de orgulho. Ricardo Chiavelli
A equipe PHP Magazine agradece o elogio. Voc a parte principal da nossa publicao, Magazine: o leitor. Sem voc a revista no sobrevive.

Edio impressa da revista


Sou desenvolvedor web e gostaria de saber se vocs tem a verso impressa da revista. Edbraulio Vieira
Ainda no dispomos de uma verso impressa da revista. Estamos trabalhando para divulgar mais o projeto, expandindo-o sobre outras meios, principalmente atravs de nosso portal e das edies digitais.

Opensource
Poderiam me informar o software que usam para formatar a revista? Opensource? Guilherme Machado - Curitiba - PR
Atualmente utilizamos o Microsoft Publisher, com outros softwares de apoio pra edio de imagens, que infelizmente, no so opensource. Em alguns casos se faz necessrio aplicar realce de sintaxe, ao cdigo fonte alguns artigos. Isso feito atravs da funo show_source do prprio PHP.

Edio 6
Pessoal, gostaria de saber quando estar disponvel a sexta edio da revista? Est demorando! Adorei as outras edies, muito bom o trabalho de vocs, parabns! Marcelo Ferreira
Sofremos algum atraso no lanamento da edio, pois estvamos buscando melhorar os servios oferecidos em nosso portal. Pedimos a compreenso de nossos leitores e firmamos o compromisso de sempre buscar oferecer contedos com a qualidade de sempre.

Crticas
Gosto da revista, porm os intervalos so muito grandes. Quero fazer uma crtica construtiva: algumas imagens esto simplesmente horrveis. Bruno Merlin
Sempre procuramos incluir imagens de boa qualidade nos artigos, no entanto, alguns artigos so submetidos com as imagens em baixa qualidade e no h tempo hbil para obter outras imagens, com melhor qualidade, junto aos autores.

ENVIE E-MAIL PARA


contato@phpmagazine.org.br Recomendamos 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.

4 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

Todo programador j deve ter ouvido falar sobre PHP, uma das linguagens mais utilizadas no mundo. A popularidade do PHP deve-se sua facilidade em criar aplicaes dinmicas para a internet, com suporte maioria dos gerenciadores de bancos de dados existentes, alm de um conjunto de funes que permitem desde a criao de simples portais at complexas aplicaes de comrcio eletrnico. O que poucos entenderiam at alguns anos atrs a possibilidade de criar aplicaes-cliente, com janelas, botes, listas e painis em PHP. Pois este justamente o foco de PHP-GTK Criando Aplicaes Grficas com PHP. O PHP tem crescido muito nos ltimos anos e se tornou uma linguagem de propsitos gerais. Este livro prova disto. Por intermdio do PHP-GTK, voc pode utilizar o PHP para desenvolver aplicaes com visual atraente e nativo para vrias plataformas, como Linux, Windows e Mac, utilizando a mesma linguagem que utiliza para 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: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 5

PHP-GTK
por Pablo DallOglio

Um gerenciador de

Downloads em PHP PHP-GTK


Neste artigo iremos desenvolver um pequeno utilitrio em PHP-GTK para baixar arquivos remotos. Assim como nos artigos anteriores, nosso objetivo no desenvolver nenhuma ferramenta profissional, mas mostrar de forma didtica como utilizar os recursos do PHP em conjunto com o GTK.
1. O Programa
A interface do programa ser bastante simples. Como pode ser visto na Figura 1, a janela composta de um campo onde o usurio ir digitar o endereo remoto do arquivo a ser baixado (objeto $file), um boto OK para iniciar o download (objeto $inicia_btn) e um boto Cancelar (objeto $cancel_btn) para interromper o download. Logo a seguir, tem-se uma barra de progresso (objeto $progress) que indica o percentual que j foi baixado do arquivo at o momento. Para criar a interface do programa, a classe GtkWindow, que representa uma janela, ser estendida. Desta forma, em seu mtodo construtor, definiremos quais objetos estaro contidos na janela principal e tambm as aes do boto OK, que executar o mtodo download() e do boto Cancelar que executar o mtodo abort().
<?php /** * classe para baixar arquivos * @author Pablo Dall'Oglio */ class Downloader extends GtkWindow { private $file; //local do arquivo private $inicia_btn; //boto ok private $cancel_btn; //boto cancelar private $progress; //barra de progresso private $aborted; //controle de abortar /** * cria a interface */ function __construct() { parent::__construct(); parent::set_position(Gtk::WIN_POS_CENTER); parent::set_size_request(430,-1); parent::set_title('pDownloader!'); // cria uma caixa vertical $vbox = new GtkVBox; $this->aborted = FALSE; // cria uma caixa para o arquivo $this->file = new GtkEntry('http://file.tgz'); // cria botes de OK e Cancelar $this->inicia_btn = GtkButton::new_from_stock... $this->cancel_btn = GtkButton::new_from_stock... // define as aes dos botes $this->inicia_btn->connect_simple('clicked', array($this, 'download')); $this->cancel_btn->connect_simple('clicked', array($this, 'abort')); // cria uma barra de progresso $this->progress = new GtkProgressBar(); $this->progress->set_fraction(0); $this->progress->set_text('Aguardando...'); // cria uma caixa horizontal $hbox = new GtkHBox; $hbox->pack_start($this->inicia_btn, FALSE,... $hbox->pack_start($this->cancel_btn, FALSE,... // organiza a interface $vbox->pack_start($this->file, TRUE, TRUE); $vbox->pack_start($hbox, FALSE, FALSE); $vbox->pack_start($this->progress, FALSE,... // adiciona a caixa vertical na janela parent::add($vbox); parent::show_all(); }

Figura 1 Aplicao rodando

O prximo mtodo que iremos escrever o mtodo abort(). Este mtodo ser executado sempre que o usurio clicar no boto cancelar. Seu funcionamento ser bastante simples. Ele ir definir o valor da propriedade $aborted como verdadeiro (TRUE) e tambm ir exibir uma mensagem ao usurio por meio de um dilogo de

6 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

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 o arquivo. Para tal, ele ir abrir ambos arquivos remoto e local por meio do mtodo fopen(). Em um lao de repeties, utilizaremos o mtodo fgets() para ler os dados remotos e o mtodo fwrite() para gravar no arquivo local. A funo events_pending() e main_iteration() so utilizadas para que o GTK atualize a interface principal com o percentual de andamento do download e para que a mesma no fique congelada at o final do processo. Neste mtodo utilizamos a funo get_headers() para obter a informao do tamanho do arquivo, antes de iniciar o download, para poder calcular o percentual concludo, e a funo pathinfo(), para extrair somente o nome do arquivo da URL. Assim, o arquivo remoto ser salvo na pasta /tmp, mantendo o mesmo nome. O ndice de concluso do download (varivel $indice) ser obtido acumulando a quantidade de bytes j baixados, por meio da varivel $downloaded e fazendo a 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 localmente fwrite($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 classe principal para que a janela seja exibida na tela.
// instancia classe new Downloader; Gtk::main(); ?>

Consideraes finais
Neste artigo, demos continuidade nossa srie de artigos sobre PHP-GTK, sempre demonstrando uma funcionalidade especfica da linguagem PHP til no dia-adia. Devido ao espao restrito aqui, algumas linhas foram truncadas. Logo a seguir, na seo referncias, encontra-se o [Site do Programa], onde o mesmo poder ser 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 - pablo@dalloglio.net Pablo Dall'Oglio bacharel em Informtica pela UNISINOS. Autor dos livros "PHP Programando com Orientao a Objetos" e "PHP-GTK - Criando Aplicaes Grficas com PHP", pela editora Novatec. Tambm foi o criador do PHP-GTK Brasil. Atualmente, diretor de tecnologia e proprietrio da Adianti Solutions (www.adianti.com.br).

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 7

FTP
por Helton Eduardo Ritter

Upload seguro de

arquivos usando FTP


verificando vrus
Este artigo apresenta uma tcnica no usual de fazer upload de arquivos para o servidor. Essa forma no garante, mas auxilia a segurana do servidor. Da maneira proposta, o daemon do apache no precisa ter permisso de gravao em um diretrio ou arquivo em uma URL pblica para fazer a transferncia.
Segurana no brincadeira, no de simples implementao, mas necessria e, em algumas situaes, crtica. Vale ressaltar que segurana total no existe. O mximo que podemos fazer aplicar boas tcnicas e monitorar sempre os sites que gerenciamos. O que define tudo o conhecimento. Se o invasor, ou quem quer que seja, que esteja tentando burlar o sistema souber mais do quem o projetou/desenvolveu, ento ele conseguir. Da tentativa de dificultar a concretizao da m inteno que surgem as prticas. Uma delas o upload usando FTP e a verificao de vrus no arquivo carregado. consegue se conectar a mquina do cliente e carregar de l o arquivo necessrio. O que acontece no propriamente um upload. basicamente uma cpia, pois o upload feito da maneira tradicional (por http). Esse mtodo, entretanto, inseguro, pois precisamos dar permisso de gravao para o usurio que roda o daemon do Apache. O problema no propriamente a permisso de gravao, mas o fato de costumarmos faz-la em um diretrio pblico que, se no for monitorado, pode virar um servidor gratuito de tudo quanto arquivo, exceto os esperados pela aplicao. Uma forma de melhorar isso sem usar-se do FTP nunca fazer upload para um diretrio pblico e uma pgina PHP (que tem acesso a esse diretrio) fazer o streaming desse arquivo (com file_get_contents() por exemplo). O mtodo proposto consiste em colocar o arquivo em uma local temporrio no servidor durante o upload, fazer as verificaes e, se passar, transferi-lo por FTP para o diretrio definitivo.

1. Mdulo php_clamavlib
ClamAV um anti-vrus conhecido do mundo Linux, principalmente por integrar-se com diversos outros servios como o Postfix, SendMail, Samba e, dentre outros, o Apache. Para PHP tambm h um mdulo que pode ser instalado atravs do gerenciador de pacotes de sua distribuio. Com o mdulo do ClamAV disponvel em PHP podemos verificar vrus em um arquivo antes de servi-lo ao cliente ou carreg-lo do cliente para a aplicao. O comportamento de verificao de vrus pode ser habilitado no php.ini (se o PHP estiver compilado com suporte) para fazer a anlise sempre que um arquivo for carregado, pois esta opo no est ativa por padro. Caso detecte um vrus, o arquivo do upload apagado e em $_FILES[file_field][error] o erro registrado.

3. Vantagens do mtodo
A primeira e mais importante delas que no precisamos ter nenhum arquivo pblico com permisso de gravao. Uma segunda vantagem: podemos colocar o arquivo em um diretrio pblico diretamente e depois no precisamos usar funes para ler o arquivo de um local no pblico ao exibi-lo na Web. Usa-se menos processamento, uma vez que o carregamento (que agora tem uma carga maior) feito uma vez e a exibio ocorre em vrios momentos. Podemos criar uma organizao maior em nossos servidores. Pode-se ter um servidor que receba o arquivo via upload http, faa as verificaes e se estiver limpo, passe o arquivo para outro servidor (por FTP). Assim

2. Upload por FTP


Esse mtodo soa estranho aos ouvidos de muitos, pois afinal o script PHP que est em um servidor no
8 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

estamos expondo apenas uma mquina e protegendo as informaes j consolidadas. No caso de termos dois servidores ou mais, o mtodo pode ser ainda otimizado, fazendo a transferncia do arquivo por SSH usando ssh2_scp_send(). Uma regra interna de firewall poderia liberar a conexo SSH apenas para o servidor que enviar o arquivo. Essa mesma regra poderia ser aplicada ao caso do FTP. FTP no um protocolo seguro. Assim, se na rede (dos servidores) estiver rodando algum sniffer, ainda existe a possibilidade de interceptao/adulterao do arquivo quando transferido de um para outro.
function upload($form_field, $tam_max, $tam_min, $ftp_server, $ftp_user, $ftp_passwd, $acept_files, $ftp_folder)
{

Com apenas um servidor e fazendo conexo FTP para 127.0.0.1 ou localhost no samos para a rede, logo, um possvel sniffer neste ambiente no tem ao.

4. Implementao
O objetivo desse artigo mais didtico do que prtico, visto que ele pode no ser totalmente implementvel em seu ambiente, caso no se tenha acesso administrativo ao servidor para instalar/configurar SSH, ClamAV... Abaixo uma funo que analisada rapidamente na seqncia:

$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: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 9

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 carregado pode ter; - Tamanho mnimo, em Kb; - IP ou nome do servidor de FTP, localhost ou o nome do seu servidor, lembrando a questo da transferncia no segura; - Usurio de FTP. Apenas o usurio, sem @server; - Senha de FTP; - Array no formato $a = array(gif.jpg,png das extenses de arquivos que o upload deve ser permitido; - Diretrio em que os arquivos depois de passarem pela verificao devero ser colocados; A funo move_uploaded_file()recebe o arquivo carregado e o deixa em um diretrio temporrio no pblico em que h permisso de gravao, ao contrrio da prtica comum que mov-lo para o diretrio definitivo 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, devolve uma string com o nome dele. Caso contrrio, retornar vazio. Use o Eicar para testes ou outro vrus que voc saiba anular sua ao e talvez limpar sua mquina. Passando por todas as verificaes, o arquivo ento transferido ftp_put(), para o seu local definitivo. A funo upload() retorna uma string informando o erro, ou retorna ok no caso de nenhum ter havido.

mento e, conseqentemente, o processo ficar mais lento como um todo. Tal fato agravado quando h transferncia do arquivo de um servidor para outro (FTP ou SSH). Entretanto ocorre somente uma vez e, no futuro, temos mais garantias. Prs e contras pesados. Se for iniciar um projeto, sugiro que pense bastante em segurana.

Referncias e links sugeridos


PESSOA, Mrcio. Segurana em PHP. So Paulo: Novatec, 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 - heltonritter@gmail.com Bacharelando em Sistemas de Informao. Tcnico em Informtica, professor adjunto e funcionrio da SETREM, atuando na mesma como desenvolvedor Web desde 2006. Membro da equipe da PHP Magazine deste maro de 2008. Mantm um site portflio: www.sourcedreams.eti.br

Consideraes finais
A metodologia discutida neste artigo melhor que a tradicional, mas ainda oferece riscos, pois poderemos ter alteraes no arquivo ou na leitura destas informaes entre a mquina do cliente e o servidor. Neste caso o uso de HTTPS possivelmente ajudaria. A partir do momento em que o arquivo sai da sua rede at ele chegar ao servidor, ele est em um ambiente fora de seu controle. O ideal seria comparar se o arquivo que chegou no servidor exatamente igual quele que saiu do cliente. Mas de uma maneira transparente, sem que o usurio tenha que gerar uma MD5 do arquivo e depois compar-la. As dependncias de softwares e configuraes no servidor so maiores. Tambm haver maior processa-

10 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

ORM
por Alexsandro Assis

Mapeamento

objeto objeto-relacional
usando PHP e MySQL
Conceituar e demonstrar o desenvolvimento e uso de classes em PHP para efetuar o mapeamento objeto-relacional, visando padronizao, produtividade e portalibilidade entre diferentes bancos de dados. Tornando, dessa forma, o uso de programao orientada 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 banco de dados como objeto, visando tornar mais amigvel o uso de um banco de dados relacional com linguagens ou projetos que utilizam a orientao a objetos. No mapeamento objeto-relacional no ser utilizada a linguagem SQL para fazer manuteno dos registros do banco, mas chamadas a mtodos que estaro encapsulando os comandos 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, alterar e apagar registros do banco de dados MySQL, utilizando a idia de mapeamento objeto-relacional. zveis.
<?php /** * @objetivo Responsvel por fazer integrao *com o servidor MySQL * @author Alexsandro Luiz de Assis * @email alexsandro.assis@gmail.com * @copyright www.pointdainformacao.com.br * @Criado em 09/08/2008 */ define('SERVIDOR' ,'localhost'); define('USUARIO' ,'root'); define('SENHA' ,''); define('BANCO' ,'artigo'); class db { #Funo para executar as transaes no banco public function executar( $sql, $con ){ @$Seleciona = mysql_query( $sql, $con ); if (!$Seleciona ) die('Erro.: '.$sql.'<br>'.mysql_error ()); return $Seleciona; } # Conecta ao servidor e seleciona o banco de # dados public function conectar ( ){ $Conexao = mysql_connect( SERVIDOR, USUARIO, SENHA); if (!$Conexao ) die('Erro.: '.mysql_connect_error()); if (!mysql_select_db (BANCO, $Conexao)) die('Erro.: '.mysql_error()); return $Conexao; }

1. Classes
Sero usadas trs classes para executar o mapeamento objeto-relacional: Classe db classeDados.php tem como objetivo a conexo e execuo dos comandos no banco MySQL. Classe tabela classeTabela.php tem como objetivo a montagem dos comandos de insert, update e delete que sero executados em uma determinada tabela do banco de dados. Classe coluna classeColuna.php esta classe trata as informaes referentes as colunas de uma determinada tabela.

Esclarecendo, este artigo tem como objetivo demonstrar a tcnica de mapeamento objeto relacional. No o objetivo dar uma soluo completamente pronta. Os exemplos so meramente demonstrativos, pois no houve tratamento de erros e os scripts foram simplificados ao mximo visando diminuir o tamanho do artigo. Fica como desafio melhorar as classes tornado-as 100% utili-

#Fecha a conexo com o banco de dados public function desconectar ( $con ){ mysql_close($con); }

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 11

O cdigo descrito acima pertence ao arquivo classeDados.php, e possui trs mtodos (executar, conectar e desconectar) responsveis por fazer a integrao/ utilizao do banco de dados MySQL. Esta classe pode ser expandida para tratar outros bancos (SGBDs) se tornando tambm uma classe de abstrao de dados, o que amplia muito sua utilidade. Tambm pode ser usada para implementar mtodos para tratar as pesquisas e as selees do banco de dados.
<?php /** * @config Responsvel por armazenar e * controlar os * dados das colunas * @author Alexsandro Luiz de Assis * @email alexsandro.assis@gmail.com * @copyright www.pointdainformacao.com.br * @Criado em 09/08/2008 */ class coluna{ # Cria os atributos privadas private $nome; private $tipo; private $tamanho; private $chave; private $valor; # Construtor da classe public function __construct ($nome,$tipo,$tamanho) { $this->nome = $nome; $this->tipo = $tipo; $this->tamanho = $tamanho; $this->chave = 'N'; $this->valor = ''; } # Funo de atribuio de valor a coluna public function setValor($valor){ $this->valor = $valor; } # Funo para pegar o valor a coluna public function getValor(){ return $this->valor; } # Funo para pegar o tipo da coluna public function getTipo(){ return $this->tipo; } # Funo para pegar o tamanho da coluna public function getTamanho(){ return $this->tamanho; } # Funo para pegar se a coluna chave public function getChave(){ return $this->chave; }

# Funo para pegar o nime da coluna public function getNome(){ return $this->nome; } # Funo para tornar esta coluna chave public function isChave(){ return $this->chave = 'S'; } } ?>

O cdigo descrito acima pertence ao arquivo classeColuna.php e possui vrios mtodos responsveis por fazer o mapeamento das colunas da tabela. Para isso cria-se objetos coluna para cada coluna da tabela. Nesta classe existem mtodos para armazenar (set), pegar (get) valores das colunas e identificar quais colunas fazem parte da chave da tabela.
<?php /** * @config Responsvel por fazer o mapeamento * das tabelas do banco de dados * @author Alexsandro Luiz de Assis * @email alexsandro.assis@gmail.com * @copyright www.pointdainformacao.com.br * @Criado em 09/08/2008 */ # Inclui a classe banco require_once( "classeDados.php" ); # Inclui a classe abstrata banco require_once( "classeColuna.php" ); # Inclui a classe de Banco de Dados class tabela extends db { # Cria public public public public os atributos privadas $nome; $coluna = array(); $sql = ''; $conexao;

# Construtor da classe public function __construct($nome){ $this->nome = $nome; } # Cria metodo para criar as colunas com seus # atributos public function coluna($nome,$tipo,$tamanho) { $this->$nome = new coluna ($nome,$tipo,$tamanho); $this->coluna[$nome] = $nome; }

O fragmento de cdigo descrito acima o inicio do arquivo (classeTabela.php). Neste fragmento de cdigo, gostaria de chamar ateno para dois pontos importantes: 1 A criao do atributo coluna para do tipo Array para armazenamento do nome das colunas. 2 O mtodo coluna, que indica dentro da classe

12 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

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

Os trs mtodos abaixo (inserir, alterar e deletar) seguem os mesmos princpios: 1 - Abre a conexo com o banco de dados;

Os fragmentos de cdigos descritos abaixo so a parte mais importante da classe tabela. Estes fragmentos so os responsveis por executar as aes de INSERT, UPDATE e DELETE, respectivamente, no banco de dados.

2 - Atravs de um loop pelo array de colunas, busca os atributos em cada objeto coluna e concatena os dados, montando a string SQL que ser executada no banco de dados; 3 - Executa a string SQL no banco de dados.

# Cria metodo para montar o comando de insert public function inserir(){ $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 function alterar(){ $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 function deletar(){ $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 function formataTipo($vl,$tp){ $valor = ''; switch ($tp){ case 'char': $valor = '\'' . $vl . '\''; break; case 'int': $valor = $vl; break;

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 13

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 classe public function __destruct(){ $this->desconectar($this->conexao); } } ?>

No final da classe tabela existe o mtodo formataTipo(), que formata os dados conforme a necessidade e o tipo de dados. Ex.: coloca os dados em formato de data compatvel com o banco de dados, como 09/25/2008, por exemplo. Vamos ver como funciona na prtica esta classe. Para exemplificar, usaremos duas tabelas conforme (Figura 1).

21 #$grupo->alterar(); 22 23?>

O cdigo acima descreve a simplicidade para executar 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 via parmetro o nome da tabela. Das linhas 10 a 12 so criadas as colunas (objeto) da tabela conforme a estrutura da tabela. Na linha 14, indica-se o campo que faz parte da chave primaria da tabela. Esta informao essencial para os mtodos de alterar e deletar, pois estas aes sero efetuadas com base nesta informao. Ex.: alterar o registro 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 os mtodos para o tipo de manuteno que ser efetuada no registro. Esta a idia de uso de mapeamento objetorelacional usando PHP e MySql para alterar sua aplicao para o uso de um banco de dados diferente, como o Oracle, basta alterar a classe db para usar Oracle em vez de MySql.

Figura 1 Diagrama de entidade relacionamento 1<?php 2 3 #Inclui a classe tabela usada para testes 4 require_once( "classeTabela.php" ); 5 6 /** 7 Exemplo de utilizacao das classes de dados 8 */ 9 $grupo = new tabela('tb_grupo'); 10 $grupo->coluna('id_grupo','int','10'); 11 $grupo->coluna('descricao','char','50'); 12 $grupo->coluna('sit','int','1'); 13 14 $grupo->id_grupo->isChave(); 15 $grupo->id_grupo->setValor('2'); 16 $grupo->descricao->setValor('Trabalho'); 17 $grupo->sit->setValor('1'); 18 19 $grupo->inserir(); 20 #$grupo->deletar();

Referncias e links sugeridos


[PHP Magazine] http://www.phpmagazine.org.br [Point da Informao] http://www.pointdainformacao.com.br

Alexsandro Assis - alexsandro.assis@gmail.com Analista de banco de dados, possui 8 anos de experincia com banco de dados SQL Server e 6 anos de experincia em desenvolvimento de aplicaes Web. Cursando o sexto perodo de Sistema de Informao pela Uniarax - Centro Universitrio do Planalto de Arax.

14 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

GDLib
por Raquel Deizrio Souto

Mapas temticos
gerados com PHP
Neste artigo, por meio de um exemplo prtico, demonstraremos como programar em PHP para gerao de mapas temticos. Diversos sistemas de informaes geogrficas j foram desenvolvidos e oferecem o recurso de gerao de mapas temticos. Entretanto, o tempo gasto na aprendizagem do funcionamento de tais sistemas pode ser economizado quando seguimos os passos simples deste breve tutorial.
A linguagem PHP tem uma biblioteca de funes muito til, mas ainda pouca usada: a GDLib, uma biblioteca de exibio grfica (em ingls: Graphics Display Library). A GDLib tem sido utilizada principalmente em aplicaes de gerao de grficos, mas seu potencial para desenvolvimento de mapas digitais grande e no deve ser negligenciado. Leia a apresentao da biblioteca GDLib contida no site oficial do PHP [1]: O PHP no est limitado a criar apenas sada em HTML. Ele tambm pode ser usado para criar e manipular arquivos de imagem em uma diversidade de formatos, incluindo gif, png, jpg, wbmp, e xpm. E ainda mais convenientemente, o PHP pode enviar streams de sada de imagem diretamente para o browser. Voc precisar compilar o PHP com a biblioteca GD de imagens de funes para isto funcionar. O PHP e GD tambm podem requerer outras bibliotecas, dependendo dos formatos de imagens com os quais voc queira trabalhar. Todas as funes grficas da biblioteca GDLib possuem descrio detalhada no site oficial do PHP [2] e o leitor pode fazer uso dele para consultas eventuais durante o desenvolvimento do projeto. $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 cor da 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 cor do preenchimento. 5) Imagepolygon Desenha um polgono sem preenchimento; 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 = identificador da cor de preenchimento. Exemplo de matriz: points[0] = x0, points[1] = y0, points[2] = x1, points[3] = y1, ... 6) Imagefilledpolygon Desenha um polgono preenchido; 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 = identificador da cor da linha.
PHP Magazine - 6a Edio - 15

1. Algumas funcionalidades disponveis na GDLib


Abaixo esto listadas as funes utilizadas nesse tutorial e a respectiva descrio da sintaxe. 1) ImageCreate Cria uma nova imagem; ImageCreate (int $width , int $height) Onde: $width = largura em pixels; $height = altura em pixels. 2) ImageColorAllocate - Aloca uma cor em uma varivel; imagecolorallocate (resource $image , int $red , int $green , int $blue ) Onde: $image = imagem criada com imagecreate;

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

7) Imagestring Desenha uma string horizontalmente; 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, dependendo do tamanho da fonte (por default, a codificao latin2), onde nmeros maiores correspondem a fontes mais largas; $x = coordenada x superior esquerda; $y = coordenada y superior esquerda; $string = string a ser 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 da cor da linha. 9) ImagePNG - Envia uma imagem PNG para o browser ou para um arquivo; ImagePNG ( resource $image [, string $filename ] ) Onde: $image = imagem criada com imagecreate; $filename = se indicado o caminho, ser enviada a imagem para um arquivo. 10) Imagedestroy Destri uma imagem, liberando 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 bsicos listados a seguir. A execuo demonstrada nesse artigo fundamenta-se no trabalho de classificao de municpios do Rio de Janeiro, onde foram gerados mapas temticos que so visualizados diretamente no navegador [3].

tadas pela GD, observe que: - GIF - Suportado apenas em verses do GD anteriores a gd-1.6. Suporte apenas para leitura est disponvel com o PHP 4.3.0 e a biblioteca GD empacotada. Suporte para escrita est disponvel desde o PHP 4.3.9 e PHP 5.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 no fizer, ir receber um erro alertando libjpeg.(a|so) not found quando voc estiver no passo de configurao para 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 de bibliotecas do seu sistema. Todos os trechos que esto entre colchetes devem ser substitudos pelas informaes relativas sua instalao. Instale o GD:
# cd [diretorio do pacote gd] # ./configure --with-jpeg-dir=[caminho do diretorio 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 diretrio 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 biblioteca png] --with-freetype-dir=[caminho diretrio da biblioteca Freetype] # make # make install

2 . Preparao do PHP para execuo das funes grficas GD


Para comear a desenvolver projetos com GD, o programador deve estar atento compilao do PHP com a GDLib para que as funes possam ser interpretadas corretamente. Alm disso, se precisar expandir os recursos da GD, o programador deve estar atento instalao de outras bibliotecas. A lista bsica de bibliotecas a serem instaladas para que tenha mnimo de independncia na programao segue adiante: - GDLib - http://www.libgd.org/releases/ - Lib JPEG Para gerar imagens JPEG a partir de scripts PHP com GD - ftp://ftp.uu.net/graphics/jpeg. - FreeType 2 - http://www.freetype.org. No tutorial, a imagem a ser criada possui extenso PNG, que suportada em verses de GD superiores gd -1.6. Com relao a outras extenses de imagens supor16 - 6a Edio - PHP Magazine

Reinicie o Apache: # /usr/local/apache2/bin/apachectl start Execute a funo phpinfo( ) para verificar se as bibliotecas foram instaladas corretamente.

Muitos documentos na web versam sobre como compilar o PHP com GD. Outras configuraes de compilao so possveis dependendo do servidor e/ou da verso das bibliotecas adquiridas e do PHP em uso. Aconselhase que os pacotes de bibliotecas sejam baixados e que

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

se procure um tutorial especfico na rede para a verso do Apache e do PHP que estiver utilizando, antes de comear a instalao.

digital.

3 . Planejamento do projeto
Muitas aplicaes podem ser desenvolvidas com uso de mapas temticos. Atualmente a informao geogrfica tem lugar cada vez maior nos projetos de Internet. Este artigo apresenta o exemplo de uma classificao temtica realizada em 34 municpios do Rio de Janeiro, envolvendo 22 temas. Para planejar o projeto, o programador deve ter em mente as necessidades de cada proposta. No exemplo, as principais caractersticas levadas em conta foram as seguintes: - Temas: como so muito temas, foi criada uma codificao 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 de fontes de dados etc.

5 . Programando o script de gerao dos mapas


O script de gerao do mapa deve claro, destinado exclusivamente a esse fim. Se o programador inserir o script em uma pgina que j tem um cabealho HTML, incorrer em erro. O uso da funo include( ) do PHP tambm no permitido. A estrutura do programa PHP para gerao de mapas digitais 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 Ttulo e do rodap; 6) Desenho da legenda; 7) Desenho dos polgonos e 8) Gerao, exibio e destruio da imagem. A seguir, os trechos do cdigo que correspondem a cada item e a explicao. Todos os trechos que esto em negrito devem ser substitudos com informaes referentes ao seu projeto. 1) Cabealho do arquivo
header("Content-type:image/png");

4 . Planejamento do banco de dados


O tamanho e complexidade do banco de dados dependero das caractersticas do projeto. Aqui, apresentada uma estrutura de banco de dados simples, apenas para entendimento bsico do processamento de informaes na gerao de um mapa temtico com unidade geogrfica municipal. Daqui, poder ser personalizado e expandido, de acordo com cada projeto. Tabelas: - mun: tabela com meta-informaes dos municpios. Campos: cod_mun (cdigo do municpio), nome (nome do municpio); - temas: tabela com meta-informaes dos temas adotados. Campos: cod_tema (cdigo de identificao do tema), desc_tema (descrio do tema); - fator: tabela com os limites de intervalos de classes utilizados e com os valores mnimo e mximo de cada srie de dados temticos. No exemplo, foram usadas trs classes, denominadas como alto impacto, mdio impacto e baixo impacto. Assim, a tabela contm os campos: 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 entre as classes mdio impacto e alto impacto), min (valor numrico mnimo encontrado na srie de dados de determinado tema), max (valor numrico mximo encontrado 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 seguintes campos: cod_mun (cdigo de identificao do municpio) e valor (valor numrico do tema referente a determinado municpio). Esta medida torna mais gil a consulta de dados pelo programa de gerao do mapa

$cod = cdigo do tema que serve de base para esse mapa;


$im = ImageCreate(890,650);/Criao da imagem.

2) Conexo com o banco de dados


$con = mysql_connect ("endereo do host do ban co 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: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 17

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 (raquel.deziderio@gmail.com)"; 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];

18 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

$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 mar imagefilledpolygon($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; PHP Magazine - 6a Edio - 19

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

//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 municpio if (($valor31 > $min)&&($valor31 < $L1)){ imagefilledpolygon ($im,$values_31,$n_31,$cor01); } if (($valor31 >= $L1)&&($valor31 <= $L2)){ imagefilledpolygon ($im,$values_31,$n_31,$cor02); } if(($valor31 <= $max)&&($valor31 > $L2)){ imagefilledpolygon ($im,$values_31,$n_31,$cor03); } //Desenha a borda do polgono 31 imagepolygon($im,$values_31,$n_31,$black)

6. Consideraes finais
Neste artigo, descrevemos somente o trecho de cdigo de um dos municpios avaliados para fim de exemplificao. Para ver o cdigo PHP utilizado na aplicao real que serviu de base para esse tutorial, visite: http:// www.ivides.org/atlas/mapas_ind.php e clique no link cdigo-fonte do mapa. Agradecimentos especiais a toda a equipe da PHP Magazine pela oportunidade.

Referncias e links sugeridos


[1] http://br2.php.net/manual/pt_BR/intro.image.php Apresentao da GDLib no php.net . [2] http://br2.php.net/manual/pt_BR/ref.image.php Lista das funes da GDLib no php.net . [3] http://www.ivides.org/atlas/mapas_ind.php Atlas de Indicadores de Sustentabilidade para os Municpios Costeiros do Estado do Rio de Janeiro.

Raquel D. Souto - raquel.deziderio@gmail.com Bacharel em Oceanografia pela Universidade do Estado do Rio de Janeiro (2005). Especialista em instalao e configurao de sistemas operacionais like Unix, instalao e configurao de SGBD MySQL. Atua desde 2004 em desenvolvimento Web com PHP, de aplicaes administrativo-financeiras e geocientficas. Atualmente seus principais projetos so: portal do Atlas de Indicadores de Sustentabilidade para os Municpios Costeiros do Estado do Rio de Janeiro - http://www.ivides.org/atlas e portal do Instituto Virtual para o Desenvolvimento Sustentvel - IVIDES.org - http://www.ivides.org.

8) Gerao, exibio e destruio da imagem


ImagePNG($im); Imagedestroy($im); 20 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

Submisso de Artigos
Voc tambm pode participar das edies da PHP Magazine. A sua participao de interesse de toda a comunidade, portanto, visitante, efetue seu cadastro e envie-nos algum artigo sobre os tpicos disponveis. Seu trabalho ser avaliado 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 recebendo arquivos no formato do Microsoft Office e Open Office, para isso, sugerimos um template especfico. Os autores devero 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: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 21

integrao
por Leandro Schwarz

Integrando Ferramentas
na construo de um calendrio
Este artigo introdutrio visa abordar todos os passos na criao de um mdulo de calendrio. O artigo voltado para o pblico iniciante, atravs do desenvolvimento de um calendrio simples. Leitores mais experientes poderiam continuar o desenvolvimento para tornar o script um mdulo integrado a um sistema de gerenciamento comercial.
O objetivo criar uma tabela dinmica do ms atual, mostrando todos os dias em ordem, conforme indicado na figura 1. QL devido familiaridade do autor com o mesmo.

3. HTML
A linguagem HTML (HyperText Markup Language) foi criada por Tim Berners-Lee. A verso atual do HTML 4.0 foi publicada em 1997 e mantida e regulada pelo W3C (World Wide Web Consortium). Tambm est disponvel a utilizao do XML como linguagem de marcao padro, tambm regulada por este rgo. O cdigo HTML a parte mais importante de toda pgina de Internet e de todo script, pois, mesmo se a programao estiver correta, sem as marcaes (ou tags) HTML adequadas, dificilmente obtm-se o resultado esperado.

Figura 1 Aspecto final do calendrio proposto.

1. Requisitos do sistema
O sistema a ser desenvolvido deve ser capaz de identificar a data atual e montar o calendrio referente ao ms. O sistema tambm deve ser capaz de permitir ao usurio que mude de ms, ou seja, deve possuir dois botes: um para o ms anterior e outro para o ms posterior. A tabela deve possuir os domingos marcados na cor vermelha. Atravs de um banco de dados, os compromissos marcados devem ter suas datas mostradas em verde.

Outro aspecto importante da marcao HTML a compatibilidade entre os navegadores. Uma vez que o script PHP processado no servidor, ele se torna transparente para o cliente, sendo responsabilidade do navegador a interpretao das marcaes HTML. Se o HTML no for compatvel com o tipo ou a verso do navegador em uso, a aparncia e at mesmo os efeitos empregados podem ser diferentes do esperado. O objetivo deste artigo no introduzir a codificao HTML, nem mesmo as outras linguagens j citadas. Entretanto, preciso que o leitor esteja ciente da sua importncia. O cdigo HTML inicia pela tag html. Na seqncia, procedem-se as tags head e title. A tag head e todo o contedo postado em seu interior dizem respeito aos dados que no fazem parte das componentes visuais do corpo da pgina. O corpo da pgina, por sua vez, delimitado pela tag body. dentro desta tag que ser definida a posio centralizada na pgina (tag center), a tabela (tag table) com suas linhas (tag tr) e colunas (tag td), alm do formulrio (tag form) com seus campos (tag input). Sugere-se ao leitor, que por ventura no esteja totalmente familiarizado com a linguagem HTML, que procure na Internet por tutoriais ou materiais para aprendiza-

2. Definies do sistema
Depois da definio dos requisitos do sistema, seguese escolha das ferramentas e linguagens que sero utilizadas para o cumprimento dos requisitos. Para a tabela, ser utilizado HTML e, para o processamento dinmico, evidentemente, ser utilizado o PHP. O JavaScript enviar as requisies para o servidor quando se desejar alterar o ms. As diversas combinaes de cores e fontes sero definidas atravs do CSS. O banco de dados pode ser criado com qualquer servidor compatvel com o PHP. Neste artigo, foi utilizado o MyS-

22 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

do desta linguagem, de carter fundamental para quem deseja programar em PHP para a Internet. A especificao da W3C para o HTML 4.01 est disponvel em portugus no website do consrcio. O cdigo HTML utilizado neste artigo est reproduzido na seqncia. As regies marcadas com a seta seguida 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 de uma tabela inserida em uma clula de outra tabela. O formulrio e seus elementos possuem nomes atribudos atravs da propriedade name. atravs do nome que o JavaScript ir atuar sobre a pgina. Os nomes iniciam com f para formulrio e h para campos tipo oculto (hidden) por conveno do autor.

01 <html> <head> <style type="text/css"> 02 </style> <script language="javascript" type="text/javascript"> 03 </script> <title>Ttulo da Pgina</title> </head> <body> <center> <table cellpadding="0" cellspacing="0" border="1" width="140"> <tr> <td colspan="7" width="140"><table cellpadding="0" cellspacing="0" border="0" width="140"> <tr> <td width="20" align="center"><a href=" 04" class="domingo">&laquo;</ a></td> <td width="100" colspan="5" align="center"> 05</td> <td width="20" align="center"><a href=" a></td> </tr> </table></td> </tr> <tr> <td width="20" <td width="20" <td width="20" <td width="20" <td width="20" <td width="20" <td width="20" </tr> 07 </table> <form name="fcalendario" action=" data"> <input type="hidden" name="hmes" value=" 09"> <input type="hidden" name="hano" value=" 10"> <input type="hidden" name="hacao" value=""> <input type="hidden" name="henviado" value="0"> </form> </center> </body></html>
PHP Magazine - 6a Edio - 23

06" class="domingo">&raquo;</

align="center">D</td> align="center">S</td> align="center">T</td> align="center">Q</td> align="center">Q</td> align="center">S</td> align="center">S</td>

08" method="post" enctype="multipart/form-

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

4. JavaScript
A linguagem de programao JavaScript foi desenvolvida pela Netscape em 1995 para realizar a validao dos formulrios no lado do cliente e para interagir com os elementos da pgina. O mtodo AJAX (Asynchronous Javascript And XML) faz uso desta linguagem para produzir efeitos como os do Gmail. Quando se deseja alterar o ms, preciso enviar uma requisio ao servidor indicando qual o ms desejado. Isto pode ser feito atravs de botes HTML dentro do formulrio. Porm, desejou-se uma interface mais agradvel, obtida atravs do JavaScript. Conforme mencionado, a identificao do elemento alvo na pgina feita atravs da propriedade name do HTML. Foram criadas duas funes, MesAnterior() e MesPosterior(). Estas funes so definidas dentro da

rea 03 e chamadas nas reas 04 e 06. A definio das funes e as chamadas so reproduzidas na seqncia. A lgica empregada a seguinte: O cdigo PHP ir preencher os campos hano e hmes. Ao clicar nos hiperlinks &laquo; () e &raquo; (), so ativadas as funes especficas que modificam os campos hacao (para a ou p) e henviado (para 1). O campo hacao indica se o ms desejado o anterior ou o posterior. O campo henviado um campo de controle, inserido para enviar requisies eu no tenham sido enviadas atravs dos hiperlinks. Outros dispositivos de segurana podem ser inseridos no script, entretanto, neste artigo apenas ser abordado este. O processamento do formulrio enviado ser feito atravs do PHP na mesma pgina, na rea marcada com o 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();

24 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

5. MySQL
Neste exemplo puramente didtico, uma base de dados bastante simples foi implementada com apenas uma tabela MySQL de quatro campos, conforme listado a seguir. Cabe salientar que o sistema pode ser melhorado atravs da implementao de um banco de dados mais completo. A data e a hora poderiam ter sido inseridas dentro de um mesmo campo DATETIME, porm, para facilitar a busca na base, foi prefervel separar estes campos. compromissos ============= codigo data hora INT(10) DATE TIME latin1_general_ci UNSIGNED PRIMARY latin1_general_ci

6. PHP
O cdigo PHP pode ser includo em praticamente todos os pontos da pgina. Entretanto, uma boa prtica de programao criar-se as variveis no incio do script e cham-las quando necessrio. Ateno, a utilizao das boas prticas de programao facilita o entendimento do script, tanto pelo prprio programador, quanto por terceiros; isto no significa que as outras tcnicas no sejam vlidas. Antes de seguir quaisquer recomendaes, o mais importante que o programador possua um padro pessoal de programao e o utilize sempre. Normalmente, as primeiras funes a serem executadas num script so: abertura de sesses, validao do usurio e comunicao com o banco de dados. Uma vez que o script em questo no lida com sesses, nem possui usurios, deve-se conectar o banco de dados, conforme script a seguir.

descricao TEXT rea 01

<? // Arquivos necessrios require_once("config.php"); // Conexo com o banco de dados $banco = @mysql_connect($mysql['servidor'],$mysql['usuario'],$mysql['senha'],1); if($banco == false) { echo "No foi possvel estabelecer conexo com o banco de dados"; exit(0); } $resp = @mysql_select_db($mysql['banco'],$banco); if($resp == false) { echo "No foi possvel acessar a base de dados"; exit(0); } unset($mysql); A primeira instruo do script uma chamada para incluso de outro arquivo. Neste arquivo, foi criado um vetor chamado $mysql contendo os dados do servidor do banco de dados. Esta abordagem bastante prtica, pois, caso os dados do servidor mudem, possvel se alterar apenas um arquivo ao invs de todos os scripts do Website. Outra vantagem que, com as variveis em apenas um vetor, elas podem ser facilmente apagadas aps seu uso, por meio da chamada de apenas uma instruo unset(). Assim, as variveis existem por um perodo muito curto durante o processamento do script. As funes de acesso ao banco de dados so chamadas precedidas pelo caractere @ para evitar que os erros sejam ecoados na tela. O tratamento dos erros no o mais adequado, porm, para fins didticos, o suficiente. Na seqncia, necessrio se criar um vetor com o nome dos meses em portugus. Isto necessrio, pois a funo date() do PHP retorna o nome dos meses e dos dias da semana apenas em ingls. Uma vez que a funo date() retorna os meses em formato numrico de 1 a 12, esta a forma utilizada para indexao do vetor, conforme indicado no script a seguir. Conforme mencionado nas sesses anteriores, o usurio pode enviar um formulrio para modificar o ms desejado. Para tal, necessrio que os dados enviados pelo formulrio sejam processados. Com este intuito, pode-se utilizar a varivel $_REQUEST. Esta varivel bastante til, j que agrega todos os dados das variveis $_GET e $_POST, encarregadas de armazenar os dados provenientes de formulrios ou requisies pelos mtodos GET e POST, respectivamente.

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 25

A chamada das datas feita atravs da funo date (). Para selecionar uma data especfica, utiliza-se a funo mktime(). preciso ser bastante cauteloso ao utilizar 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 linguagem PHP. Nas linguagens fortemente tipadas, as variveis devem ser declaradas antes de sua utilizao e o tipo de dados que elas iro armazenar deve ser especi-

ficado. Este o caso das linguagens C, C++ e suas derivadas. A linguagem PHP, entretanto, permite que o usurio utilize uma varivel sem especificar o tipo. Apesar de ser bastante fcil trabalhar desta forma, pois as variveis podem ser convertidas do tipo numrico para o tipo string 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))
26 - 6a Edio - PHP Magazine
Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

$data['dias_no_mes'] = 28; else $data['dias_no_mes'] = 30; Os dados armazenados pela varivel $_REQUEST so provenientes de um campo hidden do formulrio e, portanto, so do tipo string. Entretanto, a funo mktime() requer que um dado numrico seja passado. Para realizar a converso, a fim de poder somar ou subtrair 1 do ms, conveniente antes garantir que o dado esteja convertido para o tipo inteiro. Isto conseguido atravs de um typecast (int). Nesta seo inicial, ainda falta definir quais as datas possuem compromissos marcados. Este procedimento pode ser realizado de diversas formas. No entanto, como para este exemplo no necessrio especificar a quantidade nem mesmo descrever o compromisso marcado para o dia. possvel pesquisar-se apenas se h compromissos marcados para cada um dos dias do ms. No exemplo, foi criado um vetor cujo valor inicial foi false. Este vetor ser o responsvel por armazenar os dias com compromissos marcados. Se o banco de dados retornar um ou mais elementos registrados para a data especificada, ento o elemento criado. Utilizando como exemplo a figura 1, este pedao do script ir criar um vetor esparso com apenas os elementos 10, 18, 22 e 28, marcados com o valor true. O script em questo est reproduzido na seqncia. Todos os dados necessrios j foram criados e processados, portanto, as reas 05, 08, 09 e 10 podem ser inseridas por entre as marcaes HTML.

Continuao da rea 01 // Busca as datas marcadas $marcado = false; for($i = 1;$i < ($data['dias_no_mes'] + 1);$i++) { $sql = "SELECT COUNT(*) FROM `compromissos` WHERE `data` = '" . $data['ano'] . "-" . $data['mes'] . "-"; if($i < 10) $sql .= "0"; $sql .= $i . "'"; $resp = @mysql_query($sql,$banco); if($resp == false) { echo "Erro no envio da requisio ao banco de dados"; exit(0); } $linha = @mysql_fetch_array($resp,MYSQL_NUM); if($linha[0] > 0) $marcado[$i] = true; } ?>

O uso da orientao a objetos juntamente com o emprego de boas prticas de programao nos possibilita manter um ritmo sustentvel no desenvolvimento de aplicaes. O foco deste livro demonstrar como se d a construo de uma aplicao totalmente orientada a objetos. Para isso, implementaremos alguns padres de projeto (design patterns) e algumas tcnicas de mapeamento objeto-relacional, alm de criarmos vrios componentes para que voc possa criar complexas aplicaes de negcio com PHP.

www.novatec.com.br

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 27

A rea 05 escreve o ms e o ano. A rea 08 o nome da pgina atual para onde o formulrio ser enviado. As reas 09 e 10 armazenam o ms e o ano nos campos do formulrio. rea 05 <? echo $meses[$data['mes']] . " / " . $data['ano']; ?> rea 08 <? echo $_SERVER['PHP_SELF']; ?> rea 09 <? echo $data['mes']; ?> rea 10 <? echo $data['ano']; ?> O calendrio montado na tabela atravs do script na rea 07. Basicamente, um lao while utilizado para percorrer os dias do ms e uma srie de condicionais if posicionam os dias do ms em suas posies corretas na tabela. Para facilitar a visualizao do cdigo, a rea 07 possui os textos 07a, 07b e 07c, reproduzidos na seqncia. Dentro do lao while montada cada linha da tabela, onde os dias da semana so verificados com o conjunto de condies if. A tabela deve ser preenchida com caracteres vazios &nbsp at que o primeiro dia do ms seja encontrado. As reas 07a, 07b e 07c so muito parecidas, pois a lgica empregada praticamente a mesma. Nas trs reas, o valor X simboliza o dia da semana: de 0 (para domingo) at 6 (para sbado).

A clusula if($i <= $data['dias_no_mes']) verifica se ainda h algum dia que no foi escrito no calendrio. Na rea 07c, que onde o nmero dia ser efetivamente escrito, caso o nmero de dias j tenha sido alcanado, o caractere espao (&nbsp;) ser escrito. A clusula if(date(...) == X) verifica se o dia do ms a ser escrito est na coluna correta da tabela. Nas reas 07a e 07b, o resultado ir guiar a formatao do texto escrito na clula, com a diferena de que a rea 07a utilizada para os domingos e a 07b para os demais dias. Dentro desta condio, verifica-se se h algum compromisso marcado. As classes CSS utilizadas sero discutidas na prxima parte. Na rea 07c, aps o dia do ms ter sido impresso, o contador $i incrementado para que o prximo dia possa ser processado. Uma vez que o processamento do while realizado dentro da tabela e o contador pode ser incrementado a cada clula, a cada repetio do lao while a varivel contadora poder ter sido incrementada at sete vezes. Um detalhe que muitas vezes passa despercebido a endentao do cdigo PHP e do cdigo HTML. O cdigo PHP processado no servidor, o que significa que endentar com espaos, tabulaes ou escrever o cdigo em uma linha apenas reflete meramente o perfil do programador. O autor tem preferncia por formatar as reas 01 a 07 como representado neste artigo. Entretanto, quanto aos cdigos 07a, 07b e 07c, inseridos diretamente entre as marcaes HTML, a preferncia escrever na mesma linha. Por motivos didticos o cdigo foi endentado.

rea 07 <? $i = 1;while($i <= $data['dias_no_mes']){ ?> <tr> <td width="20" align="center" 07a> 07c</td> <td width="20" align="center" <td width="20" align="center" <td width="20" align="center" <td width="20" align="center" <td width="20" align="center" <td width="20" align="center" </tr> <? } ?> 07b> 07c</td> 07b> 07c</td> 07b> 07c</td> 07b> 07c</td> 07b> 07c</td> 07b> 07c</td>

Outro aspecto importante diz respeito s marcaes HTML. As tabulaes e espaos so representados no cdigo HTML, entretanto, visualmente, apenas um espao apresentado na tela. Isto causa a falsa impresso de que o cdigo HTML no sensvel endentao. Isto se torna bastante perceptvel quando formatamos a pgina atravs de tabelas. O contedo entre as marcaes <TABLE> e </TABLE> e <TR> e </TR> no apresentam problemas com a formatao, pois elas no

guardam contedos. Porm, as marcaes <TD> e </ TD> devem ser escritas juntas, isto , na mesma linha e sem espaos ou tabulaes separando-as. Como exemplo, reproduza o cdigo a seguir para verificar a diferena.

28 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

Cdigo exemplo <table border="0" cellpadding="0" cellpadding="0"> <tr> <td width="50" height="1" bgcolor="#0000ff"><img width="1" height="1"></td> </tr> <tr> <td width="50">Algo escrito</td> </tr> <tr> <td width="50" height="1" bgcolor="#0000ff"><img width="1" height="1"></td> </tr> </table> <table border="0" cellpadding="0" cellpadding="0"> <tr> <td width="50" height="1" bgcolor="#0000ff"> <img width="1" height="1"> </td> </tr> <tr> <td width="50"> Algo escrito </td> </tr> <tr> <td width="50" height="1" bgcolor="#0000ff"> <img width="1" height="1"> </td> </tr> </table> Na segunda tabela, as linhas 1 e 3 no possuiro altura de apenas um pixel, pois o navegador considera que a quebra de linha um caractere que deve ser impresso. O resultado pode no parecer muito significativo, rea 07a <? if($i <= $data['dias_no_mes']) { if(date("w",mktime(1,1,1,$data['mes'],$i,$data['ano'])) == X) { if(isset($marcado[$i])) { ?> class="marcado"<? }else{ ?> class="domingo"<? }}} ?> rea 07b <? if($i <= $data['dias_no_mes']) { if(date("w",mktime(1,1,1,$data['mes'],$i,$data['ano'])) == X) { if(isset($marcado[$i])) { ?> class="marcado"<? }}} ?> rea 07c porm, quando o layout do Website inteiro baseado em tabelas , o resultado pode ser bem diferente do desejado.

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 29

<? if($i <= $data['dias_no_mes']) { if(date("w",mktime(1,1,1,$data['mes'],$i,$data['ano'])) == X) { echo $i; $i++; } else { echo "&nbsp;"; } } else { echo "&nbsp;"; } ?> mente na forma de classe. A maneira mais prtica de se utilizar uma formatao CSS colocar toda a formatao em um documento parte, com a extenso css, e anex -lo a cada pgina com o comando HTML <LINK>. Neste artigo, foi prefervel utiliz-lo dentro do prprio cdigo HTML por meio da marcao <STYLE>, na rea 02.

7. CSS
As folhas de estilo em cascata (CSS) foram desenvolvidas para criar uma abordagem consistente que fornecesse informao de estilos para documentos na Web. A idia formatar vrios aspectos da pgina e de vrias pginas com apenas a insero de uma instruo, geral-

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 {

30 - 6a Edio - PHP Magazine

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

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 marcaes HTML. As classes, quando presentes, so definidas aps o ponto (domingo, marcado). As marcaes, quando presentes, so definidas antes das classes (td.marcado, td.domingo e a.domingo) ou sem nenhuma classe associada (td). Neste ltimo caso, ser considerada como formatao padro para aquela marcao HTML. Os dois pontos definem os eventos associados aos hyperlinks (link, visited, active e hover). Dentro de cada bloco so definidas diversas propriedades de cada classe ou marcao, como por exemplo, tipo, tamanho, formatao e cor da fonte. Outras propriedades dos mais diversos elementos HTML esto disponveis, o que torna esta ferramenta bastante prtica e verstil.

Leandro Schwarz - leandroschwarz@gmail.com Engenheiro eletricista pela Universidade Federal de Santa Catarina (UFSC) e Mestre em Engenharia Eltrica (rea de concentrao: Engenharia Biomdica) pela UFSC, Leandro atua desde 2000 com desenvolvimento Web e possui slidos conhecimentos em PHP e MySQL.

Consideraes finais
Espera-se que este artigo tenha guiado o leitor por durante todo o processo de desenvolvimento de um Website dinmico. As ferramentas mais consolidadas foram apresentadas, bem como uma forma de integrlas em um mesmo projeto. Salienta-se ao leitor que a formatao, as tcnicas de programao e o modo de escrever o cdigo no presente documento no devem ser considerados como nicas fontes, nem como as mais corretas. Estes quesitos so pessoais e cada programador possuir ou desenvolver a maneira que melhor lhe convier.

Referncias e links sugeridos


[W3C] http://www.w3c.br [PHP Manual] http://www.php.net

Exemplar do assinante: 011700 - Flvio Marcos de Moraes <flavio2m@gmail.com>

PHP Magazine - 6a Edio - 31