Baixe o app para aproveitar ainda mais
Prévia do material em texto
EDUCAÇÃO A DISTÂNCIA PONTA GROSSA / PARANÁ 2019 LICENCIATURA EM André Caruso DESENVOLVIMENTO DE APLICAÇÕES PARA WEB ComputaçãoComputação UEPG UNIVERSIDADE ESTADUAL DE PONTA GROSSA Núcleo de Tecnologia e Educação Aberta e a Distância - NUTEAD Av. Gal. Carlos Cavalcanti, 4748 - CEP 84030-900 - Ponta Grossa - PR Tel.: (42) 3220-3163 www.nutead.org 2019 Pró-Reitoria de Assuntos Administrativos Michel Jorge Samaha - Pró-Reitor Pró-Reitoria de Graduação Lígia de Paula Couto - Pró-Reitor Núcleo de Tecnologia e Educação Aberta e a Distância Carlos Willians Jaques Morais - Coordenador Geral Kelly Cristina Ducatti da Silva - Coordenadora Pedagógica Coordenadora de Convênios NUTEAD Assessora Pedagógica NUTEAD Cristiane Aparecida Woytichoski Sistema Universidade Aberta do Brasil Carlos Willians Jaques Morais - Coordenador Geral Kelly Cristina Ducatti da Silva - Coordenadora Adjunta Marcelo Ferrasa - Coordenador de Curso Projeto Gráfico Eloise Guenther Colaboradores de Publicação Denise Galdino - Revisão Eloise Guenther - Diagramação Todos direitos reservados ao Ministério da Educação Sistema Universidade Aberta do Brasil Direitos autorais cedidos pela IF SUL-RIO GRANDENSE para uso na Graduação em Computação UEPG/UAB, disciplina Fundamentos de Programação WEB. CRÉDITOS Universidade Estadual de Ponta Grossa Miguel Sanches Neto Reitor Everson Augusto Krum Vice - Reitor Os materiais produzidos para os cursos ofertados pelo NUTEAD/UEPG para o Sistema Universidade Aberta do Brasil - UAB são licenciados nos termos da Licença Creative Commons - Atribuição - Não Comercial- Compartilhada, podendo a obra ser remixada, adaptada e servir para criação de obras derivadas, desde que com fins não comerciais, que seja atribuído crédito ao autor e que as obras derivadas sejam licenciadas sob a mesma licença. APRESENTAÇÃO INSTITUCIONAL A Universidade Estadual de Ponta Grossa é uma instituição de ensino superior estadual, democrática, pública e gratuita, que tem por missão responder aos desafios contemporâneos, articulando o global com o local, a qualidade científica e tecnológica com a qualidade social e cumprindo, assim, o seu compromisso com a produção e difusão do conhecimento, com a educação dos cidadãos e com o progresso da coletividade. No contexto do ensino superior brasileiro, a UEPG se destaca tanto nas atividades de ensino, como na pesquisa e na extensão. Seus cursos de graduação presenciais primam pela qualidade, como comprovam os resultados do ENADE, exame nacional que avalia o desempenho dos acadêmicos e a situa entre as melhores instituições do país. A trajetória de sucesso, iniciada há mais de 40 anos, permitiu que a UEPG se aventurasse também na educação a distância, modalidade implantada na instituição no ano de 2000 e que, crescendo rapidamente, vem conquistando uma posição de destaque no cenário nacional. Atualmente, a UEPG é parceira do MEC/CAPES/FNDE na execução dos programas de Pró-Licenciatura e do Sistema Universidade Aberta do Brasil e atua em 40 polos de apoio presencial, ofertando, diversos cursos de graduação, extensão e pós-graduação a distância nos estados do Paraná, Santa Cantarina e São Paulo. Desse modo, a UEPG se coloca numa posição de vanguarda, assumindo uma proposta educacional democratizante e qualitativamente diferenciada e se afirmando definitivamente no domínio e disseminação das tecnologias da informação e da comunicação. Os nossos cursos e programas a distância apresentam a mesma carga horária e o mesmo currículo dos cursos presenciais, mas se utilizam de metodologias, mídias e materiais próprios da EaD que, além de serem mais flexíveis e facilitarem o aprendizado, permitem constante interação entre alunos, tutores, professores e coordenação. Esperamos que você aproveite todos os recursos que oferecemos para promover a sua aprendizagem e que tenha muito sucesso no curso que está realizando. A Coordenação INSTITUTO FEDERAL SUL-RIO-GRANDENSE UNIVERSIDADE ABERTA DO BRASIL MÓDULO 3 André Caruso DESENVOLVIMENTO DE APLICAÇÕES PARA WEB Ministério da Educação CURSO DE TECNOLOGIA EM SISTEMAS PARA INTERNET Modalidade a Distância UNIVERSIDADE ABERTA DO BRASIL INSTITUTO FEDERAL SUL-RIO-GRANDENSE - CAMPUS PELOTAS CURSO DE TECNOLOGIA EM SISTEMAS PARA INTERNET Modalidade a Distância PRESIDÊNCIA DA REPÚBLICA Dilma Rousseff PRESIDENTE DA REPÚBLICA FEDERATIVA DO BRASIL MINISTÉRIO DA EDUCAÇÃO Fernando Haddad MINISTRO DO ESTADO DA EDUCAÇÃO Luiz Cláudio Costa SECRETÁRIO DE EDUCAÇÃO SUPERIOR - SESU Eliezer Moreira Pacheco SECRETÁRIO DA EDUCAÇÃO PROFISSIONAL E TECNOLÓGICA Luís Fernando Massonetto SECRETÁRIO DA EDUCAÇÃO A DISTÂNCIA – SEED Jorge Almeida Guimarães PRESIDENTE DA COORDENAÇÃO DE APERFEIÇOAMENTO DE PESSOAL DE NÍVEL SUPERIOR - CAPES INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA SUL-RIO-GRANDENSE [IFSUL] Antônio Carlos Barum Brod REITOR Daniel Espírito Santo Garcia PRÓ-REITOR DE ADMINISTRAÇÃO E DE PLANEJAMENTO Janete Otte PRÓ-REITORA DE DESENVOLVIMENTO INSTITUCIONAL Odeli Zanchet PRÓ-REITOR DE ENSINO Lúcio Almeida Hecktheuer PRÓ-REITOR DE PESQUISA, INOVAÇÃO E PÓS-GRADUAÇÃO Renato Louzada Meireles PRÓ-REITOR DE EXTENSÃO IF SUL-RIO-GRANDENSE CAMPUS PELOTAS José Carlos Pereira Nogueira DIRETOR-GERAL DO CAMPUS PELOTAS Clóris Maria Freire Dorow DIRETORA DE ENSINO João Róger de Souza Sastre DIRETOR DE ADMINISTRAÇÃO E PLANEJAMENTO Rafael Blank Leitzke DIRETOR DE PESQUISA E EXTENSÃO Roger Luiz Albernaz de Araújo CHEFE DO DEPARTAMENTO DE ENSINO SUPERIOR IF SUL-RIO-GRANDENSE DEPARTAMENTO DE EDUCAÇÃO A DISTÂNCIA Luis Otoni Meireles Ribeiro CHEFE DO DEPARTAMENTO DE EDUCAÇÃO A DISTÂNCIA Daniel Grill Lacerda COORDENADOR DA UNIVERSIDADE ABERTA DO BRASIL – UAB/IFSUL Marla Cristina da Silva Sopeña COORDENADORA ADJUNTA DA UNIVERSIDADE ABERTA DO BRASIL – UAB/IFSUL Cinara Ourique do Nascimento COORDENADORA DA ESCOLA TÉCNICA ABERTA DO BRASIL – E-TEC/IFSUL Ricardo Lemos Sainz COORDENADOR ADJUNTO DA ESCOLA TÉCNICA ABERTA DO BRASIL – E-TEC/IFSUL IF SUL-RIO-GRANDENSE UNIVERSIDADE ABERTA DO BRASIL Daniel Grill Lacerda COORDENADOR DA UNIVERSIDADE ABERTA DO BRASIL – UAB/IFSUL Marla Cristina da Silva Sopeña COORDENADORA ADJUNTA DA UNIVERSIDADE ABERTA DO BRASIL – UAB/ IFSUL Mauro Hallal dos Anjos GESTOR DE PRODUÇÃO DE MATERIAL DIDÁTICO CURSO DE TECNOLOGIA EM SISTEMAS PARA INTERNET Modalidade a Distância Daniel Grill Lacerda COORDENADOR DO CURSO SUPERIOR DE TECNOLOGIA EM SISTEMAS PARA INTERNET – TSIAD Beatriz Helena Zanotta Nunes SUPERVISORA PEDAGÓGICA Suzana Grala Tust REVISORA LINGUÍSTICA Vera Maria Machado Damé COORDENADORA DE TUTORIA DO TSIAD UNIVERSIDADE ABERTA DO BRASIL INSTITUTO FEDERAL SUL-RIO-GRANDENSE - CAMPUS PELOTAS CURSO DE TECNOLOGIA EM SISTEMAS PARA INTERNET Modalidade a Distância EQUIPE DE PRODUÇÃO DE MATERIAL DIDÁTICO – UAB/IFSUL Lisiane Corrêa Gomes Silveira GESTORA DA EQUIPE DE DESIGN Alessandro Cruz Wrague Aline de Almeida Tessmer Andressa Silva Nasiloski Denise Zarnottz Knaback Felipe Rommel Helena Guimarães de Faria Helena Rodrigues dos Santos Igor da Silva Amaral Lucas Quaresma Lopes Luisa Mendes Machado Marco Lucas dos Anjos Morgana Ávila dos Santos Taís Lopes Barbosa Talita Mesquita Barbosa EQUIPE DE DESIGN Catiúcia Klug Schneider GESTORA DE PRODUÇÃO DE VÍDEO Gladimir Pinto da Silva PRODUTOR DE ÁUDIO E VÍDEO Jeferson de Oliveira Oliveira AUXILIAR DE EDIÇÃO DE VÍDEO E PROGRAMADOR EM FLASH João Eliézer Ribeiro Schaun GESTOR DO AMBIENTE VIRTUAL DE APRENDIZAGEM Giovani Portelinha Maia GESTOR DE MANUTENÇÃO E SISTEMA DA INFORMAÇÃO Acauan Merseburger Picanço Anderson Weige Dias Bruna Gonçalves Ribeiro Carlo Camani Schneider Diego Barcellos Rocha Efrain Becker Bartz Francine Neuschrank Gabriel Duarte Mateus Lorenzato Braga Neimar Mendes Lima Paula Cruz Guttier Piter Oliveira Vergara Vinícius Maciel EQUIPE DE PROGRAMAÇÃO PARA WEB 1 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nden se Desenvolvimento de Aplicações para WEB | Unidade A “A orientação a objetos, também conhecida como Programação Orientada a Objetos (POO) ou ainda em inglês Object-Oriented Programming (OOP) é um paradigma de análise, projeto e pro- gramação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos.” “Na programação orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.” Disponível em: http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos 1. Classes e objetos Uma classe nada mais é do que uma espécie de tipo de dados definido pelo usuário. Ela é o molde com o qual faremos novos objetos (instâncias desta classe). A grande diferença entre uma classe e um tipo definido pelo usuário tradicional, é que na POO uma classe além do modelo de dados a serem armazenados, conterá a descrição das funcionalidades que podem ser realizadas pelos objetos da classe. Em outras palavras a classe é um tipo de dados que já vem com algumas funções em- butidas! Imagine agora uma classe chamada calculadora. Ela poderia conter dados sobre os operandos (do tipo Real) e o do resultado (também do tipo Real). Seus métodos (funcionalidades) poderiam ser: Atributos (dados da classe) Métodos (funções da classe) $primeiroOperando $segundoOperando $resultado lerPrimeiroOperando($x); lerSegundoOperando($y); soma(); subtrai(); divide(); multiplica(); pegaResultado(); 2. Criando nossa primeira classe Toda definição de classe começa com a palavra-chave class, seguido por um nome da classe, que pode ser qual- quer nome que não seja uma palavra reservada no PHP, seguido por um par de chaves, que contém a definição dos atributos e métodos da classe. 1 <?php Uma breve introdUção à Programação orientada a objetos AUnidade 2 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 2 class°Calculadora 3 { 4 °°°//...implementação da classe 5 } 6 ?> Normalmente uma classe terá um método especial chamado de construtor que é a função que será executada sempre que um novo objeto desta classe for instanciado. O construtor é usado para inicializar os atributos (vari- áveis internas que conterão os dados do objeto). Em PHP (5.x em diante) o construtor é definido com a seguinte sintaxe: 1 <?php 2 function°__construct() { 3 echo°“Este é o construtor da minha classe!\n”; 4 } 5 ?> Assim, teríamos como primeiro exemplo de código fonte usando POO: 1 <?php 2 class Calculadora 3 { 4 °°°function°__construct()°{ 5 echo°“Este é o construtor da minha classe!\n”; 6 } 7 } 8 ?> E é claro para que possamos ver o funcionamento, precisaremos instanciar a classe (linha 8): 1 <?php 2 class Calculadora 3 { 4 function __construct() { 5 echo “Este é o construtor da minha classe!\n”; 6 } 3 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 7 } 8 $calc = new Calculadora ( ); 9 ?> Arquivo: u1_oop_calculadora1.php O resultado será: 3. mais sobre atributos e métodos de uma classe No exemplo anterior, nossa classe é instanciada em um objeto chamado $calc utilizando a palavra reservada new(), na linha 8. Como você pode notar, nossa classe não nos permite instanciar objetos lá muito úteis, uma vez que tudo que a classe Calculadora() modela é um método construtor que escreve uma mensagem na tela. Para adicionarmos alguma utilidade a nossa classe, precisaremos que ela modele os atributos (dados) e métodos (funções). 1 <?php 2 { 3 public $primeiroOperando; 4 public $segundoOperando; 5 public $resultado; 6 functon __construct( ) { 7 //aqui podem ser feitas inicializações no objeto 8 $this->primeiroOperando =0; 9 $this->segundoOperando =0; 10 4 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 11 } 12 //método que lê o primeiro operando 13 public function lePrimeiroOperando($p){ 14 $this->primeiroOperando = $p; 15 16 } 17 //método que lê o segundo operando 18 public function leSegundoOperando($p){ 19 $this->segundoOperando = $p; 20 21 } 22 //método que realiza soma 23 public function soma( ){ 24 $this->resultado =$this->primeiroOperando + $this->segundoOperando; 25 } 26 //método que pega o resultado 27 public function pegaResultado( ) { 28 return($this->resultado); 29 } 30 }//fim da definição da classe 31 //programa principal 32 $calc = new Calculadora(); 33 $calc->lePrimeiro0perando(2); 34 $calc->leSegundo0perando(3); 35 $calc->soma(); 36 echo ($calc->pegaResultado()); 37 ?> Arquivo: u1_oop_calculadora2.php 5 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A No exemplo acima, da linha 3 à linha 5 adicionamos três atributos: $primeiroOperando• $segundoOperando• $resultado• Na linha 7, note que o construtor apenas inicializa os atributos com zero (isso não é estritamente necessário em PHP): Nas linhas 8 e 9, temos uma novidade: a “pseudo variável” $this, que é uma variável reservada do PHP. No exemplo usamos $this para sinalizar ao PHP que nos referimos aos atributos definidos na classe (linhas 4 a 6). Nossa classe agora implementa quatro métodos: lePrimeiroOperando(), leSegundoOperando(), soma() e pega- Resultado(). 3.1 os métodos lePrimeirooperando() e lesegundooperando() Esses dois métodos apenas copiam o parâmetro que recebem para os respectivos atributos da classe. A vantagem de fazer é o fato de que podemos “blindar” nossa classe para que ela não aceite receber valores que provocariam erro. Veremos isso mais adiante. 3.2 o método soma() Este método pega os valores dos atributos $primeiroOperando e $segundoOperando, soma e guarda o resultado da soma em $resultado. 3.3 o método retornaresultado() Este método retorna valor de $resultado. o programa principal No exemplo, o programa principal é composto apenas pelas linhas: 32: instanciação de um novo objeto do tipo Calculadora;• 33: chamada ao método lePrimeiroOperando, passando o valor 2 como parâmetro;• 34: chamada ao método SegundoOperando, passando o valor 3 como parâmetro;• 35: chamada ao método soma();• 36: imprime na tela o retorno do método retornaResultado().• 4. visibilidade A POO nos dará maior controle sobre o que programamos, pois permite que separemos melhor os dados do escopo interno de cada classe com os dados do programa principal. Para isso podemos usar algumas palavras reservadas de “visibilidade”, que permitem que os atributos e métodos de nossas classes possam ser vistos e executados por outras classes ou não. As palavras reservadas que definem os níveis de visibilidade são: Palavra Define que com o atributo/método: Public pode ser acessado por qualquer classe e pelo programa principal diretamente. 6 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A Protected pode ser acessado apenas de dentro da classe e por suas herdeiras (o conceito de herança será abordado mais profundamente em disciplina subsequente deste curso). Private pode ser pode ser acessado apenas de dentro da classe. Vamos alterar o exemplo anterior para testar os modificadores de visibilidade: 31 //programa principal 32 $calc = new Calculadora(); 33 $calc->lePrimeiroOperando(2);34 $calc->leSegundoOperando (3); 35 $calc->soma(); 36 echo ($calc->primeiroOperando); 37 echo (“<br/>”); 38 echo ($calc->segundoOperando); 39 echo (“<br/>”); 40 echo ($calc->resultado); 41 ?> Aqui apenas adicionamos modificamos a linha 36 e adicionamos as demais até a 41. O resultado da execução será: Isso mostra que $primeiroOperando, $segundoOperando e $resultado apesar de serem atributos da classe Cal- culadora, são acessíveis de fora da classe no programa principal, pois foram definidos com o modificador public (linhas 4 a 6). Agora iremos alterar o código, mudando o modificador public de $primeiroOperando para private. 7 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A O resultado será: Note que agora $primeiroOperando não pode ser acessado pelo programa principal diretamente, pois foi defi- nido como private (privativo da classe), resultando dessa forma em um erro. O programa fonte alterado com estas modificações está no arquivo: u1_oop_calculadora4.php . 5. resumo rápido sobre ooP Na OOP, lidamos com classes e objetos. Classes são tipos de dados compostos que contêm os moldes para definirmos • um objeto; Um objeto nada mais que uma espécie de “super variável” capaz de conter outras variáveis (atributos) e também • funções (métodos); Um objeto é criado (instanciado) a partir de uma classe com a palavra reservada new();• Uma classe define atributos (variáveis/dados) e métodos (funções) de um objeto;• Para definirmos uma nova classe usamos a palavra reservada class;• Normalmente uma classe deve ter um método especial que é chamado construtor e que será automaticamente execu-• tado no momento em que criamos (instanciamos) um novo objeto dessa classe; Para definirmos o construtor de uma classe, devemos usar o identificador reservado __construct()• Para referenciarmos os atributos de nosso objeto, podemos usar o identificador reservado $this, seguido do sinal -> ;• Os modificadores de visibilidade são: public, protected e private;• Devemos evitar o uso de public sempre que possível, restringindo o acesso a atributos e métodos apenas às classes • que realmente devem enxergá-los. 6. exercícios Implemente o método multiplica();1. Implemente o método subtrai();2. Implemente o método divide(). Cuide para que em caso do $segundoOperando ser igual a Zero, o método retorne o 3. valor 1. Caso contrário, o método deve retornar 0. 8 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A Nesta sessão, vamos conhecer um pouco mais a respeito das novas tendências no que diz respeito à evolução da interatividade que faz as páginas web comportarem-se de forma mais parecida com os aplicativos desktop (para Windows por exemplo). 1. Web 2.0 “Web 2.0 é um termo criado em 2004 pela empresa estadunidense O’Reilly Media[1] para desig- nar uma segunda geração de comunidades e serviços baseados na plataforma Web, como wikis, aplicações baseadas em folksonomia e redes sociais. Embora o termo tenha uma conotação de uma nova versão para a Web, ele não se refere à atualização nas suas especificações técnicas, mas a uma mudança na forma como ela é encarada por usuários e desenvolvedores. A Web 2.0 propõe uma experiência de uso semelhante à de aplicativos para desktop, frequente- mente fazendo uso de uma combinação de tecnologias surgidas no final da década de 1990, que incluem Web services APIs (1998), AJAX (1998), Web syndication (1997), entre outras. Estas tec- nologias aumentaram a velocidade e a facilidade de uso de aplicativos Web, sendo responsáveis por um aumento significativo no conteúdo (colaborativo ou meramente expositivo) existente na Internet.” Disponível em: http://pt.wikipedia.org/wiki/Web_2.0. Acesso em: 21 abr. 2009 1.1 Programando “a La” Web 2.0 Em termos de interface e de experiência do usuário, os aplicativos Web 2.0 devem ter interface e tempo de resposta que deem ao usuário a impressão de que está usando um aplicativo desktop tradicional (um editor de textos online deveria comportar-se de forma similar ao Word, por exemplo). O nome Web 2.0 refere-se à filosofia de implementação e uso dos web sites, e não à uma nova tecnologia pro- priamente dita, tendo sido usadas soluções baseadas nas tecnologias já existentes para a melhoria da interface dos aplicativos. Dentre essas soluções, destacamos o AJAX (Asynchronous Javascript And XML) que é uma me- todologia de trabalho (e não uma nova linguagem para computadores) que se baseia em Javascript, CSS e XML para criar um conjunto de ferramentas que permitem que a experiência do usuário em um aplicativo web seja muito parecida com o uso de um aplicativo desktop tradicional. 1.2 o objeto XmLHttprequest “XMLHttpRequest é um objeto Javascript que torna possível a comunicação assíncrona com o ser- vidor, sem a necessidade de recarregar a página por completo.” Disponível em: http://pt.wikipedia.org/wiki/XMLHttpRequest. Acesso em 21 abr. 2009 Através do objeto Javascript XMLHttpRequest é possível enviarmos dados por GET ou POST para o servidor Web e receber uma resposta a ser exibida na página web sem que esta precise ser recarregada no navegador. A Web 2.0 Unidade 9 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 1.3 Um pouco mais sobre ajaX O termo AJAX foi criado por GARRETT (2005) para abreviar “Asynchronous JavaScript + XML” . Segundo REIS (2005), comparando as aplicações Desktop com as aplicações Web, constata-se que as Desktop dão ao utilizador uma maior riqueza de utilização e melhores tempos de resposta que as aplicações Web tradi- cionais. A mesma simplicidade que fez proliferar as páginas Web criou um abismo entre a experiência de utilização que se consegue oferecer numa aplicação Desktop e uma página Web standard. No entanto essa distância está cada vez mais curta com a chegada de novas tecnologias e novas técnicas, entre elas o AJAX. Segundo GARRET (2005): ‘O AJAX não é uma tecnologia. São na realidade várias tecnologias, cada uma pro- gredindo de forma independente, e que se juntaram de forma a poder explorar formas de melhorar a interação com os utilizadores em aplicações Web.” Assim podemos dizer que AJAX é apenas um estilo de design de aplicações, que junta todas as características dos Web Browsers atuais de forma a produzir aplicações que se assemelham menos a Web e mais a Desktop. O AJAX utiliza as seguintes tecnologias: Apresentação baseada em padrões, utilizando XHTML e CSS;1. Interação e apresentação dinâmica utilizando o Documento Object Model (DOM);2. Formato padrão para troca e manipulação de dados – XML;3. Comunicação assíncrona com o servidor utilizando XMLHttpRequest;4. Utiliza Javascript que interliga todas estas tecnologias.5. 1.4 modelo clássico de aplicações Web X aplicações com ajaX Observe que enquanto no site www.gmail.com o usuário navega, cria emails, anexa arquivos não há recarga total da página. Já no site g1.globo.com cada notícia que for aberta provocará a recarga de todo o portal (menus, links etc). 1.5 Usando o Framework XajaX Uma maneira fácil de adentrarmos o mundo do Ajax é utilizarmos o Framework XAJAX que facilitará muito nossa primeira jornada nos domínios da Web 2.0. Vale lembrar que este framework é open source e pode ser usado e modificado livremente, desde que observa- dos os termos de sua licença GPL. 10 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 1.5.1 Obtendo o e instalando o XAJAX O XAJAX pode ser baixado no site do projeto:http://xajaxproject.org/en/download/ Observe que existem três versões disponíveis: compiled, minimal e standard. Para efeito de estudo, iremos utilizar a versão standard que contém exemplos de uso além das bibliotecas padrão do XAJAX. Veja a Figura 2. O arquivo compactado em formato ZIP tem apenas 236Kb e deve ser descompactado em uma pasta dentro do nosso projeto de trabalho desta forma: No caso da Figura 2, pasta xajax foi criada no caminho: C:\apache2triad\htdocs\web2\xajax , em que a pasta web2 será a raiz de nosso projeto. 1.5.2 Um primeiro exemplo em XAJAX Para começarmos, vamos criar um arquivo de teste chamado exemplo01.php (na pasta raiz do projeto). Para fins de organização de nosso projeto, também na pasta raiz, criaremos um arquivo chamado funções.php que conterá as funções que utilizaremos em nosso teste. 11 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A Veja Figura 3. Nosso projeto ficará da seguinte forma: 1.5.2.1 O arquivo exemplo01.php 1 <?php 2 //bibliotecas XAJAX 3 require “./xajax/xajax_core/xajax.inc.php”; 4 //funcoes definidas pelo usuário 5 require “funcoes.php”; 6 ?> 7 <head> 8 <meta http-eguiv=”Content-Type” content=”text/html; charset=UTF-8” /> 9 <titlex/title> 10 <?php 11 //gera os javascripts necessários para o funcionamento do XÃJÃX 12 //printJavascript recebe como parâmetro o caminho da bliblioteca XA- JAX 13 $ajax->printJavascript(‘./xajax/’); 14 ?> 15 </head> 16 <body> 17 <form method=”post” action=””> 18 <table cellspacing=”0” cellpadding=”4”> 12 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 19 <thead> 20 </thead> 21 <tbody> 22 <tr> 23 <td colspan=”2”><label id=”lbmensagem”></labelx></td> 24 </tr> 25 <tr> 26 <td>nome</td> 27 <td> 28 <input name=”nome” type=”text” id=”nome” size=”50” maxlength=”100” onBlur=”xajax_valida(this.value) ;”></td> 29 </tr> 30 <tr> 31 <td>fone</td> 32 <td> 33 <input name=”fone” type=”text” id=”fone” size=”20” maxlength=”100”></ td> 34 </tr> 35 <tr> 36 <tdvalign=”top”> </td> 37 <td><input type=”submit” name=”btenviar” id=”btenviar” value=”Enviar”></ td> 38 </tr> 39 </tbody> 40 </table> 41 </form> 42 </body> 13 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A Vamos analisar as linhas mais importantes do nosso programa exemplo01.php: Linha Fonte O que faz? 3 require “./xajax/xajax_core/ xajax.inc.php”; Requer a inclusão o arquivo fonte xajax.inc.php (que contém as bibliotecas necessárias para utilizarmos o XAJAX 5 require “funcoes.php”; Requer a inclusão o arquivo fonte funcoes.php (que contém as funções definadas pelo usuário) 8 <meta http-equiv=”Content- Type” content=”text/html; charset=UTF-8” /> Define que a codificação a ser utilizada na página será UTF-8. Veremos mais sobre isso posteriormente. 13 $ajax->printJavascript(‘./xajax/’); Cria os scripts necessários para que o XAJAX funcione. Para esta linha funcionar a inclusão da linha 3 obrigatoriamente tem de ter sido feita antes. 23 <td colspan=”2”><label id=”lbmensagem”></label></td> Aqui definimos uma marcação HTML <label> que nada mais é do que um lugar onde colocaremos o texto da mensagem de erro/ sucesso. 28 <input name=”nome” type=”text” id=”nome” size=”50” maxlength=”100” onBlur=”xajax_ valida(this.value);”></td> Caixa de texto onde deverá ser digitado o nome. Note que foi configurado o envento Javascript “onBlur”, ou seja, quando o usuário sair do campo será disparada a chamada à função xajax_valida(), passando como parâmetro o valor do próprio campo nome (this.value). 1.5.2.2 Arquivo funcoes.php 1 <?php 2 $ajax = new xajax(); 3 4 // Registra as funções no javascript 5 $ajax->registerFunction(“valida”); 6 7 //FUNÇÕES JAVASCRIPT REGISTRADAS PELO XAJAX 8 function valida($valor}{ 14 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 9 $res=””; 10 $valor = trim($valor); 11 12 $objResponse = new xajaxResponse(‘UTF-8’); 13 14 if (strlen($valor) <3) { 15 $res = “Por favor, preencha o campo Nome.”; 16 } 17 else { 18 $res = “nome OK”; 19 } 20 21 $res = utf8_encoder($res); 22 $objResponse->assign(‘lbmensagem’, ‘innerHTHL’, $res); 23 24 25 // Atribui a variável $res ao label resultado 26 27 28 // Retorna a resposta de XML gerada pelo 29 // objeto do xajaxResponse 30 return $objResponse; 31 } 32 33 // Manda o ajax processar os pedidos acima 34 $ajax->processReguest(); 35 ?> 15 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A Vamos analisar as linhas mais importantes do nosso programa funcoes.php: Linha Fonte O que faz? 2 $ajax = new xajax(); Cria o objeto XAJAX que será usado na linha 13 do programa exemplo01.php (vide tabela anterior) 5 $ajax->registerFunction(“valida”); Registra (para que possa ser usada) a função valida(), definida na linha 8 deste mesmo programa. 8 function valida($valor){ Início da definição da função valida(). Esta função será chamada via Javascript na linha 28 do programa anterior. 12 $objResponse = new xajaxResponse(‘UTF-8’); Cria um objeto de resposta XAJAX. Na prática toda função XAJAX deve criar um. Não vamos nos preocupar muito com detalhes agora. De 14 a 19 if (strlen($valor) <3) { $res = “Por favor, preencha o campo Nome.”; } else { $res = “nome OK”; } Lógica da função. Se o comprimento (strlen) de $valor (que é o parâmetro de entrada da função) for menor do que 3, a variável $res recebe a mensagem “Por favor, preencha o campo Nome.”. Caso contrário a variável $res = “nome OK”; 21 $res = utf8_encode($res); Como a variável $res pode conter caracteres especiais (acentos) devemos codificá-la com utf8_ encode(), a fim de evitarmos dores de cabeça com a acentuação mais tarde. 22 $objResponse- >assign(‘lbmensagem’, ‘innerHTML’, $res); Esta linha coloca no label de ID=”lbmensagem” (linha 23 do programa anterior) o conteúdo de $res. Na prática é esta linha que fará com que a mensagem de erro/sucesso apareça na tela! 31 } Fim da função valida() 34 $ajax->processRequest(); Realiza o processamento Ajax. 16 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A Agora que conhecemos os princípios básicos do uso do método de programação AJAX, através do Framework XAJAX, vamos utilizar o método xajax.getFormValues() para processarmos um formulário de maneira assíncrona, isto é, sem recarregar a página. 1. o arquivo exemplo02.php 1 <?php 2 //bibliotecas XAJAX 3 require “./xajax/xaiax_core/xajax.inc.php”; 4 //funções definidas peio usuário 5 require “funcoes2.php”; 6 7 ?> 8 <head> 9 <meta http-eguiv=”Content-Type” content=”text/html; charset=UTF-8” /> 10 <titlex/title> 11 <?php 12 //gera os javascripts necessários para o funcionamento do XAJAX 13 //printJavascript recebe como parâmetro o caminho da bliblioteca XA- JAX 14 $ajax->printJavascript(‘ ./xajax/’); 15 ?> 16 </head> 17 <body> 18 <form id=”forml”> 19 <table cellspacing=”0” cellpadding=”4”> UnidadeA ProCessando FormULÁrios Unidade 17 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações paraWEB | Unidade A 20 <thead> 21 </thead> 22 <tbody> 23 <tr> 24 <td>Valor 1 </td> 25 <td> 26 <input name=”vl”type=”text” id=”vl” size=”2” maxlength=”3”></td> 27 </tr> 28 <tr> 29 <td>Valor 2</td> 30 <td> 31 <input name=”v2” type=”text” id=”v2” size=”2” maxlength=”3”> </td> 32 </tr> 33 <tr> 34 <td colsplan=”2” >Resultado: <label id=”lbresultado”</label></td> 35 </tr> 36 <tr> 37 <td valign=”top” </td> 38 <td><input typ e=”button” name=”btsoma” id=”btsoma” value=”Somar” onC1ick=”xajax_processaForm(xajax.ge tFormValues(‘fo rml’));”></td> 39 </tr> 40 </tbody> 41 </table> 42 </form> 43 </body> 18 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 1.1 vamos analisar as linhas mais importantes do nosso programa exem- plo02.php: linha Fonte O que faz? 3 require “./xajax/xajax_core/xajax.inc. php”; Requer a inclusão o arquivo fonte xajax.inc. php (que contém as bibliotecas necessárias para utilizarmos o XAJAX 5 require “funcoes2.php”; Requer a inclusão o arquivo fonte funcoes2. php (que contém as funções definadas pelo usuário) 9 <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8” /> Define que a codificação a ser utilizada na página será UTF-8. Veremos mais sobre isso posteriormente. 14 $ajax->printJavascript(‘./xajax/’); Cria os scripts necessários para que o XAJAX funcione. Para esta linha funcionar a inclusão da linha 3 obrigatoriamente tem de ter sido feita antes. 34 <td colspan=”2”>Resultado: <label id=”lbresultado”></label></td> Aqui definimos uma marcação HTML <label> onde colocaremos o valor do resultado (soma). 38 <input type=”button” name=”btsoma” id=”btsoma” value=”Somar” onClick=”xajax_processaForm(xajax. getFormValues(‘form1’));”> Este é o botão (do tipo Button, não submit) que fará a submissão assíncrona do formulário. 2. o arquivo funcoes2.php 1 <?php 2 $ajax = new xajax(); 3 // Registra as funções no javascript 4 $ajax->registerFunction(“processaForm”); 5 //FUNÇÕES JAVASCRIPT REGISTRADAS PELO XAJAX 6 function processaForm($vetForm){ 7 //aqui pegamos os valores que vem em $vetForm 8 //que é um vetor associativo contendo os 9 $valorl = $vetForm[‘v1’]; 10 $valor2 = $vetForm[‘v2’]; 11 $res=$valorl + $valor2; 12 $objResponse = new xajaxResponse(‘UTF-8’); 13 $res = utf8_encode($res) 19 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade A 14 $objResponse->assign(‘lbresultado’, ‘innerHTML’, $res); 15 // Retorna a resposta de XML gerada pelo 16 // objeto do xajaxResponse 17 return $objResponse; 18 } 19 // Manda o ajax processar os pedidos acima 20 $ajax->processRequest(); 21 ?> O código fonte dos arquivos anteriores pode ser encontrado no arquivo unidade1_web2_parte2.zip 1 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B Caro(a) aluno(a), qualquer página web que se preze precisará ter um mínimo de interatividade com o usuário/ internauta. Por exemplo: Guardar email e dados do usuário para enviar um newsletter;• Reconhecer e saudar o internauta quando ele volta a visitar nosso site;• Coletar dados de acesso para estatísticas de gerenciamento do site;• Permitir cadastro de seções e notícias (em caso de um portal) por um gerente de conteúdo (através de um sistema de • gerenciamento com senha). Todos os serviços exemplificados acima (e provavelmente todos os outros que você puder imaginar) dependerão de uma grande quantidade de dados que devem ser armazenados e resgatados de forma fácil e rápida pelo sis- tema do site. Para isso precisaremos de um banco de dados. 1 Manipulando o BD via funções (PHP até versão 4.x) versus Conexão via PDO (PHP 5+) 1.1 Visão geral O PHP é uma linguagem que trabalha com o conceito de conexões de dados, ou seja, de posse de um endereço de servidor de dados, nome de usuário, senha e porta de conexão (opcional) um programa PHP pode requisitar uma conexão com o Banco de Dados. Através dessa conexão, poderemos realizar uma série de operações como inserir, consultar e apagar registros de uma ou mais tabelas. Com uma conexão desse tipo os arquivos (.php) de nosso website não precisam estar obrigatoriamente no mesmo servidor que o banco de dados. Na verdade esse servidor pode estar instalado na mesma ou em outra máquina, esteja ela em outra sala, em outra cidade e por que não em outro país? Essa é a beleza da arquitetura cliente-servidor. Para que isso funcione corretamente será necessário que o banco de dados esteja com suas permissões de aces- so configuradas corretamente e que tenhamos o endereço do servidor de dados, nome de usuário e senha de conexão (obviamente também será necessária uma conexão de rede razoavelmente rápida). B ACESSO AO BD VIA FUNÇÕES PADRÃO UNIDADE 2 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B A maneira tradicional para manipulação de um banco de dados via PHP é o uso do conjunto de funções nativas do PHP para acesso a bancos de dados. Nas versões do PHP até a 5.x essa era a única maneira nativa para aces- sarmos o banco de dados. Seu funcionamento consiste em criarmos uma variável de conexão (que é que uma espécie de ponteiro que aponta para o banco) através de uma função específica para tal fim. Note que, nos exemplos a seguir, usaremos a tabela clientes (vista em LPW), cujo script de criação está no arqui- vo: clientes_script.sql. 3 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B O PHP nos oferece várias formas de acessarmos um banco de dados. Vamos primeiramente estudar a forma mais simples e também mais difundida, que é a utilização das funções nativas, ou padrão, desta linguagem. Essas funções são bastante intuitivas e permitem que acessemos a maioria dos bancos de dados mais comuns como MySQL e PostgreSQL. 1. Fazendo consultas ao banco com as funções pa- drão de acesso a dados do PHP 1.1 Conectando com um banco de dados PostgreSQL: <?php // fonte em : u2_funcoes_conectando.php $conexao = pg_connect(‘host=localhost dbname=bdexemplo user=root password=zxcvbnm,.’ ) or die (“Não foi possível conectar ao Banco de da- dos.”); ?> No exemplo acima, a função pg_connect do PHP irá criar a variável $conexao que será um ponteiro para o banco de dados com o nome de bdexemplo, localizado em localhost, identificando o usuário como root e com a senha zxcvbnm,.. Caso algo saia errado, a função die() será acionada, encerrando o programa e mostrando a mensa- gem “Não foi possível conectar ao Banco de dados.” 1.2 Retornando uma tupla Agora que já sabemos como criar uma conexão com o banco de dados, vamos realizar uma consulta simples (observe com atenção os comentários no código): <?php // fonte em : u2_funcoes_consultando01.php //conecta ao banco $conexao = pg_connect(‘host=localhost dbname=bdexemplo user=root password=zxcvbnm,.’ ) or die (“Não foi possível conectar ao Banco de da- dos.”); B CONECtANDO, CONSULtANDO, INSERINDO, ALtERANDO, ExCLUINDO UNIDADE 4 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B //executa uma consulta no banco $resultado = pg_query($conexao,’SELECT * FROM clientes’); //guarda em $dados (que será um vetor associativo) a primeira tupla retor- nada $dados = pg_fetch_assoc($resultado); //print_r é função útil para testes que permite imprimir o vetortodo de uma vez! print_r($dados); ?> A saída na tela é dada pela função print_r e será: 5 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B 1.3 Retornando todas as tuplas Também é possível guardar na variável $dados todas as tuplas retornadas pela consulta. Para isso usamos a fun- ção pg_fetch_all() no lugar de pg_fetch_assoc(). Assim, no código do exemplo anterior, trocamos: $dados = pg_fetch_assoc($resultado); Por: $dados = pg_fetch_all($resultado); A saída na tela dada pela função print_r($dados) será: Veja o código completo no arquivo: u2_funcoes_consultando02.php No exemplo acima, $dados é um vetor de vetores, ou seja, cada elemento seu é um outro vetor (associativo) que representa uma tupla (ou registro). Os índices de cada vetor associativo correspondem aos campos no banco de dados e o seu conteúdo corresponde ao dado gravado no campo correspondente. 1.4 Fazendo inserções no banco com as funções padrão do PHP para acesso a dados. <?php // fonte em : u2_funcoes_inserindo01.php //aqui criamos as variáveis que representam os campos a serem gravados //obviamente em condições normais (este é apenas um teste), estas variáveis viriam de um //formulário por $_GET ou $_POST ! $codigo = “103”; 6 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B $nome = “Maria da Silva”; $cep = “99999-999”; //conecta ao banco $conexao = pg_connect(‘host=localhost dbname=bdexemplo user=root password=zxcvbnm,.’ ) or die (“Não foi possível conectar ao Banco de da- dos.”); //executa uma consulta de inserção no banco pg_query($conexao,”INSERT INTO clientes (codigo,nome,cep) VALUES ($codigo,’$nome’,’$cep’)”) or die (“Erro inserindo dados”); //guarda em $erro a mensagem de erro (se houver), caso contrario $erro re- ceberá false $erro = pg_last_error(); if ($erro != false) echo $erro; else echo “Registro incluído com sucesso!”; ?> Atenção Se você executar o exemplo acima mais de uma vez será apresentada a mensagem: ERROR: duplicate key violates unique constraint “PRIMARYKEY” Isso ocorrerá devido ao campo código ser chave primária, ou seja, só pode haver uma tupla com código=103. 1.5 Fazendo exclusões no banco com as funções padrão do PHP para acesso a dados. <?php //fonte em: u2_funcoes_excluindo01.php include “inicializacoes.php”; //arquivo de configuração geral //aqui definimos a variável do código a ser deletado 7 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B //obviamente em condições normais, esta variável viria de um formulário por $_GET ou $_POST ! $codigo = “103”; //conecta ao banco $conexao = pg_connect(‘host=localhost dbname=bdexemplo user=root password=zxcvbnm,.’ ) or die (“Não foi possível conectar ao Banco de da- dos.”); //executa uma consulta de exclusão no banco //primeiramente vamos verificar se o código informado existe $resultado = pg_query($conexao,”SELECT * FROM clientes where codigo=’$codigo’”); //agora testamos quantas tuplas foram retornadas //pela função pg_num_rows (se o valor for zero é porque o código não exis- te!) $numero = pg_num_rows($resultado); if ($numero != 0){ pg_query($conexao,”DELETE FROM clientes where codigo=’$codigo’”); echo “Registro excluído com sucesso!”; } else { echo “o código $codigo não existe!”; > 1.6 Referência rápida das funções utilizadas. Função (parâmetros) Para que serve Exemplo pg_connect(‘string de con- exão’); Retorna para uma variável um ponteiro para o banco de dados definido em ‘string de conexao’. $conexao = pg_ connect(‘host=localhost dbname=bdexemplo user=root password=zxcvbnm,.’); 8 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B pg_query($conexao,’QUERY SQL’); Realiza a consulta definida em ‘QUERY SQL’ no banco de dados e retorna para uma variável o resultado da consulta. $resultado = pg_ query($conexao,’SELECT * FROM clientes’); pg_fetch_assoc($var_resul- tado); Retorna a 1ª tupla da variável de resultado como um vetor associativo. $dados = pg_fetch_ assoc($resultado); pg_fetch_all($var_resul- tado); Retorna todas as tuplas da variável de resultado como um vetor de vetores associativos (onde cada um deles é uma tupla). $dados = pg_fetch_all($resultado); pg_last_error(); Retorna a última mensagem de erro gerada pelo banco de dados PostgreSQL. Se não houve erro retorna FALSE. $erro = pg_last_error(); pg_num_rows($var_resul- tado); Retorna o número de tuplas contidas na variável de resultado. Se a consulta não encontrou nenhuma tupla, pg_num_rows retornará 0 (ZERO). $numero = pg_num_ rows($resultado); 9 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B 2. Atividades Usando as funções padrão de acesso a dados do PHP, crie o programa que:1. Insira um registro da tabela Clientes (ver LPW). a) Altere um registro da tabela Clientes (ver LPW). b) Exclua um registro da tabela Clientes (ver LPW). c) 3. A classe PDO para acesso a bancos de dados As funções tradicionais de bancos de dados do PHP trazem uma série de problemas e inconvenientes: Cada banco de dados (PostgreSQL, MySQL etc.) tem um conjunto diferente de funções e parâmetros, o que d) obrigará o pobre programador a reescrever todo código de acesso ao banco de dados se, por alguma razão, for necessário trocar a tecnologia do banco; A versão 6 do PHP que substituirá a versão 5, não terá suporte nativo às funções de acesso a dados tradicionais e) por default, o que amarrará o seu programa (e o cliente que pagou por ele) indefinidamente a uma versão da linguagem que fatalmente se tornará obsoleta e mais cedo ou mais tarde você terá que reescrever todo código de acesso ao banco de dados; Enquanto com as funções tradicionais você precisa se preocupar em tratar aspas na hora de inserir dados em f) uma tabela a fim de prevenir ataques por SQL injection1 , a classe PDO do PHP 5 e 6 fará isso por você; O desempenho das funções de acesso ao banco de dados nativas das versões 3, 4 e 5 do PHP é em geral pior g) do que a alternativa a elas (que veremos a seguir). PDO (PHP Data Objects) é uma classe 2 que padroniza todas as funções de acesso a banco de dados para todos os bancos de dados (PostgreSQL, MySQL, Firebird....) Quando você instancia (cria) um objeto PDO, você deve informar além do servidor (host), usuário e senha, qual banco de dados será acessado, dizendo o nome do driver que o PDO deverá utilizar. Na prática, você diz para o PDO qual banco deverá ser acessado. O PDO vai “se virar” para fazer as conexões e operações necessárias e particulares a cada banco, escondendo a complexidade do programador e deixando que ele precise se preocupar apenas com a lógica do seu programa. 3.1 Configurando a classe PDO no Apache Triad O Apache Triad não vem “de fábrica” com o acesso PDO ao PostgreSQL habilitado. Felizmente é simples ativar estes módulos através do Painel de Controle do Apache Triad (Apache2TriadCP). 3.2.Conectando a um banco de dados via PDO <? $banco = new PDO(‘pgsql:host=localhost;dbname=nome_do_banco’, ‘username’,’password’); ?> No exemplo acima (para facilitar seu entendimento, observe a correspondência de cores) a variável $banco é 1 Técnica usada por hackers para invasão de websites. Veja mais em: http://imasters.uol.com.br/artigo/5179/sql_injec- tion_no_php_o_que_e_e_como_se_proteger 2 Classe é um conceito de programação Orientada a Objetos. Ver unidade A. 10 S is te m a U ni ve rs id ad eA be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B um objeto do tipo PDO e irá acessar o banco de dados nome_do_banco que é do tipo pgsql (PostgreSQL) e está localizado no servidor localhost, usando o usuário username e a senha password. E se você precisar criar uma conexão com um banco de dados MySql1? Nada mais simples : <? $banco = new PDO(‘mysql:host=localhost;dbname=nome_do_banco’, ‘username’,’password’); ?> Note que a única mudança foi o nome do driver (mysql ao invés de pgsql) que especifica qual banco será aces- sado! 3.3 Fazendo consultas ao banco via PDO 3.3.1 Retornando uma tupla Agora que já sabemos como criar uma conexão PDO a um banco de dados, vamos realizar uma consulta simples (observe com atenção os comentários no código): 1 <pre> 2 <?php 3 //conecta ao banco 4 $banco = new PD0(‘pgsql:host=localhost;dbname=bdexemplo’, ‘root’,’zxcvbnm,.’); 5 6 //executa uma consulta no banco 7 //como PDO é orientado a objetos, quando queremos chamar um método (função) devemos usar a “seta” (->). 8 $resultado = $banco->query(‘SELECT * FROM clientes’); 9 10 //guarda em $dados (que será um vetor) a primeira tupla retornada 11 $dados = $resultado->fetch(); 12 13 //print_r é uma função muito útil para testes e permite imprimir um vetor todo de uma vez! 1 Nesse caso será necessário ter o driver PDO – MySQL habilitado previamente, da mesma maneira que você habilitou o driver do Postgres, porém adicionando o texto extension=php_pdo_mysql.dll ao arquivo de configuração do PHP. 11 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B 14 print_r($dados); 15 ?> Arquivo fonte: ub/ub_retornando_tupla.php Note que no exemplo acima o método fetch é usado para retornar a primeira tupla (linha) da variável $resultado para a variável $dados. A saída na tela é dada pela função print_r e será: 3.3.2 Retornando várias tuplas Também é possível guardar na variável (vetor) $dados todos as tuplas retornadas pela consulta. Para isso usamos o método fetchAll() no lugar de fetch(). Assim: $dados = $resultado->fetch(); Será trocado por: $dados = $resultado->fetchAll(); A saída na tela é dada pela função print_r($dados) e será: 12 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B No exemplo acima, $dados é um vetor de vetores. Cada elemento seu é um vetor associativo que representa uma tupla (ou registro). Os índices de cada vetor associativo correspondem aos campos no banco de dados e o seu conteúdo corresponde ao dado gravado no campo correspondente. 3.4 Fazendo uma inserção Uma vez entendido o procedimento de conexão e consulta, visto anteriormente, nada mais fácil que realizar as demais operações no banco de dados. 1 <pre> 2 <?php 3 //conecta ao banco 4 $banco = new PD0(‘pgsql:host=localhost;dbname=bdexemplo’, ‘root’,’zxcvbnm,.’); 5 6 //executa uma consulta no banco 7 //como PDO é orientado a objetos, quando queremos chamar um método (função) devemos usar a “seta” (->). 8 $resultado = $banco->query(“INSERT INTO clientes (codigo,nome,cep) VALUES (105,’Maria da Silva’,’99910-000’)”); 9 10 //em caso de ocorrer um erro $banco->errorInfo() vai retornar um vetor associativo com informações sobre o que ocorreu 11 if (!$resultado) { 12 print_r($banco->errorInfo()); 13 } 14 else { 15 //caso contrário da uma mensagem de sucesso. 16 echo “Registro inserido com sucesso!”; 17 } 18 19 ?> Arquivo fonte: ub/ub_fazendo_insercao.php 13 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B Neste exemplo, se a chave for duplicada o banco não aceitará a inserção. Para podermos ter certeza se tudo saiu como esperávamos, usamos o método ->errorInfo( ) que retorna um vetor associativo com os dados do último erro (se ocorrer erro, $resultado na linha 11 receberá false). Para conferir se a inserção foi feita, podemos executar o programa ub_retornando_todas_tuplas.php novamen- te. 3.5 Alterando Agora digamos que queremos alterar o nome da cliente “Maria da Silva” para “Maria da Silva Santos”. Para isso iremos realizar uma consulta SQL de update no banco. Na prática a única diferença do exemplo da inserção está no SQL em si, na linha 8, o resto do programa é igual ao da inserção! 1 <pre> 2 <?php 3 //conecta ao banco 4 $banco = new PD0(‘pgsql:host=localhost;dbname=bdexemplo’, ‘root’,’zxcvbnm,.’); 5 6 //executa uma consulta no banco 7 //como PDO é orientado a objetos, quando queremos chamar um método (função) devemos usar a “seta” (->). 8 $resultado = $banco->query(“UPDATE clientes SET nome=’Maria da Silva Santos’ where codigo=105”); 9 10 //em caso de ocorrer um erro $banco->errorInfo() vai retornar um vetor associativo com informações sobre o que ocorreu 11 if (!$resultado) { 14 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B 12 print_r($banco->errorInfo()); 13 } 14 else { 15 //caso contrário da uma mensagem de sucesso. 16 echo “Registro alterado com sucesso!”; 17 } 18 19 ?> Arquivo fonte: ub/ub_fazendo_alteracao.php 3.6 Excluindo Para fazermos uma exclusão, deveremos escolher um campo pelo qual iremos procurar uma tupla para deletar. No presente exemplo utilizaremos um “where codigo=”, localizando e excluindo o cliente pelo seu código (chave primária). 1 <pre> 2 <?php 3 //conecta ao banco 4 $banco = new PD0(‘pgsql:host=localhost;dbname=bdexemplo’, ‘root’,’zxcvbnm,.’); 5 6 //executa uma consulta no banco 7 //como PDO é orientado a objetos, quando queremos chamar um método (função) devemos usar a “seta” (->). 8 $resultado = $banco->query(“DELETE from clientes WHERE codigo=100”); 9 10 //$resultado->rowCount retorna quantas tuplas foram afetadas na última consulta 11 if (!$resultado)->rowCount () == 0) { 12 echo “Registro não encontrado!”; 13 } 14 else { 15 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B 15 //caso contrário da uma mensagem de sucesso. 16 echo “Registro deletado com sucesso!”; 17 } 18 19 ?> Arquivo fonte: ub/ub_fazendo_exclusao.php Na linha 8, realizamos nossa consulta como nos exemplos anteriores. Note que $resultado receberá um objeto que, entre outras coisas, contém um método chamado ->rowCount( ) que permite sabermos quantas tuplas foram atingidas pela nossa query (consulta). Como no caso só pode haver 1 registro com o codigo=100, na linha 11 testamos quantas tuplas foram afetadas. Se rowCount() for zero, é sinal de que não conseguimos deletar (provavelmente porque o código não existe). Por outro lado, se o banco conseguir encontrar e deletar o registro, o valor de rowCount( ) será 1, ou seja, um registro foi encontrado e deletado. Nesse caso damos uma mensagem de sucesso (linha 16). 16 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B Uma grande vantagem de utilizar um banco de dados é a possibilidade de se utilizar a integridade referencial. Integridade referencial é a capacidade que o banco de dados tem de impedir que sejam quebradas as relações existentes entre as diversas entidades (tabelas). Por exemplo: se uma determinada venda está associada a um cliente, o banco não devepermitir que ele seja excluído, pois isso deixaria a venda ligada a um código de cliente inexistente, gerando uma inconsistência. Para nós, programadores PHP, integridade referencial facilita muito a codificação de programas, pois podemos deixar que o próprio banco de dados verifique se um dado pode ou não ser excluído, restando-nos apenas veri- ficar se a operação foi ou não bem sucedida e dando uma mensagem para o usuário. Agora observe o script de criação da tabela vendas (arquivo fonte: vendas.sql)1: 1 CREATE TABLE vendas 2 ( 3 codigo serial NOT NULL, 4 data date, 5 cliente integer NOT NULL, 6 CONSTRAINT keycod PRIMARY KEY (codigo), 7 CONSTRAINT keycli FOREIGN KEY (cliente) 8 REFERENCES clientes (codigo) MATCH SIMPLE 9 ON UPDATE NO ACTION ON DELETE NO ACTION 1 A ser rodado via PgAdmin para criação da tabela. B UtILIZANDO INtEGRIDADE REFERENCIAL UNIDADE 17 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B 10 ) 11 WITHOUT OIDS; Veja que linha 7 é criada uma restrição (constraint) do tipo chave estrangeira (FOREIGN KEY), a qual referencia o campo código da tabela clientes. Na prática isso quer dizer que agora clientes relacionados a uma venda não poderão ser deletados sem antes a venda ser deletada. 1 <pre> 2 <?php> 3 //conecta ao banco 4 $banco = new PD0(‘pgsql:host=localhost;dbname=bdexemplo’, ‘root’,’zxcvbnm,.’); 5 6 //executa uma consulta no banco 7 //como PDO é orientado a objetos, quando queremos chamar um método (função) devemos usar a “seta” (->). 8 $resultado = $banco->query(“DELETE from clientes WHERE codigo=100”); 9 10 //em caso de ocorrer um erro $banco->errorInfo() vai retornar um vetor associativo com informações sobre o que ocorreu 11 if (!$resultado) { 12 print_r($banco->errorInfo()); 13 } 14 else { 15 //caso contrário da uma mensagem de sucesso. 16 echo “Registro inserido com sucesso!”; 17 } 18 ?> Arquivo fonte: ub_fazendo_exclusao_integridade.php Mensagem retornada no exemplo acima (caso o cliente de código=100 estiver relacionado a uma venda). 18 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade B Array ( [0] => 23503 [1] => 7 [2] => ERROR: update os delete on “clientes” violates foreign key cons- traint “keycli” on “vendas” DETAIL: Key (codigo)=(100) is still referenced fron table “vendas”. Atividades 1. Usando PDO, crie o programa que: 1.1 inclua um registro na tabela Clientes (ver LPW). 1.2 altere um registro da tabela Clientes (ver LPW). 1.3 exclua um registro da tabela Clientes (ver LPW). 1 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C Até o presente momento, sempre que desejávamos passar valores de uma página para outra, precisávamos utilizar os métodos GET ou POST. Nesta unidade, veremos uma forma de criar variáveis que são mantidas na memória do navegador, mesmo que o usuário navegue para outra página através de um link ou mesmo submeta um formulário. O que são sessões e para que elas servem? Uma sessão é um vetor associativo1 especial que não perde seu conteúdo mesmo que o usuário navegue para outra(s) página(s). Esse vetor somente será apagado, se o programa PHP chamar a função comando apropriada (session_destroy) ou então se o usuário fechar (encerrar) o navegador. Esse vetor associativo de que falamos terá obrigatoriamente o nome $_SESSION[] e é bom notar que seu identi- ficador (nome do vetor) deve ser escrito em maiúsculas. As utilidades óbvias de uma sessão são: Manter um carrinho de compras na memória enquanto um cliente navega;• Manter o usuário logado no website enquanto navega.• Criando uma nova sessão Para criar uma nova sessão, basta chamar a função session_start() no ínicio do programa. Exemplo: 1 <?php 2 session_start(); 3 print_r($_SESSION); 4 ?> Programa uc01.php A saída do programa será: Array ( ) Indicando que foi criado um vetor, por enquanto, vazio. Acessando uma sessão Agora que já criamos o vetor de sessão, podemos acessá-lo normalmente. É importante lembrar que, mesmo já estando criada, a sessão deverá ser habilitada para uso através da função session_start() em todas as páginas que desejarmos usá-la. Vamos ver um exemplo na prática. Primeiramente vamos criar a sessão e colocar dentro do item ‘nome’ o valor 1 Vetor onde o índice de cada elemento é um texto (string) C SESSÕES E REGISTROS DE VARIÁVEIS UNIDADE 2 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C ‘Universidade Aberta do Brasil’: 1 <?php 2 session_start(); 3 $_SESSION[‘nome’] = ‘Universidade Aberta do Brasil<br>’; 4 ?> 5 <a href=”uc03.php”>Ir para a segunda página </a> Programa uc02.php Quando o usuário clicar no link na linha 5 do programa anterior, ele será levado para outra página (uc03.php) que exibirá o conteúdo de $_SESSION[‘nome’], provando que o valor não é perdido quando o usuário navega. O código da segunda página vem a seguir: 1 <?php 2 session_start(); 3 echo ($_SESSION[’nome’]); 4 ?> 5 <a href=”uc02.php”>Voltar</a> Programa uc03.php Veja a saída: 3 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C Destruindo uma sessão Para destruir uma sessão, via código PHP, devemos utilizar a função session_destroy(). Para fazer um teste, cha- me o programa uc02.php para criar a sessão e em seguida mude a URL para que seja chamado o programa uc04. php (cujo fonte está a seguir): 1 <?php 2 session_start(); 3 session_destroy(); 4 ?> 5 <a href=”uc03.php”>Ir para uc03.php </a> Programa uc04.php Após executado uc04.php, a sessão não existirá mais. Para conferir, clique no link “Ir para uc03.php”. A saída deverá mostrar apenas o link “voltar”: A sessão foi destruída e a prova está na mensagem que sumiu: O texto “Universidade Aberta do Brasil” sumiu, pois a sessão foi destruída! Sessões: Resumo Uma sessão é um vetor associativo;• O nome do vetor da sessão é $_SESSION;• Podemos guardar quantos valores quisermos numa sessão;• Para inicializar e utilizar o vetor $_SESSION, é necessário chamar a função session_start() no ínicio do programa• Para destruir a sessão, devemos chamar a função session_destroy();• 4 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C Até aqui, sempre que o usuário fechava o navegador, todos os dados (mesmo os de uma sessão) eram perdidos. Existe uma forma de mantermos os dados que quisermos, mesmo após o encerramento do navegador. Ela é chamada de cookie e constitui na criação de um pequeno arquivo de texto, contendo os dados que desejamos manter e recuperar numa próxima visita ao site. A criação e controle dos cookies são feitos pelo navegador, cabendo ao programador apenas solicitar sua criação, alteração ou consulta. Segundo Wikipedia: “Cookie é um grupo de dados trocados entre o navegador e o servidor de páginas, colocado num arquivo (ficheiro) de texto criado no computador do utilizador. A sua função principal é a de manter a persistência de sessões HTTP. A utilização e implementação de cookies foi um adendo ao HTTP e muito debatida na altura em que surgiu o conceito, introduzido pela Netscape, devido às consequências de guardar informações confidenciais num computador - já que por vezes pode não ser devidamente seguro, como o uso costumeiro emterminais públicos. Um exemplo é aquele cookie que um site cria para que você não precise digitar sua senha nova- mente quando for ao site outra vez. Outros sites podem utilizá-los para guardar as preferências do usuário, por exemplo, quando o sítio lhe permite escolher uma cor de fundo para suas páginas. Funcionamento: Quando o servidor deseja activar um cookie no cliente, envia uma linha no cabeçalho HTTP inicia- da por Set-Cookie: ... A partir desse momento, consoante às opções especificadas pelo cookie, o cliente irá enviar no seu cabeçalho HTTP dos pedidos uma linha contendo os cookies relevantes, iniciada por Cookie: .... Entre os parâmetros dos cookies estão: o tempo de vida (a data para o cookie “expirar a validade”) e o domínio, ou grupo de páginas a que o cookie se aplica. Por exemplo, é possível fazer com que um cookie seja aplicado apenas a endereços iniciados por http://pt.wikipedia.org/wiki/ de maneira que esse mesmo cookie já não se aplique para http://pt.wikipedia.org/skins/, por exemplo.” Disponível em:< http://pt.wikipedia.org/wiki/Cookie > Acesso em: 20 maio 2009. Vantagens e desvantagens de usar cookies Vantagens Um cookie pode durar indefinidamente, dependendo de seu tempo de expiração, que é uma espécie prazo de valida-• de. Uma vez ultrapassado esse tempo de expiração, o cookie será apagado automaticamente; Uma aplicação com cookies pode reconhecer o usuário quando ele retorna ao site mesmo muito tempo depois (desde • que o cookie não tenha expirado e que o usuário não o tenha deletado). C COOKIES UNIDADE 5 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C Desvantagens Cookies podem ser um problema de segurança potencial, se a aplicação que os armazena for mal programada, assim • como usá-los para guardar dados sensíveis como senhas (o que jamais deve ser feito); Alguns navegadores permitem que o usuário os configure para não aceitar cookies. Embora isso possa aumentar a • segurança do usuário, também irá impedir que o site baseado em cookies funcione corretamente com o navegador desse usuário; Em máquinas públicas, como em laboratórios de informática, lanhouses e cybercafés há o risco de aplicações mal • intencionadas pré-instaladas nas máquinas vasculhem e capturem dados importantes de cookies. Algumas empresas de ética questionável usam cookies para rastrear o usuário enquanto ele navega por diversos sites. • Essa prática é condenada por organismos que defendem o anonimato e a privacidade na Internet, como a EFF (Eletro- nic Frontier Fundation - http://www.eff.org/) Criando um cookie Veja um exemplo de como criar um cookie no navegador do usuário: 1 <?php 2 //Unidade C - Trabalhando com Cookies 3 $teste = setcookie(“teste”,”UAB”, time()+3600); 4 if ($teste == true) 5 echo “cookie criado com sucesso!”; 6 else 7 echo “cookie não pode ser criado.”; 8 ?> Programa uc_cookies01.php Vamos comentar o programa anterior linha a linha: Na linha 3, criamos o cookie com a função setcookie()a) O parâmetro 1 é o nome (identificador) do cookie• O parâmetro 2 é o valor que será armazenado no cookie• O parâmetro 3 é a hora de expiração (hora atual + 1 hora neste exemplo)• A variável de retorno ($teste) receberá true se o cookie for criado corretamente e false caso contrário• Da linha 4 em diante, fazemos um teste para saber se o cookie foi criado com sucesso (o que deverá ocorrer b) normalmente, a não ser que o usuário tenha configurado seu navegador para bloquear a criação de cookies). 6 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C Testando e depurando programas com cookies Alguns navegadores mais “democráticos “permitem que manipulemos os cookies armazenados individualmen- te. No caso do Mozilla Firefox é bem fácil obter esse acesso, bastando clicar no menu: Ferramentas > Opções E em seguida da aba “Privacidade”: Na tela acima, devemos então clicar no link “excluir cookies em particular”, o que nos remeterá para seguinte tela: 7 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C Note na tela abaixo que, digitando uma parte do nome do cookie que desejamos localizar, o Firefox irá filtrar os cookies que batem esse critério Uma vez feita essa filtragem, podemos clicar no botão “Excluir cookie” e apagar o cookie que estiver seleciona- do. Essa ferramenta do Firefox é muito útil quando depuramos programas que utilizam cookies e por essa razão (e por muitas outras) o Mozilla Firefox é o melhor amigo do programador Web! Lendo dados de um cookie Agora que já sabemos como criar nossos cookies, será preciso poder ler o conteúdo dos cookies já existentes. Em PHP essa tarefa é muito fácil, e tudo que precisamos é acessar o vetor especial $_COOKIE, que conterá todos os cookies relativos à URL do nosso site (esse controle é feito automaticamente pelo navegador quando este grava o cookie). Vejamos um exemplo: 1 <?php 2 //Unidade C - Trabalhando com Cookies 3 echo (“0 cookie ‘teste’ tem valor = ‘” . $_ C00KIE[‘teste’].“’”); 4 ?> Programa uc_cookies02.php Toda a mágica está na única linha deste programa (3) e fará que o valor de $_COOKIE[‘teste’] seja exibido (caso você não tenha rodado uc_cookies01.php anteriormente, este cookie estará em branco). 8 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade C Apagando um cookie Para remover um cookie da máquina do usuário podemos sobrescrevê-lo com um cookie de mesmo nome e data de expiração vencida. 4 <?php 2 //Unidade C - Trabalhando com Cookies 3 setcookie(“teste”,””,time() - 3600); 4 ?> Programa uc_cookies03.php Veja que agora estamos sobrescrevendo o cookie ‘teste’ com um cookie cuja data de expiração é configurada para uma hora atrás (a partir da atual). Após rodar o programa acima, se você experimentar procurar novamente nosso cookie “teste” utilizando o pai- nel de cookies do Firefox, verá que ele não será mais exibido: 1 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D Nesta unidade, vamos aprender como manipular arquivos e diretórios (pastas) do sistema operacional através do PHP. Trata-se de uma técnica avançada que pode ser muito útil quando precisamos ter maior controle sobre os arquivos do site, sem precisar recorrer a ferramentas externas ao nosso programa em PHP. Navegando (trocando) o diretório atual Descobrindo qual o diretório atual A primeira coisa que precisamos ter em mente é que, por motivos de segurança, normalmente, o servidor Web não permitirá que se navegue em diretórios abaixo de um certo nível, que normalmente é o nosso diretório home ou www. Podemos descobrir qual o diretório atual usando a função getcwd(): 1 <?php 2 echo getcwd(); 3 ?> Programa ud_dir01.php O programa acima irá retornar algo como: “C:\Users\andy\Documents\cefet\uab\unidades\UD\fontes” (esse caminho irá variar dependendo das configu- rações do servidor apache e do sistema operacional no qual o PHP está rodando). Trocando de diretório Agora que sabemos qual o diretório atual, vamos trocá-lo. Para isso devemos usar a função chdir(): 1 <?php 2 chdir(“..”); 3 echo getcwd(); 4 ?> Programa ud_dir02.php D NAVEGANDO, LISTANDO E CRIANDO DIRETÓRIOS UNIDADE 2 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D No exemplo anterior, pedimos ao PHP que“suba” um diretório, indo para o diretório pai do até então diretório atual. A saída deste programa será algo parecido com: Note que getcw() retornou um diretório acima do que foi retornado na execução do programa ud_arquivos01. php Note que o PHP não manterá o diretório atual após o término do programa, assim ele voltará a ser o mesmo onde o programa está rodando, no caso: “C:\Users\andy\Documents\cefet\uab\unidades\UD\fontes” Vamos agora considerar a seguinte árvore de diretórios: Nosso próximo programa chama-se ud_dir03.php e será executado a partir do caminho: “C:\Users\andy\Documents\cefet\uab\unidades\UD\fontes” (ou equivalente em sua máquina). A idéia deste exemplo é permitir que o usuário navegue pelas pastas através de uma caixa de texto onde poderá digitar o caminho desejado. Se o caminho for inválido, o programa irá dar uma mensagem de erro do tipo: “Ca- minho inválido”. 1 <?php 2 $caminho = getcwd(); 3 $acao = $_POST[‘acao’]; 4 if ($acao == “OK”){ 3 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D 5 $caminho = stripslashes($_POST[‘caminho’]); 6 7 $teste = chdir($caminho); 8 if ($teste == true) 9 echo “Novo caminho: $caminho”; 10 else 11 echo “Caminho inválido: $caminho”; 12 } 13 14 ?> 15 <form method=”POST”> 16 <input type=”text” size=”100” name=”caminho” value=”<?=$caminho?>”> 17 <input type=”submit” value=”OK” name=”acao”> 18 </form> Programa ud_dir03.php Experimente rodar o programa acima e navegar pelas pastas do sistema. Vamos entender o programa linha a linha: Linha 2: a variável $caminho recebe o diretório atual;• Linha 3: testa se o botão ação foi acionado;• Linha 4: guarda em $caminho o valor do campo caminho do formulário, filtrando as contra barras (\) com a • função striplashes()1 ; Linha 5: se $caminho for um caminho válido a variável $teste recebe true e o diretório atual será mudado para • $caminho. Caso contrário, $teste recebe false; Linha 6 a 10: o programa irá decidir qual mensagem exibir dependendo do valor de $teste.• Listando o diretório atual Uma vez que já sabemos como percorrer os diretórios do sistema, vamos agora listar o diretório atual, mostran- do quais arquivos e diretórios que existem dentro dele. 1 <?php 2 $dir = “pastas”; 1 Quando um formulário é submetido, normalmente o PHP irá colocar uma contra barra (\) na frente de caracteres especiais como aspas duplas, aspas simples e outras contra barras. Esse comportamento depende das configurações do servidor PHP. 4 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D 3 $handle = opendir($dir); 4 if ($handle != false) { 5 echo “$dir <hr>”; 6 while (false !== ($file = readdir($handle))) { 7 echo “$file <br>\n”; 8 } 9 closedir($handle); 10 } 11 else 12 echo “diretório inválido: $dir”; 13 ?> Programa ud_dir04.php Vamos entender este programa linha a linha. É bem simples acredite! Linha 3: opendir() retorna para $handle um apontador para o diretório definido em $dir. Caso $dir seja um • diretório inexistente ou inválido, $handle receberá false; Linha 6: while irá se repetir enquanto a função $readdir() retornar valores para $file• 2 que não forem false; Linha 7: irá imprimir o nome de cada entrada do diretório seguido de um <br>;• Linha 9: fecha o apontador de diretório ($handle);• Experimentos: Mude o valor de $dir para “pastas/pasta1”;a) Mude o valor de $dir para “pastas/pasta2”;b) Mude o valor de $dir para “pastas/pasta4”;c) O que aconteceu em cada um dos testes? Criando um diretório Uma vez que já sabemos navegar pela árvore de diretórios do sistema operacional via PHP, vamos aprender como criar novos diretórios. 2 Note o sinal “!==”. Ele serve para que o PHP possa diferenciar o valor booleano false de um arquivo ou diretório chama- do “false”! 5 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D 1 <?php 2 $teste = mkdir(“pastas/pasta4”); 3 if ($teste == true) 4 echo “Diretório criado com sucesso!”; 5 else 6 echo “Erro criando diretório”; 7 ?> Programa ud_dir05.php O programa acima é bem simples e dispensa grandes comentários. A única coisa a salientar é que mkdir() retor- na false não consiga criar o novo diretório. Há ainda um segundo parâmetro que é o modo de acesso (leitura, escrita e execução) em sistemas UNIX. Esse parâmetro não tem efeito em sistemas Windows e é demonstrado a seguir: 1 <?php 2 $teste = mkdir(“pastas/pasta5”,0777); 3 if ($teste == true) 4 echo “Diretório criado com sucesso!”; 5 else 6 echo “Erro criando diretório”; 7 ?> Programa ud_dir05b.php Este parâmetro não tem efeito no Windows. Removendo um diretório Para encerrarmos nossa manipulação de diretórios, falta apenas uma maneira para deletá-los. Esta funcionali- dade é dada pela função rmdir(): 1 <?php 2 $teste = rmdir(“pastas/pasta4”); 3 if ($teste == true) 4 echo “Diretório removido com sucesso!”; 5 else 6 echo “Erro criando diretório”; 6 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D 7 ?> Programa ud_dir06.php Esta função funciona de forma análoga à função que cria os diretórios, vista anteriormente. Se rmdir() não con- seguir remover o diretório especificado, ela retornará false. 7 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D Abrindo um arquivo Antes de ler ou escrever em um arquivo, é preciso fazer a sua abertura. A função fopen() faz a abertura de um arquivo e retorna um ponteiro de arquivo em uma variável. Exemplo: $pta = fopen (“caminho/nome_do_arquivo”, “modo_de_abertura”) or die (“erro lendo arquivo”) ; No exemplo acima, incluímos o comando or die(), que serve para fornecer uma mensagem de erro personalizada caso algo saia errado na abertura do arquivo. fopen() recebe dois parâmetros: Caminho (se o arquivo estiver no mesmo diretório não precisamos colocá-lo aqui) e nome do arquivo a ser aberto;1. Modo de abertura (leitura, gravação ou ambos)2. A seguir uma tabela de referência sobre os modos de abertura de arquivos: ‘r’ Abrir somente para leitura; coloca o ponteiro de arquivo no começo do arquivo. ‘r+’ - Abrir para leitura e gravação; colocar o ponteiro de arquivo no começo do arquivo. ‘w’ Abrir somente para gravação; colocar o ponteiro de arquivo no começo do arquivo e truncar o arquivo para tamanho zero. Se o arquivo não existir, tentar cria-lo. ‘w+’ Abrir para leitura e escrita; colocar o ponteiro de arquivo no início do arquivo e truncar o arquivo para tamanho zero. Se o arquivo não existir, tentar cria- lo. ‘a’ - Abrir o arquivo somente para escrita; colocar o ponteiro de arquivo no fim do arquivo. Se o arquivo não existe, tentar criá-lo. a+’ Abrir o arquivo para leitura e gravação; colocar o ponteiro no fim do arquivo. Se o arquivo não existe, tentar criá-lo. Descobrindo o tamanho de um arquivo Podemos descobrir o tamanho em bytes de um arquivo através da função filesize(). Exemplo: $tamanho = filesize (“caminho/nome_do_arquivo”); D TRAbALhANDO COm ARqUIVOS UNIDADE 8 S is te m a U ni ve rs id ad e A be rta d o B ra si l - U A B | I F S ul -r io -g ra nd en se Desenvolvimento de Aplicações para WEB | Unidade D Lendo um arquivo Lendo todo o conteúdo de um arquivo Podemos ler um arquivo passando quantos bytes desejamos ler de cada vez. Para ler um arquivo inteiro de uma só vez, podemos
Compartilhar