Anda di halaman 1dari 109
0011403; jioteca - UNIVATES 7 a, i ye Neste livro 0 aprendizado de desenvolvimento de sistemas para web utilizando a linguagem de programagao PHP. ETON CLOUT TCL ECON CCC CO Em um processo evolutivo é ensinada a estrutura geral da linguagem CORN UMeeem EM Noreen oTemece OM TiVO RCO nen hy Ove Mer Mua (enero eel ye CoM KeO OKC H CUT ey implementagao na linguagem PHP. Outro ponto forte desta publicacao é 0 capitulo sobre banco de dados, com exemplos de implementagao em AU NrASTe) E dedicado aos professores e académicos de graduacio e pos- graduacao dos cursos da area de computagio ou informatica, bem como aos analistas de sistemas, programadores e técnicos em processamento de dados. O autor procura expressar estes conceitos de forma gradativa ny PoC ELITE Coe To SI ORO tLe (COC eT RT CCRT CeOM eT pCere MDH para web tirar grande proveito aprendendo técnicas de progr amagao de alto nivel. Sao oferecidas ainda de forma bem estruturada, a teoria ea pratica, através de exemplos, sobre a gravagéio e a manipulagao de dados em arquivos, banco de dados, sessdes e cookies. BN S78 ih CLL CIENCIA MODERNA Ro ton! Agradecimentos Ao Departamento de Informatica da Universidade Estadual de Maringa por ter me proporcionado um ambiente propicio para o desenvolvimento pessoal e profissional. Ao Governo do Estado do Paran4, meu financiador salarial, e ao Governo Federal pelo apoio ja recebido através da CAPES e CNPq. / A Bditora Ciéncia Moderna por acreditar neste trabalho, em especial & tengo do colega Paulo André Pitanga Marques. Sumario Capitulo 1 Conceitos Basicos .... 1.1. Histérico .... Cédigo PHP x Cédigo HTML Os delimitadores (tags)... 1.4, Comentirios.... 1.5. Separador de instrugées ... Capitulo 2 Tipos de dado: 2.1. Tipos suportados .. 2.1.1. Ntimeros inteiros (integer ou long) Nuimeros reais (float ou double) . 2.1.3. Cadeias de caracteres (strings) 2.1.4, Caracteres de controle ,. 1.5. Arranjos de dados (arrays) 2.1.6. Listas (lists) . 2.1.7. Objetos 2.1.8. Simula ‘410 do tipo booleano . nsformagio de tipos (cast) .3, Verificagiio do tipo de uma varidvel VI Capitulo 3 Varidveis 3.1. Definigaio 3.2. Nomes de varidveis 3.3. Escopo das varidveis .. 3.3.1. Varidveis locais 3.3.2. Varidveis globais .. 3.3.3. O modificador de escopo ‘global 3.3.4. O adaptador de escopo 'static’ .. 3.3.5. Varidveis varidveis ... 3.4. Varidveis externas ao PHP. 3.4.1. Os métodos de interagio 2. Configuragio das varidveis 3.4.3. A utilizacio de Forms 3.5. Varidveis de ambiente .. 3.6. Destruindo uma varidvel explicitamente 3.7. Verificando se uma varidvel possui um valor Capitulo 4 4.1. Definic 4.2. Constantes predefinida: Capitulo 5 Operadores... 5.1. Atribuigo 5.2. Aritméticos 5.3. Légicos 5.4. De deslocamento de bits... 5.5. Relacionais (comparago 5.6. Concatenagiio 5.7. Operador ternério Capitulo 6 Estruturas de comparagéo. 6.1. Estrutura “se/senao" 6.2. O Encadeamento se/seniio/se 6.3. Operador ternario "2" 6.4. Comparagdes com o "switch/ease Capitulo7 Estruturas de iteragdo (lagos de repetigao) .. 7.1. “para-faga" 7.2. "enquanto-faca 7.3. "faga-enquanto" Capitulo 8 Comandos de Desvio 8.1. Break ... 8.2. Continue... Capitulo 9 Fungées definidas pelo usuario. 9.1. Definigao .... 9.2. Valor de retorno .. 9.3. Parimetros de entrada .. 9.4, Passagem de parimetros por valor 9.5. Passagem de pardmetros por referéncia 9.6. Parametros com valores predefinidos (default) Capitulo 10 Orientago a objetos.. 10.1. Conceitos basicos da OO 10.1.1. Objeto: 10.1.2. Ocultagio de informagées (encapsulamento) 10.1.3. Classe: 10.1.4. Heranga 10.1.5. Polimorfismo .. 11.1. Definigio de protocolo .. 11.2. Headers... 11.3. Senhas .. VIII 10.2, Implementago da teoria OO com a linguagem PHP........ 0 10.2.1. Classe 10.2.2. Objeto 10.2.3. O ponteiro Sthis, 10.2.4. Encapsulamento (PHP 5) 10.2.5, Heranga . 10.2.6. Fungdes construtora: 10.2.7. Fungées destrutoras (PHP 5) 10.2.8. Polimorfismo (PHP 5) .... Capitulo 11 Seguranga, personalizagdo e privacidade... 11.2.1. Informagées do documento 11.2.2. Titulos 11.2.3. Os cabegalhos do protocolo 11.3.1. Validagdo por varidveis 11.3.2. Validagdo por arquivos textos .. 11.3.3. Validacdo por banco de dados 11.3.4. Validagdo por autenticagio http . 4. "Cookies 11.4.1. Criagdo de ‘cookies’. 11.4.2, Manipulagao dos dados gravados em um 'cooki 11.4.3. Exclusio de um ‘cookie! .5. Sessions’ 11.5.1. Criagdo, manipulagio e encerramento de se: 11.5.2. Manipulagio das varidveis de uma sess 11.5.3. Validagiio de uma sessio .. 11.5.4, Aplicagao das fungies . 11.5.5. Cache 11.5.6. Identificagao da sessio. 11.5.7. Caminho do arquivo de ses Capitulo 12 Manipulagdo de dados em arquivos.. 12.1, Abertura do arquiv. 12.2, Fechamento do arquivo 12.3. Determinagiio do fim do arquivo 12.4. Leitura em arquivo 12.4.1, Por caractere 12.4.2. Por linha. 12.4.3, Por lote 12.4.4. Por ‘array 12.5. Escrita em um arquiv. 12.5.1. Em arquivo novo 12.5.2. Em arquivo existente 12.6. Acesso aleatério a arquivos . 12.6.1. fseek() Capitulo 13 Protocolo de transferéncia de arquivos . . 105 13.1. A conexao FTP... 106 13.1.1. Seguranga em uma conexiio 106 13.1.2. Os modos de conexiio 107 13.2. Os comandos FTP... 13.2.1. Fungdes sobre a conexiio . 13.2.2. Fungées de transferéncia de arquivos do servidor para o cliente (download)... 13.2.3. Fungées de transferéncia de arquivos do cliente para o servidor (upload)... 13.2.4. Fungées que atuam sobre os arquivos remotos . 13.2.5. Fungées que atuam sobre pasta 13.2.6. Outras fungées ... BLIOTE UNIVATES Leleaeda Capitulo 14 O banco de dados MySOL.... 14.1, Alguns tipos de dados suportados pelo MySQL . 14,2. Conexto com um servidor ... 14,3, Selegéio de um banco de dados do servidor . 14.4, Manipulagao das tabelas de um banco de dados .. 14.5, Operagdes na tabela 14.5.1. Criagiio de uma tabela.... 14.5.2. Limpeza dos dados de um tabela.. 14.5.3. Remogio de uma tabela..... 14.6. Operagdes sobre os dados da tabela . 14.6.1. Insergdo de linhas na tabela ... 14.6.2. Pesquisa e apresentagdo de uma linha . 14.6.3. Atualizagao dos dados de uma linha .. 14.6.4. Remogfio de uma linha 14.7. Exemplos de fungées MySQL 14.8. Lista de fungdes PHP para acessar MySQL... Capitulo 15 E-mails autenticados com 0 protocolo SMTP. 15.1. O protocolo SMTP .... 15.1.1. Os requerimentos ¢ as respostas nesse protocolo 15.1.2. Os comandos SMTP para enviar e-mail. 15.1.3. Os comandos SMTP para estabelecer handshake com o servidor 15.1.4. Os comandos SMTP para validar login e senh 15.2. O carteiro na pratica... ai Capitulo 16 Um compéndio sobre imagens ... 16.1. Métodos de formatagio de imagens 16.1.1. RGB (Red, Green, Blue) .. 16.1.2. CMYK (Cyan, Magenta, Yellow, Black) 16.1.3. Preto e Branco ... 16.2, Métodos de formatagao de arquivos . 16.2.1. Imagens JPG 16.2.2. Imagens GIF. 16.2.3. Imagens PNG 16.2.4. Imagens WBMP 16.3. Criagiio de imagens no PHP 16.4. Remogiio de imagens 16.5. Manipulacio de cores 16.6. Textos .. 16.7. Figuras geométricas 16.8. Manipulagio das imagens contidas em arquivo: 16.8.1. Abertura dos arquivos de imagen: 16.8.2, Redimensionamento das imagens 16.8.3. Manipulagio de cores transparentes .. 16.8.4. Marca d'fgua. Apéndice A Exemplos adicionais . 17.1. Envia dado: 17.2, Detecta némeros pares e impares 17.3. Mostra a data 17.4. Mostra a hora 17.5, Valida CPF 17.6. Conta dias 17.7. Conta horas 17.8. Contador de visitas em arquivos 17.9. Gerador de calendario de um més e ano especificados 17.10. Gerador automético de senhas 17.11. A fungdo e-mail completa 17.12. Bandeira do Brasil .. 17.13. Marca d'égua . 17.14. Gerador automatico de senhas gr: 17.15. Arco, triangulo, anél e pizza .. Xil Apéndice B Introdugdo a linguagem HTML. 18.1. Os elementos e 18.2. O elemento <body> 18.3. Cabecalhos ... 18.4, Pardgrafos e quebras de linha . 18.5. Ligagdes com outras paginas 18.5.1. Caminho relativo .. 18.5.2. Caminho absoluto 18.5.3. Caminho para um ponto do documento 18.6. Formatagao de texto 18.7. Caracteres especiais 18.8. Tabelas 18.9. Listas . 18.9.1. Listas de definigio.. 18.9.2. Listas de itens ... 18.9.3. Listas de itens numerados 18.9.4. Aninhamento 18.9.5. Estilos de li ‘as marcadas .. 18.9.6. Estilos de listas numeradas 185 18.10. Exibindo imagens no navegador. 185 18.10.1. Atributos para alinhar a imagem ... 185, 18.10.2. Atributo para definir o tamanho da imagem . 18.10.3. Atributos para manipular as bordas . 18.10.4. Texto alternativo 18.11. Formuldrios eletrénicos x PHP 18.11.1. A delimitagdo de um formulério 18.11.2. Os atributos de um formulério 18.11.3. A recepgiio dos dados por um script 18.11.4. Os campos dentro dos delimitadores de formul 18.11.4.1 <INPUT> 18.11.4.2<SELECT> 18.11.4.3 <TEXTAREA> 19.1, Os objetos de um documento HMTL . 19.1.1. Eventos .. 19.1.2. Algumas fungdes predefinidas .. Prefacio Este livro foi escrito baseado em trés praticas basicas: * Oestudo de varias linguagens de programagiio ao longo dos anos; A exercicio da programagao em varios sistemas voltados para a Internet.; * Eoensino de PHP tanto em disciplinas formais como em cursos de extensao de eventos. A compreensio das estruturas de dados e das estruturas de programagiio é chave de fundamental importancia para o aprendizado da ciéncia da computa¢do, e essencial para a formagiio de um profissional competitivo. O advento da Internet trouxe com ela varios textos ¢ solugdes com abordagens pouco criticas e principalmente nada formais. O aprendiz se depara com um volume muito grande de informagdes e na maioria das vezes desorganizadas, fato contraproducente para o aprendizado. UNIVATES ho Ae XIV O objetivo geral e ensinar o leitor desenvolver sistemas para web utilizando alinguagem PHP. Com uma seqiiéncia l6gica de ensino oferece ao leitor uma grande oportunidade de aprender a linguagem de programagao que mais cresce no mundo (incluindo conceitos de Internet, informatica e banco de dados). Diferencia de outras obras porque trata de conceitos de alto nivel como 0 da teoria da orientagiio a objetos, bem como a implementagiio desses conceitos na linguagem PHP, utilizando como apoio, exemplos testados em provedores. Oferece ainda de forma bem estruturada, conceitos e exemplos sobre a gravagiio e manipulagdio dados em arquivos, banco de dados, sessées e cookies. O livro proposto aborda em 17 capitulos e um apéndice a linguagem HTML. Os principais conceitos de orientagdo a objetos sio debatidos na teoriae comprovados com exemplos testados, evidenciando inclusive pontos importantes da versao mais nova do interpretador PHP. Capitulo 1—Trata da estrutura geral da linguagem, como sintaxe, regras, etc, Capitulo 2— Sao mostrados os tipos de dados que a linguagem permite, evidenciandoachecagem dindmica de tipos, inerente a linguagem. Jé neste capitulo surgem conceitos de orientagiio a objetos voltados para a criagdio de novos tipos de dados. Capitulo 3 — As varidveis sio 0 foco neste item, que trata temas como a criagiio de varidveis simples, o escopo dessas varidveis, passagem de parmetros ¢ até a transmissio delas pela Internet. Capitulo 4 — Este é um capitulo pequeno reservado para explicar acriago e utilizagao de constantes. Capitulo 5 - Os operadores stio explicados separando-os por classes: atribuigao, aritméticos, ldgicos, de deslocamento de bits, relacionais, de concatenacao. Capitulo 6 — Importante drea dentro de algoritmos e linguagens de programagio, as estruturas de comparagdo sio tratadas com detalhes. Capitulo 7—Neste, as estruturas de Tepetigdo sao abordadas com exemplos muito didaticos. Capitulo 8 — Reservado para debater as fungGes e seus parametros. Capitulo 9- Um capitulo completo para atender a teoria e a programagiio orientada a objetos. E um dos pontos fortes deste livro, pois, traz exemplos de programacao, tal como, polimorfismo que, em geral, nZio demonstrado na pratica. Capitulo 10 - Outro capitulo de alto nivel, debate algumas técnicas de Seguranga, privacidade e personalizagao na Internet. Assunto muito visado pelos programadores. Capitulo 11 —Os cookies so pequenos arquivos que um sistema da Internet pode gravar no computador que visita uma homepage, o cliente. Detalhes pouco discutidos na literatura sao abordados aqui com propriedade, De forma semelhante as sessGes (session) gravam informagGes no servidor, criando um poderoso sistema de validagdo de usuarios. Uma sessiio (session) é uma forma de estabelecer seguranga em sistemas da Internet que muitos aprendizes tem dificuldade de entender. Exemplos e um texto didatico quebram a barreira do aprendizado. Capitulo 12 — A manipulagiio de arquivos do tipo texto e bindtio sio esmiugados neste item, que mostra no somente as fungSes de manipulagiio, mas 0 interior dos arquivos apés cada aco sobre ele. Capitulo 13 - O protocolo de transferéncia de arquivos via Internet é detalhado neste capitulo, tornando muito simples 0 aprendizado do conceituado FTP. Capitulo 14 —A rea de banco de dados é considerada por muitos, a mais importante da informatica. Neste capitulo é ensinado como funciona o banco de dados MySQL, bem como, a forma que a linguagem PHP pode XVI acessa-lo, armazenado e recuperando os dados, por meio de ricos exemplos sobre 0 assunto. Capitulo 15—Um exemplo didatico de como enviar emails quando o servidor exige validagao de login e senha. Para que 0 leitor possa compreender 0 assunto, este livro apresenta a explicagdo detalhada do mais utilizado protocolo de comunicagao por sockets, chamado SMTP. Capitulo 16 — Seria impossfvel trabalhar com a Internet sem entender bem como funcionam as imagens. Este capitulo é reservado para esmiugar os diversos tipos de imagens que sao utilizadas para ilustrar as homepages e ‘os sistemas computacionais da Web. Capitulo 17 —Toda teoria deve ser comprovada pela pritica. A vasta colegio de exemplos oferecida neste capitulo deixa o leitor mais proximo da realidade computacional. Capitulo 18 - Este apéndice mostra a linguagem, a técnica e as formas de se istemas PHP, bem como introduz o conceito de orientagio a objetos em HTML. criar formuldrios HTML para enviarem dados para os Capitulo 1 Conceitos Basicos 1.1. Histérico A linguagem PHP foi concebida para ser utilizada exclusivamente na Web c implementa todas as estruturas de programagio, manipulagiio de dados, suporte para a implementagio das estruturas de dados, banco dados e, além disso, atualmente conta com um respeitavel suporte para a programaciio das estruturas orientadas a objetos. Tnicialmente a linguagem PHP, uma linguagem de programagiio interpretada pelo servidor, tinha 0 objetivo de criar paginas pessoais com funcionalidades maiores que o HTML, daf o nome ‘Personal Home Page’. Em 1994, Rasmus Lerdorf membro da comunidade Apache, escreveu a primeira versio do interpretador PHP em Perl para funcionar como um CGI (Common Gateway Interface), que é 0 método usado para permitir a interagao entre o servidore os clientes. Devido a grande propagagiio dessa linguagem, Rasmus disponibilizou uma parte da documentagéio do mesmo, dando origem ao PHP v.01. Em seguida, foi adicionado um sistema para a interpretagao de OO, OO 2 = Fale a linguagem da Internet PHP Orlentado a Objetos formulérios danclo origem ao PHPIFI (Form Interpreter). A partir daf, novos Colaboradores foram surgindo e a linguagem PHP vem demonstrando uma Constante evolugio, Dada a evolugiio da Internet, bem como a da propria linguagem, (veja Figura 1) 0 PHP ocupa um importante espaco no setor de desenvolvimento de sistemas paraa Web, PHP Usage for Feb 2004 (http://www oracle.comitechnology/publarticles/php_experts/rasmus_php.htm!) 1.2. Cédigo PHP x Cédigo HTML A primeira diferenga é que o HTML é interpretado pelo navegador do usuario (cliente) e o PHP é interpretado pelo servidor e, ao final da interpretagao, gerauma pagina como se fosse originalmenteescritana linguagem HTML. O usuério final (cliente) nunca enxerga 0 cédigo-fonte PHP, apenas Oresultado gerado pelo navegador, Por esse motivo, sem desmerecero grande potencial da linguagem, pode-se dizer que é uma potente linguagem de Programacao geradora de HTML. Para gerar esse resultado (pagina HTML), 9 programador PHP deve utilizar uma das fungSes de impressio, que sio: echo(), print() ¢ printf0. Conceltos Bisleos ~ 3 Além disso, 6 possfvel mesclar as duas linguagens emum tinico programa, delimitando 0 espago de cada uma dentro do mesmo cédigo utilizando as tags de delimitagiio, 1.3. Os delimitadores (tags) O interpretador do servidor identifica um c6digo PHP através de dois delimitadores que indicam o infcio eo fim do programa ou trecho de programa, Esses delimitadores so 0 <?php para o inicio e o 2> para representaro fim. Porém, € possivel utilizar a abreviagdo <?, sendo necessério habilitara opedio short-tags na configuragao do PHP. <?php Cédigo PEP > Para imprimir uma frase no video em HTML, basta escrevé-la no corpo lo arquivo com a terminagéo ".htm" ou "html" e pronto. O cédigo fonte em HTML ficaassim: <htm1> <body> Mata frase apareceré no video. </body> </htm1> Porém, no cddigo PHP, é necessétio delimitare utilizar fungGes especificas ¢, além disso, o arquivo deverd ter a extensiio “\php" ao invés de ".htm" ou "himt", <?php echo "<html>"; echo "<body>"; echo “Esta frase apareceré no video. echo "</body>"; echo "</html>"; » ee OOOO 4 = Fale a linguagem da Internet « PHP Orlentado a Objetos Conceltos Basieos ~ 5 i fi é 2 is Odi afdirna <?php E possivel também shenelar os dois cédigos e da mesma forma que 0 Get exemplo anterior, o arquivo deverd ter extensiio " php". @cho “segundo comando em PHP"; u" ese _ echo “Gitimo comando em PHP" <html> > <body> <?php echo “Esta frase apareceré no video. > </body> </html> 1.4, Comentarios HA dois tipos de comentirios no cédigo PHP: Os comentarios de uma linha, indicados preferencialmente por duas barras "YI" ,eopcionalmente pelo sinal "# Comentarios de mais de uma linha delimitados pelos caracteres "/*" para Oinicio do bloco e "*/" para o final do bloco comentado. Exemplo |: // estas linhas sio comentérios e néo tém efeito de programagio, nom // precisam ser terminadas por ponto-e-virgula Exemplo2: y te bloco € um comentéric, podem ser colocadas aqui quantas linhas forem necessérias 7) 1.5. Separador de instrugdes A exemplo de linguagens como C/C++, Pascal, Java, Perl ¢ outras, 0 PHP exige que cada linha de comand seja terminada com o ponto-e-virgula. Em comentarios e na tiltima instrugaio do bloco delimitado pelos sinais acima descritos, nao é necessario 0 uso do ponto-e-virgula, Capitulo 2 Tipos de dados 2.1. Tipos suportados Alguns programadores costumam dizer que o PHP niio define o tipo para a varidveis ou que o PHP nfio tem tipos de dados, mas existem tipos sim, Na realidade, essa linguagem utiliza uma checagem dindimica de tipos, por isso, uma tinica varidvel pode receber valores de tipos diferentes em momentos diferentes da execugio do script. Por esse motivo niio é necessario declarar as varidveis, conseqtientemente nao é necessério declarar 0 tipo delas para poder utilizé-las. Ointerpretador PHP (no servidor) detectaré o tipo de cada varidvel através da verificagao do contetido durante toda a execugaio do programa. Dentro desse conceito, o PHP suporta os seguintes tipos de dados: Inteiro, Ponto flutuante, String, Array e Objeto. Mesmo com essa interpretagiio automatica, o programador pode converter 8 valores de um tipo em outro desejado, utilizando 0 typecasting oua fungiio settype(), ambos debatidos no item 2.2. 8 = Fale.a lnguagem da Internet « PHP Orlentado a Objetos A composicao dos nomes das variéveis segue as regras apresentadas no item 3.2, A seguir sao explicados os tipos de dados suportados pela linguagem. 2.1.1. Némeros inteiros (integer ou long) Uma varivel pode conter um valor inteiro “curto” ou “longo”. A diferenga entre eles € 0 niimero de bytes utilizados para armazené-los na meméria, porém, isso também é transparente para o programador, pois, quem define é 0 interpretador, de acordo com as necessidades do momento. Exemplos: valor = 456; // inteiro positive ma base decimal §valor = ~456; // inteiro negative na base decimal: Svalor = 0710; // inteizo na base octal (todo mimaro inicializato por 0 6 octal) fvalor = xic8; // inteiro ma base hem (todo minero inicializaio por Ox é hem) 2.1.2. Niimeros reais (float ou double) Uma variavel pode conter um valor real (ponto flutuante) “curto” ou “duplo”. A diferenga entre eles 6 0 ntimero de bytes utilizados para armazend- los na mem6ria, porém, da mesma forma que o inteiro, isso também & transparente para 0 programador. $valor = 1.4567 §valor = -1.456; valor = 45e1; // Real positive igual a 1,456 // Real negativo igual a -1,456 // Real positivo em notagéo cientifica (450) 2.1.3. Cadeias de caracteres (strings) Silo seqiiéncias de caracteres contfguos armazenados em uma sequiéncia de bytes contfguos. Para atribuir valores utilizam-se duas técnicas: * Envolver a string entre apéstrofes, também conhecida como aspas simples, desta maneira, o valor da varidvel sera exatamente 0 texto contido entre as aspas. Para imprimir a propria apéstrofe, deve-se utilizar um caractere ; i Tipos de dados = 9 de controle que é a barra invertida, também conhecida por contrabarra, precedendo o apostrofe (\’ ). O item 2.1.4 apresenta uma lista dos caracteres de controle. + Enyolver a string com aspas, também conhecida por aspas duplas. Esta técnica permite que o valor de uma varidvel, cujo nome esté explicitado dentro das aspas, seja impresso, ao inyés do seu nome literal. Exemplo: valor = ‘teste'; echo “§valor"; // 0 valor ‘teste’ contido na varidvel seré impresso echo '§valor';// 0 texto $valor seré impresso 2.1.4. Caracteres de controle A Tabela 1 apresenta os caracteres de controle, que siio caracteres constantes predefinidos pela linguagem e utilizados especificamente para realizar uma agiio nao prevista pela string impressa. ‘Sintaxe | Resultado in Nova linha r Retorno de carro ie ‘Tabulacdo horizontal Imprime a barra ( \$ ‘Imprime o simbolo € @ Imprime uma apéstrofe o Imprime uma aspa Tabela 1. Caracteres de controle da impressiio Exemplo: echo “o saldrio 6 R\$:".$salérioy A funcionalidade destas constantes depende do navegador reconhecé-las ou nao. Por exemplo, 0 “\n” nao é reconhecido pela maioria dos navegadores, sendo necesséria a utilizagao do <br> para realizar uma quebra de linha. 10 - Fale a linguagem da Internet - PHP Orientado a Objetos 2.1.5. Arranjos de dados (arrays) Este tipo de dado pode ser chamado de: cadeia, vetor, seqiiéncia ou ainda eminglés array. O valor de uma posigio do array deve ser acessado através de seus indices, que podem ser valores de qualquer tipo e nfio somente inteiros, inclusive do tipo string. Além disso, se os indices forem todos inteiros, no precisardio formar uma seqiiéncia continua. Quando um array é criado sem especificar os indices, eles so criados automaticamente a partir do zero. Como a checagem dos tipos no PHP € din&mica, valores de tipos diferentes podem ser usados como indices de array, assim como os valores atribufdos, que podem ser de diversos tipos. Exemplo: $cor[1] = "vermelho"; $cor[2] = "verde"; §cor[3] azul"; §cor[*teste”] = 17 0 c6digo acima pode ter outra sintaxe, com o mesmo efeito: cor = array(1 => "vermelho", 2 => "verde", 3 => "azul", "teste" => 1); Existem duas fungdes PHP que facilitam a impressao dos arrays: print_r($cor); ce var_dump($cor); 2.1.6. Listas (lists) As listas siio utilizadas no PHP para realizar atribuigdes miltiplas. Através das listas, € possfvel atribuir os valores que estio em um array ds varidveis. Exemplo |: Uist (fa, $b, $o) = arvay("a", "bY, "OM)y Tipos de dados - I 1 Ocomando acima atribui valores As trés varidveis simultaneamente. E importante destacar que s6 sio atribufdos as varidveis da lista os elementos do array que possuem {indices inteiros e ndio negativos. No exemplo acima, as trés atribuigGes foram bem-sucedidas porque ao inicializar um array _ sem especificar os indices eles passam a ser inteiros, a partir do zero. Um. fator importante € que cada varidvel da lista possui um indice inteiro e ordinal, iniciando com zero, que serve para determinar qual valor seré atribuido, No exemplo anterior $a tem {indice 0, $b fndice 1 e $c indice 2. Exemplo2: ($arr = array(1=>"um",3=>"tres","a"=>"letraa",2=>"dois); list ($a,$b,$c,$4) = Sarr; Apés a execugao do cédigo acima, os seguintes valores sio atribufdos: null ay == "dois" == tres" Observe que nao foi atribufdo valor a varidvel $a, pois no array nao iste elemento com {indice 0 (zero). Outro detalhe importante é que 0 valor 's” foi atribufdo A varidvel $d e nao a $b, pois seu indice é 3, omesmo ice da posigio da variével $d na lista. Por fim, € possivel notar que o valor A” nao foi atribuido a nenhum elemento da lista, pois seu indice niio € iro a lista trabalha somente com indices inteiros. Os indices da lista servem apenas como referéncia para o interpretador realizar as atribuiges, ndio podendo ser acessados de maneira nenhuma lo programador. De maneira diferente do array, uma lista nao pode ser ibufda a uma varidvel, servindo apenas para fazer miltiplas atribuigdes és de um array, 12 = Fale a linguagem da Internet « PHP Orientado a Objetos 2.1.7. Objetos Um novo tipo de dado definido pelo usuario é criado por class (ver capitulo 10.2.1) que permite colocar 0 cédigo de fungées (ver capitulo 9) e varidveis (ver capitulo 3) em um mesmo elemento. Desta forma, 0 novo tipo de dado criado tera varidveis chamadas de “atributos da classe” e fungdes chamadas de “métodos da classe”. O operador new (ver capitulo 10.2.2) é utilizado para alocar espago na memiéria dinamicamente, assim, um objeto deve ser criado com esse operador que instancia determinada classe, criando um objeto. Exemplo: class teste{ public function fazNada() { echo “teste de classe e objeto”; ? y valor = new teste; // aloca meméria para o novo objeto valor -> fazNada(); // chama a fungdo que imprime a frase 2.1.8. Simulagiio do tipo booleano O PHP nao possui um tipo booleano especificado, mas pode avaliar expressdes € retornar verdadeiro ou falso através do tipo inteiro, neste caso, o valor zero representa o estado falso e qualquer valor diferente de zero representa 0 estado verdadeiro. 2.2. Transformacio de tipos (cast) A transformagio de tipos no PHP pode ser feita de trés maneiras: * automaticamente (cast automitico ou coergao); * explicitamente pelo usuario, utilizando o typecast ou * utilizando a fungio settype(). Tipos de dados « 13 No primeiro caso, quando ocorrem determinadas operagées entre dois: valores de tipos diferentes, o PHP converte o contetido de um deles ‘utomaticamente para adequar o resultado sem, porém, alteraro valor contido Ho operando. O tipo no qual os valores dos operandos sero convertidos tem a ordem de precedéncia mostrada na Tabela 2. Ordem [Um dos operando é: [0 outro é transformado em: 1 Real (float) Real (float) 2 Inteiro Inteiro Tabela 2. Ordem de precedéncia na transformagdo dos tipos Uma string é convertida em um ntimero real ou inteiro quando comegada jor um numero de acordo com a andlise realizada pelo interpretador e, no 30 de comegar por uma letra, ser convertida em zero. , CO interpretador descobre e aceita sinais precedendo nimeros, pontos ie representam as casas decimais ¢ a letra e ou E como exponencial. lor = 3e2; // $valor recebe 300, que 6 3 x 10 elevado ao quadrado $valor; // imprime 300 No segundo caso, a transformagio explicita dos tipos, deve explicitar-se tipo de dado de forma semelhante ao da linguagem C, escrevendo 0 novo entre parénteses antes do valor a ser convertido. lor = 3.27 J/ cxiar variével ‘real* 0 $valor.'<br>'; J/ imprime 3.2 alor_int = (int)§valor; // converte para inteiro 0 Svalor_int.'<br>'; // imprime 3 Como palavras-chaves para compor 0 cast, sao aceitas as listadas na Tabela 3. EE TEC: 14 » Fale.a Inguagem da internet PHP Orlentadlo a Objetos . Tipos de dados = 1§ Pete ae (eo Exemplo: int ou Integer Inteiro Af (Ae float (gvar)) ¢ real, double ou float | Real com ponto fluluante : string Cadeia de caracteres ara \Vetor indexado object ‘objeto 4 Tabela 3. Palavras-chaves para a converséo dos tipos Finalmente, utilizando a fungdo settype(), que converte uma varidvel no tipo especificado, que pode ser “integer”, “double”, “string”, “array” ou “object”. Exemplo: $valor = 15; // $valor 6 integer settype($valor,double); —// muda $valor para double 2.3. Verificacdo do tipo de uma varidvel Como ja foi analisado anteriormente, a tipagem utilizada pelo PHP é dindmica, portanto, nem sempre é possfvel saber qual o tipo de uma varidvel em determinado instante, Existem duas maneiras de verificaro tipo delas: Através da fungiio. gettype() que retorna o tipo da varidvel testada através das seguintes strings: “integer”, “double”, “string”, “array”, “object” ¢ “unknown type”, Exemplo: echo gettype($var); Eatravés das funges que testamo tipo da varidvel, sao elas: is_intO, is_integer(), is_real(), is_long(), is_float(), is_string(, is_arrayQ) eis_object(). Todas estas fungdes retornam verdadeiro se a varidvel for do ti ipo Perguntado e falso em caso contrario, Capitulo 3 Variaveis 3.1. Definicao Uma varidivel é uma posigfio nomeada da memaria como mostrado na Figura 2 ou, de outra forma, varidveis so os espacos da meméria utilizados Para guardar valores que podem ser modificados pelo programa. Nome da variavel Enderecodavariével Contetido da meméria $valor 259 > 45 Figura 2. Relagdo de uma varidvel com a meméria A criagio de uma varivel corresponde & ago do sistema reservar um determinado espago na meméria, do tamanho adequado para guardar o dado desejado, O tamanho do espago que cada varidvel vai utilizar na memoria depende do seu tipo (ver capitulo 2), porém, como a tipagem no PHP é dinamica, as varidveis ndo precisam ser declaradas antecipadamente, Ela é Criada no momento em que é feita a primeira atribuigao. o tipo dessa varidvel ee OOOO 18 » Fale a linguagem da Internet « PHP Orlentado a Objetos serd definido automaticamente de acordo com o valoratribuido. Tecnicamente esse conjunto de agdes é chamado de alocagiio de meméria. 3.2. Nomes de variaveis ‘Toda varidvel no PHP deve ter seu nome inicializado pelo caractere "$" ¢ apés ele, vem uma seqiiéncia de caracteres que deve ser iniciada por uma letra ou pelo caractere Exemplos: $valor_1 = 36; $valor_2 = 45; soma = $valor_l + §valor_2; Como o PHP € "case sensitive", uma letra maitiscula é diferente de uma mintiscula, tradicionalmente, os programadores utilizam letras mintsculas para compor 0 nome das varidveis e maitisculas para compor 0 nome das constantes, fato produtivo pois, diferencia as varidveis criadas pelo programador das inerentes linguagem, que possui muitas varidveis predefinidas cujos nomes sao compostos por letras maitisculas. 3.3. Escopo das variaveis Oescopo de uma varidvel é 0 tempo de vida dela, o que esta diretamente relacionado com 0 médulo do programa no qual ela ¢ visfvel ou acessivel. O escopo varia de acordo com 0 local onde ela foi declarada. Conforme o resumo mostrado na Tabela 4, as varidveis podem ser declaradas em trés lugares bisicos que definem 0 seu escopo: * no programa principal — desta forma se tornam acessiveis por todo 0 programa e pelas fungées, por este fato sio chamadas de globai: * dentro das fungées - 0 que as torna visiveis (ou acessiveis) somente para a fungaio que as criou, assim que a fungio for encerrada este tipo de varidvel morre; Varldvels = 19 * na lista de parimetros — uma c6pia da varidvel (valor) ou o seu enderego (referéncia) é enviado para a fungiio chamada, [Local da deciaragio Escopo_ Dentro das funcdes Varidvels [ocais E [Fora de todas as fungdes Varidveis globai Na lista de parémetros das funcées_| Parémetros formais Tabela 4, Escopo das varidveis 1. Varidveis locais As varidveis locais stio declaradas dentro de uma fungio e sé podem ser referenciadas por comandos que esto dentro do bloco no qual estiio. declaradas. Uma variavel local é criada no momento da sua declaragiio e destrufda na safda da fungio. function fune1(){ $x = lor ) function fune2(){ $x = -199; ) Neste exemplo, pode parecer que a varidvel inteira $x 6 declarada erroneamente, duas vezes, uma vez em func 1()e outraem func2(), porém, 0 $x em func1() nao tem nenhuma relagao ou correspondéncia com 0 $x em func2( porque esto em blocos de cédigos diferentes. Cada fungdio tem seu préprio escopo. 3.3.2. Varidveis globais Ao contrario das varidveis locais, as varidveis globais sfio declaradas fora das fungées e reconhecidas pelo programa inteiro, assim, podem ser utilizadas em qualquer ponto do cédigo do programa, oor <- ~ °° X—_—_ — 20 - Fale a linguagem da Internet - PHP Orientado a Objetos §iconta=340; function teste()¢ conta = 100; echo "0 valor de conta é ",§conta; ) weste(); //imprime "O valor de conta 6 100" Caso exista uma varidvel global e uma local com o mesmo nome, a varidvel com 0 escopo local € acessada prioritariamente ali. function teste()( waurante: §z<br>"; wantes + $z<br>"; beste(); echo “depois : $z<br>"; Resultado antes: 3 durante: 5 depois: 3 3.3.3. O modificador de escopo 'global' Uma varidvel de escopo global pode ser utilizada no interior de uma fungao (escopo local), porém, € necess4rio explicitar esta intengdo através do modificador global, que pode conter diversas varidveis, separadas por virgulas. function globo() ¢ global $valor, res, @cho ‘valor inicial: '.$valor.', resultado: '.§resy ) fvalor = 1007 , fires = 10 * Svalory globo.) Varidveis - 2 1 Uma outra maneira de acessar as varidveis de escopo global dentro de uma fungi é utilizando um array predefinido pelo PHP cujo nome é SGLOBALS|]. O indice para a varidvel referida é 0 proprio nome da varivel, sem o caractere $. O exemplo abaixo produzird o mesmo resultado do anterior. valor = “varidével global"; function globo()¢ echo $GLOBALS['valor']; ) @lobo(); 3.3.4. O adaptador de escopo ‘static! Uma varidivel quando precedida pelo modificador static dentro de uma fuungiio é chamada de estética, porque é visivel naquele escopo local, mas 6 inicializada apenas uma vez.e seu valor no é perdido quando a execugiio do Seript deixa esse escopo, function teste() ¢ wtatic $z = 0; @cho “a varidvel z vale: §z<br>"; gaees ) O valor das varidveis declaradas como estaticas é mantido ao terminar a @Xecugiio da fungaio. Na proxima execugao da fungao, ao encontrar novamente A declaragio da varidvel, precedida pelo modificador static, o ultimo valor daquela varidvel sera recuperado. Portanto, uma varidvel declarada com esse Modificador tem o mesmo "tempo de vida" de uma varidvel global, porém, Sun visibilidade é restrita ao escopo local no qual foi declarada. Para testar o exemplo acima, no esquega de chamar a fungdo mais de Wma vez no mesmo script. // Amprime "a varidvel = vale: o” // Ampedme "a varidvel = vale: 1" 22 - Falea linguagem da Internet - PHP Orientado a Objetos 3.3.5. Varidveis varidveis O PHP tem um recurso conhecido como variaveis varidveis, ilustrado na Figura 3, que consiste em varidveis cujos nomes também so varidveis. Sua utilizagio € feita através do duplo cifiio ($$). $a = “simples; $$a = “dupla"; A forma de escrever pode variar como segue: ga = "simple: $simples = "dupla* Este conceito se assemelha aos de ponteiros da linguagem C/C++, pois, considerando que o nome de uma varidvel é 0 apelido do seu enderego, 0 conceito de varidvel do item 3.1 remete ao conceito de ponteiros: "...posigio nomeada da mem6ria...", portanto, $a aponta para o contetido "simples", que por sua vez aponta para o contetido "duplo". Nome da variével Enderego da meméria Conteddo da meméria sa 201 (ficticio) + simples $$ ou 300 (ficticio) + dupla Ssimples Figura 3. Relagdo das varidveis varidveis com a meméria 3.4. Variaveis externas ao PHP Para produzir uma navegacio interativa, a linguagem Web nativa, que 0 HTML, deve se comunicar com 0 PHP enviando informagdes através de varidiveis, Essas varidiveis podem ser criadas de duas formas; 1) escrevendo- através de formuldrios as literalmente no enderego Web chamado e 2: Varidveis - 23 compostos por campos preenchidos pelo usuario. Nos dois casos, as 20 script PHP através da chamada da pagina (URL) por meio do navegador. informagées sto enviadas p 3.4.1. Os métodos de interagao Os navegadores transitam estas informagdes baseados em dois métodos: GET e POST: O primeiro, agrega os nomes das varidveis e seus respectivos valores concatenando essa lista ao final do enderego (URL) buscado, tornando os nomes ¢ valores das varidveis vis{veis ao usuario. J 0 método POST, transmite todas as informagdes de entrada do <FORM> para o script PHP em um bloco de dados enderecado ao URL, de forma que o usudrio nao as veja. O método GET, pelo fato de passar a lista de varidveis agregada ao final do URL, permite que 0 ususrio escreva essas varidveis e seus respectivos valores como no exemplo abaixo: Www. din.uem.br/sica/teste.php?varl=33évar2=65 O script teste.php recebera duas varidveis (varl e var2) com seus fespectivos valores ¢ deverd capturd-las através do array predefinido §_GETL], cujos indices so os nomes das variéveis passadas: Qvariavell = § cET['vari‘}; Wvariavel2 = $_cET{'var2']; Preferencialmente a esta técnica manual, vem a utilizagiio de formulérios, {ue siio delimitados pelas tags HTML <FORM></FORM> (ver capitulo item 18.11). Neste caso, o programador pode optar entre o método GET ou POST, Quando os dados sio enviados para um script PHP, todas as varidveis do formulario silo automaticamente disponibilizadas para o script, através do array $_GET[] ou $_POST(], cujos fndices stio os nomes das varidveis, $variavell = § post['vari'}; $variavel2 = §$ post('var2'}; Os contetidos dessas varidveis sZio Passados no formato URLencode, que € obtido substituindo os espacos pelo caractere "+" € todos os outros caracteres nao alfanuméricos (com excegiio de "_")pelo caractere "%", seguido do cddigo ASCII em hexadecimal, Porexemplo,o texto "UEM - DIN" em urlencode fica"UEM+%2D+DIN" O PHP possui duas fung6es para tratar 0 texto no formato urlencode. string urlencode(string texto); string urldecode(string texto); Essas fung&es servem respectivamente para codificar ou decodificar um texto passado como argumento, 3.4.2. Configuragiio das varidveis Como 0 interpretador PHP é instalado no servidor (; geralmente em um Provedor) sua configuragao depende dele e a forma como uma variavel chega a0 script, depende também dessa confi iguraciio. Existe um arquivo chamado php.ini onde stio armazenadas as configuragdes utilizadas pelo interpretador, neste caso especifico, a configuracao é feita através da diretiva "register_globals" que pode receber On ou Off. No primeiro caso (register_globals =On), as varidveis criadas na linha do enderego URL ou em um elemento de um formulério HTML, quando Submetidas a um script PHP, criam uma varidvel cujonome éo mesmo nome do elemento. fvariavell = gvari; variavel2 = $var2; Varidvels = 25 ' técnica, apesar de mais fécil, oferece algumas desvantagens: o Programa fica menos portavel, menos estruturado e, além disso, deixa os seripts Na forma padriio, essa diretiva é configurada como Off, exigindo que o programador utilize arrays especiais para receberas varidveis is vulneré veis a ataques. _GET['varl']; fvariavel1 = ¢ = $_GET['var2"]; $variave12 Nas versdes anteriores a 4.1.0 deve-se utilizar respectivamente SHTTP_GET_VARS['var']e SHTTP_POST_VARS['var']. 3.4.3. A utilizagaio de Forms Um campo definido como <input type="text" name=' 18.11.4.1) a0 ser submetido a um script PHP faré com que seja criada uma ‘cidade"> (ver item Varidvel com o nome $cidade acessivel globalmente, caso esta opgio esteja Configurada no arquivo php ni. Porém, por seguranga, em geral essa opeo fica desabilitada e neste caso, deve-se utilizar os arrays ptedefinidos pelo PHP ($_GETe $_POST) cujos indices siio og nomes das varidveis criadas no <FORM>, portanto a varidvel descrita acima deve ser acessada preferencialmente através do array $_GET['cidade'] ou $_POST['cidade'] dependendo do método especificado no formulério. Napritica, deve-se utilizar o c6digo HTML abaixo paracriar um formulério © 0 cOdigo PHP para receber ¢ trabalhar com a varidvel enviada pelo formulétio. . HTML $fGm Seton tseu_scrint php" mathoda"post* enctypestmiltipart /form-data*s <input type="text" name="cidade"> <input type="submit" values"Enviar"> </form> 26 - Fale a linguagem da Internet - PHP Orientado a Objetos é.. PHP <?php $cidade = §_posT['cidade']; echo $cidade; 3.5. Variaveis de ambiente As varidveis de ambiente so ajustadas no momento em que 0 servidor executa um script solicitado, Existem dois tipos: as com valores independentes da requisigiio, contendo informagées basicas, ¢ as que variam com cada execugio do script. As varidveis $PHP_SELF e $PATH_INFO, por exemplo, contém o nome eocaminho do arquivo do préprio script. Outras contém informagdes sobre o navegador do usuario, o servidor http, a versio do PHP etc. Para obter uma listagem de todas as varidveis e constantes de ambiente e seus respectivos contetidos, deve-se utilizar a Fungo PHPinfo(). 3.6. Destruindo uma variavel explicitamente Osistema do PHP destr6i cada varidvel sempre que necessario, porém, é possivel desalocar uma varidvel através da fungao unset(), que libera ameméria eretorna verdadeiro caso a operagiio seja bem-sucedida. Exemplo: fa = echo $a; 1) imprime "3" unset ($var); echo $a; 1/ nfo imprime 3.7. Verificando se uma variavel possui um valor Existem dois tipos de fungdes que podem verificar se uma varidvel foi criada ou inicializada (usualmente conhecida como ligada); a fungiio isset() ¢ a fungiio empty(), Varidveis - 27 ott A fungiio isset() retornard verdadeiro se a varidvel contiver al: gum valor (estiver ligada, ainda que com uma string vazia ou o valor zero) e falso em caso contrario. Exemplo: Um campo Form nao foi preenchido e 0 script recebe o campo nao inicializado, A£ (tisset($_posT[‘cidade']) echo “o campo cidade néo foi preenchido"; A fungdo empty( retornard verdadeiro sea varidvel nfo contivernenhum valor (nao estiver ligada), possuir um valor 0 (zero) ou uma string vazia. Caso contrario, retornard falso. Af (ompty($_POsT{'cidade']) echo "o campo cidade nao foi preenchido"; Capitulo 4 Constantes 4.1. Definigao Por definigéo, uma vez associado um valor a uma constante, o mesmo. nao poderd mais ser alterado, além disso, uma constante s6 pode conter _ valores escalares, sendo proibidos arrays ¢ objetos. Para definir as constantes utiliza-se a fungzio define() que espera receber dois parmetros: o nome e o valor da constante apés sua execugaio, Retomara yerdadeiro se for bem-sucedida e falso caso contrario. Exemplo: define ("PI", 3.1415926536)7 | $raio = 3; $circunf = 2*PI*$raio; echo $circunf; // imprime 18.8495559216 Emcontraste com os nomes das varidveis, utiliza-se tradicionalmente letras _ maitisculas para compor os nomes das constantes. BIBLIOTECA UNIVATES: Lajeado la Iinguqyem da Internet » PHP Orlentado a Objetos 4.2. Constantes predefinidas O ambiente do servidor PHP possui algumas constantes predefinidas, indicando, por exemplo, a versio do PHP, 0 Sistema Operacional do. servidor, © arquivo em execugio etc, Como citado no item 3.5, & possfvel enxergar todas as constantes predefinidas através da fungdo PHPinfo(), que exibe uma tabela contendo todas as varidveis ¢ constantes do sistema. Capitulo 5 Operadores 5.1. Atribuicao 40, a operagao ¢ feita entre os dois operandos antes da atri buigéio, send ~ altibufdo o resultado da: operagao ao primeiro operando, especificado esquer Alaatribuigfo. A atrbuigtio€ sempre por valor, nio por referéncia, 4 Operador [Reso = atribuigao simples atribuicdo com adiglo atribuigéo com subtraci atribuigso com multiplicagio ‘atribuico com diviséo atribuigso- com médulo atribuico com concatenagio Tabela 5. Operadores de atribuigao Exemplo: fe- 7, fa += 2) // $a passa a conter o valor 9 32 = Fale tinguagem da internet - PHP Orlentado a Objetos 5.2. Aritméticos Os operadores aritméticos, mostrados na Tabela 6, sio aplicdveis somente aos tipos numéricos (integer ou float). Se forem de outro tipo, teraio seus valores convertidos automaticamente ou explicitamente de acordo com as regras descritas no item 2.2, antes da realizagao da operagio. Operador [Acao ‘Subtragio, também menos undrio Adicao_ MultiplicacSo_ Diviséo Médulo da divisdo (resto) Tabela 6. Operadores aritméticos Existem dois operadores especiais chamados undrios (Tabela 7) de incremento e decremento Operador | Agio. = incremento = decremento. Tabela 7. Operadores undrios Podem ser especificados de duas formas: antes ou depois da varidvel. Quando utilizado antes, retornao valor da varidvel antes de incrementé-la ou decrementé-la, Quando utilizado depois, retorna o valor da varivel ja incrementado ou decrementado, Exemplo: $a = $b = 10; 11 Ga @ $b recebem o valor 10 echo "$a - $b - $c - $acbr>"; // imprime 10 - 10 ~~ $e = gate; 11 Sc recebe 10 @ $a passa a ter it $d = +48b; 11 $0 recebe 11, valor de $b 34 incrementado echo “$a - $b - $c - gan; W Smprime 11-11 = 10 - 11 A ordem de precedéncia dos operadores aritméticos é mostrada na Tabela 8, Operadores « 33 Mais ata [a == = (menos unério) % Mais baixa | +, - Tabela 8. Ordem de precedéncia dos operadores aritméticos 5.3. Légicos __ Também conhecidos como operadores bit a bit (Tabela 9), so muito ilizados para operar ntimeros inteiros representando valores booleanos, mas Se aplicam a qualquer tipo. ‘Operador ‘Agao. ‘&(ou AND) le. LI (ou * ou OR) | ow You =) ‘ndo (inversio) A ‘ou exclusiva, Exempio. Andlise: Variavel_| Decimal | Bindrio $b = 35; b 35 (0010 OOnt [$c= 1287 c 128 | 1000-0000 $a= $b [$c [a 163 | 10100011 Tabela 9. Operadores logicos 5.4, De deslocamento de bits Em aplicativos cientificos, é muito comum a utilizagdo de operagdes que slocam os bits de um valor para a esquerda ou para a direita (Tabela 10), niimero de vezes que os bits vio ser deslocados deve ser especificado, ‘Operador [Aci >> Desloca para a direita <2 Desloca para a esquerda Tabela 10. Operadores de deslocamento de bits Exemplo: ja = 32; // a = 32(decimal), 0010 0000 (bindrio) b= $a >> 27 // bd = B(decimal), 0000 1000 (bindrio) 34 ~ Fale a linguggom da Imeret - PHP Orientado a Objetos Resultado: Deslocou todos os bits 2 (duas) vezes para a direita Deslocar os bits de um valor uma vez para a esquerda significa jicar o nimero por2e deslocar para a direita 60 mesmo que dividir esse ntimero por 2. 5.5. Relacionais (comparacio) As comparagées sao feitas entre os valores contidos nas varidveis ou constantes € no entre as suas referéncias. Uma comparagiio sempre resulta em um valor booleano simulado. Qualquer valor diferente de zero é considerado verdadeiro e zero, falso. Ou seja, uma consulta como na expressio: (5 * 16 - 32 / 98 * 2) >= 2) produz um resultado verdadeiro, ATabela 11 lista os operadores l6gicos relacionais implementados no PHP. ‘Operador | Acdo Resultado: Igual Diferente, Tdéntico (a === $0) verdadeiro se $a for igual a $b e eles forem do mesmo tipo (PHP 4 ou maior) Nao idéntico (ga == $6) verdadeiro se $a for diferente de $b ou eles nao forem do mesmo tipo (PHP 4 ou maior) > Maior que SS Maior que ou igual < ‘Menor que, <= ‘Menor que ou igual Tabela 11. Operadores relacionais Observe que o simbolo da relagao de diferenca é composto pelo sinal de igual (=) precedido pela negagio (!). ne Operadores ~ 35 Os resultados destas operagdes podem ser combinados utilizando os operadores l6gicos Ee OU listados na Tabela 12. ‘Operador [ Acso B& E I Ou Tabela 12, Operadores légicos atuando sobre os relacionais Eixemplo: (a > $b) Be ($e < 0)) Aordem de precedéncia destes operadores, conforme a Tabela 13, é: Maior Menor Tabela 13. Ordem de precedéncia dos operadores relacionais . Concatenacio iste apenas um operador de concatenagiio e ele € exclusivo das Ges realizadas com strings, o ponto (Tabela 14). ‘Operador_[ Agia : ‘concatenacio Tabela 14. Operador de concatenagao le concatenagao"; // imprime “teste de concatenacéo"; . : Capitulo 6 Estruturas de comparagao O PHP suporta duas categorias de estruturas de ‘comparagao', chamadas \bém de ‘decisfio' ou 'selecao': if e switch. Além disso, 0. operador ternario uma alternativa ao if em certas circunstancias. 1, Estrutura "'se/senio" -A forma geral da sentenga que utiliza o comando em inglés if é: (@xpressio) comando1; Onde 'comando' pode ser um tinico comando, um bloco de comandos ou (embora possa parecer curioso para o leitor, o caso de comandos vazios te). Aclausula’else' é opcional. ‘Se a expressio for verdadeira (diferente de 0), o comandol (ou bloco Imandos) sera executado; caso contrario, o comando2 (ou bloco) sera ‘utado. Nunca ambos. 38 ~ Fale a Inguagem da internet - PHP Orlentado a Objelos 6.2. O Encadeamento se/senio/se Umaconstrugiio comumem programagio é 0 encadeamento if-else-if. Oseguinte exemplo ilustra esta construgao: 4£( condigaoi ) declaragio; elseif( condig&o2 ) declaragao; elseif( condigao3 ) declaragio; else declaracioy As expresses condicionais so avaliadas de cima para baixo. Assim que uma condi¢io verdadeira é encontrada, a declaragio associada a ela é executada € o resto do encadeamento é ignorado, Se nenhuma das condigées for verdadeira, entdo entra em acio o else final, que atua como uma condigaio. padrio; isto é, se todos os testes condicionais falharem, a tiltima declaragio else ser executada. Se 0 else final nao estiver presente ¢ todas as outras condigdes forem falsas, entdo nenhuma agio seré realizada. 6.3. Operador ternario "2" O operador terndrio ? trabalha da seguinte forma: expressac 7 valor_caso_verdadeiro : valor_caso_falso; Se a expressiio for verdadeira, retornard valor_caso_verdadeiro, caso a expressio seja falsa, retornard valor_caso_falso. Noexemplo: $x = $y > 0 7 Sy: OF 0 trecho de cédigo mostrado atribui & varidvel $x um valor de acordo com a expresso "$y > 0", ou seja, se $y for maior que 0 (zero), $x receberd truturas de comparaglo = 39 © proprio valor de $y, porém se $y for um valor negativo, $x receberd 0 (zero), Veja como ficaria o mesmo exemplo em um cédigo convencional: Af(fy > 0) $x = syr else $x = 07 ‘Um segundo exemplo mostra como resumir uma expressio if-else (Ga >= 0) $z = -99; $2 = 997 __ A forma simplificada deste trecho, utilizando 0 operador temnétio 2, fica “fissim: i= Ga > 07 -99 : 99; 6.4. Comparacées com 0 "switch/case" \ __ OPHP tem ainda um comando de selegdo com miiltiplas opgdes: o switch. la estrutura testa sucessivamente o valor de uma expressiio, comparando “Oresultado dela com uma lista de constantes inteiras ou de caracteres. Quando 0 valor coincide, os comandos associados aquela constante s%0 executados, A forma geral do comando switch é: witch (expresséo) { seqiéncia_de_comandos; break; case constante2: seqiléncia_de_comandos; breaks case constante3: seqiéncia_de_comandos; breaks default: seqiéncia_de_comandos; 0 = Fale a Mnguagem da internet « PHP Ortentado a Objetos A declaragaio default é opcional e corresponde a "nenhuma das altemnativas anteriores", O comando break (veja detalhes no item 8.1) € um dos comandos de desvio do PHP, ao encontré-lo, 0 ponto de execugiio salta para o préximo comando apés 0 bloco do comando switch, delimitado pelo fecha chaves. A tiltima seqiiéncia de instrugGes, a do bloco default, nao precisa ser delimitada pelo break Porque o sinal de fecha chaves realiza esta tarefa, encerrando a estrutura do comando switch, Se, por exemplo, o break da seqiiéncia de comandos pertencentes A Constante2 nao existisse e essa constante fosse selecionada, os comandos da Constante3 também seriam executados até que o break fosse encontrado ou estrutura switch fosse encerrada, Exemplo: switch ($var) ¢ case case case case case casi case case case case oO: a: 2: 3t 4a: St 6: 7: 8s 9% echo “o niimero esté entre 0 ¢ 9”; break; default: echo “o numero esté fora da faixa”; Capitulo 7 Estruturas de iteragao (lagos de repeticao) As estruturas de iteragiio ou lagos de repetigaio (Figura 4), permitem que ‘terminado conjunto de instrugGes seja executado até que determinada Condicao seja satisfeita. Essa condigdo pode ser um ntimero de repetig¢des lefinido, como no lago ‘para-faga’, ou uma condi¢éio genérica, como nos rs ‘enquanto-faga' e ‘repita-até’, _— Bloco de insrugdes Figura 4, Lago de repetigto fe a Mnguiagem da tnternet « PHP Orlentado a Objetos 7.1. "para-faga" Ocomando da linguagem que implementa esta estrutura é 0 'for', do inglés, ‘para’. Bumaestrutura de Tepetigdo que tem o nimero de ocomréncias definido previamente. Sua forma geral é: for (inicializagso; condigéo; incremento) sequénci, comandos; A inicializagao ¢ feita por um comando de atribuigao usado para colocar um valor na varidvel de controle do Tago. Acondigio é uma expresso relacional que determina quando 0 lago acaba, Muito CUIDADO deve ser tomado no ‘estabelecimento dessa. condigao, pois ndo se aceita o operador relacional ‘ somente os seguintes: "|=", '<', '>', ‘<='e'>=', porque a relagiio é estabelecida pela palavra-chave 'enquanto’, por exemplo: repita enquanto $i < 19, Oiincremento define como a varidvel de controle do lago varia cada vez que 0 lago é repetido. Na verdade, esse incremento. pode ser um decremento Caso 0 valor da inicializagZo seja maior que o critério de parada, Além disso, pode ser inteiro ou real. Estas trés segdes principais devem ser Separadas por: pontos-e-virgulas. Uma vez que a condi¢ao se torna falsa, a execucdo do programa continua no comando seguinte ao for. Exemplos: for ($i = 0; $4 < 10; sits) {) // repete enquanto menor que 10, 11 portanto, de 0a 9 for ($i = 07 $4 < 10 $ine0.5) (77 repote enquanto menor que 10, // portanto, de 0 a 9.5 for ($e = 107 $x > 0; $x) {2 // repete enquanto maior que 0, // portanto, de 10 a 1 Estruturas de Neragio (lagos de repetigtio) ~ 43 € permitido que duas varidveis controlem o Iago, para tanto se usa o ‘Operador virgula que denota a necessidade de duas agées. for (Hx = 0, $y = 0; Sxegy < 20; +4$%) (0.03 Supondo que a varidvel de controle jé tenha sido definida e inicializada, pode-se criar um lao ‘for’ sem a parte de inicializagio das variaveis de “Controle. Or (5 $x < 97 Ste) ¢ € possfvel também, criar um lago infinito que executaré 0 bloco de Conclusio, qualquer um dos parmetros de for pode ser suprimido sem Auretar erros de sintaxe, Exemplo 1: Escreve a tabuada do 7. b= 77 ($i = 1; $i ce 10 5 give) echo $tab."*".$i."a" $isgtab.ucbrom, Exemplo 2: Escreve as tabuadas dos ndmeros 2a 10, lor (Stab = $min; stab <= $max; gtab++) for ($1 = 1; $i <= 10; gis) echo $tab."*",$i.wa" $ivstab.mebron, 44 ~ Palo a inguagem da Internet « PHP Orlentado a Objetos Estruturas de lerago (lagos de repetigo) = 4S Hmenor-0, " " 7.2, "enquanto-faca' Miiieress0, 1a geral: ae foolsius = 5 * ($£ahr-32) / 9; 4£(§fahr == 0) $£ahr = ‘000'; while(condigéo) comando; A£(($fahr >= 10) Ge ($fahr <= 90)) Sfahr = ‘0'.$fahr; echo $fahr.' || *.$celsius.'<br>"; Sfahr = $fahr + 10; Onde ‘comando' pode ser um comando vazio, um comando simples ou ($fahr <= §maior) um bloco de comandos. Accondigao pode ser uma varidvel ou uma. expressao cujo resultado sera avaliado, O lago se repete enquanto a condigao é verdadeira. Quando for falsa, o controle do programa passaré para a linha apés 0 cédigo do lago. Oexemplo abaixo calculaa temperatura em graus centigrados com base Nos graus fahrenheit dos ntimeros compreendidos entre 0a 300, ; $menor=0; $maior=300; $fahr = menor; while ($fahr <= gmaior) { $celsius = 5 * (sfanr-32) / 9; 4£($€ahr == 0) $fahr = ‘000"; Af((Sfahr >= 10) ee ($fahr <= 90)) $fahr = *0'.$£ahr; echo $fahr.* || '.$celsius.*<br>'; Sfahr = §fahr + 10; 7.3. ''faga-enquanto" Ao contrério do lago fore while, o lago do-while testa a condi¢ao no final do lago. Isso significa que 0 laco é executado obrigatoriamente uma vez ao menos. Forma geral: do ¢ comandos; } while (condicao); O lago do-while repete 'comandos' até que a 'condigiio' se torne falsa. — Ul Capitulo 8 Comandos de Desvio 1, Break Ocomando break tem dois usos: terminar um comando switch ou forgar inagdo imediata de um lago de repeti¢iio, ignorando o teste condicional jal do lago. O exemplo abaixo, ilustra o funcionamento do switch (item 6.4) sem o k. Se constante1 for selecionada, somente a seqiiéncial de comandos. executada. Porém, se constante2 for selecionada, todas as préxima. \éncias (2, 3 e default) serfio executadas. Se constante3 for selecionada, iéncia3 ¢ a referente ao bloco default, sero executadas. ch (expresséo) ( @ constantel: seqiéncial_de_comandos; ak; ease constante2: seqiéncia3_de_comandos; 48 - Fale a linguagem da Internet - PHP Orientado a Objetos default: seqiéncia_4e_comandos; Um exemplo com o comando break aplicado dentro de um lago de repetigdio é visto a seguir: for($t = 1; $t < 100; echo gt." ") if (§t == 10) break; sere) ¢ Este script escreve os nimeros de 1 até 10 na tela do navegador. O lago termina porque o break provoca uma saida imediata do lago, desrespeitando 0 teste condicional t< 100. Resultado: 12345678910 8.2. Continue Ocomando continue trabalha de forma parecida com break. A diferenga € que enquanto o comando break provoca 0 término do lago, o comando continue, forga o fluxo do programa a passar para a proxima iteragiio, pulando qualquer cédigo que houver entre ele ¢ 0 final do bloco de cédigo do lago. for ($im0; $i<10; $i++) Svet [$i] = Siz for ($i=0; $i<10; $i++) ( Af (Svet{$i] == 0)¢ echo " 0 ‘continue’ continue; echo “ndéo passa por aqui<br>"; evita a divisio por zero<br>"; > $vet [$i] =1/$vet [$4] 1/ inverte o valor guardado; echo "1/".$i." = ".$vet [$i] <br>") Comandos de Desvio~ 49 Repare que 0 comando else nio foi necessério, porque o continue se encarrega de saltar as préximas linhas de comando. Resultado: © ‘continue’ Mt= 2 1/2 = 0.5 evita a divisdo por zero 73 = 0.333333333333 /4 = 0.25 15 = 0.2 0.166666666667 0.142857142857 0.125 O.azaaaiiiai41 Capitulo 9 Funcoes definidas pelo usuario ‘Uma fungiio é um trecho de programa delimitado, que executa uma agiio ica, Em geral, isola-se 0 trecho do cédigo em uma funciio quando o mesmo ue ser utilizado mais de uma vez, ou ainda, por questées de portabilidade. intaxe basica para definir uma fungio é: home_da_fungéo( [lista de parametros]) { 0) «valor de retorno>]; er C6digo PHP valido pode estar contido no interior de uma fungao. lecagem de tipos no PHP é dinamica, o tipo de retorno nao deve ), Sendo necessdrio que o programador esteja atento para que a ie 0 tipo desejado, 52 » Fale a linguagem da Internet » PHP Orlentado a Objetos 9.2. Valor de retorno Toda fungao pode opcionalmente retornar um valor. Esse valor é retornado através do nome da fungao, fato que o torna semelhante ao de uma varidvel. O valor € atribuido no corpo da fungiio, com a utilizagao do comando return. O comando return é utilizado para encerrar a execugio de uma fungao e retornar ao chamador, que pode ser o programa principal ou outra fungio. Asintaxe geral é: return expressao; A palavra "expressao" é opcional e pode representar uma expressiio ou uma constante. Se ela estiver presente, uma atribuicao ser feita ao nome da fungio como se ela fosse uma varidvel e o resultado da expressiio se tornard o valor de retorno da funcio. O programador pode utilizar quantos comandos return forem necessarios dentro de uma fungio, contudo, a fungio seré interrompida to logo encontre o primeiro. Exemplo: case 2: return $a / 2; default: return 0; Nao € possivel que uma fungio retorne mais de um valor, mas é permitido fazer com que uma fungao retorne um valor composto, tal como, listas ou arrays. Fungées deftnidas pelo usudrlo~ 53 9.3. Pardmetros de entrada Os pardmetros sio as informagées que a fungio precisa para realizar determinada tarefa. Esses parametros siio passados pelo cédigo que chama ‘fungzio e dentro dela, eles se comportam como varidveis locais. Exemplo: notion imprime($texto) echo $textos rime ("teste de fungdes com parametros"); E possfvel, portanto, passar parmetros (ou argumentos) para uma funciio. tanto, devem ser declarados logo apés 0 nome da fungaio, entre nteses, € tornam-se varidveis pertencentes ao escopo local da fungio. 4, Passagem de parametros por valor : ‘Na passagem de parametros por valor, é possivel passar uma constante 0 valor de uma variavel. Neste segundo caso, 0 c6 igo da fungao pode izar essa importéincia sem que 0 contetido: original da varidvel seja alterado. Exemplo: ction soma(gnumero) { $numero += 5; //apés a execugao, $a continua valendo 3 No exemplo acima, como a passagem de parimetros é por valor, a fungiio ja € intitil, j4 que apds a execuciio sair da fungdo, o valor anterior da idvel 6 recuperado. 54 ~ Palo. inguagom da Internet » PHP Orlentado a Objetos 9.5. Passagem de parAmetros por referéncia Passar um pardmetro por referéncia significa passar o endereco na memoria daquela varidvel. No exemplo anterior, sea passagem fosse feita porreferéncia, a varidvel $a teria 8 como valor. Existem duas maneiras de fazer com que uma fungiio receba parametros passados por referéncia: 1) indicando na declaragiio da fungzio que se espera receber um enderego ¢ nfo um valor, o que faz com que a passagem de parmetros seja sempre por referéncia, ¢ 2) na propria chamada da fungao pode-se especificar que o chamador esté passando um enderegoe naoum valor. Nos dois casos utiliza-se o modificador". Oexemplo abaixo demonstra as duas situagdes: function soma(a$num1, §num2) ¢ $numl += 5; $num2 += 5; na declaragao dessa fungiio, o operador modificador &, precedendo o nome da varidvel, indica que o parametro passado sera sempre 0 enderego dela e nao seu valor, portanto, na chamada abaixo, a fungiio receberé o enderego de $a e 0 valor de $b ga = 3; $b = 5; soma($a, $b); echo "as$a, b=$b"; 11 imprime "a=8, b=5" Porém, é possfvel modificar essa definigdo indicando & no momento da chamada da fungao, criando uma sintaxe que chama a fungao passando os enderegos tanto de $a quanto de $b. fa = 3; §b = 5; soma($a, &$b); echo "a=$a, b=$b"; 17 Amprime "as8, b=10" Fungdes definidas pelo usudriow 5S 9.6. Pardmetros com valores predefinidos (default) 1 posstvel predefinir valores paraos argumentos das fungGes. Esses valores Serio assumidos no caso da fung3o serchamada sem que sejam especificados Afgumentos. Desta forma, quando algum parametro € declarado assim, a passagem do mesmo na chamada da fungiio torna-se opcional. finction teste(gvalor = “pré-definido")( echo §valor; Or // Aimprime *pré-definiao" ("outro valor"); // imprime “outro valor" Quando a fungdo tem mais de um parémetro, 0 que tem valor padr3io ve ser declarado por tiltimo, como no exemplo abaixo, notion teste2($cor, $figura = “circulo"){ @cho "$figura de cor §cor"; 2 (azul); // imprime “circulo de cor azul" ste2(marrom,quadrado); // imprime “quadrado de cor marron” Capitulo 10 Orientagao a objetos A computagao utiliza métodos de modelagem que nem sempre 10 similares aos modelos humanos. A orientagao a objetos (OO) sca conceitos que proporcionem uma aproximagiio do mundo real m a modelagem, da andlise até a implementagao computacional, Conceitos como a separaciio de dados e processos, a ocultagao dados através do encapsulamento, as facilidades de abstrair dados agdo de software sfio fortemente aplicados & orientagio a A utilizagao da linguagem PHP vem crescendo a cada dia no nario mercadolégico e os desenvolvedores vém criando softwares ofisticados, fato que direciona a linguagem para uma evolugdo. vii disso é o langamento da versao 5 com grandes suportes para Jentagiio a objetos. ea Mnguagom da Internet» PHP Orlentado a Objetoy 10.1. Conceitos basicos da OO 10.1.1. Objetos Objeto é uma unidade da qual queremos representar informagoes no sistema. Por exemplo, o ser humano€é freqiientemente representado através de informagées a seu Tespeito, que so guardadas em uma ficha cadastral. Esses dados representam um ser humano. m particular que ainda tem outras caracterfsticas ndo presentes nessa ficha. Por exemplo, as capacidades de andar, pensar, falar e outras, Os objetos siio constitufdos pelos atributos que o representam e pelas operagGes que eles realizam. Neste sentido, pode-se criar um paralelo com os seres humanos, exemplificando a cor, altura, peso entre outros como atributos, e andar, falar, pensar etc. como operagées. Um conjunto de atributos € conhecido por formar 0 estado de um determinado objeto. As OperagGes, que também sao conhecidas Por servicos ‘ou métodos, tém a fungiio de manipular 0 estado do objeto, 10.1.2. Ocultagiio de informagées (encapsulamento) A teoria da orientagio a objetos reza que o tinico meio de manipular o estado de um objeto é através das Operagdes associadas a ele. Dai, 0 conceito de ocultagio de informag6es, pois, os atributos no devem ser manipulados diretamente, mas somente através de fungGes especfficas para tal fim. Essas sim sio visiveis &, por este motivo, podem ser chamadas de interfaces. Um grande valor agregado a essa técnica é a visio da independéncia dos dados, pois, a implementagiio dos métodos pode ser alterada sem comprometer 0 uso do objeto ou mesmo modificar a forma de utilizagio. As fungdes também podem ser ocultadas através da técnica de encapsulamento vista no item 10.2.4, Onlentagdo a objetos « 59 10.1.3, Classes Uma classe é 0 agrupamento de objetos com caracterfsticas comuns, por Xemplo, o individuo pertence a classe de seres humanos. Nesse exemplo, ‘ida homem' é um objeto da classe 'humano’. Entenda-se por caracteristicas i Agrupamento de atributos e operagées, pois, todos tém cor, altura e pes ‘6, 16m disso, os humanos podem andar, falar e pensar. 1.4. Heranga Heranga é um mecanismo que permite que as caracteristicas comuns de Brupo de objetos diferentes sejam concentradas em uma tinica classe. 1s Classes, com nivel hierarquico superior, podem ser intituladas como ise-base, classe-mie, classe-pai, superclasse ou ainda outra atri buigio Se refira 4 sua superioridade. Jé as classes herdeiras, assim podem ser jadas, mas também, classe-filha, subclasse ou classe derivada, As classes derivadas herdam caracteristicas das superiores através do cionamento hierérquico, mas também criam as suas proprias iiaridades, por isto sio chamadas de especializagaio de uma superclasse. asse superior representa a generalizagiio das classes herdeiras. im exemplo é a superclasse ‘animal’, que agrupa caracterfsticas comuns j classes derivadas 'racional'e ‘irracional’. c 1.5. Polimorfismo b ’olimorfismo é a capacidade pela qual duas ou mais classes derivadas da 1 Classe-miie podem reescrever as operagées criadas na superclasse ‘anto, herdadas por elas. Nesse conceito, por serem reescritas, teriio rtamentos distintos, especificos de cada objeto da classe herdeira. 0s seres humanos fossem analisados como objetos, seria facil imaginar um contorno geral somos todos iguais, mas conhecendo-nos como sabemos que nem todos somos iguais. Somos entiio, objetos iguais, mas IBLIOTE UNIVATES: jieado CA 60 - Fale a tinguagem da Internet - PHP Orlentado a Objetos reagimos de forma diferente quando submetidos a situagGes iguais, portanto, somos polimorfos. 10.2. Implementacio da teoria OO coma linguagem PHP Pela possibilidade de criar e manipular novos tipos de dados baseados na teoria da orientagao a objetos, a linguagem PHP, principalmente na versio 5, pode ser considerada orientada a objetos. 10.2.1. Classes ‘Uma classe é um novo tipo de dado composto por um conjunto de varidveis e de fungGes relacionadas a essas varidveis. Para utilizar esse recurso, deve- se utilizar 0 criador de tipos class que permite colocar cddigo e dados em nivel de igualdade. Dessa forma, 0 novo tipo de dado criado terd varidveis, chamadas de "atributos da classe" e fungdes, chamadas de "métodos da classe". Oexemplo abaixo refere-se 4 sintaxe da versao 4 do PHP <br>"; function Mostravar(){ . echo §this->var; // 0 ponteiro this 6 explicado no item 10.2.3 y Exemplo na sintaxe do PHP 5 class NovaClasse( private $var = "minha primeira classe<br>"; public function mostravar(){ echo §this->var; d Orlentagéio a objetos = 6 1 10.2.2. Objetos Um objeto é uma instancia de uma: classe, em outras palavras, as varidveis Vivas do tipo de uma classe siio chamadas de objetos daquela classe e devem fer criadas pelo operador new que aloca meméria para 0 objeto e devolve o @nderego reservado para ele. bj = new Novaclasse; tho $obj->var; —// funciona no PRP 4 ou, se declarar public, no MEP 5 PMostravar(); // funciona nos dois porque a fungao 6 publica 2.3. O ponteiro $this _ Sempre que um novo objeto é instanciado pelo operador new, o que se Kém € uma referencia daquele objeto. Se ele for acessado através do préprio ieto, deve-se utilizar a varidvel $this, que é uma referéncia ao proprio objeto. 2.4, Encapsulamento (PHP 5) A programagiio orientadaa objetos, prevé a restrigtio de acesso a métodos iributos, atendendo a teoria da ocultagiio de informagaio. O objetivo é Oleger os dados permitindo seu acesso somente através de fungGes. Esta aunizacaio de acesso pode ser chamada de visibilidade ao invés de ‘apsulamento. _OPHP 5, seguindo as normas da. orientagao a objetos, oferece trés niveis rotegdo para implementar essa reg: ublic: todos tém acesso aos dados e fungGes ali definidos; Protected: os objetos daquela classe e das classes herdeiras tém acesso ios e funges ali definidos; Private: somente os objetos daquela classe tém acesso aos dados e fungdes linidos. De forma idéntica, tanto as fungdes como os atributos de uma classe devem edidos pela definicao de visibilidade (public, protected ou private) 62 ~ Fale a Inguagem da Internet - PHP Orlentado a Objetos e sé podem ser invocados de acordo com a regra estabelecida pelo encapsulamento descrita nos exemplos abaixo. Os métodos podem receber qualquer um dos trés niveis de encapsulamento, porém, aqueles que forem declarados sem a definigao de visibilidade serao considerados public, Exemplo: class classe_exenplo ( public $vari = 1; private $var2 = 2; public function imprime() ( ‘echo $this->var2; //veja explicagdo do ponteiro this no item 10.2.3 d » §variavel_objeto = new classe_exemplo(); Uma vez criado um objeto, é possivel acessar os atributos (varidveis internas as classes) e os métodos (fungdes-membros), ambos definidos na classe. Para tanto, deve-se utilizar 0 operador composto pelos sinais de ‘menos’ e de 'maior’ formando uma flecha'->'. A varidvel piblica $varl pode ser acessada por qualquer nivel do programa: $variavel_objeto->varl = 367 echo $variavel_objeto->varl; J/ altera o valor de $vari // Amprime o valor 36 A varidvel privada $var2 tem seu acesso proibido, a nao ser pelos métodos implementados na prépria classe: echo §variavel_objeto->var2; —// ocorre um erro aqui porque “1 $var2 6 privada Portanto, a Gnica forma de acessé-la é invocando a fungiio imprime(): $variavel_objeto->imprime(); J/ Amprime o valor 2 Orlentago # objetos = 63 Neste contexto, seria necessério criar uma fungiio especttica para alterar or seu function muda_valor($valor) ( $this->var2 = gvalor , ‘Testando: #variavel_objeto->muda_valor(3); variavel_objeto->imprime() ; 1 Amprime o valor 3 10.2.5. Heranca Uma classe pode herdar 08 atributos e métodos de outra classe de nfvel Superior usando a palavra-chave extends na declaragiio. Exemplo (em continuagao a0 exemplo do item anterior) eli classe_filha extends clas: private Soutra_var; public function outra_funcao(lista de parametros) ( » exemplot ) obj = new classe fi1ha; Sobj->imprime(); // 0 método imprime foi herdado da class. 10.2.6. Funcdes construtoras Toda classe pode ter uma fungiio que é executada automaticamente no _ Momento de sua instanciagao (sinénimo de criagio de um objeto), chamada de fungao construtora ou método construtor. Por ser chamado automaticamente sempre que um novo objeto é criado, esse método é _adequado para efetuar as inicializagées das quais 0 objeto possa vira precisar logo na sua criagao, portanto, antes de ser usado. ~ Nenhum grau de encapsulamento (public, protected ou private) deve ‘Ser declarado para esta funciio. Nas versdes do PHP 4, a fungdio construtora deve receber 0 mesmo nome - daclasse, jéno PHP 5, este método deve receber o nome exclusivo construct, 64 ~ Fale a Iinguagem da Internet - PHP Orlentado a Objetox precedido por dois underlines. Porém, 0 PHP 5 também est preparado para reconhecer uma fungdo que tenha o mesmo nome da classe como a construtora, caso nao haja uma nomeada como '_construct’. Exemplo paraa versio 4: elass ci; function ClasseTeste(){ echo “um objeto foi criado*; y y $obj_teste = new ClasseTeste; // imprime “um objeto foi criado”; Exemplos para a versio 5: class testel( public function __construct (){ echo “um objeto foi criado"; y y $obj_testel = new testel; ; // imprime “um objeto foi criado*; Umaconstrutora pode opcionalmente receber parametros como as outras fung6es, caracteristica que enriquece a classe. class teste2{ public function __construct ($objeto) { echo "0 objeto ".Sobjeto." foi criado"; y > §obj_teste2 = new teste2("cidade"); // imprime "0 objeto cidade 11 foi criadon As fungGes construtoras de classes superiores (classe-miie ou classe-pai) nao serdo chamadas automaticamente se a classe filha definir seu proprio método construtor. Para invocar a fungio construtora da classe-mae, deve ser feita uma chamada explicita para ela, através do especificador Orlentagiio a objetos = 65 parent::__construct(), a partir do construtor da classe-filha. Essa chamada pode ocorrer em qualquer momento da execucao da construtora da filha, ou Seja, pode-se escrever a linha que a invoca em qualquer trecho dentro da fungao construtora da filha, Exemplo paraa versio 4: lass Classemaet function ClasseMae($objeto) { §this->var = Sobjeto; ) Cone “Criando © objeto da classe mie: ".gthis->var.*<br>"; y ClasseFilha extends Classelfae{ function ClasseFilha($objeto) { parent::ClasseMae("Mée"); // chamaré a construtora da // classe mie Sthis->var = $objeto; 4 echo “Criando © objeto da classe filha: “.§this->var."<bro"; ) fobj = new ClasseFitha("Filha); // imprime "Criando © objeto da 11 classe mie: Mie" 11 "Criando 0 objeto aa ‘7 classe filha: Filha.* Exemplo para a versio 5: @lass ClasseMae( public function _construct(){ y *0he "erdando © objeto da classe mie. <br>"; eFilha extends ClasseMae( public function _ construct () ( Parent::_construct(); // chamaré a construtora da // classe mie echo “Criando o objeto da classe filha.; lobj1 = new Classemae(); // imprime "Criando © objeto da // classe mie." 66 ~ Fale a linguagem da Internet - PHP Orientado a Objetos $obj2 = new Clas: 11 imprime "cr: // classe mai 7] "Criando 0 objeto da 7/ classe filha." 10.2.7. Fungées destrutoras (PHP 5) O método destrutor ou fungaio destrutora, que é uma inovagiio da versio 5 do PHP, funciona de forma similar ao de outras linguagens orientadas a objeto, como o C++ e Java. O método destrutor sera chamado automaticamente assim que todas as refer€ncias para um objeto em particular forem removidas ou quando 0 objeto for explicitamente destrufdo pela fungiio unset(); Esse método deve receber 0 nome exclusivo destruct, precedido por dois underlines. Exemplo: class NovaClasse( public function __construct ($objeto) { Sthis->var = $objeto; print "Criando o objeto ".$this->var."<br>"; > public function _destruct() ( print "Destruindo o objeto: “.§this->var."<br>"; » fobj = new NovaClasse("Estado"); // imprine "Criando © objeto 7) Estado" unset ($ob3)7 1] imprime "Destruindo © objeto: 1) Estado" Como no caso dos construtores, os destrutores das classes-mies nio siio chamados automaticamente no momento da desalocaciio do objeto filho. Para invocar a fungao destrutora da classe-mie, é necessério fazer uma chamada explicita com a seguinte sintaxe: parent::__destruct(). Orlentagdo a objetos = 67 10.2.8. Polimorfismo (PHP 5) Por principio, objetos polimorfos siio objetos semelhantes que atuam de forma diferente, Para implementar tal princfpio, é necessario usar uma referéncia a um objeto do tipo da superclasse (ponteiro ou enderego) ea partir daf, o sistema pode decidir sobre qual método deve ser selecionado na execugio do objeto, de acordo com 0 tipo da classe derivada, durante a execugiio. Em outras palavras, o comportamento assumido por um método 86 sera definido durante a sua execugiio. Para implementar 0 polimorfismo é necessério trabalhar com classes abstratas. Conceito jé consolidado na orientagdo a objetos, uma classe abstrata nilo pode ser instanciada, pois, é utilizada apenas para criar um padriio a ser Seguido pelas herdeiras e, estas sim, poderiio ser instanciadas, Por exemplo, como mostrado na Figura 5, as classes ‘circulo' e ‘quadrado' herdam caracterfsticas da superclasse ‘figura’ que tem a fungiio ‘desenha’, Esta fungio sera reescrita em cada uma das subclasses. A classe-mie ‘figura’ deve ter a fungiio abstrata que, na verdade, nao desenhard a figura, mas as herdeiras reescrevendo essa fungiio de acordo com suas caracteristicas, 0 far’io. Cada objeto das classes-filhas respondera uma fungdo com o mesmo nome, porém, de forma diferente, de acordo com sua implementagio. Figura 5. Hierarquia de classes polimorfas 68 = Fale linguagom da Internet « PHP Orlentado a Objetos Os métodos das classes-filhas, que reescrevem 0 método abstrato da classe superior, deve ter o mesmo grau de encapsulamento ou inferior. Entende- Se 0 nivel public como o mais fraco ou inferior. Sempre que um novo objeto for criado ele tera o tipo ‘figura’, mas fara referencia a um dos objetos gerados a partir da subclasse 'circulo' ou ‘quadrado’. Para criar uma lista polimorfa, deve-se imaginar a criagdio de um novo Objeto circulo’e atribuir sua referéncia A posigdio de um array do tipo figura’, seqliencialmente, executar esta ago como objeto quadrado e atribuir sua referéncia a proxima posigiio do array (Figura 6). Ao invocar a fungio desenha através do comando array[i}->desenha(), nfio se sabe qual objeto est sendo realmente ativado, entao o sistema decide durante aexecugao a fungiio de qual objeto sera chamada. objeos es Figura 6, Lista polimorfa (elementos tipo Tfigura) Exemplo: (Osnomes das classes so precedidos por um T maitisculo, apenas para lembrar que é um tipo de dado criado pelo programador) abstract class T£igurat abstract protected function desenha(); ) @lass Tcirculo extends T£igura{ protected function desenha(){ echo "Bola"; » , @lass Tquadrado extends T£igurat Protected function desenha(){ echo "Quadro"; ) Orlentagio # objetos = 69 fobj = new Teirculo; fobj->desenha(); fobj = new Tquadrado; $obj->desenha(); Este exemplo nao garante ainda o polimorfismo, pois, os objetos ‘$obj' silo de tipos diferentes e 0 polimorfismo exige objetos iguais atuando de forma diferente. Neste caso, o que esté ocorrendo sio atribuigdes com tipagem automiatica. A implementagio do polimorfismo baseada em sua definigao é totalmente vidvel em linguagens fortemente tipadas, como o C+, Java entre outras, mas encontra uma limitagiio no PHP que tem a tipagem automatica. Paraesclarecer este ponto ser utilizado um exemplo na linguagem C+ que € tipada: Tfigura obj; // @efine um objeto do tipo Tfigura obj = new Tcirculo; // instancia um objeto do tipo Tcirculo obj->desenha()+ // imvoca a fungio polimorfa obj = new Tquadrado; // instancia um objeto do tipo Tquadrado obj->desenha(); // invona a figura polimorfa Repare que agora os objetos ‘obj’ so de um tinico tipo, portanto, nao se sabe até o momento da execugio, qual objeto serd realmente ativado. Observe que seria possfvel inclusive criar uma lista (estética ou dinaimica) do tipo Tfigura e inserir nela objetos Tcirculo e Tquadrado, assim, 0 polimorfismo estaria garantido e seria construfda uma lista polimorfa. Como o PHP nao permite a tipagem explicita, é necessério langar mao de outras ferramentas para implementar o polimorfismo. A partir do PHP 5, é possivel utilizar a "indugiio de tipos" que permite regular os objetos pelo seu tipo. Isso € implementado especificando o tipo do pardmetro de entrada de uma fungio. Induzir um tipo é forgar que os parmetros de uma fungao sejam objetos de uma classe exclusiva, especificando seu nome no prototipo da funciio. ~ 70 = Fale. Iinguagem da Internet « PHP Orlentado a Objetos Esta técnica s6 pode ser utilizada com tipos objetos (criados por uma classe). A indugaio de tipos tradicionais, tais como, inteiro e string, nao € suportada pela linguagem. Exemplo: function t. e(T£igura $objeto_figura){ insere na lista estdética ou dinamica Esta implementagao garante que esta fung’io somente receberé objetos do tipo Tfigura. Em caso de incompatibilidade de tipos 0 interpretador PHP provocaré um erro fatal e interromperd o script. Com este método é seguro afirmar que o polimorfismo foi implementado e a lista criada é polimorfa. Esta fungiio (que induz 0 tipo) pode perfeitamente ser um método de uma classe: class Tlistat private $array_polimorfo = array(); // cxia array (lista) public function insere(Tfigura $objeto_figura) ( array_push(§this->array polimorfo, $objeto_figura); J] insere objeto no array > // teste de insergio dos objetos na lista polimorfa $obj_lista = new Tlista; // cria uma lista nova $obj = new Teirculo; // cria um objeto ‘circulot $obj_lista->insere($obj); “ws ele na lista $obj = new Tquadrado; au" um objeto quadrado $obj_lista->insere($obj); a“ ele na lista §obj_lista->array_polimorfo[0]->desenha(); J1 imprime Bola §obj_lista->array_polimorfo[1]->desenha(); 1) imprime Quadro Capitulo 11 Seguranga, personalizagaoe privacidade Alinguagem PHP ¢ interpretada no servidor, fato que cria um ambiente altamente propicio a ataques e fraudes através da invasio do servidor itencionalmente ou nao. : A seguranga de areas restritas em geral é feita pela restrigiio de entradas 20m a utilizagdo de senhas (item 11.3), a Privacidade através de sessdes item 11.5) que permitem acada usuério utilizar um software como se fosse 0 ico naquele momento ¢, por: Ultimo, a personalizagiio que utiliza os cookies (item 11.4) para guardar informagées especificas de cada ususrio, A implementacdo, principalmente das duas iltimas técnicas, depende dos e¢alhos do protocolo http, entiio antes de tudo, serd estudado este assunto Nos itens 11.1 11.2. 1.1. Definicdo de protocolo Justificada pela necessidade do conceito do protocolo ser utilizado em lguns capitulos subseqiientes, sua definigfio seré dada neste ponto. 72 ~ Fale a linguagem da Internet « PHP Orientado a Objetos De forma semelhante 4 comunicagio oficial entre os seres humanos, na firea técnica, protocolo é um conjunto de regras utilizadas para estabelecer uma comunicagio entre dois sistemas que podem ser: dois softwares, dois computadores, uma mescla dos dois ou ainda outros dispositivos como teclado, mouse e monitor de video. Tecnicamente falando, é um conjunto de regras padronizadas que individualizam os arquivos através do seu formato, levando em conta a sincronizagao, a seqiiéncia e a detecgiio de erros ou falhas na troca de informagGes entre dois ou mais componentes De forma simples, para as méquinas se comunicarem numa rede, elas tém de falar a mesma lingua ou, em palavras corretas, usar 0 mesmo protocolo e, nocaso do protocolo entre dois computadores, um sempre é chamado cliente outro de servidor. 11.2. Headers Oprotocolo HTTP (HyperText Transfer Protocol) é utilizado em aplicagdes hipermidia. E 0 protocolo padrio dos navegadores Internet. Esse protocolo espera que as mensagens de cabegalho (header) sejam enviadas, do servidor para o navegador, antecipadamente a qualquer texto (utilizado para o controle ou para visualizagiio). A Figura 7 mostra 0 formato de um arquivo com cabegalhos, na qual é destacada a existéncia de trés tipos de cabegalhos: * o primeiro refere-se ao cabegalho do arquivo, utilizado para atender 0 protocolo HTTP; *o segundo € utilizado para conter informagées sobre o documento HTML, tal como 0 titulo da homepage, mostrado na barra superior do navegador; * oterceiro, refere-se simplesmente aos titulos de trechos dos documentos contidos no corpo HTML. Seguranga, personallzacho e privacidade= 73 caberalho ‘corpo Figura 7. Formato do cabegatho Por questio de conveniéncia, serdo explicados os dois tiltimos antes do rerdadeiro header. 1.2.1. Informacdes do documento _ O par de tags <head>...</head> niio compée uma mensagem tipo ibegalho, mas é um elemento HTML. que contém informagées diversas a ‘Speito do documento corrente, joad> ta http-equiv="Content-Language" content="pt-br"> Fa hetp-equive*Content-Type" contents"text/html; charset=windows-- http-equiv="Keyliords" content="microprocessores, ditle>carios Sica 1252"> C++, CHBuilder, assenbly"> .2.2. Titulos O par de rags tipo ...cria uma evidéncia no texto, cabegalho que intitula algum item da pagina a ser mostrada. formando 7A ~ Fale a linguagem da Internet - PHP Orlentado a Objetos

Capitulo 1

qtem 1.1 11.2.3. Os cabecalhos do protocolo Cada cabegalho que atende ao protocolo HTTP é uma mensagem diferente etodos devem ser compostos por um ‘nome’ seguido de dois pontos ':’e um campo ‘valor’. Uma pAgina pode receber varios cabegalhos. Existem dois tipos especiais de uso de cabegalho: 0 primeiro iniciacom a sigla http/ (maitiscula ou mintiscula) utilizada para informar um cédigo de estado do HTTP, por exemplo: header ("HTTP/1.0 404 Not Found"); informa 0 cddigo de erro de pagina nao encontrada. Esta agio sera valida se sistema operacional estiver com o servidor Apache para que o PHP manipule as requisigGes de arquivos nao existentes. O segundo caso especial é 0 "Location: ’ retorna 0 cédigo de estado REDIRECT (302), provocando uma mudanga de pagina. Por exemplo, este cabegalho redireciona a pégina para o enderego especificado. que, além de enviar o cabegalho, header("Location: http: //www.din.uem.br/sica/"); Existem dezenas de mensagens de cabegalhos. Tanto os 'cookies' como as 'sessions', por exigéncia do protocolo HTTP, devem ser enviados ao navegador cliente em forma de mensagens de cabegalho, agiio que deve ocorrer antes de qualquer safda do script. Isso obriga a utilizagiio das fungoes pertinentes antes de qualquer safda, incluindo: * a tag , que inicia o documento HTML; * atag , que engloba as informagées iniciais da pagina e * qualquer espago em branco. Seguranga, personalizagdo e privacidade= 75 Nunca confunda o cabegalho que deve preceder o documento HTML, como um todo, para atender ao protocolo HTTP, com 0 cabegalho que guarda informagGes do documento, ou ainda, 0 que evidencia os titulos do texto HTML. 11.3. Senhas Autilizago de senhas 6 muito comum em sites que limitam 0 acesso para usuarios cadastrados. O exemplo abaixo criar um pequeno formulario com dois campos de entrada, sendo um para 0 usuario digitar seu Jogin e outro a senha. Além disso criaré um botdo para enviar os dados para o script PHP "valida_login.php". E nesse script que serio realizadas as conferéncias de senhas para validar a entrada daquele usuario. LOGIN DE ALUNOS
76 » Fale a linguagem da Internet « PHP Orlentado a Objetos 11.3.1, Validagio por variaveis A validagao realizada no script valida_senha.php pode ser feita de diversas formas. A mais simples, porém de aplicagio pratica questionavel, é comparar 0 login a senha com as constantes definidas pelo programador: 4£(($_PoST[*login’] != ‘sica’) || ($_POST[‘senha’] 1= ‘maluco’)){ // se nfo validou sai do sistema exit('0 login ou a senha n&o conferem!’); d echo ‘Login e Senha validados!’; // 38 passar pelo t © cédigo da pagina vai aqui 11.3.2. Validacio por arquivos textos A segunda forma ainda pouco utilizada é a que acessa um arquivo texto contendo 0 login e senha de todos os usuarios autorizados. O exemplo abaixo que espera encontrar 0 arquivo texto com atributos que permitam a leiturae escrita (veja item 12.1) tem o seguinte formato: jose;bo1aas incrivel;batrs $login = §_GET[*‘login’}; $senha = §$_GET[‘senha’]; §arq = ‘senhas.txt $le = fopen($arq,’r'); while(1!feo£($1e)) { $linha = explode(™;”,fgets($1e)); 4£(($1inha[0} login) && ($linha[1] == §senha))( $validou = verdadeiro? rn §validou = false; per y r felose($le); i£(1$validou) { // se nfo validou sai do sistema exit("Login e/ou Senha invdlidos!”); , echo ‘Login @ Senha validados!’; // se passar pelo teste o cédigo da pagina vai aqui Seguranga, personallzagio ¢ privacidades 77 11.3.3. Validagiio por banco de dados A terceira forma, que é a mais utilizada pelos programas, faz uma consulta no banco de dados, neste exemplo, um banco de dados MySQL (veja os detalhes sobre esse banco de dados no capitulo 13). Mogin = posrt+1ogin‘}; 1/ login para ser validado no banco de dados fwonba = Post{* senha‘); // senha para ser validada no banco de dados 1/ conecta ao servidor de banco de dados MySQL Whose = *servidor.combr*; // servidor de banco de dados fuser = *sicar; // Aogin para se conectar a0 servidor do banco fpass = "12345"; // senha para se conectar ao servidor do banco oon = nysql_pconnect ($host, fuser, $pass) // conecta ao banco de dados base = “meu_banco"; 11 seleciona 0 bando de dados ‘Aql_select_db(Sbase) // com 0 login @ senha a / valida a senha no banco Jaq = “SELECT * PROM tabela WHERE login = ‘Slogin‘ AND senha = faonha’ fary = mysql_query($sql); chow = mysql_nun_rowa (Sry); Af (Gachou == 0)¢ @cho * Login e/ou Senha invélidos!* exit; em validados echo "Login e Senha validados!*; Para que 0 usuario nao tenha que digitar seu login e senhaacada pagina site no qual ele entrou, existem dois mecanismos para gravar seus dados efetuar a validacdio automitica em cada pAgina requisitada: Cookies e ssions. 3.4. Validagao por autenticacio http O protocolo HTTP tem uma mensagem de cabegalho especifica para luerer 0 login e senha do usuério que tenta visitar uma determinada pagina. cabecalho do tipo "WWW-Authenticate” provoca a chamada de uma jancla 78 ~ Fale a linguagern da Internet « PHP Orlentado a Objetos (oucaixa) de didlogo ¢ 0 respectivo envio ao navegador. Este didlogo solicita a digitagao do login e da senha do usuario e oferece dois botdes: OK e CANCEL. Caso 0 botio OK seja clicado, trés variéveis de ambiente serio inicializadas: a variével PHP_AUTH_USER com o login, PHP_AUTH_PW coma senhae AUTH_TYPE conterd 0 tipo de autenticagiio, que esta limitado ao tipo "basic". Essas trés varidveis pertencem ao array SHTTP_SERVER_VARS que pode ser chamado simplesmente de $_SERVER dependendo da versio do interpretador PHP. Caso 0 botio CANCEL seja escolhido, as varidveis nao serdo ajustadas © o sistema interpretaré como se elas nao existissem. No método de autenticagio Basic, 0 login e a senha sao transmitidos para o servidor no formato texto conhecido como "base 64". Outra caracteristica é que esse tipo de autenticagao baseia-se no modelo no qual 0 proprio cliente deve se autenticar. Para enviar um cabegalho cliente ao servidor, o PHP tem a fungao header(). header (‘www-authenticate: Basic realm="Autenticando na Intranet com PHP"'); O fator positivo que esta técnica oferece é que apds um dos botées ser clicado, o script PHP é chamado novamente e, neste momento, a fung’io isset() (item 3.7) pode ser utilizada para saber se as varidveis foram inicializadas ou nao. No exemplo abaixo, as varidveis $/ogin e $senha podem ser inicializadas utilizando qualquer uma das técnicas ensinadas nos itens 11.3.1, 11.3.2¢ 21.3.3. Af(1isset ($_SERVER[ 'PHP_AUTH_USER'])){ header ('WwW-Authenticate: Basic realm="Autenticando na Intranet com PHP"'); header ('HTTP/1.0 401 Unauthorizea'); exit ("Login e senha nfo testados!"); Seguranga, personallzagdo ¢ privacidade= 79 ) 4£(§_SERVER['PHP_AUTH_USER'] I= $1ogin || $_SERVER('PHP_AUTH_PW'] != $senha) exit ("Nome de Usudrio ou Senha Invdlidos!"); @cho “Nome de Usuério ou Senha VALIDOSI"; // © e6digo do programa em si inicia aqui. 11.4. 'Cookies' Cookies sto pequenas porgées de informagdes guardadas em arquivos de textos que podem ter no maximo 4kbytes, Eles so enviados pelo servidor € gravados no computador cliente, Um arquivo de cookies pode receber até 20 cookies e cada um deles contém, como as varidveis, um par composto pelo "nome" do cookie ¢ 0 seu respectivo "valor". Esse mecanismo é padraio no protocolo HTTP. Esses arquivos servem para armazenar as informagées do usuario, formando um perfil de navegagiio dele na Intemet. A vantagem para o usuario € que essa técnica pode proporcionar servigos personalizados através de sua identificagaio quando ele retornar ao site. E possivel, por exemplo, agilizar o preenchimento de formuldrios com certa seguranga, pois, as informagées contidas nos cookies de cada usuario podem ser utilizadas somente dentro dos dominios do site. Nesta linha, os sites costumam utilizar esse mecanismo visando oferecer um servigo de maior qualidade, baseando- Se, por exemplo, na anilise do retorno do investimento publicitario, cAlculo de audiéncia, acompanhamento da evolugiio e da taxa de respostas a Ppromogées realizadas etc. 11.4.1. Criagao de 'cookies' Para criar um cookie e gravé-lo no computador pessoal do cliente, oPHP disponibiliza a fungao setcookie(). Mas como os cookies fazem parte do cabegalho HTTP, a fun¢ao setcookie() que os cria precisa serchamada antes que qualquer outro dado seja enviado ao navegador. 80 ~ Fale a inguagem da internet « PHP Orlentado 4 Objetos Os cookies siio gravados em um diret6rio especitico. No Windows XP um diretério deexemploé: Cr\Documents and settings\Administrator\cookies Esses cookies tém um tempo de vida definido no momento de sua criagao. No modelo padrao, eles expiram tio logo o usuario encerra a navegagdio no site corrente, mas € poss(vel configur4-los para durar varios dias, Além dos dados que ele armazena, um cookie recebe um nome e, devido a essa caracteristica, um servidor pode definir mUltiplos cookies em um mesmo arquivo e fazer a identificagao deles através dos seus nomes. Além disso, os cookies so associados ao URL da pagina que os manipula. Todas essas e outras caracteristicas sao definidas parametrizando a fungao setcookie() que espera receber os parametros abaixo descritos: bool setcockie (gnome, §valor, $expira, $caminho, $dominio, $seguranca); $nome: Define o nome do cookie (semelhante ao de uma varidvel). $valor: Estabelece o contetido textual do cookie (semelhante ao valor de uma varidvel). Este valoré guardado no computador do cliente no formato de texto ¢ é visivel, portanto, nao é recomendado guardar informacées sigilosas. Os contetidos dessas varidveis sao gravados no formato URLencode, que € obtido substituindo os espacos pelo caractere "++" ¢ todos os outros caracteres nao alfanuméricos (com excegdio de "_") pelo caractere "%", seguido do cédigo ASCII em hexadecimal. $expira: E 0 tempo durante o qual cookie existir4, Tem o tipo de um timestamp Unix, que é 0 ntimero de segundos desde a criagdo desse sistema operacional. & comum invocar a fungio time() para determinar © momento atual (em timestamp) e somar o numero de segundos que Seguranga, personallzagdo e privacidade= 8 | definiré seu tempo de vida a partir daf. Por exemplo, para criar um tempo de vida de 30 dias, calcule 0 tempo em segundos dos dias desejados utilizando a formula 60 segundos por minuto * 60 minutos por hora * 24 horas por dia * 30 dias. O resultado 2073600 faré com que 0 cookie expire em 30 dias. Se nao for definido esse tempo, 0 cookie ira expirar ao fim da sesso (quando o navegador fechar). Em resumo, é possfvel "matar" um cookie, apés utiliz4-lo por Seguranga, ou manté-lo "vivo", além de uma conexéio Web por comodidade, o programador decide. $caminho: Define o caminho no servidor para qual o cookie estara disponivel, em outras palavras, é 0 enderego (definido automaticamente) da pagina que gerou 0 cookie. Se for definido ', o cookie estar dispontvel para todo o dominio, Se for definido um diretério especffico, 0 cookie estara disponivel apenas nele ¢ em seus subdiretérios. $dominio: E 0 dominio para o qual o cookie estaré dispontvel, em outras palavras, é o dominio do servidor ao qual pertence o cookie. Para tornar 0 cookie disponivel para todos os subdoménios de WWW.xxxx.com.br, vocé deve defini-lo como 'www.xxxx.com.br’. Estes dois dltimos parametros garantem que um dom{nio nao pode ler os cookies criados por outro servidor, pois, sio gerados automaticamente pelo servidor a cada Tequisi¢ao que ele recebe. $seguranca: Indica se 0 cookie deve ser transmitido por uma conexiio segura HTTPS ou padrio HTTP. Quando for definido como 1, 0 cookie ser definido somente se existir uma conextio segura. Se for omitido, a fungzio assumird 0 padrao que € 0. Exemplo: setcookie("nome", "valor", time()+2073600, "/", "", 0); © 82 ~ Pale a tinguagem da internet PHP Orlentado a Objetos 11.4.2. Manipulagio dos dados gravyados em um 'cookie' Para ler os dados gravados em um cookie na versio 4.1.0 ou maior do PHP, utiliza-se 0 array superglobal $_COOKIB, que sempre estar‘ preenchido com os cookies enviados ao cliente. J4 nas versdes anteriores, utiliza-se o array $HTTP_COOKIE_VARS. E possfvel também listar todos os cookies de um mesmo arquivo utilizando afungao: print_r($_COOKIE); Exemplo: nome = "Nome_i"; $value = “valor é um texto a ser escrito no cookie 1"; Wetcookie(§nome, §value, time()+3600, "/sica/*, “www.din.uem.br, 0); $mome = "Nome_2"; $value = “valor é um texto a ser escrito no cookie 2"; Setcookie($nome, $value, time()+3600, "/sica/", "www.din.uem.br", 0)7 echo $_COOKIE["Nome_1"].*
'; @cho $_COOKIE["Nome_2"].
"; print_r($_COOKIE); Resultado visualizado na pagina gerada Valor é um texto a ser escrito no cookie 1 Valor é um texto a escrito no cookie 2 Array ( [Nome_1] => Valor 6 um texto a ser escrito no cookie 1 [Nome_2] => Valor 6 um texto a ser escrito no cookie 2 Resultado gravado no arquivo cookie "sica@sica.txt" Nome_1 Valor+%E9+um+textotarser+escrito+notcookie+l www.din.uem.br/sica/ Seguranga, personallzagho e privacidade- 83 Abae 9062713344 61 1055061712 699653 Nome_2 Valor+sz9+um+textotarsersescrito+no+cookier2 Www.din.uem.br/sica/ 1536 062713344 49699661 1055961712 29699653 1.4.3. Exclusio de um ‘cookie’ Para excluir um cookie, basta utilizar a mesma fi ungao de criagiio colocando, rém, uma data de expiraciio do passado. Essa técnica ativa o mecanismo le remogao do navegador. Exemplo: jet cookie(*Nome_2", "", time()-100, */sica/", "www.din.uem.br", 0); _ Repare que o valor 100 segundos esta sendo subtrafdo da hora atual, 0 \e faz 0 mecanismo de remogao ser acionado. .5. 'Sessions' _ Uma sesso é uma forma de armazenar dados através da respectiva va¢aio, controlada pelo sistema, de um arquivo no servidor. Cada sessiio jada tem seu proprio arquivo associado eo sistema permite criar varias ses, portanto, é recomendavel nomear as sessdes criadas. Pelo fato dos 84 ~ Fale a linguagem da Internet « PHP Orlentado a Objetos A utilizagiio de sessdes foi uma forma encontrada para preservar os dados que serdio utilizados na navegagiio entre as paginas seqiienciais, principalmente na identificagao de usuarios para o acesso a areas restritas (Figura 8). A utilizagao da sessdio permite ao programa registrar os dados do usuario logo ap6s sua identificagio e verificd-los a cada pagina restrita, sem solicitar ao cliente nova identificagio. Uma agiio semelhante pode ser feita utilizando cookies, porém, a sesso grava os dados no servidor e nado no computador do cliente, fato relevante para a seguranca de um sistema. lo A serra : Figura 8. Paginas protegidas por sessdes Os detalhes da validagao de senhas sio analisados no item 14.6.2 ea validagao de paginas pela sessio, no item 11.5.3 11.5.1. Criagio, manipulagao e encerramento de sessdes Para criar uma sessio, deve-se utilizar a fungao session_start() e para garantir que apés criar uma sesso; exatamente ela serd aberta através de um outro script PHP, recomenda-se nomear cada sessio aberta através da fungaio session_name(), fungéio que deve ser invocada, naturalmente, antes da criagao, utilizacdio ou destruigio dela. Essa fungiio quando nao recebe um parametro retorna o nome da sessiio aberta. A mesma metodologia anterior (definir o nome antes) é utilizada para abrir uma sessio existente, porém, para ter sucesso neste intento, nao se pode destruir a sessaio que foi criada anteriormente. Para destruir uma sessiio utiliza-se a fungiio session_destroy() que apagar O arquivo da sessio aberta e todos os dados dela. Mas CUIDADO, todas Seguranga, personallzagto e privacidade= 85 48 varidveis globais $_SESSION[] ou $HTTP SESSION_VARS|[] Permanecem vivas dentro do script, bem como as varidveis do cookie da fessio, Para liberar essas varidveis. fession_unset() que apaga (libera) todas Exemplo: » € necessario utilizar a fungiio as varidveis gravadas (registradas). #ion_name(*nome_da_, ion start(); sion_unset(); #ion_destroy(); 1.5.2. Manipulacio das varidveis de uma sessiio A gravacdo de informagdes no arquivo da sessiio € totalmente dependente a. do interpretador PHP e pode ser feita de duas formas: * utilizando a fungaio session_register(‘lista de varia sis! leontra obsoleta desde a versiio 4.1.0; iil * atribuindo valores as varidveis contidas em i um array predefinido jamado $_SESSION[] (ou SHTTP_SESSION_VARS{] no caso do PHP .6 ou menor) Cujos indices sio os nomes das vari: es Aveis que se deseja [] €recomendado a partir da versio 4.1.0, sion_register (§nome, Susuario, $email, $cidade, $estado); CUIDADO com esta fungio, que pode nao funcionar nas versdes $nome; Susuario; Semai1; $cidade; Sestado; 86 ~ Fale. linguagem da Internet « PHP Orlentado a Objetos CUIDADO comeste método de atribuigiio, pois, se essa varidvel do tipo array niio existir, por exemplo nas versées 4.0, 0 interpretador PHP niio acusard erro, pois, entende que elas esto sendo criadas no momento da atribuigao. : Para ler os dados gravados ou registrados no arquivo da sessiio, basta efetuar 0 processo inverso: $nome = §_SESSION{‘nome']; Além disso, pode-se também imprimir um dado echo $_SESSTON['nome']; ou todos os dados gravados na sessio print_r(§_SESSION); A fungiio session_write_close(), fecha a sessio € escreve os dados nela, antecipando o que aconteceria no encerramento do script. Para liberar uma varidvel registrada, utiliza-se a fungao session_unregister(), que espera receber como parametro o nome da varidvel global da sessiio atual. session_unregister('nome'); A fungio session_is_registered(), descobre se uma varidvel global esta registrada na sessio aberta, retornando verdadeiro se existir e nulo, caso contratio. session_is_registered(‘nome'); Z Outra forma de escrever e ler as varidveis na sessiio € utilizando as fungdes parceiras session_encode()e session_decode(). Seguranga, personalizagdo e privacidade= 87 Léa sessio corrente e retorna uma string com 0 contetido dela, mostrando Seqlencialmente o nome da varidvel, seu tipo e valor. Por exemplo, se quatro variaveis: booleana, string, inteiro e uma real, forem registradas, TON[*1login_ok'}= tru HSSION['inteiro'} = 34; #_8kSsrON[' real") = 12.345; uion_encode() 7 resultado de uma consulta com esta fungiio seria: Ogin_ok|b:1;nome|s:4:”sica”;inteiro|i:44;real|d:12.345; | 4s12.345000000000000639488462184090167 4011840820312 A diferenca no ndmero real é uma aproximagiio do tipo double. session_decode(string) q pe Beate a's _ Sobrescreve o contetido das varidveis existentes na sesso ou insere novas ‘Aveis. O formato da string deve ser codificado como no. exemplo anterior; lon_decode("inteiro|i:44;nova|b:0;")y exemplo registra um novo valor para a varidvel ‘inteiro'e criaa varidvel leana ‘nova’, atribuindo-lhe falso. 3. Validagio de uma sessio0 SMO que uma sesso jé tenha sido criada utilizando a fungao |_start() e a janela do navegador tenha sido mantida aberta, ao navegar 's de um link para outra pagina, é necessério incluir um session_start() luivo de script na nova pagina. Este comando no criaré uma nova , Mas abriré a mesma de onde o navegador partiu. 88 » Fale a linguagem da Internet « PHP Orlentado a Objetos Com asessiio aberta, € possivel verificare validar qualquer variavel gravada nela, através do array predefinido $_SESSION[]. Para facilitar essa solugo, recomenda-se criar um arquivo chamado, por exemplo, "valida_sessao.php", somente com o cédigo necessdrio para abrit ‘sessio e verificar se existe algo registrado nela. Apés isso, basta inclui-lo através da diretiva include em cada script que precisar acessar os dados da sessio criada. O exemplo abaixo parte do princfpio que, logo apés a sessio ser criada, a varidvel 'nome' foi registrada. Assim, a fungio isset() obtém informagées a respeito dessa varivel, indicando seu estado e, caso ela esteja inicializada, retorna verdadeiro. Observacdio: E aconselhavel verificar as configuragées estabelecidas para as sessdes no arquivo "php.ini". Veja como configurar 0 PHP em www.php.net. 11.5.4. Aplicagdo das fungées Oexemplo abaixo utiliza trés arquivos: * 0 primeiro, cria uma pagina de login * 0 segundo, verifica o login asenha * caso sejam validados, cria uma sessiio ¢ desvia para a terceira pagina que exige a sesso criada * caso no sejam validados, desvia de volta para a pagina de login Seguranca, personalizacdo e privacidacte- 89 * oterceiro, abre a sessio e testa a varidvel gravadanela *secontiver verdadeiro, autorizaré a execugiio da pagina * caso contrério, voltaré para a pagina de login Arquivo |: login.php shtm>
Stable width="180" cellspacing="0" cellpadding-"0" bordexava "> usuério: rea iS ee ” a> Pagina Protegida por Sessdo br> ENTROU NA PAGINA PROTEGIDA!

11.5.5. Cache Cache € uma forma de meméria utilizada para armazenar as tiltimas paginas visitadas através de um servidor, As duas fung6es abaixo so utilizadas para controlar este cache quando as pAginas so criadas utilizando sessdes. session_cache_expire($prazo) * Se $prazo for estabelecido, fixa o tempo para o cache da pagina expirar, neste caso, a fungao tem que ser invocada antes de session_start(), mas esta Seguranga, personallzagio e privacidades 91 Aglio 86 tera efeito se for estabelecido um limitador de cache; aconfiguragio padrio é 180 minutos; * Se nao, retorna o prazo configurado em minutos para 0 cache expirar. session_cache_limiter($limitador) Onome do limitador de cache define com qual método ou regra de controle de cache 0 contetido da pagina podera ser armazenado em cache. Os nomes que definem a regra sao: ‘none’, ‘nocache’, ‘private’, 'private_no_expire' ou ‘public’, 0 padrao é 'no_cache'. Qualquer outra palavra desabilitar4 o limitador de cache, inclusive ‘none’ que nao é realmente definida. O valor padrao é ‘nocache’. Para entender melhor, seria adequado estudar tis mensagens de cabegalho HTML tipo Expire’. * Se $limitador for fornecido, mudaré o nome do limitador e retornard o anterior; + Se nao, definird ou retornard o limitador do cache atual Para mudar um limitador e depois imprimi-lo, deve-se invocar a fungao duas vezes: a primeira, com 0 novo nome e a segunda, sem parametro. 11.5.6. Identificagao da sessio No momento em que um visitante acessa um site controlado por sessiio, é ‘determinada uma Gnica identificagao para ela, chamada id de sessio, que pode ser guardada em um cookie do lado do usuario ou no proprio URL. session_id($identificador) Se $identificador for omitido, esta fungo retornard a identificagiio (id) da dio atual. Porém, se um novo identificador for fornecido, 0 id ser trocado. session_regenerate_id() Atualizaa identificagiio (id) da segao atual gerando uma nova identificagzio \utomaticamente, mantendo os dados da sesso atual. 92 « Fale.a nguagem da Internet = PHP Orlentado a Objetos 11.5.7. Caminho do arquivo de sessio session_save_path() Retorna o caminho do diret6rio usado para salvar os dados de sessiio ou se ocaminho for especificado, ele sera atualizado. Para especificar um novo caminho, esta fungdo deve ser invocada antes da criagdo da sessio session_start(). Capitulo 12 Manipulagao de dados em arquivos _ Para manipular os arquivos em um servidor remoto, sao necessdrias quatro ragdes basicas que compdem o conjunto minimo para atuar sobre os luivos: abertura, leitura, escrita e fechamento. Uma vez que 0 arquivo esteja aberto, o sistema criaré uma estrutura jamada stream. Dat, as informagGes poderao ser trocadas entre 0 arquivo ‘© seu programa, através de operagées de leitura e/ou escrita. Aofinal dessas operagdes, o arquivo deve ser fechado, O fechamento do arquivo fica desassoci-lo da stream por meio de uma operagiio de fechamento. ‘Visto que os arquivos suportam 0 acesso aleatério, abrir um arquivo implica inicializar um indicador de posigaio em seu comego. Quando um elemento ouescrito no arquivo, o indicador de posigéio € incrementado, garantindo gressao através do arquivo. O arquivo e seu respectivo indicador so miatetetohty folsom Figura 9. Formato de um arquivo 94 » Fale a linguagem da tnternet - PHP Orlentado a Objetos 12.1. Abertura do arquivo A fungiio fopen() abre uma stream para 0 uso e associa um arquivo a cla. Ela retorna a varidvel que aponta para esse arquivo ou NULL, se niio foi possfvel abri-lo, desta forma pode-se associar seu tipo a uma varidvel ponteiro de arquivo. fnomearq = "nomearg.txt", fmodo = "ry $ptrarq = fopen(§nomearg, modo); ‘$nomearq’ é uma cadeia de caracteres que forma um nome valido de arquivo. Esta fungiio aceita o préprio nome do arquivo em forma de constante. Deve-se incluir a especificagao do caminho de pesquisa. A string contida na varidvel $modo determina como o arquivo sera aberto. Da mesma forma descrita no pardgrafo anterior, uma constante pode ser utilizada como parimetro. A Tabela 15 mostra os valores permitidos para o modo e relaciona-os com as respectivas agGes. Modo _|Significado r ‘Abre um arquivo-texto para leitura w___|Cria um arquivo-texto para escrita a ‘Anexa a um arquivo texto rb [Abre um arquivo bindrio para leitura wb |Cria um arquivo bindrio para escrita ab ___|Anexa a um arquivo bindrio r+ |Abre um arquivo-texto para leitura/escrita w+ |Cria um arquivo-texto para leitura/escrita ‘a+ |Anexa ou cria um arquivo-texto para leitura/escrita r+b__ |Abre um arquivo binario para leitura/escrita w+b_|Cria um arquivo bindrio para leitura/escrita atb _[Anexa a um arquivo bindrio para leitura/escrita Tabela 15. Constantes do modo de abertura do arquivo Strings como "r+b" também podem ser representadas como "rb+". Para abrir um arquivo chamado teste.txt, permitindo escrita, pode-se digitar: Manipulagéio de dados em arauivos= 95° ptrarg = fopen("t txt, wn) y Embora tecnicamente correto, vocé geralmente verd o cédigo anterior escrito desta forma: $ptrarg = fopen("teste.txt,"w"); Af (1$ptrara){ print£("arquivo nao pode exit; d x aberto
"); Este método detectard erro na abertura de um arquivo, tal como um disco cheio, protegido contra gravacao ou diretério com atributos que profbem a gravagao. Procure utilizar esse método, pois, em geral, sempre se deve confirmar o sucesso de fopen() antes de tentar qualquer outra operagiio no arquivo. 12.2. Fechamento do arquivo A fungiio felose() fecha um arquivo aberto por meio de uma chamada a fopen(). felose($ptrara); 2.3. Determinacao do fim do arquivo Quando um arquivo é aberto para leitura, um valor inteiro i; gual (ou emelhante) & marca de "fim de arquivo" pode ser lido. Isso pode fazer com jue a rotina de entrada indique uma condigao de fim de arquivo apesar do al fisico do arquivo nao ter sido alcangado. __ Para resolver esse problema, deve-se utilizar a fungio feof(), que detecta juando o final de arquivo realmente foi atingido. Esta fungiio retornara verdadeiro se o ponteiro estiver no fim do arquivo OF) ou um erro ocorrer; caso contrario, retornard falso. UNIVATES 96 = Fale a Inguagem da Internet « PHP Orientado a Objetos 12.4. Leitura em arquivo Uma vez aberto 0 arquivo, pode-se ler os dados contidos nele de varias. formas: caractere por caractere, linha por linha ou ainda, todo 0 contetido de uma vez. 12.4.1. Por caractere A fungi fgetc() Ié os caracteres em um arquivo aberto previamente. Para tanto basta passar como pardmetro 0 ponteiro para o arquivo de origem. Schar = fgetc($ptrara); Esta fungo retornaré falso quando o final do arquivo for aleangado. O cédigo abaixo Ié um arquivo de texto até que a marca de final de arquivo seja lida. $nomearq = “teste.txt”; $ptrarq = fopen($nomearg, “r”); d£(igptrarq) ¢ echo “Néo @ possivel abrir o arquivo te: exit; ) while (($char = fgete($ptrarq)) i€($char == ™\n”) echo “
else echo “gchar”; ? fclose($ptrarq); e.txtr 7 false){ J] navegador nao entende \n A fungiio fgetc() é compativel com os dados bindrios, portanto, pode retornar o booleano falso. Mas também, pode retornar valores nao booleanos que podem ser avaliados como falsos, por exemplo, um inteiro ou um real com valorigual a zero, um char ou uma string vazia, ou ainda um ponteiro nulo. Para garantir 0 resultado da comparagio, deve-se utilizar 0 operador idéntico (===) ou 0 operador niio idéntico (!==) para testar 0 valor retornado (veja item 5.5). ManIpulagdio de dados em arquivos= 97 12.4.2. Por linha A fungio fgets(), 1é stringsem um arquivo aberto previamente. Para tanto, basta passar como parmetros o ponteiro para 0 arquivo de origem eo ntimero de bytes a serem lidos. Qutrlida = fgets($ptrarg, $comprimento) + A fungiio fgets() retorna uma string com até $comprimento - 1 bytes lidos do arquivo apontado por $ptrarg. Se ocorrer um erro, retornaré falso. A leitura é encerrada quando: *(comprimento - 1) bytes foram lidos; *encontra um fim de linha (\r\n) (que é incluido no valor retorado) ou; *encontra o fim de arquivo (EOF) Se nenhum comprimento forinformado, 0 padrao seré 1Kb ou 1024 bytes. Exemplo: Como ler um arquivo completo linha apés linhae imprimi-lona tela. 1 fnomarg = "teste.tut; ptrarg = fopen(Snomeara, "rb"); f( §ptrara) { "echo "NK possivel abrir o arquivo teste.txt"; iy exit; while (1 feof ($ptrarq)){ $linha = fgets ($ptrarq); echo str_replace(*"\r\n", "
, $14nha); elose($ptrara); Afungao str_replace() encontraa string especificada no primeiro. parametro a stbstitui pelo segundo pardmetro, quantas vezes for encontrada na string inalisada. Este exemplo troca a quebra de linha determinada por "\n" ow \r\n' pelos delimitadores HTML "
" que é compreendido por todos os lavezadores. 9B ~ Fale a linguagem da Internet « PHP Orientado a Objetos 12.4.3. Por lote A fungio fread() Ié até 0 ntimero de bytes especificado no paraimetro $comprimento a partir do ponteiro de arquivo informado em $ptrarq. $conteudo = fread ($ptrarg, $comprimento): Aleitura éinterrompida quando: * ontimero de bytes especificado foi lido ou; * 0 fim do arquivo (cof) foi aleangado ou; * quando um pacote se torna disponivel (para streams de rede). Exemplo: §nomearq = "teste.txt" $ptrarq = fopen($nomearg, x") §$conteudo = fread(sptrara, filesize ($nomearg)); echo str_replace("\r\n", "
", §conteudo) 7 felose (§ptrarq); A fungiio filesize(), retorna o tamanho do arquivo em bytes a partir do seu nome, incluindo o caminho completo. Para utilizar essa fungaio em sistemas que diferenciam os arquivos bindrios e 0 texto (por exemplo Windows), é necessdrio abrir 0 arquivo com a constante "b" (referente a binario) inclufda como parametro na fungao fopen(). 12.4.4. Por ‘array’ ‘A fungao file() 1é um arquivo inteiro e o atribui a um array, indexando cada linha do arquivo lido. Cada elemento do array corresponde a uma linha no arquivo, incluindo 0(s) caractere(s) de nova linha. Diferente das outras fungGes, ela espera receber o nome do arquivo e nao seu ponteiro. §nomearg = “teste.txt"; §$conteudo = £ile(snomearq); print_r($conteudo) ; Manipulagtio de dados em arquivos» 99 A fungao print_rQ imprime o contetido de um array. Moray ( [0] => linha 1 [1] => linha 2 [2] => linha 3) 12,5. Escrita em um arquivo Existem duas formas de gravarem um arquivo: substituindo seu contetido ‘ul anexando novas linhas ou caracteres ao seu final. A primeira pode serem Um arquivo existente ouem um novo. 12.5.1. Em arquivo novo Para criar um arquivo, deve-se utilizar 0 modo de escrita ‘w', que roporciona a operacao de criaciio, caso ele niio exista. Porém, é necessirio autela, pois, caso o arquivo exista, o seu contetido serd substitufdo pelo OVO sem a criagio de uma cépia de reserva. _* fWwrite(Sptrarg, $string, $comprimento); As fungées fwrite() e fputs() sao sinénimas. Elas gravam os contetidos de string nO arquivo apontado por $ptrarq segundo 0 critério descrito no imeiro pardgrafo, Seo $comprimento for dado, a gravagao ird parar depois que: * ontimero de bytes correspondentes for escrito ou; o fim da string for alcangada; o que ocorrer primeiro. Exemplo: Comoescrever um texto completo em um arquivo novo, nomearg = “teste.txt”; £(1£ile_exists(Snomearq)){ $linha == “linha 1\r\n"; $linha .= “linha 2\r\n"; $linha «= “linha 3\r\n"; Sptrarq = fopen($nomearg,"w”); £put s($ptrarg,$1inha) ; felose(§ptrarq) ; 1.00 ~ Fale a linguagem da Internet « PHP Orlentado a Objetos A fungio file_exists() retorna verdadeiro ou falso em relagio A consulta pelo nome do arquivo. Portanto a idéia deste exemplo é: caso 0 arquivo nio exista, deve ser aberto com 0 modo ‘w' para que 0 mesmo seja criado. 12.5.2. Em arquivo existente Se um arquivo jé existe, é possfvel escrever adendos ao seu final, Se 0 exemplo abaixo for a continuagao do anterior, utilize else ao invés de if. Exemplo: Af (£ile_exists($nomearg) ) ( $linha = "uma linha a mais\r\n"; $ptrarq = fopen($nomearg, "a"); fputs ($ptrarq,$linha); felose($ptrara); Caso 0 arquivo jd exista, deve ser aberto com o modo 'a' para que os novos dados sejam gravados em adigio as linhas jd existentes, sem perder os anteriores. Abaixo 0 exemplo completo: §nomearg = "teste.txt"y i £(1£i1e_exists($nomearq)){ $linka = “linha 1\r\n"7 $linha .= “linha 2\x\n' §linha .= "linha 3\r\n"7 $ptrarg = fopen($nomeara, "w"); fputs ($ptrarg, $1inha); felose($ptrarq); peiset §linha = “uma linha a mais\r\n"; $ptrara = fopen($nomearg,"a") 7 £puts ($ptrarg, $linha); felose($ptrara); Manipulagdo de dados em arquivos« [OL 12.6. Acesso aleatério a arquivos 12.6.1. fseek() As operagées de leitura ¢ escrita aleatérias podem ser executadas utilizando o sistema de E/S bufferizado com a ajuda da fungiio fseek(), que modifica o indicador de posigiio de arquivo. k($ptrarg, $numbytes, forigem); Onde $ptrarq é um ponteiro de arquivo devolvido por uma chamada de fopen( e $numbytes, um ntimero inteiro que é o nimero de bytes contados a partir de $origem. Aorigemé uma das constantes pré-definidas listadas na Tabela 16. t [Origem Nome da macro [inicio do arquive | SEEK_SET Posicgo atual__| SEEK CUR Final do arquivo _| SEEK_END Tabela 16. Constantes de posicionamento em arquivos Portanto, para mover $numbytes a partir do inicio do arquivo, a origem ve ser SEEK_SET. Para mover a partir da posi¢ao atual, deve-se utilizar }EEK_CUR e para mover a partir do final do arquivo, deve-se utilizar 1K_END. Diferente da maioria das fungdes, fseek() devolve 0 (zero) quando bem -dida e -1 (um negativo) caso contrario. Para os exemplos a seguir, suponha o arquivo texto mostrado na Figura 10: o 1 2°93 4 5 6 7 8 linha 1 10 11°12 13 14 15 16 17 linha 2 1819 20 21 22 23 24 25 26 27 linha 3 Figura 10, Detalhamento de um arquivo 102 = Fale linguagem da Internet « PHP Orlentado a Objetos = “teste.txtn; = fopen($nomearg, "r") 7 $dados = fgets ($ptrarq); // para ler a primeira linha echo $dados."
"; fveok(Sptrarg, 18, SEEK SET); // para ler a terceira linha = fweck($ptrarg, -9, SEEK_END); // igualmente a anterior §dados = fgete(§ptrarq); @cho $dados."
"; Resultado: linha 1 linha 3 12.6.2. rewind() ‘A fungi rewind() reposicionao indicador de posigdo do arquivo no inicio do arquivo especificado como seu argumento. Isto é, de forma semelhante a uma fita de video, ela "rebobina" 0 arquivo. $momearq = “teste.txt"; $ptrarq fopen($nomeara, *r"); $dados = fread(Sptrarg, filesize(gnomeara)); // 1e 0 arquivo todo echo $dados."
"; // imprime tudo $dados = fgets(Sptrarq); // tenta ler mas o indicador esté no final echo $dados.*
"; 11 nao imprime, $dados = null rewind ($ptrarq) ; // reposiciona o indicador no inicio $dados = fgets($ptrarq); // le a primeira linha echo $dados."
"; // imprime linha Resultado: linha 1 linha 2 linha 3 linha 1 12.6.3. ftellQ) A fungaio fiell(, devolve como resultado a localizagdio de leitura/gravagao do indicador de posigao do arquivo. 9 de dados em arauivos~ 103 Qnomearg = “teste.txt™; $ptrarq = fopen(gnomearg, “2"); Af (1$ptrarq) { echo "N&o 6 possivel abrir o arquivo teste.txt"; exit; ) while (1£e0€ ($ptrarg)) { echo “posigéo “.ftell($ptrarg).": "; $char = f£getc($ptrarq); if€($char == "\n") echo "\\n "; else echo $char. "
"; ) felose($ptrarg); Resultado: posigdo posigao posigéo posigdo posigéo posicao posigéo posigao posigdo posicéo posicéo posigéo posicéo posig&o posigao posicéo posigéo posigéo posicéo posicao posigéo posicéo posicéo posicéo posig&o posigao posigao posicéo Capitulo 13 Protocolo de transferéncia de arquivos O protocolo de transferéncia de arquivos (FTP — File Transfer Protocol) € utilizado para executar varias agGes, tais como, downloads ¢ os uploads que nada mais siio que a transferéncia, bit a bit, de arquivos de texto ou bindrios de um computador para outro. Os protocolos de uma forma geral trabalham através de requerimentos (requisiges ou perguntas) e respostas, mas especificamente no FTP, o servidor emite uma resposta para cada requerimento recebido do cliente. Um requerimento pode ser desde a abertura de uma conexiio até a Solicitagao de envio de um arquivo e, nesta situacio, a resposta sera a _ transferéncia de uma cépia do arquivo para o cliente. Os conceitos apresentados neste capftulo formam a base para fornecer uma manutengao em pastas e arquivos remotamente, ou seja, pela propria Internet. Para acessar um servidor pelo protocolo FTP é necessario conhecer bem sua configuragzio. Muitos provedores bloqueiam esse protocolo temendo uma invasao de hackers e utilizam o SSH (Secure Shell) que é um sistema de «a linguagem da Internet - PHP Orlentado a Objetos tansferéncia de arquivos com seguranga. Ele fornece autenticagio ¢ comunicagio segura sobre canais inseguros, geralmente sobre o FTP. 13.1. A conexio FTP Em primeiro lugar é necessério estabelecer um canal de comunicagio entre © computador cliente ¢ o servidor. Muitas linguagens de programacio oferecem alguma fungao que permite o estabelecimento da. comunicagao entre 0 computador cliente e o servidor. No PHP, esta fungao é a ftp_connect() que espera como principal parametro o nome do servidor para criar uma conexao entre 0 cliente € o servidor. O segundo parimetro é 0 némero da Porta do servidor que serd utilizada para estabelecer a comunicagao; a porta padrao do FTP € a ntimero 21 e se for fornecido 0 ntimero 0 (zero) ou nada for especificado neste paraimetro, a porta padrao serd usada. Porém, se for especificada uma porta alternativa, o servidor respeitaré o nimero fomecido € tentard se conectar a ela . Como resultado, fornece um identificador de conexao € ao final, deve-se encerrar a conexao com a fungiio ftp_close (), especificando 0 identificador obtido. Essas funges serio. exemplificadas no item 13.2, 13.1.1. Seguranga em uma conexiio O protocolo FTP implementa uma seguranga minima, composta por dois processos: * ode autenticagio do usuario através de login e senha; * 0 de permissiio que estabelece niveis de acesso Ais pastas ¢ arquivos. Isto € configurado no servidor de FTP. Como complemento, o servidor permite aindaa criagiio de um usuario com acesso a alguns arquivos especificos através de uma conexdo anénima, nao requerendo senha. As agGes desse usuario siio limitadas 4 c6pia de arquivos (download). Protocolo de transferéncla de arauivos» LO7 Para a validagaio dos dados de clientes autenticados, a linguagem PHP fornece a fungao ftp_login(), que exige como pariimetros: a identificagaio da conexio feita através da fungao ftp_connect() executada previamente, o login ea senha do usudtio. 13.1.2. Os modos de conexio Umcanal de comunicagio FTP é composto, na realidade, por duas conexGes: uma para o controle e outra(s) para a transferéncia de arquivos em si. * A primeira conexiio, que recebe o nome de conexiio de controle (Fip- control), € utilizada para a autenticagio do usuario e para receber os comandos. * Asegunda, chamada de conexiio de dados (Ftp-data), € utilizada para a transfer€ncia dos arquivos, por isso, no caso de se transferir mais de um arquivo ao mesmo tempo, podem ser abertas varias conexdes automaticamente. Existem dois modos paraestabelecer uma conexiio de controle: Padrioe Passivo. * No modo Padrio, a 'conexio de controle’ solicitada pelo cliente acontecerA através de uma porta determinada dinamicamente e receberd um numero compreendido entre 1024 e 65535. J4 no servidor, o ntimero da porta € padronizado como 21. A conexio de controle autentica o cliente e informa ao servidor sobre qual(is) arquivo(s) o cliente deseja a transferéncia, além disso, essa conexdio permite a passagem de comandos. A 'conexiio de _ dados' é aberta pelo servidor através da sua porta ntimero 20 que solicita ao "cliente uma porta dinamicamente na faixa jé citada. O cliente e servidor _ negociam o ntimero da porta onde serd feita a transferéncia de dados, como parte do processo da conexao de controle. + No segundo modo, 0 Passivo, o servidor fica esperando que o cliente abra a 'conexio de dados', Durante a 'conexiio de controle’, o cliente deve, entio, fornecer o ntimero da sua porta (entre 1024 e 65535) enquanto 0 servidor encontra uma porta também de ntimero alto. 108 ~ Fale a tinguagem da Internet - PHP Orlentado a Objetos 13.2. Os comandos FTP Apés ter uma conexiio FTP ativa, anénima ou identificada, varias ati vidades podem ser realizadas através dos comandos FTP, de acordo com a configuragio do servidor. A linguagem PHP implementa, através de fungdes especificas, os comandos desse protocolo; este capitulo descreve e dé exemplos sobre as fungées relacionadas. Lembre-se que todos os comandos siio realizados a partir do computador cliente em relag&o ao computador servidor. 13.2.1. Fungées sobre a conexiio A fungaio ftp_connect() abre uma conexiio FTP entre 0 cliente e 0 servidor. $servidor_ftp = "ftp.seu_servidor.com.br"; $id_conexao = £tp_connect ($servidor_ftp) or exit ("NSo foi possivel conectar com $servidor_ftp"); Opcionalmente, pode-se usar a fungiio ftp_ssl_connect(), que abre uma conexio segura do tipo SSL-FTP, mas ela nao serd analisada porque pode, inclusive, nao existir caso o suporte OpenSSL nio esteja instalado e habilitado, 0 que também depende da versio do PHP. A fungio ftp_loginQ), realiza o login do usuario em uma conexio FTP. Ela exige trés parmetros para habilitar o usuario. Além do login e da senha, é solicitado o identificador da conexio devolvido pela funciio ftp_connect(). Ela devolverd verdadeiro se 0 usuario for autenticado com sucesso e falso, no caso contrério, Além disso, imprime uma mensagem de aviso, portanto, € usual precedé-la com o @ para inibir os avisos textuais e obter 0 controle da manipulagao de erros. §autenticou = @ftp_login($id_conexao, $login, $senha); Af ($autenticou) { echo "Conectado como $login@servidor_ftp"; Protocolo de transferéncla de arquivos~ 109 ho "N&o foi possivel autenticar o usudrio $login
"; exit ("Sistema encerrado"); Para encerrar a conexiio efetuada com sucesso, pode-se utilizar tanto a fip_close() como a ftp_quit(), sempre especificando o identificador da conexao, fitp_close($id_conexao); // ou £tp_quit ($id_conexao) 13.2.2. Fungées de transferéncia de arquivos do servidor para o cliente (download) A fungiio mais basica que realiza um download é a ftp_get(), que copia um arquivo de um servidor para um cliente. Os nomes dos dois arquivos devem ser especificados e, se jé existir um arquivo local com o mesmo nome, ele ser sobrescrito. O modo de transferéncia é especificado pelo Gltimo parametro que pode definir a transferéncia como arquivo de texto ou bindrio. Um arquivo de texto pode ser transferido no modo bindrio sem erro, mas 0 inverso nao é verdadeiro, portanto, fixar esse parametro como bindrio € seguro. As constantes predefinidas FTP_ASCII ¢ FTP_BINARY podem ser utilizadas. if (£tp_get($id_conexac, $nome_arq_local, §nome_arg_remoto, FTP_BINARY)){ echo "0 download foi realizado com sucesso.
"; yelset echo "No foi possivel concluir o download."; y A fungao ftp_fget() é semelhante, porém, copia um arquivo do servidor salvando-o em um arquivo previamente aberto pela fungdo fopen() (veja item 110 = Fale a linguagem da internet « PHP Orlentado a Objetos 12.1). Neste caso, é necessirio especificar 0 indicador de posigéio dentro do arquivo remoto. $nome_arg_remoto = “arquivo.txt $ptr_arg_local = fopen("teste.txt", wn); $autenticou = @£ftp_login($id_conexao, $login, $senha); if (£tp_fget($id_conexao, $ptr_arq_local, $nome_argq local, $nome_arg_remoto, FIP_ASCIZ, 0) ( ho *O download foi realizado com sucesso.
"; echo "Ndo foi possivel concluir 0 download, fclose($ptr_arq_local); Outra variagdio € obtida pela fungao ftp_nb_fget(), que também obtém um arquivo de um servidor e escreve através de um ponteiro de arquivo, com a vantagem de nao bloquear a conexo. O que significa que a transferéncia é feita de forma assincrona, fato que permite realizar outras operagdes enquanto o download é realizado, Para terminar a transferéncia é necessdrio compor com a fungio ftp_nb_continue() que continua a operagiio (tanto de download como de upload) do ponto parado, portanto, é preciso testar se a primeira fungao terminou o download ou nfio. A cada chamada de ftp_nb_get(), ela retorna um entre os trés possfveis resultados: FTP_FAILED em caso de falha, FTP_FINISHED quando termina 0 download e FTP_LMOREDATA quando hé dados ainda para serem transferidos. $xesultado = ftp_nb_fget($id_conexao, §ptr. §nome_arq_remoto, PTP_BINARY); while ($resultado == FTP_MOREDATA) ( 7/ Mostra pontinhos na tela e continua fazendo o dowmload echo $ret = ftp_nb_continue($id_conexao); eq_local, d if ($xesultado {= FIP_FINISHED) exit("Houve erro no download..."); 13.2.3. Funges de transferéncia de arquivos do cliente para o servidor (upload) A fungao mais basica que realiza um upload é a ftp_put(), que copia um arquivo de um cliente para um servidor. As ocorréncias e modos na transfer€ncia so idénticos ao caso download. Protocolo de transferéncla de arquivos= 111 Af (ftp_put($id_conexao, $nome_arq_remoto, $nome_arq_local, BINARY) ) ( echo "0 upload foi realizado com sucesso.
"; Jolso¢ echo "Nao foi possivel coneluir 0 upload.) ) De forma semelhante ao download, existem variagGes da fungiio basica para upload, sao elas: * ftp_fput() e ftp_put() que salvam um arquivo transferido em outro previamente aberto no servidor. *ftp_nb_fput() e ftp_nb_put() que salvam um arquivo transferido de forma Assincrona em outro previamente aberto no servidor, sem bloquear outros comandos. $resultado = ftp_nb_fput($id_conexao, $nome_arg_remoto, fptr_arq_iocal, FTP_BINARY); While ($resultado == FTP_MOREDATA) { // Mostra pontinhos na tela e continua fazendo o upload echo "2"; §ret = ftp_nb_continue($id_conexao); £ ($xesultado 1= FTP_FINISHED) exit("Houve erro no poad...")7 3.2.4. Fungdes que atuam sobre os arquivos remotos ova porns oa cae EE na Ta ‘ei a in a ena tu a 112 = Falo.a linguagem da internet » PHP Orientado a Objetos 13.2.6. Outras fungées Ts GI aER lemme Capitulo 14 O banco de dados MySQL O MySQL é€ um servidor SQL, portanto, um servidor de dados. Neste ido, os procedimentos e regras seguidos para 0 acesso ao banco de dados io inerentes ao mesmo. A primeira regra para ter acesso a um servidor do anco de dados é ter um Jogin e senha cadastrados, com autorizacao para sar pelo menos um banco de dados. Alguns autores podem utilizar o termo inco de dados ao invés de servidor, e base de dados ao invés de banco de los. A Figura 11 mostra a relagio entre um servidor do banco de dados, os ancos existentes € suas tabelas, formando uma espécie de hierarquia. ‘Senidor de dados a “Fabela | do banco de dados 2 “Tabela do banco de dados ? Figura 11. Relagao entre o servidor, bancos e tabelas 114 = Fale a linguagem da Internet « PHP Orlentado a Objetos A seqiiéncia basica para ter sucesso nas operagdes com o banco de dados €: * Conectar-se ao servidor do banco de dados; * Selecionar um banco (ou base) de dados especifico; * Manipular as tabelas. 14.1. Alguns tipos de dados suportados pelo MySQL Tipos caractere: O tipo VARCHAR (Tabela 17) ocupa 1 byte para guardar o tamanho da string. Tipo Tam. amazenado | Tam. mii Byles CHAR) Definido por x Definido por x 1255 VARCHAR) | Tamanho da siring | Definido por x-L 1a3s Tabela 17. Tamanhos dos tipos caracteres Tipos string (Tabela 18): Tipo. Tam, maine Bytes TINYTERT [278-1 285 TEXT 2516-1 (AKI) 65555 MEDIUMTEXT | 2°24-1 (I6M-1) 16777213 LONGBLOB | 2°32-14G-N) PUVGTDS Tabela 18. Tamanhos dos tipos string Tipos binétios: Um BLOB (Tabela 19) é um objeto bindrio que pode ser utilizado para guardar varios tipos de dados de forma contigua. Tipo Fam. mine Bytes "TINYBLOB. 28-1 255 ‘BLOB 2516-1 (ARCA) 65535) ‘MEDIUMBLOB | 2°24-1 (I6M-1) 16TTTAIS LONGBLOB | 2°99-1G-1) 291967295 Tabela 19. Tamanho dos tipos BLOB Obaneo de dados MySQL = 115 ‘Tipos numéricos inteiros (Tabela 20): [Tipo Byes [Be HE TINYINT “1 D7 SMALLINT 2708 aT ‘MEDIUMINT SRR EIRNGOT INT TROT 21a7aRSoT BIGNT STATOR RSTO Tabela 20. Tamanho dos tipos inteiros ‘Tipos numéricos decimais: DECIMAL, FLOAT, REALe DOUBLE PRECISION. Tipos de data e hora (Tabela 21): “Tipo de Colum Valor Zero" DATETIME "0000-00-00 OOO "0000-00-00" ‘09000000000000 (amano depends do tamano do display) On ‘0000 Tabela 21. Formato dos tipos data e hora 14.2. Conexfo com um servidor __ Existe duas fungdes PHP para efetuar a conexiio com o servidor: mysql_connect() e mysql_pconnect(). Ambas esperam como parametros 0 enderego (URL) do servidor, o login a senha do usuario. __ Adiferengaentreclas a formacomo as novas conexées sio abertas ¢ fechadas, __ Afungao mysql_connect() possui o parmetro adicional 'new_link' que Haz com que uma nova conexio seja aberta sempre que invocada, mesmo. que receba os mesmos parametros definindo o URL, login e senha. Além isso, a ligagdio com o servidor ser fechada assim que o script for encerrado ‘u quando a fungiio mysq|_close() for invocada. ‘A fungio mysq|_pconneci()estabelece ligagdes persistentes como servidor, iignificando que ela no ser encerrada quando o script terminar, nem quando fungao mysql_close() for invocada. 1.16 = Fale a inguagem da Internet - PHP Orlentado a Objetos Exemplo: §servidor = "ww.servidor.com.br"; §usuario ogin_do_usr"; §senha = “senha_do_usr"; §conexao = mysql_connect ($servidor, $usuario, $senha); Esta fungiio retorna um identificador da conexao em caso de sucesso ¢ falso em caso contrario. No exemplo acima, a variével $conexao armazenarii oidentificador. 14.3. Selecaio de um banco de dados do servidor A fun¢io PHP, que permite a selecdo ou abertura de um banco de dados ao qual 0 usuario validado tem acesso, espera receber 0 nome do banco eo identificador da conexo. Informar o identificador € opcional, visto que a conexao pode ser feita automaticamente com a tiltima conexao aberta. Exemplo: $banco = “nome_do_banco"; mysql_select_db(§banco, $conexao) ; mysql_select_db($banco) ; // ou simplesmente 14.4. Manipulacao das tabelas de um banco de dados Depois de estabelecida a conexiio com o servidor de dados ¢ selecionado 0 banco de dados a ser utilizado, quase toda a interac com o servidor MySQL pode ser feita através de consultas SQL, chamadas originalmente de querys. Essas consultas sao escritas naturalmente em uma linguagem conhecida por SQL (Structured Query Language). Os comandos SQL serio destacados em maitisculo nos exemplos a seguir. A fungio PHP que permite efetuar as consultas é a mysql_query(), que espera receber como pardmetros uma string definindo a consulta e, opcionalmente, 0 identificador da conexio. O baneo de dados MySQL = 117 MYsdl_query("string de consulta", $conexao); // ou mysql_query("string de consulta"); Para cada string de consulta SQL, 0 servidor MySQL retorna através da fung’io mysql_query() valores. especificos, portanto, esse retomo ser analisado Oportunamente em cada operagaio nos itens subseqiientes, A seguir serio debatidas as OperagGes ¢ as strings de consulta que. disparam A operagao. O resultado de uma. Operagao pode, na verdade, ser uma consulta 40 banco ou uma agao de escrita nele. De forma resumida e de interesse desta publicago, as operagées sio: 14.5. Operacées na tabela 14.5.1. Criagdo de uma tabela Ocomando SQL utilizado Para criar uma tabela é 0 CREATE TABLE, que espera o nome, o tipo, o tamanho e outros dados para cada varidvel que comporé o cabegalho da tabela. Exemplo: name ena indice fe aia [2 Poi de Siva silvaexciplo com.br Cédigo: str = “CREATE TABLE teste ‘ indice int(5) unsigned Nor NULL auto_increment, nome = varchar(50) NOT NULL default * email varchar(30) NOT NULL default ++, jogin varchar(10) NOT NULL default ‘+, senha varchar(10) NOT NULL default *'. PRIMARY KEY (‘indice’) yy = mysql_query($str) or die("Query invalida: “.mysql_error()); echo “resultado: gres"; 118 = Pale a tnguayen da tnternet « PHP Orlentado a Objetos A diretiva "auto_increment" é uma facilidade do SQL que permite que uma variavel seja incrementada automaticamente a cada insergao. A fungiio die() serd invocada automaticamente se ocorrer um erro naquelt operagio. A fungiio mysql_error() identifica o erro ocorrido retornando uma string com 0 c6digo ¢ a explicagio do erro. 14.5.2. Limpeza dos dados de um tabela O comando TRUNCATE TABLE do MySQL é responsdvel por apagar todas as linhas da tabela e reiniciar o contador automatico de inserges. utr = "TRUNCATE TABLE teste"; res = mysql_query($str) or die("Query invalida: “-mysql_error()); oho “resultado: grea"; 14.5.3. Remogio de uma tabela Uma tabela pode ser apagada mesmo contendo dados através do comando DROPTABLE. utr = "DROP TABLE tester; Gres = mysql_query($str) or die ("Query invalida: “.mysql_error()); echo “resultado: $res" 14.6. Operagées sobre os dados da tabela 14.6.1. Insergio de linhas na tabela Os itens a seguir tratam de operages sobre as linhas de uma tabela selecionada. A primeira operagio é a insergiio de dados na tabela, 0 que é feito sempre linha por linha, mesmo que nem todos os campos (ou colunas) estejam preenchidos. + nome , email) ‘sica@exemplo.com.br') (atx = "INSERT INTO t VALUES ('' "7 $res = mysql_query($str) or die ("Query invali @oho “resultado: $res
nimero de linhas af " mysql_affected_rows($conexao) ; ".mysql_error()); adas: O banco de dados MySQL = 119 Assumindo que a query foi bem-sucedida, é possivel chamar a fungao mysql_affected_rows() que retorna o nimero de linhas que foram afetadas pelo comando INSERE. Caso nao seja especificado o identificador da eonexao, a ultima conexio sera utilizada. Isto também vale ‘para os comandos, DELETE, REPLACE ou UPDATE, analisados a seguir. Ocomando REPLACE funciona exatamente como o INSERT, exceto que se um registro antigo na tabela tiver 0 mesmo valor de um novo registro em um indice UNIQUE ou PRIMARY KEY, 0 registro antigo seré apagado Antes do novo registro ser inserido. 14.6.2. Pesquisa e apresentacao de uma linha Ocomando SELECT ¢ utilizado para retomnar os registros selecionados em uma tabela. Existem algumas opgGes de composi¢ao desses dados: ‘@specificando em quais colunas a pesquisa deve ser feitae especificando as Beondices de pesquisa através do operador WHERE. A forma geral é: FROM WHERE ORDER BY LIMIT Para especificar uma coluna, basta colocar onome dela, mas para especificar ais de uma necessdrio separar os nomes por virgulas. Para especificar todas colunas da tabela, utilize o * sem explicitar nenhum nome de coluna. Exemplo 1: O SELECT abaixo retoma todas as colunas de todas as linhas a tabela ‘teste’, tr = “SELECT * FROM teste"; es = mysql_query($str) or die ("Query invalida: ".mysql_error()); 120 ~ Fale a linguagem da Internet - PHP Orientado a Objetos Assumindo que a query seja bem-sucedida, vocé podera chamar mysql_num_rows() para achar quantas linhas foram retornadas por um comando SELECT, por isso é necessério especificar a varidvel $res como pardmetro, Além disso, é poss‘vel utilizar a fungdo mysql_fettch_array() para pegar cada linha que corresponde a pesquisa feita. Essa fungiio retornara um array, cujos indices sio nimeros ou os nomes dos campos da tabela, ou falso, caso nao haja mais linhas para ler. Continuagdio doExemplo 1: echo “resultado: $res
nimero de linhas retorna\ ".mysql_num_rows(§res). "

"; while (§dados = mysql_fetch_array($res)){ echo jos['indice'].*
"; echo ‘mome'] —.'
"y echo $dados['email'] .'
"; echo $dados{‘login'] .'

'; O indice do array retornando pela fungdio mysql_fetch_array() depende de um pardmetro opcional que pode assumir trés valores predefinidos por constantes. Utilize: * MYSQL_ASSOC para que os indices sejam os nomes dos campos da tabela. * MYSQL_NUM para que os indices serjam mimeros de zero an. * MYSQL_BOTH para ambos. Se o tipo de indice for omitido, esta constante é assumida como padrio. Existem duas outras fungGes que atuam de forma semelhantes. Utilize a fungao * mysql_fetch_row($res), para receber um array indexado por ntimeros. * mysql_fetch_assoc($res) para receber um array indexado pelos nomes dos campos da tabela. As condigées Iégicas sio basicamente as mesmas da linguagem PHP descritas no item 5.3, porém, é possivel encontrar strings semelhantes utilizando 0 operador LIKE, ao invés do operador = para encontrar strings O banco de dados MySQL « 121 exatas, O operador = diferencia maitisculas de mintisculas, j4 o LIKE ni faz essa diferenga, além de permitir caracteres coringas. A Tabela 22 mostra os caracteres que, quando compostos com a palavra-chave a ser pesquisada no banco de dados, modificam a forma de comparagio entre a palavra pesquisada e as palavras guardadas no banco. Coringa | Deserigaa % ‘Comresponde a qualquer nimero de Caractere, a1 vero earacier® ‘Corresponde a evalamente um caractere Tabela 22. Caracteres de apoio a pesquisa no banco de dados Exemplo 2: Retorna apenas a coluna email’ de todos os nomes que contém ‘carlos’, independentemente das letras serem maitisculas ou mintisculas, e que contém qualquer outro prenome e sobrenome, inclusive vazios. SELECT email FROM teste WHERE nome LIKE ‘kcarlos%' Exemplo 3: Retora todas as colunas da linha que contémo nome ‘Carlos’ cuja primeira letra pode ser qualquer outra (inclusive mintiscula) e que tenham qualquer sobrenome, inclusive nenhum. SELECT * FROM teste WHERE nome LIKE ‘_arlos%* Opcionalmente, pode-se ordenar o resultado por alguma coluna da tabela utilizando 0 operador ORDER BY e também limitar o ntimero de resultados com 0 emprego do operador LIMIT. Exemplo 4: Retorna as primeiras 10 linhas da tabela ordenadas pelo nome. SELECT * FROM teste ORDER BY nome LIMIT 10 Em conclusio, todos os operadores analisados acima podem ser combinados utilizando as fungdes logicas AND, ORe XOR 1.22 = Palo alinguagem da tnternet « PHP Orlentado a Objetos Exemplo 5: Validagiio de login e senha fiovin = gumee_post_vanst‘togin't;// Login para foana = gurrp_posr_vans{‘aenha'},// souha pore // conecta a0 = "servidor.com.br*; /1 sexvidor de bance de dados = "sican; 11 Login para se conectar ao = n123ase; // senha para se conectar ao servidor do banco = mysal_pcomnect ($host, $user, Spas. 11 conecta ao bance de dados 17 seleciona o bando de dados fhase = "meu_banco"; ct _ab(sbase) 7/ con 0 Login @ senha a seren validados // vatida a genta no bance fic = "SELECT + FROM tabe1a WHERE login = ‘Slogin* AND senha = ‘$senha'*; fary = myeqi_quezy (saat); fachou = mysql_num_rows($ary); Af (Sachou == 0) echo = Login e/ou Senha invé2idos!* exits > oho "Login © Senha validados!*; 14.6.3. Atualizagio dos dados de uma linha Atualizar os dados significa, principalmente, modificar alguma informagao proveniente, por exemplo, de uma alteragao e cadastro, portanto, somente 08 campos alterados precisam ser informados, Exemplo: itr = “UPDATE teste SET none = ‘Carlos Sica’ WHERE indice = °2/ LIMIT 1"; fres = mysql_query(gstr) or exit (“Query invalida: “.mysql_error()); @cho “resultado: §res
"; @cho “némero de linhas afetadas: “; echo mysql_affected_rows($conexao); Caso a coluna ‘nome' contenha o mesmo valor Pproposto para a mudanga, ela no serd alterada ea fungaio miysql_affected_rows() retornaré 0 (zero). Obanco de dados MySQL = 123 14.6.4, Remogiio de uma linha A remogao de uma linha da tabela € feita pelo comando DELETE. E necessiirio especificar algum elemento para identificar a linha que sera removida através do definidor de condig’io WHERE. CUIDADO, se nenhuma condigao for estabelecida, TODAS as linhas serfio apagadas, de modo semelhante a0 comando TRUNCATE, Exemplo: fatr = “DELETE FROM teste WHERE nome = ‘Carlos sica’ LimrT 1"; fres = mysgl_query(Sstr)or exit ("Query invalida: “.mysql_error()); @cho “resultado: §res
"; echo “niimero de linhas afetadas: “; echo mysql_affected_rows($conexao) ; 14.7. Exemplos de funcdes MySQL A fungiio mysql_field_flags() retorna o estado (status) de uma consulta §xes = mysql_query("SELECT * FROM aluno"); print_r(explode(' ', mysql_field_£lags($res,0))); Resultado: Array ( 101 not_null. ta) primary key [2] unsigned 13] auto_increment ) A funcao mysq|_stat(), éutilizada para verificar oestado. (status) de umaconexiio, print_r(explode( ', mysql_stat($con))); Resultado: Array ( (01 => Uptime: 72550 (1) => Threads: 1 [2] => Questions: 3322 124 ~ Fale a linguagem da Internet - PHP Orlentado a Objetos [31 => Slow queries: 0 (41 Opens: 1604 (51 Flush tables: 1 (61 open tables: 64 71 Queries per second avg: 0.046 Existe um conjunto de fungdes que atuam no banco de dados com operagées que tratam os dados como objetos. Para obter e imprimir um objeto com informagGes da base de dados util $obj = mysql_list_dbs($con); while ($linha = mysql_fetch_object ($obj)) ( echo $1inha->Database."
"; > Como resultado, sera mostrado o nome da base de dados ou bases de dados, ligadas a conexo corrente. Para obter ¢ imprimir um objeto com informagées do processo, utilize: $obj = mysql_list_processes($con); while ($linha = mysql_fetch_assoc($obj)) ( echo $linha[*ra"]."
". $linha["Host"]."
". $linha["db"]. "
". $linha["Command"] . "
". $linha["rime"] ."
"; Resultado: 301 servidor.com.br:59202 sica Processlist 0 14.8. Lista de funcdes PHP para acessar MySQL Um resumo das fungdes PHP que acessam o banco de dados MySQL é mostrado na Tabela 23. O banco de dados MySQL = 125 Agi minal affected_ rowdy ‘Devolve o namero de Tinhas afsiadas na Giima operayio ccom as declaragdes INSERT, UPDATE 08 DELETE, Opcionalmente pode ser especificado o resultado da Loperago que se desea consular o nimero de linha. Inyil_ change wser(nove_uswro, senha) “Troca o vsudrio validado na conexio ativa iyiql-client_encoding() Reloma o nome do conjunio de earacteres wilizado pelo cliente, por exemplo,” Latin!" inyaal_cTose( conto) Fecha uma conexio my connect (server, usvario, senha) ‘Abre ume conexio vid ereate_db(nome_ base, conexdo) ‘Cria una base de dados ‘myaql_db_name(ista_base) ‘Retoma o nome da base de dades aberias apés a chamada de mysal list dbs) Tiyaal_db_query(base, conexioy TEnvia uma operagao ao servidor para ser relizada em tama base de dadas especifcada ijaal drop _ab(nome base) ‘Remove wna base de dados Reena 0 nimero do er oe a Ukima Opeapt, Retoma o texto do ero ccorride na Ultima operagio, ‘string vazia indica sucesso Tijnal Teich _array(eanaltad, ipa) evolve um aray indexado por nimeros ox pelos nomes dos campos da tabela contendo os dados deus Tha da tabela aps aslima consul ¢incrementa o apontador interno de lnhas para a peéxima. Se ndo houver mais linha, retoma ze. O tipo de retorn & indicado pelo ‘limo parimesro que pode sssumir: MYSQL_ASSOC para noms, MYSQLNUM para miimetos ou MYSQL_BOTH para ambos. Se _neahum for expecifcada o timo é asumido por padeo, inyral_fetch_row(resultadoy Devolve um array indexado por nimeros, contends os dados de uma Tinka da tabela, apés @ dima consulta & Jnerementa 0 apontador interno de linhas para a préxima. ‘Se ndo houver mais linhas, retoma zero, Devolve um atray indexado pelos names da tabela, ccontendo os dados de uma linha da tabola, apés a time consult € inerementa 0 apentador interno de linhas para 1 proxima, Se nio houver mais linhas, retorna zero, ‘informa o tamanho de cada campo resullaate de uma consulta ‘Retoma um objeto com informagoes sobre & consulta cespecificada Tnforma o estado de um resultado Tomneside por uma ormagdes slo separadas por espago, Retorma 0 tamanho de um campo "resullante de uma ‘consulta. 0 indie do campo dentro do array reeebido pela consulta dve ser indica, ‘Retoma o nome de um campo resultate do wma consulta, © indice do campo dentro do array recebido pela consulta deve ser indicado, Fornece o nome da iltina bela consutada ‘Retoma © tipo de um campo resultante de uma consuls © indice do campo dentro da array reeebido pela consulta deve ser indicado. Libera a meméria oeupada por um resullado de consulta ‘Retorna a versto do cliente do MySQL ‘Retoma onome do servidor MySOL_ ‘Retorna a identficagdo do protocolo ‘Retorna a identifieagdo do servidor 126 ~ Fale a linguagem da Internet - PHP Orlentado a Objetos Fangio gio ‘mysql_info(resultadoy "Mostra informagies da operagio mais recente com Wi declares INSET, LOAD, ALTER, UPDATE. ‘mysql inser WO ‘Mosirao indice da ita inserelo feta no bunc ‘mysql_list_dBs(conextoy Tiyan proceseafeonenio) Finys um, elsrsliado) ‘Retoma informagies sobre a(s) base(s) de dados di ‘conexio aberta Mostra informagice a rexpeito do proves Tinforma 0 nGmero de campos (colunas) que compoan ‘tim tabela consultada ‘agagl pum Fows(resuliado) evolve 0 nimero de Iinhas afvtadas em ume operagio se consulta com a dectaagio SELECT. ‘yaql_peonnect(Servider, usuario, senha) ‘Abre uma conexio persistente ‘mysai_ping(eonexio) ‘Retemna verdadeiro se 0 servidor es allvo € Taso caso contri, O parnero conexto é opcional, Tmyegl_query(cting) avia oporagies 20 servidor MySQL. mya esull(cesulado Tinka) Retorna o conteddo de um campo a parr do resulado de ‘uma consulta, Deve-se especificar o niimero da lina que se deseja acessar. ‘ayeal_select_db nome base) ‘Seleciona uma base de dados a partir de wm conexio aberta ‘ayeal_sia(eoneda) informa 0 Gslado do sistema referents a conesto aber. {As informagées slo separadas por 2 espapos, utilize a Fangio explode() para separa. ‘ayaGl thread fo(conexto) Relorna a identfieagio do dread da conexio cespecificada Capitulo 15 E-mails autenticados com o protocolo SMTP 15.1. O protocolo SMTP Em principio, SMTP é um servidor para enviar e-mails. O nome vem do inglés "Simple Mail Transfer Protocol” que significa "Protocolo Simples de ransferéncia de Mensagens", eletrénicas, naturalmente. Protocolo é um conjunto de regras utilizadas para estabelecer uma somunicacio entre dois sistemas, neste caso, entre o cliente eo servidor, Os protocolos trabalham através de requerimentos (requisiges ou lerguntas) e respostas, ou seja, o servidor emite uma resposta para cada querimento. Em geral, os requerimentos s’io compostos por uma linha texto, ‘ontendo um comando que pode exigir pardmetros ou niio. Jé a resposta le conter uma ou mais linhas do tipo texto plano, mas todas elas contém cédigo que pode ser de acerto ou de erro. Em primeiro lugar é necessario estabelecer um canal de comunicagiio com servidor. Muitas linguagens de programagio oferecem alguma fungdio que irmite o estabelecimento da comunicagao entre o computador cliente e 0 128 ~ Fale a linguagem da internet » PHP Orientado a Objetos servidor. No PHP, esta fungio é a fsockopen() que espera como principal parametro 0 nome do servidor paracriar um socket entre o cliente ¢ 0 servidor. Para definir um socket, pense antes em uma tomada de energia que liga 0 aparelho de som ii rede elétrica - é essa a idéia. O computador cliente vai se conectar ao computador servidor através de uma ligagiio légica para promover uma comunicagiio bidirecional. Essa ligagdo é chamada de socket. 15.1.1. Os requerimentos e as respostas nesse protocolo Um requerimento é uma string de bytes que contém um comando chamado, na literatura técnica, de verbo, que pode receber parametros ou nao. Ao final de cada comando (¢ parametros) deve vir uma quebra de linha, pois, o préximo comando deve iniciar em uma nova linha. A quebra de linha €comandada pelas constantes \r\n. A forma geral de um comando para o servidor SMTP. VERBO parametros\r\n As respostas so compostas por um ntimero de trés digitos, formatado como uma string ASCI, seguido por uma mensagem explicativa, Esses dois componentes podem estar separados por espaco, traco ou outro separador. 999 exemplo de resposta 999-exemplo de resposta 15.1.2. Os comandos SMTP para enviar e-mail Existem varios verbos ou comandos SMTP, mas serio explicados somente 0s comandos necessarios para estabelecer uma comunicagiio de envio de e- mail € as respostas que cada verbo fornece. Lembre-se que esses verbos serdo recebidos pelo servidor através do socket, que existird apenas apés 0 estabelecimento de uma conexiio. mails autenticados com 0 protocolo SMTP = 129 MAIL Este verbo requer que o servidor estabelega um enderego de retorno no envelope, que sera utilizado, por exemplo, para enviar exemplos de mensagens de erro. MAIL From: sica@exemplo.com.br\r\n Exemplo de mensagem de aceitagiio: 250 ok Exemplos de mensagens de erro: 500 line too long 555 garbage not permitted 501 malformatted address 451 timeout RCPT Este verbo solicita ao servidor que escreva um ou mais enderegos de destino no envelope. RCPT To: carlos@exemplo.com.br\r\n Exemplo de mensagem de aceitagao: 250 ok Exemplos de mensagens de erro: 450 mailbox busy, try again later 452 recipient out of disk space 452 too many recipients 503 need MAIL before RCP 550 no such recipient here 551 recipient has moved 553 we don't relay mail to remote addresses 1.30 » Fale a linguayem da Internet « PHP Orlentado a Objetos DATA Este verbo estabelece 0 inicio da composigio do e-mail a ser enviado (nao requer parametros). DATA\r\n As prximas linhas enviadas ao servidor devem ser escritas em um formato especifico, contendo os varios campos necessirios para construir um e-mail (veja abaixo). Um ponto estabelece 0 final do texto. MIME-Version: 1.0\r\n Content-Type: text/html; charset=iso-8859-1\r\n From: Carlos Sica \r\n To: José Silva \r\n Subject: teste de email\r\n \r\n Agui_vem o corpo do email que 6 um texto composte por linhas de 80 caracteres.\r\n +\r\n Exemplo de mensagem de aceitagiio: 354 go ahead Exemplos de mensagens de erro: 451 unable to set up internal message buffer 503 need RCPT before DATA 552 sorry, this message is too large 554 too many hops, this me: is looping QUIT Solicita 0 encerramento da conexio que est aberta (nao requer parametros). Qurr\r\n Lomails autenticados com 0 protocolo SMTP = 131 Exemplo de mensagem de aceitagio: Bad: nai1.exenpic.con-br 15.1.3. Os comandos SMTP para estabelecer handshake com 0 servidor Caso seja necessério testar a conexo com o servidor antes de enviar _ umae-mail, pode-se utilizar os seguintes verbos: HELO : ‘Fala oi' para o servidor SMTP. MELO smtp.exemplo.com.br\r\n Exemplo de mensagem de aceitagio: i 220 mail.exemplo.com.br ESMTP , ; __ Limpa o envelope presente no servidor (nao requer parametros). SET\r\n Exemplo de mensagem de aceitagiio: 50 flushea _ Alguns servidores reconhecem também um HELO estendido, conhecido 1 EHLO. EHLO Semelhante ao HELO, porém, responde com um texto contendo formagdes sobre as aptidées do servidor. Esse texto 6 compreensivel pelo jomputador. 132 = Fale a linguagem da Internet « PHP Orlentado a Objetos Euno\r\n Mensagens de aceitagio 250-mail.exemplo.com.br 250-AUTH LOGIN CRAM-MD5 PLAIN 250-AUTH=LOGIN CRAM-MD5 PLAIN 250-STARTTLS 250-PIPELINING 250 SBITMIME Como cada servidor pode responder com mensagens de aceitaciio diferentes e com ndmeros diferentes. E aconselhdvel utilizar um lago de repeticao para encontrar a tiltima mensagem, assim a resposta estar completa. £puts($conexao, "EHLO $servidor\r\n", 512); dot Sbuffer = fgets($conexao, 512); echo “loop: ".$buffer. "
"; Jwhile (substr($buffer, -8) != ‘8BITMIME'); 15.1.4. Os comandos SMTP para validar login e senha Os verbos estudados acima sao os necessérios para compor e enviar um e-mail através do servidor SMTP. Porém, quando o servidor esta configurado para enviar apenas e-mails de usudrios cadastrados, é necess4rio validar seu login e senha. Para tanto, deve-se utilizar 0 verbo AUTH. Apés essa requisigao ser aceita, deve-se enviar o login e senha encriptados. AUTH Solicita a autenticagaio AUTH LOGIN\r\n Exemplo de mensagem de aceitacao: 334 VxNicmshbwo6 smalls autenticados com o protocolo MTP = 13.3 15,2. O carteiro na pratica Em primeiro lugar, serdo definidas as informagées a serem utilizadas na eonexio com o servidor SMTP, que sao: o nome dele e a porta de comunicagio. A porta 25 é padrao para todos os servidores SMTP. Além dessas informagées, a fungiio fsockopen() solicitara um parametro opcional, que é uma constante definindo o tempo de espera para uma segunda tentativa, uso haja impossibilidade de estabelecer a conexio de imediato. mtp.seu_servidor.com.br"; = 25; Como se planeja enviar e-mails com validacio, € necessario esclarecer luais sto as informag6es para a validaco do usuario no servidor. ‘"sou_login@eeu_servidor.com.br*; // em alguns servidores basta o seu_login 71 sexba no formato texto _ E Gtil também projetar o e-mail antecipadamente. Neste exemplo, as aridveis so definidas diretamente, mas é possfvel receber cada contetido yrado a partir dos campos de um form HTML. “origem@seu_servidor.com.br*; “origem"; tino@seu_servidor.com.br"; "Destino"; "Mensagem com autenticagéo OK
bysicae"; massunto"; q i ‘ = . Curiosamente, a data nao é gerada automaticamente, ento é necessario \tilizar a fungao date() para criar uma string no formato RFC2822 com o seguinte estilo: "Wed, 25 May 2005 13:24:07 -0300", onde o tiltimo ntimero ‘corresponde a zona, referindo-se aos fusos hordrios onde foi gerada a string. 134» Fale a linguagem da internet « PHP Orientaclo a Objetos data = "Date: '.date('r',time(}) 7 exigéncia do servidor // este formato 6 Comegando o script em si, vem a conexiio com o servidor SMTP. A fungiio fsockopen(), como jd analisado, é a fungdo escolhida, O simbolo @ no inicio indica que € para ocultar as mensagens de erro automaticas, porque € possivel manipular os erros através de duas varidveis alteradas pela fungi: Sermo e $errstr. $conexao = @fsockopen($servidor, §porta, $errno, gerrstr, $timeout); Se ocorrer algum erro, a varidvel booleana $errno informard | (verdadeiro), se nao informara 0 (falso). Portanto, se ocorrer erro, 0 scri ipt ser interrompido pela fungao exit. 4£ ($errno)¢ exit ("Erro ao conectar ao $servidor na $porta: ".gerrstr); y Se nao houver erro, o script continuaré aqui. B importante explicar um pouco mais a fungdo fsockopen(). Sempre que ela abre uma conexiio, um socket é criado e abrir uma conexiio é muito semelhante a criar um arquivo, assim podemos escrever nela € Ié-la, o que significa enviar comandos (requisi¢’io) para o socket e receber os resultados através deste pseudo- arquivo. Assim os comands utilizados stio os mesmos de ler e escrever nos arquivos: fputs() e fgets() j4 debatidos no Capitulo 12. Caso vocé esteja testando o que o servidor devolve como resposta, € possivel imprimir esses resultados lendo 0 socket como no exemplo abaixo. Esta linha pode ser inserida no script, apés cada envio de comando ou dado. echo “informagao: ".fgets($conexao, 512)."
"; Remails autenticados com 0 protocol SMTP = 13.5 Neste ponto, é preciso conhecer bem o servidor utilizado. Cada um pode tesponder de forma diferente a uma conex4o. Alguns exigem uma mensagem de handshaking precedendo os outros comandos. Se for necessétrio, utilize o verbo HELO ou o EHLO descritos no item 15.1.3. Visto que cada servidor pode responder de forma distinta a essa indagagiio, © trecho elaborado generaliza a espera de um némero distinto de respostas, 4 HELO ou EHLO, enviadas pelo servidor. fputs($conexac,"EHLO $servidor\r\n", 512); do( Sbuffer = fgets($conexao, 512); cho "loop: “.$buffer. "
" Jwhile (substr($buffer, -8) != ‘8BITMIME'); Continuando, agora é necessirio solicitar ao servidor SMTP a autenticagio, O que € feito pelo verbo AUTH LOGIN mas, caso deseje enviar e-mails sem autenticar, € s6 tirar esse trecho. Em seguida ao requerimento, envia-se o login e a senha no formato que o servidor espera receber: codificado. A fungiio base64_encode() codifica uma string no formato esperado. fputs($conexao, "AUTH LOGIN\r\n", 512)."
"; fputs ($conexao,base64_encode($login)."\r\n", 512)."
"; fputs (Sconexao, base64_encode($senha)."\r\n", 512). "
"; Feitaa validagao, é necessario fixar um e-mail de retorno, por exemplo, para receber mensagens de erro, tais como, destinatdrio nao encontrado, e seqiiencialmente, o enderego do destinatario. fputs($conexao, “MAIL FROM:<$de>\r\n", 512); fputs($conexac, “RCPT 70:<$para>\r\n", 512); Finalmente, vem a composigiio do e-mail propriamente dito a ser enviado, Para tanto, o comando DATA deve ser enviado e, logo apés ele, 0 servidor 1.36 = Fale a linguagem da internet « PHP Orlentado a Objetos espera que daf para frente tudo que for enviado para ele seja os dados do ¢ mail até que seja enviada uma linhacom o ponto final, fputs($conexao, "DATA\r\n", 512); fputs($conexao, "MIME-Version: 1.0\r\n"); fputs($conexao, “Content-Type: text/html; charset fputs($conexao, “Date: $data\r\n"); fputs($conexao, “From: §deNome <§de>\r\n"); fputs($conexao, "To: $paraNome <$para>\r\n"); fputs($conexao, "Subject: $assunto\r\n"); fputs($conexao, "\r\n"); fputs(§conexac, "$corpo\r\n"); fputs($conexac, ".\r\n")7 so-8859-1\r\n"); Repare, ent&o, que existem dois detalhes importantes para que esta taref'a seja realmente realizada com sucesso: 1) antes do corpo do e-mail é necessatio enviar uma linha em branco e 2) apés ele, encerrar com uma linha contendo apenas um ponto. Claro, o \r\n € necessdrio em todas as linhas. Se for interessante, pode-se inserir a string Ce: que significa'Com Cépia’, em inglés, ‘Carbon Copy’ e ainda a string Bcc: que gera uma cépia oculta, do inglés, ‘Blind Carbon Copy’ Agora, falta apenas encerrar a conexaio com 0 comando QUIT. fputs($conexao, "QUIT\r\n", 512); echo “quit: “.fgets($conexao, 512)."

Anda mungkin juga menyukai