História e Funcionalidades do PHP .................................................................................... 4 O ambiente WEB .................................................................................................................. 7 Ambiente de desenvolvimento ............................................................................................. 9 Ambiente HTTP.................................................................................................................. 12 Estrutura do código PHP ................................................................................................... 17 Integrando PHP com HTML ............................................................................................. 20 Tipos de Dados .................................................................................................................... 21 Variáveis .............................................................................................................................. 24 Constantes ........................................................................................................................... 25 Operadores .......................................................................................................................... 26 Estruturas de Controle ....................................................................................................... 32 Funções: definição, criação, return, parâmetros. ............................................................ 37 Reutilização de Código Include e require......................................................................... 40 Função Recursiva ............................................................................................................... 41 Trabalhando com Array .................................................................................................... 43 Trabalhando com String .................................................................................................... 50 Trabalhando com Data e Hora .......................................................................................... 56 Formulários HTML ............................................................................................................ 60 Upload de Arquivos ............................................................................................................ 63 Sessões e Cookies ................................................................................................................ 66 Manipulando Arquivos ...................................................................................................... 67 Enviando E-mail ................................................................................................................. 72 Integrando PHP com Mysql .............................................................................................. 76 Ferramenta para trabalhar com Mysql phpMyAdmin ................................................. 80 Introdução a OO com PHP ................................................................................................ 81 Definindo uma Classe ......................................................................................................... 84 Construtores e Destrutores ................................................................................................ 88 Instanciando um Objeto ..................................................................................................... 91 Trabalhando a segurança do seu sistema ......................................................................... 92 Exercícios Resolvidos ....................................................................................................... 102 Exercícios Propostos ......................................................................................................... 115
3
Projeto E-JOVEM
Introdução Traremos nesta apostila uma das linguagens mais utilizadas para o desenvolvimento WEB, a linguagem PHP que é um acrônimo (sigla) para Hypertext Preprocessor, o PHP é uma linguagem de código-fonte aberto. Em comparativo com outras linguagens como PERL ou C, o PHP ao invés de escrever um programa com um monte de comandos para imprimir HTML, você escreve um arquivo HTML com algum código inserido para fazer alguma coisa (nesse caso, imprimir um pouco de texto). O código PHP é delimitado por tags iniciais e finais que lhe permitem pular pra dentro e pra fora do “modo PHP”, mas isso explicaremos melhor durante o curso. 1. História e Funcionalidades do PHP O PHP foi criado por volta de 1994 por Rasmus Lerdorf, que inicialmente o utilizava em sua home page pessoal. Em meados de 1995 ele passou a ser utilizado por outras pessoas e foi reescrito com novos recursos, sendo renomeado para PERSONAL HOME PAGE Tools/FI, e entre os novos recursos, passou a contar com suporte ao MSql. Dois anos mais tarde o PHP deixou de ser um projeto pessoal de Rasmus e passou a ser desenvolvido por uma equipe de colaboradores, e neste período, foi lançada a versão 3 do PHP. A partir da versão 4 o PHP passou a utilizar a engine de scripting da ZEND, para melhorar a performance e suportar uma variedade maior de bibliotecas externas e extensões. Até março de 2002, o PHP estava sendo utilizado em 9.000.000 de domínios. Atualmente esses números chegam a 37,10% dos sites do mundo todo. Rasmus Lerdorf iniciou o desenvolvimento do PHP para mostrar as estatísticas de sua página pessoal, substituindo alguns scripts feitos em Perl. 1.1. A Linguagem PHP A linguagem PHP é voltada principalmente para o ambiente WEB, mas pode ser usada para a criação de aplicações desktops, aplicações servidoras, de rede, entre outros. Se você ainda não está habituado com linguagens de programação, poderá achar inicialmente PHP um pouco difícil, mas logo perceberá que é uma linguagem muito fácil. PHP é uma linguagem orientada a objetos e sua sintaxe é bem parecida com a do C, só que bem mais simples e prática. 1.2. Vantagens e o que pode ser feito com PHP Qualquer coisa feita pode ser feita com PHP, como coletar dados de formulários, gerar páginas dinâmicas, enviar e receber cookies. Além disso, PHP tem suporte a outros serviços através de protocolos como IMAP, SNMP, NNTP, POP3 e, logicamente, HTTP. Ainda é possível abrir sockets e interagir com outros protocolos.
4
Projeto E-JOVEM
Algumas vantagens do PHP: • • • • • • • •
É uma linguagem de fácil aprendizado; Tem performance e estabilidade excelentes; Seu código é aberto, não é preciso pagar por sua utilização, e é possível altera-lo na medida da necessidade de cada usuário. Tem suporte nos principais servidores web do mercado e suporte nativo no servidor web apache (o mais utilizado no mundo); Suporta conexão com os banco de dados mais utilizados no mercado, como por exemplo MySQL, PostgreSQL, Oracle e DB2; É multiplataforma, tem suporte nos sistemas operacionais mais utilizados no mercado; Não precisa ser compilado; Aceita orientação a objetos;
1.3. Como Funciona O PHP. Ao digitar um endereço no seu browser (Firefox, Internet Explorer, chrome), abrirá uma comunicação simples entre o cliente (seu browser) e o servidor Web funcionando da seguinte forma: •
O cliente (seu browser) decompõe a URL (endereço da página) em várias partes, tais como nome do domínio, nome da página e protocolo. Por exemplo, o domínio HTTP://www.teste.com.br/noticia.php, teria o nome de domínio teste.com.br, o nome da página noticia.php e o protocolo HTTP.
•
O DNS (Servidor de Nome de Domínio) interpretará o seu domínio informando seu endereço de IP, números combinados que representa o endereço real no site na internet (como se fosse o CEP da nossa rua). Por exemplo, para o domínio teste.com.br nós teríamos o endereço de IP 69.38.21.53. Então o que seria mais fácil de lembrar, o domínio ou seu endereço de IP ?
•
O cliente (seu browser) determina qual protocolo será usado. Por exemplo, temos o protocolo HTTP (Protocolo de Transferência de HiperTexto) e FTP (Protocolo de Transferência de Arquivo).
•
Então o servidor web retorna os arquivos solicitados. Por exemplo, no domínio HTTP://www.teste.com.br/noticia.php, o browser solicita o arquivo noticia.php do servidor teste.com.br e ficará aguardando a resposta. O servidor então responde os pedidos do browser. Verifica se o endereço existe, encontra os arquivos necessários, executa as instruções apropriadas e retorna para os resultados de volta para o browser. Se não puder localizar o arquivo, o servidor envia a uma mensagem de erro para o cliente.
5
Projeto E-JOVEM •
O browser recebe os dados do servidor na linguagem HTML interpreta essas instruções e exibe os resultados para o usuário.
Esse processo é repetido até que o cliente (seu browser) deixe o site. 1.4. Exemplo de um código PHP "; // pula uma linha. echo $valor; // realiza o mesmo que print print " "; // pula uma linha. if($valor > 10){ // se o valor for maior que 10 print "Valor maior do que 10"; // imprime o resultado }else{ // se não print "Valor menor do que 10"; // imprime o resultado } ?> 1.5. Site oficial PHP e como utiliza-lo O site oficial do php é HTTP://www.php.net, lá podemos tirar duvidas sobre funções, visualizar sua documentação, fazer download do PHP, ler notícias e novidades sobre o PHP, reportar bugs, ler o FAQ, entre outras coisas. 1.5.1. Buscando uma função no site Quando você estiver com dúvidas sobre uma determinada função poderá recorrer sempre ao site oficial do PHP. Para isso, vamos seguir os passos: 1. Digite o endereço do site: HTTP://www.php.net 2. Procure por search for, que encontra-se no canto superior direito. 3. Digite uma função por exemplo, print. 4. Verifique se está in the function list. Isso quer dizer que você fará sua busca dentro da lista de funções. 5. Aperte Enter ou clique na setinha para pesquisar a função. Será exibida uma tela, onde mostrará a função, sua descrição, seus parâmetros, seu valor retornado, exemplos e funções relacionadas. A maioria das funções possui exemplos e estão disponíveis em português.
6
Projeto E-JOVEM
2. O ambiente WEB 2.1. Como funciona a internet Para seu funcionamento, a internet utiliza um procedimento detalhado para a troca de dados. Existem regras a serem seguidas, que são chamadas de "protocolos de comunicação". Essas regras são similares as da linguagem humana. Por exemplo, quando duas pessoas estão conversando, enquanto uma fala a outra escuta, para que haja uma compreensão é necessário que as palavras estejam dentro da sintaxe da linguagem conveniente. Caso o interlocutor não compreenda a mensagem, ele solicita que seja repetida. 2.2. Protocolo TCP/IP Para a troca de mensagens na internet foi desenvolvido o protocolo TCP/IP – Transmission Control Protocol/Internet Protocol (Protocolo de Controle de Transmissão/Protocolo de Internet). O TCP/IP é o protocolo básico para a comunicação entre as máquinas conectadas à internet, que gerencia toda a parte de transmissão e distribuição de dados na rede. 2.2.1. Funções do TCP O TCP - Transmission Control Protocol(Protocolo de Controle de Transmissão) é o responsável por quebrar a mensagem em pacotes de informação. Quando o computador de destino da mensagem recebe os pacotes, ele utiliza o TCP para recombiná-los na mensagem original. Comparando a quantidade de informação enviada com a quantidade de Informação recebida na mensagem, o computador de destino pode então garantir que não ocorreram erros na transmissão da mensagem. 2.2.2. Funções do IP O IP - Internet Protocol(Protocolo de internet) é o responsável por assegurar que a informação chegará no computador de destino. Resumindo o IP tem as funções de: • Cuidar do envelopamento • Endereçamento (remetente e destinatário) • Envio dos dados empacotados 2.3. Protocolo HTTP O HTTP é o protocolo que gerencia e formaliza as requisições e as respostas trafegadas entre o cliente e o servidor web. Caso o servidor web encontre a página, ela será enviada em partes ao navegador, caso contrário, o servidor enviará uma mensagem de erro.
7
Projeto E-JOVEM
2.4. Serviços da Internet Abaixo listamos alguns serviços disponíveis na internet e suas definições: •
WEB (www) – Páginas com os mais variados assuntos. é um sistema de documentos em hipermídia que são interligados e executados na Internet. Os documentos podem estar na forma de vídeos, sons, hipertextos e figuras.
•
Correio Eletrônico - Comunicação entre pessoas através de mensagens escritas (@). O funcionamento do e-mail segue o seguinte procedimento. Você escreve a mensagem no seu computador para alguém. Esta mensagem vai primeiro para o seu provedor que transmite para o provedor da pessoa para quem você escreveu. Então, a pessoa deve acessar o próprio provedor para resgatar sua mensagem.
•
FTP – FTP significa File Transfer Protocol (Protocolo de Transferência de Arquivos), e é uma forma bastante rápida e versátil de transferir arquivos (também conhecidos como ficheiros), sendo uma das mais usadas na internet.
• •
WAP – Disponibilização de recursos da Internet via telefonia celular Conversas On-line - Troca de informações simultâneas
Abaixo temos uma figura que demonstra muito bem a forma como acessamos esses serviços:
Porém para acessarmos esses serviços precisamos utilizar os provedores da internet, veja abaixo algumas explicações. Algumas das formas para conectarmos a internet: •
Uma linha telefônica discada: dial-up. Para a conexão dial-up será necessário uma linha telefônica, ligada a um modem, conectado ao computador e um provedor de acesso para onde você vai ligar e que irá permitir seu acesso à Internet.
8
Projeto E-JOVEM •
Conexões de alta velocidade: ADSL, fibra ótica, TV a cabo, satélite.
•
Conexão dedicada é um tipo caro mas muito rápido de conexão. É o utilizado normalmente pelos provedores: a estação do provedor é conectada via cabo aos Backbones (linhas de altíssima velocidade de conexão à Internet).
2.4.1. Provedores Os provedores estão conectados à Internet 24 horas por dia por meio dos backbones (espinha dorsal da Internet). Você deve possuir uma assinatura (paga ou não) com o provedor para poder ter acesso a internet, assim o provedor disponibiliza um endereço único para você. Nos computadores do provedor você tem também um espaço para armazenar suas informações e mensagens eletrônicas. 2.5. Tipos de Domínio Ao invés de decorarmos http://www.educandus.com.br
os
Ips,
decoramos
os
domínios
ou
nomes:
http:// - protocolo www – tipo de serviço com – tipo de domínio br – país No Brasil, para registrar um domínio precisamos entrar no site HTTP://www.registro.br. No site existe um local onde poderemos pesquisar um domínio. Caso esse domínio esteja disponível para registro você poderá comprá-lo. 3. Ambiente de desenvolvimento Para começarmos a programar precisamos definir nosso ambiente de desenvolvimento ou ambiente de trabalho. O ambiente de desenvolvimento nada mais é que todos os softwares e aplicativos necessários para ajudar o programador em seu trabalho. Seja na criação do seu sistema, na simulação em ambiente web ou na realização de testes. 3.1. Sistemas necessários para o desenvolvimento em PHP Para programar em PHP será necessário termos um servidor web rodando em nossa máquina, isso será útil para simularmos como nosso sistema estará funcionando quando o mesmo estiver disponível na internet e para o armazenamento de dados no banco, necessitaremos também de uma IDE de desenvolvimento, esse, não sendo tão essencial para seu desenvolvimento, mas extremamente útil para acelerar o processo de desenvolvimento.
9
Projeto E-JOVEM
3.2. Xampp Uma das suítes de desencolvimento mais utilizadas para PHP é o XAMPP, que é um pacote de aplicativos para desenvolvimento web em PHP, e além de sua instalação ser muito fácil, sua usabilidade também é. Sendo necessário apenas baixar, extrair e inicializar. Além disso, o XAMPP é gratuito, esta livre para ser copiado nos termos da licença GNU - General Public License. Veja abaixo alguns dos aplicativos que já estão integrados ao XAMPP: •
APACHE – Servidor web livre.
•
PHP- Linguagem de programação.
•
PERL – Linguagem de programação.
•
MYSQL - Linguagem de banco de dados.
•
PHPMYADMIN - é um programa de computador desenvolvido em PHP para administração do MySQL pela Internet.
Esses são os aplicativos essenciais para simular um servidor web na sua máquina, assim será possível testar as aplicações que serão criadas. Nesta apostila não vamos mostrar como instalar o XAMPP, pois existem muitas formas de se instalar o xampp, uma delas você poderá seguir usando as aulas no portal da educandus. 3.3. IDE de Desenvolvimento IDE - Integrated Development Environment (Ambiente Integrado de Desenvolvimento), é um programa de computador que reúne características e ferramentas de apoio aos desenvolvedores de software, cujo objetivo é de agilizar o processo de produção. 3.4. Principais características de uma IDE As principais características de uma IDE com suporte a PHP são: •
Editar o código fonte do sistema em desenvolvimento, colocar cores diferenciando variáveis, palavras-chave, funções e etc. tornando fácil sua compreensão.
•
Auxiliar no processo de encontrar e corrigir erros (bugs) no código-fonte do programa, na tentativa de aprimorar a qualidade de software.
•
Ajudar na utilização de funções nativas da linguagem, completando automaticamente e mostrando os valores passados e retornados delas.
10
Projeto E-JOVEM
•
Na utilização de Orientação a Objetos, a IDE auxilia na utilização de métodos das classes.
3.5. Qual IDE Utilizar ? Indicamos que você utilize o ECLIPSE PDT, que além de ser uma ide gratuita, atende a todos as necessidades do programador PHP. Veja abaixo como configurar seu ambiente de desenvolvimento: 1. Acesse o link: http://download.eclipse.org/tools/pdt/downloads/ 2. Procure pelo Release Build mais atualizado e clique no link 3. Será carregada outra página, contendo o Release Build. 4. Procure por PDT All-in-One e baixe a versão para seu sistema operacional 5. Após o download, descompacte o arquivo. 6. Pronto o eclipse PDT já pode ser usado. Para executar o eclipse, seguiremos os passos abaixo: 1. Clicamos no ícone do eclipse. 2. Como é a primeira vez em que estamos usando o eclipse. Será necessário definirmos o local do nosso Workspace (área de trabalho). 3. Para definirmos nosso Workspace clicaremos no botão browser, abrirá uma janela para selecionarmos o diretório do nosso Workspace. OBS: será necessário escolhermos a pasta htdocs, que encontrasse dentro de lampp. Geralmenete no caminho /opt/lampp/htdocs. Esse é o mesmo caminho onde nós instalamos o xampp. 4. Selecione a opção “Use this as the default and do not ask again” (use esse diretório como default e não pergunte novamente) 5. Será exibida a tela de boas vindas do eclipse PDT Obs.: Você pode utilizar qualquer outra ide para o desenvolvimento PHP, você deve apenas levar em consideração aquela que mais se adapta a seu estilo de trabalho.
11
Projeto E-JOVEM
4. Ambiente HTTP Como falamos anteriormente HTTP (Hypertext Transfer Protocol ou Protocolo de Transferência de Hipertexto) é um protocolo de comunicação utilizado para transferir dados por intranets e pela World Wide Web. Geralmente, esse protocolo utiliza a porta 80 e é usado para a comunicação de sítios web, comunicando na linguagem HTML. Ele surgiu da necessidade de distribuir informações pela Internet. Para isso tornou-se necessário uma forma de comunicação que tornasse padrão à comunicação entre cliente e servidor, tornando assim possível de ser interpretada por todos os computadores ligados na Internet. 4.1. Funcionamento do HTTP O HTTP utiliza o modelo cliente-servidor, como na grande maioria dos protocolos de rede, baseando-se no paradigma de requisição e resposta. Um programa requisitante (cliente) estabelece uma conexão com um outro programa receptor (servidor) e envia-lhe uma requisição, contendo a URI, a versão do protocolo, uma mensagem MIME (padrão utilizado para codificar dados em formato de textos ASCII para serem transmitidos pela Internet) contendo os modificadores da requisição, informações sobre o cliente e, possivelmente, o conteúdo no corpo da mensagem. O servidor responde com uma linha de status (status line) incluindo sua versão de protocolo e um código de operação bem sucedida ou um código de erro, seguido pelas informações do servidor, meta informações da entidade e possível conteúdo no corpo da mensagem. Após o envio da resposta pelo servidor, encerra-se a conexão estabelecida. 4.2. Mensagem HTTP No protocolo HTTP a comunicação entre cliente e servidor é feita através de mensagens: •
O cliente envia uma mensagem de requisição e o servidor uma de resposta ao cliente com a solicitação.
•
Uma mensagem, tanto de requisição como de resposta, é composta, por uma linha inicial, nenhuma ou mais linhas de cabeçalhos, uma linha em branco obrigatória que finaliza o cabeçalho e para finalizar o corpo da mensagem, que poderá ser opcional em alguns casos.
12
Projeto E-JOVEM 4.2.1. Cabeçalho da Mensagem O cabeçalho da mensagem (header) é utilizado para adicionar informações na transmissão entre o cliente e o servidor. Sendo inserido logo após a linha inicial da transação (método), tanto para a requisição do cliente quanto para a resposta do servidor, seguido de dois pontos (:) e um valor.
4.2.2. Corpo da Mensagem Uma mensagem HTTP poderá conter um corpo de dados que serão enviados abaixo das linhas do cabeçalho. Na resposta, essa mensagem poderá conter o recurso que foi requisitado pelo cliente ou uma mensagem de erro, caso esse recurso não seja possível. Já numa requisição, poderá conter dados que serão enviados pelo usuário ou um arquivo que será enviado para o servidor. Quando uma mensagem HTTP tiver um corpo, poderão ser incluídos cabeçalhos de entidades que descrevem suas características, como por exemplo, o Content-Type que informa o tipo MIME dos dados no corpo da mensagem e o Content-Length que informa a quantidade de bytes que o corpo da mensagem contém. Exemplos: text/plain text/html Image/gif Image/jpeg application/zip
Descrição Arquivo no formato texto (ASCII) Arquivo no formato HTML, utilizado como padrão para documentos Web Imagem com o formato GIF Imagem com o formato JPEG Arquivo compactado
13
Projeto E-JOVEM
4.3. Requisição Uma mensagem de requisição enviada pelo cliente é composta por: • Uma linha inicial (Request-Line) •
Linhas de cabeçalhos (Request-header)
•
Linha em branco obrigatória
•
Corpo da mensagem (opcional)
A linha inicial de uma requisição é composta por três partes separadas por espaços: • O método (Method) •
A identificação do URI (Request-URI)
•
A versão do HTTP (HTTP-Version) utilizado.
No protocolo HTTP, o tipo de URI utilizado é chamado de URL (Uniform Resource Locater), que é composto pela identificação do protocolo, pelo endereço do computador servidor e pelo documento requisitado. 4.4. Métodos O protocolo HTTP possui 8 métodos que indicam a ação a ser realizada no recurso especificado. O método é o responsável por determinar o que o servidor deve fazer com a URL fornecida no momento da requisição de um recurso. São eles: •
GET – O método mais comum. Solicita um recurso seja um arquivo ou um script CGI. O método GET é reconhecido por todos os servidores.
•
HEAD – É o mesmo que GET, mas o recurso não será retornado. É usado para obter meta informações por meio do cabeçalho da resposta, sem ter que recuperar todo o conteúdo.
•
POST – Envia dados que serão processados (por exemplo, formulários HTML). Os dados são incluídos no corpo do comando.
14
Projeto E-JOVEM Uma requisição por método POST requer sempre que: 1. As informações submetidas sejam anexadas ao corpo da mensagem e formatadas como uma query string 2. Conter cabeçalhos adicionais especificando seu tamanho (ContentLenght) e seu formato (Content-Type). Por isso, esse método oferece uma maior segurança em relação aos dados transferidos, ao contrário do método GET que os dados são anexados a URL, ficando visíveis ao usuário. •
PUT – Envia certo recurso.
•
DELETE – Exclui o recurso.
•
TRACE - Ecoa o pedido, de maneira que o cliente possa saber o que os servidores intermediários estão mudando em seu pedido.
•
OPTIONS - Recupera os métodos HTTP que o servidor aceita.
•
CONNECT - Serve para uso com um proxy que possa se tornar um túnel SSL (um túnel pode ser usado, por exemplo, para criar uma conexão segura).
4.5. Resposta Uma mensagem de resposta é composta pelos seguintes campos: •
Uma linha inicial (Status-Line).
•
Linhas de cabeçalhos (Responseheader).
•
Uma linha em branco obrigatória.
•
Um corpo de mensagem opcional.
A linha inicial de uma resposta, chamada de linha de status, possui por sua vez três partes separadas por espaços: •
A versão do protocolo HTTP (HTTP-Version).
•
Um código de status (Status-Code) da resposta, que fornece o resultado da requisição.
•
Uma frase de justificativa (Reason-Phrase) que descreve o código do status.
15
Projeto E-JOVEM
4.6. Os Códigos de Retornos O Status-Line de uma resposta HTTP indica ao cliente se sua requisição foi bem sucedida ou não. Esta situação é fornecida através de um código de retorno (Status-Code) e uma frase explicativa. O código de status é formado é formado por três dígitos sendo o primeiro o digito que informa a classe que pertence. Existem cinco tipos: •
1xx. Informação (Informational) – utilizada para informar o cliente que sua requisição foi recebida e está sendo processada.
•
2xx. Sucesso (Success) – indica que a requisição foi concluída com sucesso.
•
3xx. Redirecionamento (Redirection) – informa a ação adicional que deverá ser tomada para completar a requisição.
•
4xx. Erro no cliente (Client Error) – informa que a requisição feita pelo cliente não poderá ser atendida.
•
5xx. Erro no Servidor (Server Error) – ocorreu um erro no servidor ao tentar cumprir uma requisição valida.
4.7. Outros Protocolos Existem outros tipos de protocolos como: •
FTP (File Transfer Protocol, ou Protocolo de Transferência de Arquivos), usado para envio de arquivos do computador para um servidor na Web.
•
SMTP (Simple Mail Transfer Protocol, ou Protocolo de Transferência de Correio Simples), protocolo usado para correio eletrônico (e-mail).
16
Projeto E-JOVEM 4.8. Esquema de Comunicação
5. Estrutura do código PHP Sitaxe Antes de tudo, uma aplicação PHP é um pequeno conjunto de blocos básicos de construção. O PHP foi construído com a intenção de ser simples. A sintaxe php é fácil de ser entendida, apesar de ser derivada de muitas outras linguagens como C, PERL e JAVA apartir das ultimas adições de orientação a objeto. Tags e Arquivos Fontes Arquivo PHP é concebido como processador de texto, com isso pode ser inserido direto em arquivos de texto, utilizando para isso tags especiais o interpretador irá então interpretar o texto fora das tags e executar os que se encontram dentro das tags. Alguns tipos de tags disponíveis: Tag Padrão
Tag Curta
?> Código php
Tag Script
?> <script language=”php”> Código php 17
Projeto E-JOVEM
A tag padrão é a melhor forma de abertura e fechamento de tag para se trabalhar com php, por deixar seu código mais portável e compatível, porque é garantida sua disponibilidade e não é desativado ao mudar o arquivo de configuração do php. Porem a forma mais usada no mundo é a tag curta elas não tem o problema de conflito com cabeçalhos XML. Outra grande vantagem e uma das mais usadas, é a possibilidade da utilização de uma impressão direta =$variavel?> sem a necessidade da utilização do print ou echo. Você poderá usar qualquer um dos tipos de tags, sabendo que em alguns casos poderá ser necessário configurar o php. Espaço em branco PHP é whitespace-insensitive Isso significa que não há exigências para uso (ou não usar) um tipo específico de caracteres branco (ex.: guias, em vez de espaços), ou um determinado número de caracteres branco, exceto em alguns casos:
• • •
Você não pode ter nenhum espaço entre e php Não pode romper uma palavra-chave (por exemplo: whi Le, fo r ou func tion) Não pode romper nome de variáveis e funções (por exemplo: $var nome, function te ste())
Palavras-chave Palavras-chave, palavras-reservada ou ainda keywords. São palavras que tem um significado especial no PHP. Algumas delas representam coisas que parecem funções, algumas parecem constantes, mas na verdade não o são realmente: elas são construtores de linguagem. Você não pode usar nenhuma das seguintes palavras como constantes, nomes de classes, de funções ou de métodos. Utilizar como nome de variáveis geralmente não causa erros, mas pode levar a confusão.
Tabela de Palavras-chave: and
or
xor
__FILE__
__LINE__ class die() empty() endswitch for include()
array() const do enddeclare endwhile foreach include_once()
as continue echo() endfor eval() function isset()
break declare else endforeach exit() global list()
exception (PHP 5) case default elseif endif extends if new
old_function this (PHP 5) final (no PHP 5) (PHP 4 somente) __NAMESPACE__ namespace (no goto (PHP 6 __DIR__ (no (no PHP 5.3) PHP 5.3) somente) PHP 5.3) Comentários Toda linguagem de programação possui formas de comentar o código, e com o php não é diferente. Vale lembrar que é uma boa pratica de programação comentar cada função, classe, método ou propriedade em seu código. Embora seja muito fácil achar códigos mal comentados ou praticamente sem comentários em códigos. Então quando for codificar lembre-se sempre que até você mesmo depois de alguns dias, meses ou anos poderá ter esquecido como programou tal função e será necessário ler e reler algumas vezes o código para entendê-lo.
Tal como acontece com tags, PHP dá-lhe múltiplas escolhas para os seus comentários: // comentário simples de uma linha # comentário simples de uma linha /* Comentário de varias linhas, comentário em bloco */ /**
19
Projeto E-JOVEM Bloco de código
Um bloco de código é simplesmente uma série de declarações entre duas chaves: { / / Alguns comentários f () / / uma chamada de função } Construtor da Linguagem Talvez a mais comum delas seja a indicação do echo, que permite que você escreva dados de saída. echo 10; // irá imprimir 10 na tela. É importante compreender que o ECHO não é uma função e, como tal, não tem um valor de retorno. Se você precisa de saída dados através de uma função, você pode usar print() em vez disso: echo print (10);
10;
Outra que é muito importante saber é die(), que na verdade é um apelido de exit(). Ela permite que você encerre o script e obtenha uma saída que poderá retornar uma string ou um valor numérico. As funções são, obviamente, um importante elemento da linguagem PHP. Como tal, falaremos mais adiante sobre elas. 6. Integrando PHP com HTML A linguagem padrão dos browsers é o HTML com isso a integração do PHP com HTML deve ser feita levando-se em consideração que tudo será transformado em HTML ao final. 6.1. Usando print() e echo() As funções print() e echo() são praticamente idênticas, tendo apenas algumas diferenças que mostraremos abaixo: •
echo( ): Pode receber mais de um parâmetro, mostrando a concatenação dos mesmos. Tem uma sintaxe curta, onde você pode imediatamente abrir a tag com o sinal de igual. Esta sintaxe curta funciona habilitando a definição da configuração short_open_tag. Ex: =”teste”?>.
20
Projeto E-JOVEM •
print( ): Retorna o valor mostrado. $valor = print "teste"; -> imprime “teste” na tela e coloca em $valor a string "teste". echo não retorna nada.
Observação: Ambos são construções da linguagem, portanto podem ser chamados com ou sem os parênteses, mas para enviar mais de um parâmetro para echo, o uso de parênteses é problemático. 6.2. Usando aspas simples e aspas duplas A escolha do tipo de aspas usado com as funções de impressão (print e echo) é fundamental, pois o resultado pode ser bastante diferente. Com aspas duplas (") podemos usar variáveis e caracteres especiais, como ‘\n’ (para criar uma quebra de linha), já entre aspas simples tudo é literalmente impresso. Exemplo: Você verá na tela que o textarea que usamos aspas simples irá imprimir o \n enquanto o com aspas duplas irá criar uma nova linha. Outra diferença entre aspas simples e duplas se faz no uso de variáveis, ao imprimir uma variável com aspas simples nós estaremos imprimindo a variável em si. Ao imprimir com aspas duplas estaremos imprimindo o valor do dado que a variável possui.
6.3. Integrando PHP com JAVASCRIPT Da mesma forma que podemos integrar PHP com HTML, podemos integrar PHP com javascript. Veja o exemplo abaixo: alert('PHP com JAVASCRIPT');"; ?> Você verá que logo ao carregar a página, será exibido um alerta com o nome que esta entre parêntese. 7. Tipos de Dados O PHP suporta vários tipos de dados, porém eles são divididos em duas categorias:
21
Projeto E-JOVEM 7.1. Escalar Um valor escalar contém somente um valor de cada vez. PHP suporta quatro tipos escalares:
boolean int float string
Um valor que possa somente ser verdadeiro ou falso. Um número de valor inteiro. Um valor de ponto flutuante Uma coleção de dados binários.
PHP reconhece dois tipos de números, os inteiros e de valor ponto flutuante. O tipo de dados inteiro é usado para representar inteiros assinados (o significado que os números positivos e negativos podem ser expressos com ele). Os números podem ser declarados usando diversas notações diferentes: Decimal
Octal
Hexadecimal
10; -11; 1452
Notação decimal padrão. Note que não é necessário ter separador de milhar, na verdade, é permitido. 0666, 0100 Notação octal, identificado pelo seu zero à esquerda e utilizado principalmente para expressar UNIX-estilo de permissões de acesso. 0×123; 0XFF; - Notação base-16, veja que há dígitos 0×100 hexadecimais e 0x são o prefixo principal e são case-insensitive, ou seja, podem ser escritos na forma maiúscula ou minúscula.
OBS: É importante você está bem ciente das diferentes notações, em particular, números octal que pode facilmente ser confundido com os números decimais e pode conduzir a alguns erros. Os números de pontos flutuantes (chamados também flutuadores e, às vezes, dobros) são os números que têm um componente fracionário. PHP suporta duas notações diferentes para expressá-las:
Exponencial de um conjunto de notação de dígitos significativos, seguido pelo “E” que é case-insensitive, ou seja, podem ser escritos na forma maiúscula ou minúscula, seguido também de um expoente. O número resultante é expresso multiplicou por dez ao poder do expoente, para o exemplo, 1e2 iguais 100.
7.1.1. Strings Para muitos programadores, strings são equivalentes a textos. Enquanto em algumas linguagens isto é, na verdade, o que acontece, em muitos outros (incluindo o PHP), a string é um dado muito limitado. Strings são na verdade uma coleção de dados binários podendo assim ser um texto, mas também pode ser o conteúdo de um arquivo de imagem, uma planilha eletrônica, ou mesmo uma gravação musical. 7.1.2. Boolean Um valor booleano só pode conter dois valores: verdadeiro ou falso. De uma maneira geral, Booleans são utilizados como base de operações lógicas, que serão discutidas posteriormente. Quando converter dados para o tipo booleano, várias regras especiais são aplicáveis: •
Um número (ou inteiro ou de ponto flutuante) torna-se convertido em um Booleano falso se o valor original é zero, e verdade de outra forma.
•
Uma string é convertida em falso somente se ela estiver vazia ou se ele contém o único 0. Se ele contém quaisquer outros dados, até mesmo vários zeros, são convertidos para verdadeiro. Quando convertida para um número ou uma string, um Booleano 1 passa a ser verdadeiro, e 0 contrário.
•
7.2. Composto PHP suporta dois tipos de dados compostos chamados porque são essencialmente recipientes de outros dados: •
Arrays: são recipientes de dados de elementos ordenados; um array pode ser usado para armazenar e recuperar qualquer outro tipo de dados, incluindo números, valores booleanos, strings, objetos e até mesmo outras matrizes.
23
Projeto E-JOVEM •
Objetos: são recipientes de ambos os dados e código. Eles formam a base da programação orientada a objetos.
7.3. Tipo de Dado NULL NULL indica que uma variável não tem qualquer valor. A variável é considerada como NULL caso tenha sido atribuído o valor especial NULL, ou se ele ainda não tenha sido atribuído um valor, neste último caso, PHP poderá dar um alerta de saída se você tentar usar a variável em uma expressão. 7.4. Conversão entre Tipos PHP toma cuidado de converter tipos de dados de forma transparente quando uma referência é usada em uma expressão. Entretanto, é possível forçar a conversão de um valor a um tipo específico usando os tipos operadores da conversão. Estes são simplesmente os nomes dos tipos de dados que pretende converter que será colocada entre colchetes antes de uma expressão. Por exemplo: 8. Variáveis Variáveis são recipientes de armazenamentos de dados temporários. Em php, uma variável pode conter qualquer tipo de dados, tais como: • • • • •
Strings Inteiros Números de ponto flutuante Objetos Arrays.
Php não é fortemente tipado, o que significa que ele irá implicitamente alterar o tipo de uma variável conforme necessário, dependendo da operação a ser realizada em seu valor.
24
Projeto E-JOVEM As variáveis são representadas por um cifrão ($) mais o nome da variável. As variáveis devem ter seu identificador usando apenas letras (az, AZ), números ou o caractere sublinhado. PHP é casesensitive, ou seja, irá diferenciar letras maiúsculas e minúsculas, considerando por exemplo: que $a é diferente $A.
É aconselhável utilizar os nomes das variáveis com letras minúsculas, por causa das variáveis pré-definidas da linguagem, que são declaradas com maiúsculas; 8.1. Verificando de se uma variável existe Um dos pontos negativos de como php lida com variáveis é que não há nenhuma maneira de garantir que qualquer uma delas irá existir em qualquer ponto na execução de um script. Isso pode introduzir no seu sistema uma serie de problemas. Para minimizar o problema você pode utilizar o construtor especial isset() Uma chamada para o isset() irá retornar true se uma variável existe e tiver o valor diferente de NULL. Exemplo: 9. Constantes Constantes são identificadores para valores simples. O seu conteúdo não muda durante a execução do código. Elas são criadas com a função define e, por convenção, são escritas com letras maiúsculas e não usam o cifrão no início. Constantes podem ser acessados de qualquer parte dentro do script PHP, contudo, só podem receber valores escalares. Assim como variáveis, constantes são casesensitive ( diferencia maiúsculas de minúsculas).
25
Projeto E-JOVEM print “ ”; print USE_XML define(’1CONSTANTE’, ’algum valor’); // nome invalido print 1CONSTANTE; ?>
OBS: como você pôde observar, podemos definir uma constante de forma errada, mas nunca iremos poder utilizá-la. 10. Operadores São usados para efetuarem operações sobre as variáveis e constantes. 10.1.
Operadores de Comparação
São operadores que estabelecem uma relação de equivalência entre dois valores. Eles tanto podem determinar se dois valores são iguais (ou não iguais) entre si, ou se um é maior (ou menor) do que o outro. O resultado de uma operação comparação é sempre um valor Booleano.
Existem quatro operadores de equivalência:
==
=== != != =
Equivalentes. Verifica se os dois operandos são equivalentes, o que significa que eles podem ser convertidos para o tipo de dados comum que eles têm o mesmo valor, mais não necessariamente do mesmo tipo. Identidade. Verifica se os operandos possuem o mesmo Tipo e têm o mesmo valor. Não Equivalentes. Verifica se os dois operandos são não equivalentes, sem verificar o seu tipo. Operador não-idênticos. Verifica se os dois operandos não possuem o mesmo tipo de dados ou não têm o mesmo valor.
Observação: É muito fácil confundir o operador de atribuição (=) pelo operador de comparação (= =) e este é, na verdade, um dos erros mais comuns na programação. Uma solução parcial para este problema é utilizar um padrão de projetos em que o programador inverte a ordem de seus operandos quando se compara uma variável com valor.
26
Projeto E-JOVEM Exemplo: echo $a = = 10; Você poderia escrever: echo 10 = = $a; Estas duas operações são totalmente idênticas, mas, devido à esquerda do operador ser um valor, se tivesse esquecido um dos sinais iguais, o parser teria jogado um erro, assim, alertando-o. Veja abaixo o exemplo: ”; /* a comparação abaixo. Retornará um valor em branco porque o resultado foi false, pois as variáveis possuem valores diferentes*/ echo ($variavel1 = = $variavel2); echo “ ”;
/* a comparação abaixo. Retornará um valor em branco porque o resultado foi false, isso porque a variável é um número inteiro e a comparação está sendo feita com uma string*/ echo ($variavel1 = = = “100”); echo “ ”; /* a comparação abaixo. Retornará 1 porque o resultado foi true, isso porque a variável é um número inteiro e a comparação está sendo feita com outro número inteiro*/ echo ($variavel1 = = = 100); echo “ ”; ?> 10.2.
Outros Operadores de Comparação
Outros conjuntos de diferentes operadores estabelecem uma relação de desigualdade entre os dois operandos, ou seja, se um dos dois é maior do que o outro: <
Retorna true se o operando da esquerda for menor que o da direita.
<=
Retorna true se o operando da esquerda for menos ou igual ao da
27
Projeto E-JOVEM direita. >
Retorna true se o operando da esquerda for maior que o da direita.
>=
Retorna true se o operando da esquerda for maior ou igual ao da direita.
Observações Sobre Operadores de Comparação Embora o processo seja claro para os números, as coisas mudar um pouco para outros tipos de dados, por exemplo, strings são comparadas através da análise do valor binário de cada byte na seqüência, até dois valores diferentes são encontrados, o resultado é então determinado pelo valor numérico desses dois bytes. Por exemplo: $direita); ?> O código acima imprime um valor em branco (ou seja, falso), porque a letra D é mais elevado na variável da direita, do que na letra C da variável da esquerda. Enquanto você poderia pensar que esta comparação ocorre por causa da ordem alfabética. Considere os seguintes exemplos: $direita; ?> Neste exemplo será impresso 1 (verdadeiro), pois o valor ASCII do caractere “a” é 97 que por sua ver é mais elevado que o caractere “A” que é 65. OBS: A utilização de operadores comparação com arrays também introduz um conjunto de regras diferentes.
28
Projeto E-JOVEM
10.3.
Operadores Lógicos
Operadores lógicos são usados para ligar valores booleanos em conjunto e obter um terceiro valor booleano em função das duas primeiras. Existem quatro operadores lógicos em PHP das quais três são binárias. O único operador unário é o NÃO Lógico, identificado por uma exclamação antes do operando. É importante compreender que todos os operadores lógicos trabalham apenas com valores booleanos. Por isso, o PHP irá converter primeiro para valor Booleano e, em seguida, executar a operação. Os três operadores binários são: && AND || / OR XOR !
/ Retornará true caso os operandos da direita E esquerta do operador retornem true. Retornará true caso um dos operandos o da direita OU o da esquerda retornar true. Podendo ser ambos. O ou exclusivo retornará true se o um dos operandos o da direita OU o da esquerda retornar true, mais não ambos. Operador lógico “não”, invertendo o resultado de um teste.
Observação Sobre Operadores Lógicos É importante saber que o PHP tem uma simples estratégia para avaliar os resultados. Por exemplo, se a esquerda do operando && (AND) a operação for avaliada como false. Automaticamente será retornado false, já que qualquer outro resultado não mudará essa condição. ”; /* a comparação abaixo. Retornará um valor em branco porque o resultado foi false, na verdade será feita a comparação da $variavel1 != 100 retornando false e $variavel2 = = 50 retornando true. Como uma das comparações retornou false, o resultado final será false*/ echo ($variavel1 != 100 && $variavel2 = = 50); echo “ ”; ?>
29
Projeto E-JOVEM
10.4.
Operadores Matemáticos
Operadores matemáticos são os responsáveis pelas operações matemáticas básicas. Adição
$a = 1 + 3.5;
Subtração
$a = 4 - 2;
Multiplicação
$a = 8 * 3;
Divisão
$a = 15 / 5;
Modulo
$a = 23 % 7;
OBS: Lembre-se que alguns operadores matemáticos (por exemplo, o operador de adição) assumem um significado diferente quando aplicados a arrays. 10.4.1. Cálculos complexos Em cálculos complexos, procure sempre utilizar parênteses, sempre observando as prioridades aritméticas. Por exemplo: "; echo ( $variavel1 + 5 ) * 2 + (10 * $variavel2); // será impresso o valor 710 ?> 10.4.2. Conversão entre tipos em operações O PHP realiza automaticamente a conversão de tipos em operações 10.5.
Operadores de incrementação e decrementação
Formam uma categoria especial de operadores, com eles é possível incrementar e decrementar valores inteiros. Eles são operadores unários, porque eles só aceitam um operando (ou seja, a variável que necessita ser incrementado ou decrementado), e podem mudar de comportamento, dependendo se forem usadas antes ou depois da variável.
30
Projeto E-JOVEM
10.5.1. Posição do operador de incrementação e decrementação A posição do operador determina se o ajuste será realizado antes, ou depois da devolução do valor: • •
Se o operador estiver depois do operando, o interpretador irá primeiro retornar o valor atual da variável e depois incrementar ou decrementar o valor. Se o operador estiver antes do operando, o interpretador irá primeiro incrementar ou decrementar o valor, e depois retornar o valor.
Uso em excesso desse operador pode tornar seu código de compreensão difícil, até os melhores programadores algumas vezes são surpreendidos pelo uso desse operador. Por isso use-o com cautela. Vale a pena ressaltar também que esse operador deve ser utilizado para valores numéricos. 10.6.
Referenciando variáveis
Por padrão, os operadores trabalham pela atribuição de valor, ou seja, eles copiam o valor de uma expressão para outra. Se do lado direito do operando for uma variável, somente seu valor será copiado, de modo que qualquer alteração subseqüente ao da esquerda do operador não será refletindo no operador da direita. Por exemplo:
31
Projeto E-JOVEM $b = 20; echo $a; // será impresso 10 ?> Normalmente, você espera que esse seja o resultado obtido, mais a casos em que você queira uma tarefa que o resultado seja obtido por referência, de modo que a expressão da esquerda do operando torna-se “ligado” com a expressão da direita. Por exemplo: Observações sobre referência de variáveis O operador trabalha pela atribuição de valor para todos os tipos de dados, exceto objetos, os quais sempre são passados por referência, independentemente do operador “&” ser usado ou não. A utilização de variáveis por referência usada algumas vezes pode ser até útil, mas sempre será uma técnica PHP bastante arriscada, porque variáveis PHP tendem a permanecer ativas por um longo período de tempo, até mesmo dentro de uma função.
Além disso, contrariamente ao que acontece em muitas outras línguas, essa técnica muitas vezes é mais lenta do que a atribuição de valor, porque o PHP usa uma inteligente “deferredcopy” mecanismo que otimiza a realidade de valor atribuições. 11. Estruturas de Controle No PHP, as estruturas de controle são formadas por declarações condicionais e de looping:
11.1.
Estruturas condicionais
Estrutura condicional é usada para alterar o fluxo de uma execução baseado em uma ou mais condições. A maior parte destas estruturas básicas é o se-então-senão (if-else-elseif) que executa uma das duas declarações (ou conjuntos de declarações fechados em um bloco de código), dependendo se uma condição é verdadeira ou falsa.
32
Projeto E-JOVEM •
IF: Executa uma ação se uma condição for atendida. O bloco de comandos a ser executado deve ser escrito entre chaves; 10) { echo("O valor da variável é maior que 10."); } 19 ?>
•
ELSE: Ele é utilizado para indicar um novo bloco de comando caso a condição do IF não seja satisfeita. 10) { echo("O valor da variável é maior que 10."); } else { echo("O valor da variável é menor que 10."); } ?>
•
ELSE IF: Podemos analisar diversas condições possíveis:
33
Projeto E-JOVEM } ?> OBS: O ELSE IF pode ser usado tanto separado(ELSE IF) como junto(ELSEIF), não fará diferença para o PHP. •
IF sem operadores Quando não se coloca o operador lógico em testes condicionais com o IF, o PHP por padrão irá retornar TRUE sempre que a variável tiver um conteúdo válido. Por exemplo:
•
Encadeamento de IF Para realizar testes condicionais de forma encadeada, basta colocar um bloco IF dentro de outro, ou, usar o operador AND. Exemplo: 50){ if($valor < 100){ echo 'O valor é maior que 50 e menor que 100'; }else{ echo 'O valor é maior que 50 e maior ou igual a 100'; } } ?>
•
Forma contraída Um operador ternário e especial permite embutir uma estrutura se-então-senão (ifthen-else)dentro de uma expressão de declaração: echo 10 = = $x ? ’sim’ : ’não’;
34
Projeto E-JOVEM O código acima seria equivalente ao seguinte: if (10 = = $x) { echo ’sim’; } else { echo ’não’; } Como você pode ver, a primeira expressão é muito menor, mais deve se alertar sobre o seu uso. Se usada em excesso, pode tornar seu código de difícil compreensão e comprometer sua funcionalidade, principalmente se você começar a aninhar varias dessas operações entre si. •
SWITCH O problema com os se-então-senão (if-then-else) é que eles tendem a ser bastante complicado quando você precisa verificar uma expressão simples com vários resultados possíveis. Para diminuir este problema, em PHP você pode construir um interruptor switch / case Onde se apresenta uma forma de testar uma dentre várias possibilidades. A declaração default executa caso nenhuma das opções for verdadeira. A declaração break faz com que o restante do código não seja executado caso o teste seja verdadeiro. Veja o exemplo:
35
Projeto E-JOVEM
11.2.
Estrutura de looping ou Comandos de Repetição
Com o controlador iterativo pode-se executar o mesmo trecho de código múltiplas vezes. PHP tem quatro destes, apesar de apenas dois deles são necessários para o funcionamento de uma língua. •
while: Estrutura de looping que não necessita de um número determinado de iterações. Ele é executado enquanto uma condição for verdadeira.
•
do-while: outra forma de looping que executa um bloco de código, testa uma condição e repete novamente o bloco de código (ou não). no do … while, o controle é realizado no final de cada iteração significado que, mesmo que a condição de nunca for verdadeira (true), o conteúdo do loop será executado pelo menos uma vez.
•
For: Estrutura de looping que executa um bloco de código quantas vezes for indicado em uma variável. Deve-se definir a variável que será testada no looping, uma condição de teste e o incremento (ou decremento) da variável de controle. A declaração for contém três partes, separadas por ponto e vírgula (;). 36
Projeto E-JOVEM
•
Loop infinito: Ao realizar um comando de repetição, tenha sempre o máximo de cuidado possível, pois, podemos entrar num looping infinito. Um looping infinito nada mais é do que entrar num comando de repetição que não tenha fim, então ele ficará processando aquele trecho de código sem fim. Veja que no exemplo acima os dois FOR estão usando a mesma variável $i. Isso faz que a variável $i sempre saia do segundo for com o valor de 5, assim nunca chegará a ser >= a 10.
11.3. •
Fluxo de Execução break e continue Break: O comando break aborta a execução em um bloco de comandos como IF, FOR, WHILE. Ignorando as instruções restantes até o fechamento em “}”. Dessa forma, o programa segue para a próxima verificação da condição de entrada do laço de repetição. Observação: Lembre-se sempre de encerrar uma declaração break usando ponto e vírgula (;) mesmo se não tiver nenhum parâmetro. Se você não fizer e por acaso ele for seguido de uma expressão que retorna um valor inteiro, você pode acabar causando uma saída aleatória do loop, causando todo o tipo de situações difíceis de solucionar.
•
Continue: Há casos em que, em ver de encerrar um ciclo, você quer simplesmente que ignore o restante de uma iteração e pule imediatamente para a próxima. Isto é feito com a palavra-chave continue. for ($i = 0; $i < 10; $i++) { if ($i > 3 && $i < 6) { continue; } echo “$i, ”; }
Definição: Função é um bloco de código com um objetivo específico, que pode ou não receber uma serie de parâmetros e retornarem dados. Uma função é declarada
37
Projeto E-JOVEM apenas uma vez, mas pode ser utilizada diversas vezes. É uma das formas mais simples de prover reusabilidade. •
Criação: Para declararmos uma função no PHP será necessário usarmos o operador function seguido do nome da função, não podendo haver espaços em branco e sendo iniciada obrigatoriamente por uma letra. Veja como é sua sintaxe: function minhaFuncao(){ // o código ficara aqui } Exemplo:
•
Return: A declaração return retorna um valor quando a função é chamada. Esta declaração não é necessária se a função não retorna nenhum valor. Também podemos guardar esse valor de retorno numa variável para isso o código ficaria assim: Para passarmos parâmetros, ao definirmos uma função, colocaremos entre os parênteses quantos argumentos (parâmetros) forem necessários para a função. Veja o exemplo abaixo:
38
Passagem de parâmetros por referência: Para passarmos uma variável por referencia, colocaremos o operador “&” na frente do parâmetro, fazendo com que todas as modificações da variável dentro da função sejam validas na variável externa à função. Veja o exemplo:
•
Variáveis globais: As variáveis quando são declaradas dentro do escopo da variável são variáveis locais, isso quer dizer que, a variável só poderá ser usada dentro da função. Se quisermos usar uma variável sem passá-la como parâmetro será necessário declará-la como global. Uma variável quando declarada como global poderá ser acessada de qualquer ponto de uma aplicação.
•
Variáveis estáticas: Dentro do escopo de uma função também podemos definir uma variável como estática. Dessa forma será mantido o ultimo valor da variável. Exemplo: static $total;
•
Definindo valores detault: PHP permite definir valores default, valores default serão usados caso nenhum valor for passado para aquele parâmetro. Veja o exemplo abaixo:
39
Projeto E-JOVEM
13. Reutilização de Código Include e require 13.1. Reutilização de Código Reutilização de Código é muito útil para que possamos requisitar funções de outros arquivos PHP, incluírem determinada área de código tornando assim o código fácil de ser mantido. Vamos supor que você possua um portal de notícias com mais de 100 páginas na internet e que cada página possui o mesmo topo e o mesmo rodapé. Agora imagine que precisamos trocar a logomarca do portal no topo e o nome do portal no rodapé. Teríamos que entrar página por página em todas as 100 e trocar de cada uma. Com a reutilização de código nós só precisaríamos trocar apenas uma vez e todas as páginas estariam trocadas. Vamos supor agora que nesse mesmo portal que você possui, cada página tem uma função de imprimir os assuntos. E você descobriu que sua função de imprimir as notícias está errada. Teríamos novamente que trocar função por função em cada página. O que não seria necessário com a reutilização de código. 13.2. Include A instrução include() inclui e faz uma avaliação do arquivo informado. Todos os códigos ficam disponíveis no escopo do programa a partir da linha na qual foi inserido. Caso o arquivo não exista será produzida uma mensagem de warning (advertência). Exemplo: Crie um arquivo PHP chamado variáveis.php e insira o código abaixo: $nome = "Filippe"; $aula = "PHP"; ?> Crie agora outro arquivo na mesma pasta com o nome exemplo.php e insira o código abaixo: "; include "variaveis.php"; print "O aluno $nome está estudando $aula "; ?> Analise o resultado.
40
Projeto E-JOVEM 13.3. Require Idêntico ao include. Diferente apenas na sua manipulação de erros. Enquanto o include produz um warning, o require produzirá um fatal error (Erro fatal) caso o arquivo não exista. 13.4. Include_once Seu funcionamento é idêntico ao include, a não ser que o arquivo informado já tenha sido incluído. Essa instrução só permite que o arquivo seja incluído apenas uma vez. Muito importante para evitar redeclarações ou sobreposições de informações caso o programa necessite passar pela mesma instrução mais de uma vez. 13.5. Require_once Seu funcionamento é idêntico ao require, a não ser que o arquivo informado já tenha sido incluído. Essa instrução só permite que o arquivo seja incluído apenas uma vez. Muito importante para evitar redeclarações ou sobreposições de informações caso o programa necessite passar pela mesma instrução mais de uma vez. 14. Função Recursiva Uma função recursiva é uma função que se refere a si própria. A idéia consiste em utilizar a própria função que estamos a definir na sua definição. Em todas as funções recursivas existe: • •
Um passo básico (ou mais) cujo resultado é imediatamente conhecido. Um passo recursivo em que se tenta resolver um subproblema do problema inicial.
14.1. Como começar uma função recursiva Geralmente, uma função recursiva só funciona se tiver uma expressão condicional, mas não é obrigatório que assim seja. A execução de uma função recursiva consiste em ir resolvendo subproblemas sucessivamente mais simples até se atingir o caso mais simples de todos, cujo resultado é imediato. Desta forma, o padrão mais comum para escrever uma função recursiva é: • •
Começar por testar os casos mais simples. Fazer chamadas recursivas com subproblemas cada vez mais próximos dos casos mais simples.
41
Projeto E-JOVEM
14.2. Erro em funções recursivas Dado este padrão, os erros mais comuns associados às funções recursivas são, naturalmente: • •
Não detectar os casos simples A recursão não diminuir a complexidade do problema.
No caso de erro em função recursiva, o mais usual é a recursão nunca parar. O número de chamadas recursivas cresce indefinidamente até esgotar a memória (stack), e o programa gera um erro. A recursão infinita é o equivalente das funções recursivas aos ciclos infinitos dos métodos iterativos do tipo while-do e repeat-until. Observação importante – Analise o seguinte exemplo: "; ?> Se analisarmos a função fatorial, o caso básico é o teste de igualdade a zero, o resultado imediato é 1, e o passo recursivo é (valor * n (fatorial ( n - 1))). Repare que uma função recursiva que funciona perfeitamente em alguns casos, pode simplesmente não estar completamente certa para outros casos. A função fatorial é um exemplo. Quando o argumento é negativo, o problema torna-se cada vez mais complexo, cada vez mais longe do caso simples. (fatorial -1) => (fatorial -2) => (fatorial -3) => 14.3. Recursão versus Iteração No exemplo do fatorial, a implementação iterativa tende a ser ligeiramente mais rápida na prática do que a implementação recursiva, uma vez que uma implementação recursiva precisa registrar o estado atual do processamento de maneira que ela possa continuar de onde parou após a conclusão de cada nova execução subordinada do procedimento recursivo. Esta ação consome tempo e memória.
42
Projeto E-JOVEM 15. Trabalhando com Array Arrays em PHP podem ser observados como mapeamentos ou como vetores indexados. Mais precisamente, um valor do tipo array é um dicionário onde os índices são as chaves de acesso. Vale ressaltar que os índices podem ser valores de qualquer tipo e não somente inteiros. Inclusive, se os índices forem todos inteiros, estes não precisam formar um intervalo contínuo. Como a checagem de tipos em PHP é dinâmica, valores de tipos diferentes podem ser usados como índices de array, assim como os valores mapeados também podem ser de diversos tipos. 15.1. Sintaxe array array ( [...]) Retorna um array a partir dos valores fornecidos. Lembre-se que os índices podem ser atribuídos aos valores através do operador =>. Observação: array() é uma estrutura utilizada para representar literais de arrays, e não uma função. "laranja", "b"=>"banana", "c"=>"melancia"); print_r($frutas); ?> A sintaxe "index => values", separados por vírgulas, definem índice e valores respectivamente. O índice pode ser do tipo string ou numérico. Quando o índice é omitido, um índice numérico inteiro é automaticamente gerado, começando do 0. Se o índice é um inteiro, o próximo índice a ser gerado será igual ao maior índice inteiro + 1. Quando dois índices idênticos são definidos, o último sobrescreve o primeiro. 15.2. Array Multidimensional O array também pode ser criado com múltiplas dimensões (matrizes), é útil para a criação de tabelas ou planilhas dinâmicas. O exemplo a seguir além de criar um array com duas dimensões mostra como especificar chaves em arrays associativos e como definir índices numéricos em arrays normais.
43
Projeto E-JOVEM
Exemplo: array ("a"=>"laranja", "b"=>"banana", "c"=>"melancia"), "numeros" => array (1, 2, 3, 4, 5, 6), "buracos" => array ("primeiro", 5 => "segundo", "terceiro") ); print_r($frutas); ?> Veja abaixo um exemplo de indexação automática com array(): 1, 4 => 1, 19, 3 => 13); print_r($array); ?> A saída desse script será: Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 13 [4] => 1 [8] => 1 [9] => 19 ) Explicação: -O índice 3 definido duas vezes, logo o valor que será guardado é o seu último. Valor igual a 13. -O índice 4 definido duas vezes, logo o valor que será guardado é o seu último. Neste caso foram valores iguais. -O índice 4 é definido depois do índice 8, e o índice gerado depois dele foi 9, uma vez que o maior índice era 8. 15.3. Foreach Foreach funciona somente com arrays e gera erro se utilizado com uma variável de outro tipo ou em variáveis não inicializada.
44
Projeto E-JOVEM
Há duas sintaxes: 1 - foreach (expressão_array as $valor) instruções 2 - foreach (expressão_array as $chave => $valor) instruções A primeira forma varre uma dada matriz dada por expressao_array. Em cada 'loop', o valor do elemento corrente é atribuído a $valor e o ponteiro interno da matriz é avançado em uma posição (assim, na próxima iteração você estará olhando para o próximo elemento). A segunda é uma abreviatura, mas útil, da primeira. Faz à mesma coisa, exceto pelo fato de que à chave do elemento atual será atribuída à variável $chave em cada iteração. Observações: Quando o foreach inicia sua primeira execução, o ponteiro interno da matriz é zerado automaticamente para o primeiro elemento do array. Isto significa que você não precisa chamar reset() antes de um loop foreach. Note também que foreach opera sobre uma cópia do array especificado, não o próprio array e, portanto, o ponteiro do array original não é modificado como na instrução each(), que altera o elemento do array selecionado, mas isso não se reflete no array original. Entretanto, o ponteiro interno do array original é movimentado pelo processamento do array. Assumindo que o laço foreach rode até o fim, o ponteiro interno do array estará posicionado no fim do array. Foreach tem a habilidade de evitar mensagens de erro com '@'. "; } ?>
45
Projeto E-JOVEM 15.4. Funções Implode e join Sintaxe: • •
As duas funções são idênticas. Retornam uma string contendo todos os elementos do array fornecido separados pela string também fornecida. Split Sintaxe: •
array split(string padrao, string str, int [limite]);
Retorna um array contendo partes da string fornecida separadas pelo padrão fornecido, podendo limitar o número de elementos do array. Explode Sintaxe: •
array explode(string padrao, string str);
Funciona de maneira bastante semelhante à função split, com a diferença que não é possível estabelecer um limite para o número de elementos do array.
46
Projeto E-JOVEM Range Sintaxe: •
array range(int mínimo, int maximo);
A função range cria um array cujos elementos são os inteiros pertencentes ao intervalo fornecido, inclusive. Se o valor do primeiro parâmetro for maior do que o do segundo, a função retorna false (valor vazio). Shuffle Sintaxe: •
void shuffle(array $arr);
Esta função “embaralha” o array, ou seja, troca as posições dos elementos aleatoriamente e não retorna valor algum. Sizeof Sintaxe: •
int sizeof(array $arr);
Retorna um valor inteiro contendo o número de elementos de um array. Se for utilizada com uma variável cujo valor não é do tipo array, retorna 1. Se a variável não estiver setada ou for um array vazio, retorna 0. Sort Sintaxe: •
void sort(array $arr);
A função mais simples de ordenação de arrays. Ordena os elementos de um array em ordem crescente, sem manter os relacionamentos com os índices.
47
Projeto E-JOVEM Rsort Sintaxe: •
void rsort(array $arr);
Funciona de maneira inversa à função sort. Ordena os elementos de um array em ordem decrescente, sem manter os relacionamentos com os índices. Assort Sintaxe: •
void asort(array $arr);
Tem o funcionamento bastante semelhante à função sort. Ordena os elementos de um array em ordem crescente, porém mantém os relacionamentos com os índices. Arsort Sintaxe: •
void arsort(array $arr);
Funciona de maneira inversa à função asort. Ordena os elementos de um array em ordem decrescente e mantém os relacionamentos dos elementos com os índices. Ksort Sintaxe: •
void ksort(array $arr);
Função de ordenação baseada nos índices. Ordena os elementos de um array de acordo com seus índices, em ordem crescente, mantendo os relacionamentos. Toda variável do tipo array possui um ponteiro interno indicando o próximo elemento a ser acessado no caso de não ser especificado um índice. As funções seguintes servem para modificar esse ponteiro, permitindo assim percorrer um array para verificar seu conteúdo (chaves e elementos).
48
Projeto E-JOVEM Reset Sintaxe: •
mixed reset(array $arr);
Seta o ponteiro interno para o primeiro elemento do array, e retorna o conteúdo desse elemento. End Sintaxe: •
mixed end(array $arr);
Seta o ponteiro interno para o último elemento do array, e retorna o conteúdo desse elemento. Next Sintaxe: •
mixed next(array $arr);
Seta o ponteiro interno para o próximo elemento do array, e retorna o conteúdo desse elemento. Observação: esta não é uma boa função para determinar se um elemento é o último do array, pois pode retornar false tanto no final do array como no caso de haver um elemento vazio. Prev Sintaxe: •
mixed prev(array $arr);
Seta o ponteiro interno para o elemento anterior do array, e retorna o conteúdo desse elemento. Funciona de maneira inversa a next. Pos Sintaxe: •
mixed pos(array $arr);
Retorna o conteúdo do elemento atual do array, indicado pelo ponteiro interno.
49
Projeto E-JOVEM Key Sintaxe: •
mixed key(array $arr);
Funciona de maneira bastante semelhante à pos, mas ao invés de retornar o elemento atual indicado pelo ponteiro interno do array, retorna seu índice. 16. Trabalhando com String Strings podem ser atribuídas de duas maneiras: • •
Aspas simples ( ' ). Aspas duplas ( " ).
Aspas simples ( ' ): É maneira mais simples para especificar uma string. Desta maneira, o valor da variável será exatamente o texto contido entre as aspas (com exceção de \\ e \' – como mostra a tabela Seqüências de escape). Aspas duplas ( " ): Desta maneira, qualquer variável ou caracter de escape será expandido antes de ser atribuído. Seqüência \n \r \t \\ \$ \’ \” \[0-7]{1,3} \x[0-9A-Fa-f]{1,2}
Significado Nova linha Retorno de carro (semelhante a \n) Tabulação horizontal A própria barra ( \ ) O símbolo $ (Cifrão) Aspa simples Aspa dupla Seqüência de caracteres batendo a expressão regular dos caracteres em notação octal. Seqüência de caracteres batendo a expressão regular de um caracter em notação hexadecimal.
16.1. Operadores de strings Há dois operadores de string. O primeiro é o operador de concatenação é o ponto (.), que retorna a concatenação dos seus argumentos direito e esquerdo.
50
Projeto E-JOVEM Exemplo: O segundo é o operador de atribuição de concatenação ('.='), que acrescenta o argumento do lado direito no argumento do lado esquerdo. 16.2. Funções Chr Sintaxe: •
string chr(int ascii);
Retorna o caracter correspondente ao código ASCII fornecido
Ord Sintaxe: •
int ord(string string);
Retorna o código ASCII correspondente ao caracter fornecido. Echo Sintaxe: •
echo(string arg1, string [argn]... );
Imprime os argumentos fornecidos.
51
Projeto E-JOVEM Print Sintaxe: •
print(string arg);
Imprime o argumento fornecido. Strlen Sintaxe: •
int strlen(string str);
Retorna o tamanho da string fornecida. Trim Sintaxe: •
string trim ( string str [, string charlist])
Retira espaços e linhas do início e do fim da string fornecida. Ltrim Sintaxe: •
string trim ( string str [, string charlist])
Retira espaços e linhas em branco do ínicio da string fornecida. Rtrim Sintaxe: •
string rtrim ( string str [, string charlist])
Retira espaços e linhas em branco do final da string fornecida. Observação: chop é alias de rtrim.
Retorna a string fornecida com todas as letras minúsculas. Exemplo: strtolower(“Teste”); // retorna “teste” strtoupper Sintaxe: • string strtoupper(string str); • Retorna a string fornecida com todas as letras maiúsculas. Exemplo: strtoupper(“Teste”); // retorna “TESTE”
53
Projeto E-JOVEM ucfirst Sintaxe: •
string ucfirst(string str);
Retorna a string fornecida com o primeiro caracter convertido para letra maiúscula. Exemplo: ucfirst(“teste de função”); // retorna “Teste de função” ucwords Sintaxe: •
string ucwords(string str);
Retorna a string fornecida com todas as palavras iniciadas por letras maiúsculas. Exemplo: ucwords(“teste de função”); // retorna “Teste De Função” similar_text Sintaxe: •
int similar_text(string str1, string str2, double [porcentagem]);
Compara as duas strings fornecidas e retorna o número de caracteres coincidentes. Opcionalmente pode ser fornecida uma variável passada por referência, que receberá o valor percentual de igualdade entre as strings. Esta função é case sensitive, ou seja, maiúsculas e minúsculas são tratadas como diferentes. Exemplo: $num = similar_text("teste", "testando",&$porc); As variáveis passam a ter os seguintes valores: $num == 4; $porc == 61.538461538462 Strcasecmp Sintaxe: •
int strcasecmp(string str1, string str2);
54
Projeto E-JOVEM Compara as duas strings e retorna 0 (zero) se forem iguais, um valor maior que zero se str1 > str2, e um valor menor que zero se str1 < str2. Esta função é case insensitive, ou seja, maiúsculas e minúsculas são tratadas como iguais. Observação: A função strcmp funciona de maneira semelhante à função strcasecmp, com a diferença que esta é case sensitive. Strops Sintaxe: •
int strpos(string str1, string str2, int [offset] );
Retorna a posição da primeira ocorrência de str2 em str1, ou zero se não houver. O parâmetro opcional offset determina a partir de qual caracter de str1 será efetuada a busca. Mesmo utilizando o offset, o valor de retorno é referente ao início de str1. Strrpos Sintaxe: •
int strrpos(string haystack, char needle);
Retorna a posição da última ocorrência de str2 em str1, ou zero se não houver. strstr e strchr Sintaxe: • •
As duas funções são idênticas. Procura a primeira ocorrência de str2 em str1. Se não encontrar, retorna uma string vazia, e se encontrar retorna todos os caracteres de str1 a partir desse ponto. Exemplo: strstr("Soft Educandus", "Edu"); // retorna “Educandus”
55
Projeto E-JOVEM
17. Trabalhando com Data e Hora 17.1. A Função date Date Sintaxe: •
String date(string formato,int[datahora] );
Para mostrar um campo data e hora o caminho mais prático é utilizar a função date. Ela retorna uma data no formato especificado. 17.2. A Função mktime Mktime Sintaxe: •
Int mktime(int hora, int minuto, int segundo, int mês, int dia, int ano, int [is_dsf]);
Retorna uma data/hora no formato UNIX. Obtém um timestamp UNIX para uma data. Este timestamp é um longo inteiro contendo o número de segundos entre a Era Unix (January 1 1970) e o tempo especificado. Argumentos podem ser omitidos da direita para esquerda; quaisquer argumentos assim omitidos serão definidos para o valor atual de acordo com a data e a hora local. Observação: is_dst pode ser definido para 1 se está durante o horário de verão, 0 se não estiver, ou -1 (o padrão) se não se sabe se está em horário de verão ou não. Se for desconhecido, o PHP tenta calcular. Isto pode causar resultados inesperados (mas não incorretos). A função mktime() é útil para fazer data aritmética e validação, ela calculará automaticamente o valor correto para um receptor fora de linha.
56
Projeto E-JOVEM Exemplo:
"; echo date ("M-d-Y", mktime (0,0,0,13,1,1997)); print " "; echo date ("M-d-Y", mktime (0,0,0,1,1,1998)); print " "; echo date ("M-d-Y", mktime (0,0,0,1,1,98)); ?> 17.3. Letras Chaves para Usar com o Comando Date A tabela abaixo mostra algumas letras usadas com o comando date e o seu significado: Caracter: d j W D l L z m M F Y y H h G g i s A a
Significado: Dia do mês, numérico (De 00 a 31). Dia do mês, numérico. Sem os zeros à esquerda (De 0 a31). Dia da semana, numérico (0=domingo ...6=sábado). Dia da semana textual, abreviado com 3 letras (Sun...Sat). Nome do dia da semana completo (Sunday...Saturday) Se é ano bissexto.1 o ano é bissexto, 0 ano não é bissexto. Dia do ano (De 0 a 365) Mês, numérico (De 01 a 12) Nome do mês, abreviado com 3 letras (Jan...Dec). Nome do mês completo (Janeiro...Dezembro). Ano, numérico, 4 dígitos. Ano, numérico, 2 dígitos. Hora, no formato de 24 horas (De 00 a 23). Hora, no formato de 12 horas (De 01 a 12). Hora, no formato de 24 horas sem zeros à esquerda (De 0 a 23). Hora, no formato de 12 horas sem zeros à esquerda (De 1 a 12). Minutos (De 00 a 59). Segundos (De 00 a 59). AM ou PM am ou pm
Observação: A função Date sem argumento da data, retorna a data atual.
57
Projeto E-JOVEM 17.4. Outras Funções Envolvendo Data e/ou Hora Getdate Sintaxe: •
Array getdate(int data/hora);
Retorna um array associativo contendo todas as informações de uma data/hora específica. “seconds” “minutes” “hours” “mday” “wday” “mon” “year” “yday” “weekday” “month”
Segundos Minutos Horas Dia do mês Dia da semana no formato decimal Mês no formato decimal Ano no formato decimal Dia do ano no formato decimal Dia da semana no formato decimal Mês no formato texto
Time Sintaxe: •
Int time(void);
Retorna a data/hora no formato UNIX, que corresponde ao número de segundos desde o Unix Epoch(01\01\1970 00:00:00 GMT).
Gmdate Sintaxe: •
String gmdate(string formato, int datahora);
Retorna uma data/hora GMT no formato UNIX. É idêntica à função mktime(), exceto que a hora retornada é a hora de Greenwich.
Strftime Sintaxe: •
String strftime(string formato, int datahora);
58
Projeto E-JOVEM
Retorna uma string formatada de acordo com o formato dado em timestamp ou o horário corrente se nenhum timestamp é dado. Nomes de mês e dia da semana e outras strings dependentes de linguagens respeitam o a localidade definida com setlocale(), ou seja, formata uma hora/data de acordo com as configurações locais. Observação: Setlocale altera as informações de localidade. Sintaxe: •
String setlocale(string categoria, string locale); Argumento Data Formato
Descrição Data/hora a ser formatada. Se não especificada, utilizará a data/hora corrente. String com caracteres de formatação de datas.
Tabela com os caracteres de formatação de datas. Caracter %a %A %b %B %c %d %H %l %j %m %M %p %S %U
%W
%w %x %X %y %Y
Significado Dia da semana abreviado. Dia da semana completo. Nome abreviado do mês. Nome completo do mês. Representação preferida de data e hora. Dia do mês no formato decimal (00−31). Hora no formato decimal de 24 horas (00−23). Hora no formato decimal de 12 horas (00−12). Dia do ano no formato decimal (001−366). Mês em formato decimal (1−12). Minutos no formato decimal. ‘am’ ou ‘pm’, dependendo da hora especificada. Segundos no formato decimal. Número da semana do ano atual no formato decimal, começando no primeiro domingo como o primeiro dia da primeira semana. Número da semana do ano atual no formato decimal, começando na primeira segunda−feira como o primeiro dia da primeira semana. Dia da semana no formato decimal, sendo o domingo igual a 0. Representação preferida da data, sem a hora. Representação preferida da hora, sem a data. Ano no formato decimal, sem o século (00−99). Ano no formato decimal, com o século. 59
Projeto E-JOVEM %Z %%
Zona de fuso horário, ou nome, ou abreviação. Um caractere literal “%”.
Checkdate Sintaxe: •
Int checkdate(int mês, int dia, int ano);
Retorna true se uma data for válida; caso contrário, retorna false. Uma data é considerada válida se: • • •
O ano está entre 1 e 32767 o mês está entre 1 e 12 O dia deve está dentro do número de dias permitidos para o dado mês. Anos bissextos são levados em consideração.
Gettimeofday Sintaxe: •
Array gettimeofday(void);
Retorna um array associativo contendo as informações da hora corrente. Os índices da matriz são: “sec” “usec” “minuteswest” “dsttime”
Segundos Microsegundos Minutos a oeste de Greenwich Tipo da correção dst
18. Formulários HTML Um formulário HTML nada mais é do que uma mascara, por onde os usuários poderão preencher as informações solicitadas, que serão tratadas no servidor por algum script PHP. Para isso precisamos ter algumas coisas básicas no formulário como: 1. Botão Submit ou uma função que faça o papel deste botão. 2. Todos os campos que serão interpretados pelo PHP devem conter o atributo “name” definido.
60
Projeto E-JOVEM Devemos também definir o método pelo qual o formulário será enviado, que pode ser GET ou POST, normalmente utilizamos o método POST para que os dados não fiquem visíveis na url do site. 18.1. Tag FORM Na tag form temos que informar alguns dados importantes para que nosso formulário funcione corretamente. 1. Temos que definir o action que diz qual script vai executar os dados quando o formulário for submetido. Caso fique em branco ele enviara os dados pro mesmo script que gerou o formulário. Ex: Sem esse atributo setado não será possível realizar o upload. 19.1. Input File O HTML já tem um campo especifico para upload de arquivos, onde precisamos apenas configurá-lo. O componente que vamos usar é o INPUT com o type como FILE. Ex: 19.1.1. Tamanho do arquivo Veja o exemplo abaixo: O valor MAX_FILE_SIZE informa ao browser que existe um limite de bytes no qual o arquivo deverá possuir. No exemplo acima, o php só irá levar em consideração arquivos que possuam mais de 3000 bytes. 19.1.2. Submetendo um arquivo Veja o exemplo abaixo: Ao clicarmos no botão enviar, iremos submeter o formulário para a página upload.php. O conteúdo do arquivo poderá ser lido usando $_FILES[]. Exemplo: upload.php print $_FILE[‘foto’][‘name’]; // imprime o nome original do arquivo no computador do usuário. print $_FILE[‘foto’][‘ type’]; // O tipo mime do arquivo, se o browser deu esta informação. Um exemplo pode ser "image/gif". print $_FILE[‘foto’][‘ size’]; // O tamanho, em bytes, do arquivo. print $_FILE[‘foto’][‘ tmp_name’]; // O nome temporário do arquivo, como foi guardado no servidor. print $_FILE[‘foto’][‘ error’]; // O código de erro associado a este upload de arquivo. ['error'] foi adicionado no PHP 4.2.0 ?> 19.1.3.
Limitando o tamanho do arquivo
Com essas variáveis podemos agora fazer qualquer coisa com o arquivo. Como verificarmos o tamanho de um arquivo está dentro do limite a ser enviado ao servidor. Usamos em nosso script: if(($_FILE[‘foto’][‘ size’] > 1024)&& ($_FILE[‘foto’][‘ size’] > 3000)) { print “O tamanho do arquivo não está entre o permitido”; die; } ?> 19.1.4. Copiando o arquivo Para copiar o arquivo usaremos a função move_uploaded_file(); Veja o exemplo abaixo: $dir = “/fotos/”; if (move_uploaded_file($_FILES['foto']['tmp_name'], $dir . $_FILES['foto']['name'])) { print "O arquivo é valido e foi carregado com sucesso. "; } else { print "Erro no envio do arquivo"; } ?> 64
Projeto E-JOVEM Na funcção move_uploaded_file();, nós passamos onde o arquivo encontra-se usando para isso $_FILES['foto']['tmp_name'], que informa o local temporário do arquivo. E como segundo parâmetro passou o local onde o arquivo ficará armazenado no servidor. 19.1.5. Explicação das mensagens de erro Desde o PHP 4.2.0, PHP retorna um código de erro apropriado na array do arquivo. O código de erro pode ser encontrado em ['error'] na array que é criada durante o upload do arquivo. Em outras palavras, o erro deve ser encontrado em $_FILES['foto']['error']. Veja o detalhe dos erros abaixo: UPLOAD_ERR_OK Valor: 0; não houve erro, o upload foi bem sucedido. UPLOAD_ERR_INI_SIZE Valor 1; O arquivo no upload é maior do que o limite definido em upload_max_filesize no php.ini. UPLOAD_ERR_FORM_SIZE Valor: 2; O arquivo ultrapassa o limite de tamanho em MAX_FILE_SIZE que foi especificado no formulário HTML. UPLOAD_ERR_PARTIAL Valor: 3; o upload do arquivo foi feito parcialmente. UPLOAD_ERR_NO_FILE Valor: 4; Não foi feito o upload do arquivo.
19.1.6. Carregando múltiplos arquivos Podemos carregar múltiplos arquivos definindo vários nomes aos inputs do tipo file ou em formato de array. Para isso precisamos usar a mesma sintaxe no formulário HTML que você usa para múltiplos selects e checkboxes. Veja o exemplo abaixo: Quando o formulário acima é submetido, as matrizes $_FILES['userfile'], $_FILES['userfile']['name'], e $_FILES['userfile']['size'] serão inicializadas e poderão ser acessadas acrescentando o índex. 65
Projeto E-JOVEM
Por exemplo: print $_FILES['userfile']['name'][0]; // imprime o nome do primeiro arquivo print $_FILES['userfile']['name'][1];// imprime o nome do segundo arquivo ?> 20. Sessões e Cookies 20.1. O que são sessões O suporte a sessões no PHP consiste em uma maneira de preservar certos dados através dos acessos subseqüentes. Isto permite a você fazer aplicações mais personalizadas e melhorar a aparência do seu web site. Um visitante acessando o seu web site ganha um identificador único, o assim chamado id de sessão. Este é salvo em um cookie do lado do usuário ou propagado via URL. 20.1.1. Trabalhando com sessões Para criar uma sessão deve ser utilizada a função session_start() antes da criação do header (primeira função da página) e sempre que se desejar utilizar a informação da sessão. O session_start() é uma simples função que não recebe parâmetro algum e sempre retorna o booleano true. Essa função precisa vir antes qualquer código de saída (echo ou print) e qualquer código HTML da sua página. 20.1.2. Destruindo sessões Para fechar a sessão deve ser utilizada a função session_destroy(); Todas informações relacionadas a sessão são perdidas. Para remover uma variável da sessão, deve ser utilizada a função unset(); Veja o exemplo abaixo: unset($_SESSION[“nome”]); ?>
66
Projeto E-JOVEM
20.2. O que são cookies Cookie é um mecanismo de armazenamento de dados no browser cliente e permite o rastreamento ou identificação do retorno de usuários. Você pode criar cookies com a função setcookie(). Cookies são parte do header HTTP, então, a função setcookie() precisa ser chamada antes de qualquer saída ser enviada ao browser. 20.2.1. Trabalhando com cookies Cookies são criados através da função setcookie(); e essa função possui até 7 atributos: 1. 2. 3. 4. 5. 6. 7.
Nome –Nome do cookie; (obrigatório) Valor – Valor a ser inserido no cookie; (obrigatório) Expire – Data (em segundos) em que o cookie vai expirar; Path – Identifica o caminho onde o cookie será salvo; Domínio – Identifica o domínio que pode acessar o cookie; Secure – (0 ou 1). 1 para o caso de HTTPS. Httponly – (0 ou 1). Usado para tornar o cookie acessível apenas ao protocolo HTTP. Isto significa que o cookie não será acessível por linguagens script, como JavaScript. Foi adicionado ao PHP na versão 5.2.0
Exemplo de Cookie:
?> 21. Manipulando Arquivos Iremos mostrar varias funções para trabalharmos com arquivos e diretórios, como por exemplo, abrir um arquivo, ler ou escrever informações e fechá-lo.
67
Projeto E-JOVEM
21.1. Acessando Arquivos Para acessar um arquivo estaremos usando a função fopen() . Sintaxe: resource fopen ( string $filename , string $mode [, bool $use_include_path [, resource $context ]] ) Parâmetros: • filename: Nome do arquivo (arquivo.txt), Caminho do arquivo (C:\arquivo.txt) ou url (http://www.site.com/pagina.html) •
mode: forma de abertura do arquivo, poderá receber os parâmetros abaixo: o “r” : somente leitura. o “r+”: leitura e escrita. o “w”: somente escrita. o “w+”: leitura e escrita. o “a”: escrita, informações acrescentadas no fim do arquivo. o “a+”: leitura e escrita, informações acrescentadas no fim do arquivo.
•
use_include_path: O terceiro parâmetro opcional use_include_path pode ser definido para '1' ou TRUE se você quiser buscar o arquivo também no include_path.
•
context: O suporte ao contexto foi adicionado com o PHP 5.0.0. Um contexto é um conjunto de parâmetros específicos e opções que modificam ou melhoram o comportamento de um stream.
OBS: O Windows oferece uma flag de tradução do modo texto ('t') que traduz, transparentemente, \n para \r\n quando trabalhando no arquivo. Em contraste, você também pode utilizar 'b' para forçar o modo binário, que não irá traduzir o arquivo. Para usar essas flags, informe ou 'b' ou 't' como o último caractere no parâmetro mode. Exemplo:
68
Projeto E-JOVEM 21.2. Lendo um arquivo Para lermos arquivos usaremos a função fgets() Sintaxe: string fgets ( resource $handle [, int $length ] ) Parâmetros: • •
handle: O ponteiro do arquivo tem de ser válido por uma chamada a fopen() ou fsockopen() (e ainda não fechado por fclose()). Length: A leitura termina quando length - 1 bytes tenham sido lidos, em uma quebra de linha (que é incluída no retorno), ou no final do arquivo (EOF), o que acontecer primeiro. Se nenhum comprimento for especificado, a leitura do stream continuará até chegar ao final da linha.
Exemplo: 21.3. Fechando um arquivo Usaremos a função fclose() para fecharmos um arquivo Sintaxe: bool fclose ( int $handle ); Parâmetros: •
Handle: O ponteiro para o arquivo tem que ser válido e tem que apontar para um arquivo aberto por fopen() ou fsockopen().
Exemplo:
69
Projeto E-JOVEM
21.4. Escrevendo no arquivo Para escrevermos em um arquivo, estaremos usando a função fwrite() . essa função será usada em conjunto com fopen() e fclose(). Sintaxe: int fwrite ( resource $handle , string $string [, int $comprimento ] ) Parâmetros: • • •
Handle: Um ponteiro para o sistema de arquivos resource é tipicamente criado usando fopen(). String: A string a ser escrita. Comprimento: Se o argumento comprimento for dado, a escrita irá parar depois que comprimento bytes tenham sido escritos ou o final da string seja alcançado, o que vier primeiro.
21.5. Copiar, Renomear e Remover um arquivo Para copiar usaremos a função copy(), para renomear rename() e para remover unlink() . Veja mais detalhes abaixo: copy() Sintaxe: bool copy ( string $origem , string $destino [, resource $context ] ) Parâmetros: •
Origem - Caminho para o arquivo de origem.
•
Destino - O caminho de destino. Se o destino for uma URL, a cópia pode falhar se o wrapper não suportar a sobrescrita de arquivos existentes.
•
Context - Um válido resource de contexto criado com stream_context_create()
dir_handle – O manipulador de diretório resource aberto com opendir().
22. Enviando E-mail Veremos agora como utilizar formulários de envio de e-mail em nosso site.
22.1. Função mail() 72
Projeto E-JOVEM
A função mail() é usada para o envio de e-mails. Sintaxe: bool mail ( string $para , string $assunto, string $mensagem[, string $ headers [, string $parametros_adicionais]] ) Parâmetros: •
Para - Receptor, ou receptores do email. o
O formato desta string precisa estar de acordo com RFC 2822 (formato de mensagens para internet). Alguns exemplos: § [email protected] § [email protected], [email protected] § Usuario § Usuario , Outro Usuario
•
Assunto - Assunto do email a ser enviado.
•
Mensagem - mensagem a ser enviada. Cada linha deve ser separada com um LF (\n). Linhas não devem ser maiores que 70 caracteres. Headers - String a ser inserida no final do cabeçalho do email. Esta é normalmente usada para adicionar cabeçalhos extras (From, Cc, e Bcc). Múltiplos cabeçalhos extras devem ser separados com um CRLF (\r\n).
•
Parâmetros_adicionais - O parâmetro parâmetros_adicionais pode ser usado para passar um parâmetro adicional para o programa configurado para usa quando enviando email usando a configuração sendmail_path. Por exemplo, isto pode ser usado para definir o endereço do envelope remetente quando usando sendmail com a opção do sendmail -f. 22.2. Como será recebido O e-mail será recebido na caixa de entrada como qualquer outra mensagem, veja como chegaria a mensagem do exemplo da página anterior: Assunto: Verifique esta mensagem! Data: (Data do envio) De: Voce Para: [email protected] Mensagem: O PHP é o melhor!
73
Projeto E-JOVEM
22.3. Enviando e-mail com formato HTML Agora que sabemos como enviar um e-mail em formato de texto simples, aprenderemos como enviar um e-mail com conteúdo em HTML. Vejam o exemplo abaixo: $destinatario = "usuario@empresa.com"; $assunto = "Esta mensagem é um teste"; $corpo = ' Teste de correio
Olá amigos!
Bem-vindos ao meu correio de teste. Estamos testando o envio de e-mail através de HTML.
'; //para o envio em formato HTML $headers = "MIME-Version: 1.0"; $headers .= "Content-type: text/html;charset=iso-8859-1"; //endereço do remetente $headers .= "From: Suporte "; //endereço de resposta, se queremos que seja diferente a do remitente $headers .= "Reply-To: [email protected]"; //endereços que receberão uma copia $headers .= "Cc:[email protected]"; //endereços que receberão uma copia oculta $headers .= "Bcc: [email protected], [email protected]"; mail($destinatario,$assunto,$corpo,$headers) ?>
74
Projeto E-JOVEM
Vamos agora as explicações: 1. Atribuímos a uma variável $destinatario o endereço de quem irá receber o e-mail. 2. Atribuímos a variável $assunto o assunto do e-mail. 3. Atribuímos a variável $corpo o nosso HTML. 4. A variável $headers receberá todos os headers para o envio do e-mail. Que são eles: a. Para envio de e-mail em formato HTML: $headers = "MIME-Version: 1.0"; $headers .= "Content-type: text/html;charset=iso-8859-1"; b. Endereço do remetente (quem está enviando o e-mail): $headers .= "From: Suporte "; c. Endereço de resposta se quiser que seja diferente a do remitente $headers .= "Reply-To: [email protected]"; d. Endereços que receberão uma copia. $headers .= "Cc:[email protected]"; e. endereços que receberão uma copia oculta $headers .= "Bcc: [email protected], [email protected]"; 5. Utilizamos a função mail() para enviar o e-mail para os destinatários, passando as variáveis que definimos anteriormente. mail($destinatario,$assunto,$corpo,$headers Observação Importante Para o envio de correio através de PHP é necessário que este tenha uma correta configuração. Se a nossa web está num servidor de um provedor de hosting provavelmente já tenham configurado o PHP para o envio de e-mails. Se estivermos trabalhando em um servidor próprio, temos que configurar no PHP. PHP configura-se editando o ficheiro php.ini onde devemos especificar dados como o servidor de correio de saída que deve utilizar PHP para transferir as mensagens. Dentro do php.ini, devemos procurar o epigrafe [mail function]. Dependendo do nosso sistema deveremos configurá-lo de uma maneira ou de outra. Em sistemas Windows encontraremos o php.ini no diretório windows ou dentro deste, no subdiretório system32 ou similar. Neste sistema deveremos indicar o domínio do servidor de smtp, algo parecido a smtp.meudominio.com. Se é o PC local o que faz de servidor, poderemos por "localhost" como máquina que enviará o correio. Também podemos
75
Projeto E-JOVEM especificar o endereço de onde queremos que pareça a mensagem no caso de que não se indique outra durante o envio. 22.4. O que é SMTP Em principio, é um servidor para enviar email, mas como o nome SMTP, que vem do inglês "Simple Mail Transfer Protocol" diz, é um Protocolo Simples de Transferência de Mensagens, eletrônicas, naturalmente. 22.4.1. Como é o protocolo SMTP? Em primeiro lugar é necessário estabelecer um canal de comunicação com o servidor. Muitas linguagens de programação oferecem alguma função que permite o estabelecimento de comunicação entre o computador cliente e o servidor. Em PHP esta função e a fsockopen() que espera como principal parâmetro, o nome do servidor para criar um socket entre o cliente e o servidor. O que é socket? Pense numa tomada de energia que liga o aparelho de som na rede elétrica, é essa a idéia. O computador cliente vai se conectar ao computador servidor através de uma ligação lógica para comunicação bidirecional. Esta ligação é chamada socket. 23. Integrando PHP com Mysql Em PHP existem funções nativas que acessam a maioria dos bancos de dados existentes, como PostgreSQL, MySQL, Oracle, Sql Server, Interbase, Sybase, Informix, DB2 e Frontbase, entre outros. O PHP conecta-se com uma enormidade de gerenciadores de bancos de dados. Para cada um existe uma gama de funções associadas para realizar as mais diversas operações, tais como conexão, consultar, retorno, desconexão e outras. 23.1. Mysql O MySQL é um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL (Structured Query Language - Linguagem de Consulta Estruturada) como interface. É atualmente um dos bancos de dados mais populares, com mais de 10 milhões de instalações pelo mundo. O MySQL é o gerenciador de banco de dados mais usado com o PHP. Existem muitas funções pré-definidas para manipulação de conexões com bancos de dados.
76
Projeto E-JOVEM 23.1.1. Conectando com o banco Para realizar qualquer operação no banco de dados, é necessário abrir uma conexão. A conexão poderá ser local ou remota e disponibiliza um recurso ou um identificador para ser utilizada em operações posteriores. mysql_connect(): tenta uma conexão com um servidor MySQL. Deve-se passer como parâmetros: o nome do servidor (ou número IP) onde o MySQL está sendo executado, o nome de usuário e a senha deste usuário. O comando alternativo die trata um possível fracasso na conexão. Sintaxe: resource mysql_connect ([ string $server [, string $username [, string $password [, bool $new_link [, int $client_flags ]]]]] ) Parâmetros: •
Server - O servidor MySQL. Também pode incluir um número de porta, exemplo "servidor:porta" ou um caminho para um socket local, exemplo ":/caminho/para/socket" para o servidor local(localhost).
•
Username - O nome de usuário. O valor padrão é o nome do usuário que é o proprietário do processo do servidor.
•
Password - A senha. O valor padrão é uma senha vazia.
•
New_link - Se uma segunda chamada é feita a mysql_connect() com os mesmos argumentos, não é estabelecida uma nova conexão, mas ao invés, o identificador da conexão que já esta aberta é retornado. O parâmetro new_link modifica este funcionamento e faz mysql_connect() sempre abrir uma nova conexão, mesmo que mysql_connect() seja chamado antes com os mesmos parâmetros.
•
Cliente_flags - O parâmetro client_flags pode ser uma combinação das seguintes constantes: MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE ou MYSQL_CLIENT_INTERACTIVE.
23.1.2. Selecionando uma base Após conectarmos ao banco mysql, para manipularmos as tabelas, precisaremos selecionar um banco. Para isso usaremos a função abaixo: mysql_selectdb(): Seleciona qual base será selecionada dentro do banco de dados que foi conectado. O comando alternativo die trata um possível fracasso na seleção da base, podendo ser incluída uma mensagem customizada.
Database_name – nome do banco de dados Link_identifier - A conexão MySQL. se o identificador de conexão não for especificado, a ultima conexão aberta por mysql_connect() é assumida. Se uma conexão assim não for encontrada, ela irá tentar criar uma como se a função mysql_connect() fosse chamada sem argumentos. Se uma conexão não for encontrada ou estabelecida, um aviso de nível de erro E_WARNING é gerado.
23.1.3. Fechando uma conexão No momento em que não precisarmos mais utilizar a conexão que abrimos com o banco, é preciso liberar esse recurso para uma possível nova conexão. Para liberar o recurso usamos a instrução close da maneira descrita a seguir: Sintaxe: bool mysql_close ([ resource $link_identifier ] ) Parâmetros: •
Link_identifier - A conexão MySQL. se o identificador de conexão não for especificado, a ultima conexão aberta por mysql_connect() é assumida. Se uma conexão assim não for encontrada, ela irá tentar criar uma como se a função mysql_connect() fosse chamada sem argumentos. Se uma conexão não for encontrada ou estabelecida, um aviso de nível de erro E_WARNING é gerado.
23.1.4. Operações no banco Para realizarmos operações no banco de dados é necessário enviar uma instrução SQL. Está instrução poderá ser uma inserção, alteração ou exclusão de registros no banco de dados. Para executar uma SQL utilizar a função descrita abaixo: Sintaxe: resource mysql_query ( string $query [, resource $link_identifier ] )
78
Projeto E-JOVEM Parâmetros: • •
Query - A consulta SQL. A consulta não deve terminar com um ponto e vírgula. Link_identifier - A conexão MySQL. se o identificador de conexão não for especificado, a ultima conexão aberta por mysql_connect() é assumida. Se uma conexão assim não for encontrada, ela irá tentar criar uma como se a função mysql_connect() fosse chamada sem argumentos. Se uma conexão não for encontrada ou estabelecida, um aviso de nível de erro E_WARNING é gerado.
23.1.5. Consulta No caso em que precisamos buscar informações no banco de dados, utilizamos a operação de fetch. A função mysql_fetch_row Obtém uma linha como uma array numérica Sintaxe: array mysql_fetch_row ( resource $result ) Parâmetros: •
Result - O resultado resource que esta sendo avaliado. Este resultado vem de uma chamada a mysql_query().
A função mysql_fetch_array Obtém uma linha como uma matriz associativa, uma matriz numérica, ou ambas. Usada para buscar mais de uma linha no banco. Sintaxe: array mysql_fetch_array ( resource $result [, int $result_type ] ) Parâmetros: • •
Result - O resultado resource que esta sendo avaliado. Este resultado vem de uma chamada a mysql_query(). Result_type - O tipo de array que deve ser obtida. é uma constante e pode ter os seguintes valores: MYSQL_ASSOC, MYSQL_NUM, e o valor padrão de MYSQL_BOTH.
79
Projeto E-JOVEM
24. Ferramenta para trabalhar com Mysql phpMyAdmin 24.1. phpMyAdmin O phpMyAdmin é pretendido para administração do MySQL sobre a Web.Com o phpMyAdmin instalado em seu servidor você poderá criar banco de dados, copiar tabelas, criar, apagar e editar. Fácil configuração e administração. O xampp que instalamos como servidor local, já contem o phpmyadmin. Digite agora no seu browser HTTP://localhost/phpmyadmin para ter o primeiro contato com o sistema. PhpMyAdmin normalmente possui dois layouts um laranja e um roxo. Muitas vezes para entrar na página inicial precisaremos efetuar login, principalmente se o servidor estiver na web, isso ocorre por segurança do banco. Ao entrar, veremos no lado esquerdo uma lista de bases que possuímos e no centro um formulário onde poderemos criar uma nova base. 24.1.1. Criando uma nova base Para criar uma base pelo PhpMyAdmin é bem simples, basta dizer o nome da nova base e clicar em criar. Pronto sua base já está criada. 24.1.2. Manipulando tabelas Para criar tabela, excluir e alterar serão feitos de uma forma semelhante, sendo muito fácil também. Veja como criar uma tabela abaixo: Digite o nome da tabela e a quantidade de campos e clique em executar. Agora iremos cadastrar os campos que a tabela irá possuir. Para isso digite o nome do campo, defina seu tipo, seu tamanho, caso seja a chave primaria, selecione o radio Button. Se preferir que o mysql torne o id auto incrementado, selecione-o no combo extra. Isso fará com que todos os ids inseridos sejam incrementados para cada insert na tabela. Depois clique em salvar. Para excluir uma tabela, basta clicar no botão eliminar. 24.1.3. Manipulando campos Para adicionarmos um novo campo numa tabela já existente, informamos a quantidade de campos e sua localização na tabela. E clicamos em executar. Então preenchemos os dados da mesma forma que preenchemos quando criamos uma tabela. Para editar um campo, clicamos no ícone do lápis. Os dados virão preenchidos e poderemos alterá-los. Para excluir um campo, clicamos no ícone do X. irá aparecer uma caixa de confirmação, clicando em ok o campo será excluído.
80
Projeto E-JOVEM 24.1.4. Manipulando registros Para inseri um novo registro na tabela que criamos, clique no botão inserir. Preencha os dados e clique em executar. Para visualizar os registros de uma tabela, clique no botão visualizar. Serão listados todos os registros da tabela. Para editar um registro clicaremos no ícone do lápis e para excluir no X. o processo que será realizado será parecido com o da tabela. 24.1.5. Importando e Exportando bases Para exportar uma base clique no meu exportar na tela inicial da base. Será possível então selecionar quais bases e qual a forma em que iremos exportar. Como diversas outras opções. Após clique em executar. Para importar clique em importar na tela inicial da base, procure pelo arquivo (*.SQL) e clique em executar. 24.1.6. Operações com bases Clique em operações para visualizar as operações que poderemos realizar com a base. Como por exemplo, criar tabela, comentar, renomear e copiar o banco. 24.1.7. Operações com tabelas Clique em operações da tabela para visualizar as operações que poderemos realizar. Como por alterar, mover ou copiar a tabela. 25. Introdução a OO com PHP 25.1. O que é OO? Orientação a objetos (OO) é um paradigma de desenvolvimento de softwares. Que em vez de construir um sistema baseado num conjunto de procedimentos e variáveis, que nem sempre são agrupados de acordo com o contexto, na orientação a objetos utiliza-se uma ótica mais próxima do mundo real, onde se liga com objetos, onde muitas vezes são estruturas já conhecidas no dia-a-dia e as quais são mais bem-compreendidas. 25.2. Introdução No PHP, a orientação a objetos foi introduzida a partir da versão 3, no qual os objetos eram implementados por meio de arrays associados e tinha um suporte a características fundamentais como herança. O PHP5 introduziu varias novidades para trabalharmos com programação orientada a objetos.
81
Projeto E-JOVEM 25.3. Recursos de OO presentes no PHP Atualmente, para trabalharmos OO com PHP temos disponíveis os seguintes recursos: •
Classe
•
Objeto
•
Herança
•
Polimorfismo
•
Abstração
•
Encapsulamento
•
Interfaces
Vantagens •
Vantagens Diretas - maior facilidade para reutilização de código e por conseqüência do projeto - possibilidade do desenvolvedor trabalhar em um nível mais elevado de abstração - utilização de um único padrão conceitual durante todo o processo de criação de software - maior adequação à arquitetura cliente/servidor - maior facilidade de comunicação com os usuários e com outros profissionais de informática.
•
Vantagens Reais - ciclo de vida mais longo para os sistemas - desenvolvimento acelerado de sistemas - possibilidade de se construir sistemas muito mais complexos, pela incorporação de funções prontas - menor custo para desenvolvimento e manutenção de sistemas.
Desvantagens • • • •
Complexidade no aprendizado para desenvolvedores de linguagens estruturadas Maior esforço na modelagem de um sistema OO do que estruturado (porém menor esforço de codificação, sendo uma vantagem), Funcionalidades limitadas por interface, quando estas estão incompletas (problemas na modelagem) Dependência de funcionalidades já implementadas em superclasses no caso da herança, implementações espalhadas em classes diferentes.
25.4. Classe A classe é uma estrutura estática e será útil para descrever os objetos, seus atributos (propriedades) e métodos (funcionalidades). A classe é um modelo ou template para criação destes objetos.
82
Projeto E-JOVEM Podem ser classes, qualquer entidade do negócio da sua aplicação (Usuário, Cliente, Filme). No momento que modelamos um Cliente, por exemplo, são suas propriedades (nome, idade, sexo) e temos como métodos, funcionalidades desempenhadas pela classe. No caso de Cliente, poderiam ser métodos (Comprar (), Alugar (), Vender ()). 25.5. Objeto Um objeto é uma estrutura dinâmica originada a partir de uma classe. Assim que utilizarmos uma classe para criar diversas estruturas iguais a ela. Pode-se dizer que um objeto é uma instância de uma classe, pois a existência de um objeto se dá desde sua criação até sua destruição. São objetos da Classe Cliente Filippe, Renato, Rafael. 25.6. Herança Com herança podemos reaproveitar uma estrutura já existente, que forneça uma base abstrata para o desenvolvimento, provendo recursos básicos comuns. Herança pode ter uma aplicabilidade muito grande, pois é comum termos que criar novas funcionalidades em software. 25.7. Polimorfismo Polimorfismo é o principio que permite que classes derivadas de uma mesma superclasse tenham métodos iguais, possuindo a mesma nomenclatura e parâmetros, mas comportamentos diferentes, redefinidos em cada uma das classes filhas. 25.8. Abstração Na orientação a objetos prega-se o conceito da abstração. Para construirmos um sistema orientado a objetos, deve-se separá-lo em partes, concentrando nas partes mais importantes e ignorando os detalhes em um primeiro momento, para poder construir peças bem-definidas a fim de que as mesmas possam ser reaproveitadas mais tarde, formando uma estrutura de hierarquia.
25.9. Encapsulamento Encapsulamento é o mecanismo de proteção dos acessos a membros internos de um objeto. Dessa forma certas propriedades de uma classe devem ser tratadas exclusivamente por métodos da mesma. As propriedades nunca devem ser acessadas diretamente de fora do escopo de uma classe, pois assim a classe não fornece mais garantias sobre os atributos que contém, perdendo, então, a responsabilidade sobre eles. 25.10.
Associação
É uma relação mais comum entre dois objetos, na qual um possui uma referência à posição da memória onde o outro se encontra, podemos visualizar seus atributos ou, mesmo, acionar uma de seus métodos. 83
Projeto E-JOVEM 25.11.
Agregação
Na agregação, um objeto agrega outro, ou seja, torna um objeto externo parte de si mesmo pela utilização de um dos seus métodos. Assim o objeto-pai poderá utilizar funcionalidades do objeto agregado. Nessa relação, um objeto poderá agregar uma ou muitas instâncias de um outro objeto. 25.12.
Composição
A composição e agregação são praticamente iguais. A diferença em relação à agregação é que na composição o objeto-pai é responsável pela criação e destruição de suas partes. Na agregação, ao se destruir um objeto, as partes permanecem na memória por terem sido criadas fora do escopo da classe. Já na composição, ao se destruir um objeto, as partes também serão destruídas. 25.13.
Interfaces
Interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface 26. Definindo uma Classe Uma classe não é necessariamente, utilizada para orientação a objetos. Podemos criar classe para as mais diversificadas operações. Geralmente criamos classes para serem reutilizadas em outros softwares que desenvolvemos. Por exemplo, podemos criar uma classe para gerenciar a conexão com o banco de dados, uma classe para juntarmos as funções mais usadas ou até mesmo uma classe para calcularmos dois valores. Uma classe é uma coleção de variáveis e funções trabalhando com essas variáveis. Variáveis são definidas por var e funções por function. Uma classe é definida usando a seguinte sintaxe: items[$artnr] += $num; } // Retira a quantidade $num de artigos $artnr do carrinho function remove_item($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } elseif ($this->items[$artnr] == $num) { unset($this->items[$artnr]);
Isto define uma classe chamada CarrinhoDeCompras que consiste de uma matriz associativa de artigos no carrinho e duas funções para acrescentar e remover itens deste carrinho. 26.1. Padrão de codificação As classes devem indicar exatamente sua finalidade. Não deve haver dúvidas ao leitor do código sobre o que está sendo armazenado na variável ou sobre o que será executado/retornado numa função. Evite utilizar abreviações principalmente as que não são de domínio público. A utilização de prefixos é óbvia para o desenvolvedor que escreveu o código, mas pode não ser para quem está lendo. Prefixos aumentam a quantidade de conhecimento que um desenvolvedor deve possuir para nomear uma simples variável.
Nomes de classes devem representar tipos. Devem iniciar com letra maiúscula. As demais letras serão minúsculas, exceto no início de cada palavra. Exemplo: ERRADO function objetoOperaçãoEntrega() { this.propriedade = 'Teste' } CORRETO function OperacaoEntrega() { this.propriedade = 'Teste' }
Lembre-se: Não devem ser utilizados caracteres especiais ou acentos em nomes de classes. Você NÃO pode quebrar uma definição de classe em múltiplos arquivos. Você NÃO pode também quebrar a definição de uma classe em múltiplos blocos PHP, a menos que a quebra esteja dentro de uma declaração de método. O seguinte não irá funcionar:
85
Projeto E-JOVEM
Entretanto, o seguinte é permitido:
Os cuidados a seguir devem ser tomados a partir do PHP 4: • •
•
O nome stdClass é utilizado internamente pela Zend e é uma palavra reservada. Você não pode ter uma classe chamada stdClass no PHP. O nome de função __sleep e __wakeup são classes especiais do PHP. Você não pode ter esses nomes em nenhuma de suas classes a não ser que você deseje aplicar essa funcionalidade especial. O PHP reserva todos os nomes de funções começando com __ como especiais. É recomendável que você não utilize nome de funções começando com __ no PHP a não ser que você precise dessas funcionalidades especiais.
26.2. Usando $this Para poder acessar suas próprias funções e variáveis de dentro da classe, pode-se utilizar a pseudo-variável $this, que pode ser lida como 'eu mesmo' ou 'objeto atual'. Dessa forma, '$this->valor += $num' pode ser lido como 'acrescente $num para o contador $valor '. Nota: A pseudo-variável $this não é normalmente definida em um método que seja chamado estaticamente. Isto não é, entretanto, uma regra estrita: $this é definido se um método é chamado estaticamente a partir de outro objeto. Neste caso, o valor de $this será do objeto que o chamou. 26.3. PHPDoc PHPDoc foi baseado no JAVADoc da Sun e tem como objetivo padronizar a documentação de códigos PHP. Ele lê o código e analisa gramaticalmente procurando por tags especiais. A partir delas extrai toda documentação usando diferentes formatos (pdf, xml, html, chm 86
Projeto E-JOVEM Windows help e outros). Todas as tags especiais são escritas dentro do comentário do php /* comentários */ e necessariamente começam com o @ (arroba).
Especifica o tipo de acesso(public, protected e private). Especifica o autor do código/classe/função. Especifica os direitos autorais. Especifica elementos que não devem ser usados. Definir arquivo de exemplo, $path/to/example.php Igonarar código Documenta função interna do código link do código http://www.exemplo.com
Especifica o apelido(alias). Especifica o nome do pacote pai, isto ajuda na organização Especifica os paramêtros muito usado em funções. Especifica o tipo de retorno muito usado em funções. Especifica o nome do pacote filho. Especifica a versão da classe/função.
Projeto E-JOVEM * @access public * @name $valor1 */ var $valor1; /** * Variável recebe o segundo valor. * @access public * @name $valor2 */ var $valor2; /** * Função para somar dois valores * @access public * @param int $primeiroValor * @param int $segundoValor * @return itn */ function somar($primeiroValor, $segundoValor){ $this->valor1 = $primeiroValor; $this->valor2 = $segundoValor; return $this->valor1 + $this->valor2; } } $calc = new Calcular(); print $calc->somar(5, 20); ?>
27. Construtores e Destrutores 27.1. Construtores Construtor é um método especial que utilizamos para definir o comportamento inicial de um objeto, ou seja, o comportamento no momento de sua criação. O método construtor será executado automaticamente no momento em que se instância um objeto utilizando o operador new. Caso não defina um método construtor, todas as propriedades do objeto criado serão automaticamente inicializadas com o valor default NULL. Para definirmos um construtor na classe, basta declarar o método __Construct() ou o próprio nome da classe. Veja o exemplo: class Calcular{ var $valor1; var $valor2;
88
Projeto E-JOVEM
function __construct($primeiroValor, $segundoValor){ $this->valor1 = $primeiroValor; $this->valor2 = $segundoValor; } function somar(){ return $this->valor1 + $this->valor2; } } $calc = new Calcular(5, 20); print $calc->somar(); ?>
Observe que agora estamos enviando os valores no momento que criamos o objeto, não sendo mais necessário o envio ao chamar o método de somar. 27.2. Destrutores Destrutor é um método especial que é executado automaticamente quando o objeto é desalocado da memória, quando atribuímos o valor NULL ao objeto, quando utilizamos a função unset() sobre o mesmo ou quando o programa é finalizado. Podemos usar o método destrutor para finalizar conexões, apagar arquivos temporários, entre outros. Para definirmos um método destrutor em uma classe, basta declarar o método __destruct(). Altere a classe Calcular e teste no seu browser. function __destruct(){ print "Classe Calcular foi finalizada."; } 27.3. Encapsulando atributos e métodos Uma das formas de definirmos um encapsulamento é definindo a visibilidade das propriedades e métodos de um objeto. A visibilidade define a forma como essas propriedades devem ser acessadas. Há três formas de acesso: •
Private – membros declarados como private, só poderão ser acessados dentro da própria classe na qual foram declarados. Não podendo ser acessados a partir de classes descendentes nem a partir do programa que faz uso dessa classe.
•
Protected – membros declarados como protected, só poderão ser acessados dentro da própria classe a qual foram declarados e a partir de classes descendentes. Mas não poderão ser acessados a partir do programa que faz uso dessa classe.
•
Public – membros declarados como public, poderão ser acessados livremente a partir da própria classe na qual foram declarados, a partir de classes descendentes e a partir do programa que faz uso dessa classe.
89
Projeto E-JOVEM
private $valor1; private $valor2; public function __construct($primeiroValor, $segundoValor){ $this->valor1 = $primeiroValor; $this->valor2 = $segundoValor; } 27.4. Criando uma Interface Como vimos anteriormente, uma interface é um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela está comprometida a fornecer o comportamento publicado pela interface. Criaremos uma interface ICalcular para a classe Calcular onde o método soma será obrigatoriamente implementado. Note que o nome da classe interface contem um “I” i maiúsculo, esse é um padrão a ser seguido. Arquivo: ICalcular.php interface ICalcular{ public function somar(); } ?> Arquivo: Calcular.php require_once("ICalcular.php"); // inclui o arquivo ICalcular.php class Calcular implements ICalcular{ // implementa a interface ICalcular private $valor1; private $valor2; public function __construct($primeiroValor, $segundoValor){ $this->valor1 = $primeiroValor; $this->valor2 = $segundoValor; }
90
Projeto E-JOVEM public function somar(){ return $this->valor1 + $this->valor2; } public function __destruct(){ print "Classe Calcular foi finalizada."; } } $calc = new Calcular(5, 20); print $calc->somar(); print " "; $calc = NULL; ?> Veja como foi simples, a interface apenas define que o método será obrigado a existir na classe. Ela não possui construtor, destrutor e nenhum outro tipo de funcionalidade. 28. Instanciando um Objeto O operador new Você pode criar uma variável (ou instância) do tipo desejado com o operador new. Veja o exemplo abaixo: add_item("10", 1); $outro_carrinho = new CarrinhoDeCompras(); $outro_carrinho->add_item("0815", 3); ?> Isto cria os objetos $carrinho e $outro_carrinho, ambos a partir da classe CarrinhoDeCompras. A função add_item() do objeto $carrinho foi chamada e acrescentou 1 item do artigo número 10 a $carrinho. 3 itens do artigo número 0815 foi acrescentado no $outro_carrinho. Ambos, $carrinho e $outro_carrinho, tem as funções add_item(), remove_item() e a variável itens. Elas são funções e variáveis distintas entre si. Você pode pensar no objetos como os diretórios de um sistema de arquivos. Num disco você pode ter dois arquivos diferentes README.TXT, partindo de que eles estão em diretórios diferentes. Da mesma forma que você teria de especificar o caminho completo para acessar cada arquivo a partir do diretório principal, você também tem de especificar o nome completo do objeto e função que você quer chamar. No PHP o diretório principal pode ser o escopo global de nomes, e o separador de diretórios ->. Portanto, os nomes $carrinho->items e $outro_carrinho->items são duas variáveis diferentes. Note que a variável é chamada $carrinho->items, não $carrinho->$items, mesmo porque, um nome de variável em PHP tem apenas um único sinal de cifrão. 91
Projeto E-JOVEM
29. Trabalhando a segurança do seu sistema 29.1. Segurança Boas linguagens de programação, não podem ser consideradas por si só seguras ou inseguras, a segurança dependerá de todo o projeto e mais especificamente do código do programa. A segurança de um sistema deve ser balanceada com o custo e a usabilidade do projeto. Projetos feitos com um pequeno nível de segurança são mais custosos do que projetos sem segurança. Por isso precisamos definir o nível de segurança com cautela no inicio do projeto. Para não torná-lo economicamente inviável ou até mesmo complicado de mais de ser implementado. 29.2. Usabilidade versus segurança O uso do seu sistema se tornará mais complicado, quanto maior for o número de recursos de segurança presentes no seu sistema. Um exemplo muito popular é o internet banking. Esse sistema precisa ser muito fácil de ser usado, mas contar com recursos de segurança bastantes confiáveis. Para tanto usam: • • • •
Login (geralmente numero da agência e da conta) Senha Palavra secreta ou contra-senha (senha especial para acesso na internet) Número sorteado do cartão de chaves de acesso (token)
Tanta segurança tem acarretado numa maior dificuldade para seus clientes usarem o sistema. Fazendo com que muitos procurem a agência por não terem de aprender a usar o sistema ou não confiarem. Para programarmos recursos de segurança levamos em consideração os itens: • • • • • •
Valor da informação manipulada Perfil do usuário Faixa etária Nível de instrução Finalidade do sistema (lazer ou trabalho) Hardware usado
29.3. Postura de Defesa Precisamos manter uma postura de defesa, onde procuramos manter informações protegidas. Mesmo que a informação não seja importante ou confidencial, terceiros não poderão tirar proveitos dessas informações. Quanto menos souberem sobre o seu sistema, mais privativo ele será e, conseqüentemente, mais segurança.
92
Projeto E-JOVEM 29.4. Desempenho Um bom sistema deve possuir tudo no qual foi planejado e ainda: • • • •
Consumir o mínimo de tempo de CPU para ser executado. Alocar a menor quantidade de memória. Gravar todos os dados necessários usando o menor espaço em disco. Utilizar a rede interna e a internet de forma econômica e racional.
Se uma página web possuir poucos recursos para serem geradas, o servidor suportará então múltiplas requisições, podendo assim atender um maior numero de conexões simultâneas. 29.5. Usuários Ilegítimos Geralmente definimos um sistema baseado nos usuários legítimos. Precisamos mudar esse conceito. O desenvolvedor precisa pensar primeiro nos usuários ilegítimos para depois pensarmos nos usuários reais do sistema. Essa técnica é muito simples, mais depois de projetada, a programação ganhará em velocidade, e como já sabemos, tempo é dinheiro. 29.6. Filtro de Dados Tudo que vir de uma fonte externa deverá ser inspecionado. Com isso o que for digitado pelo usuário, coletados de arquivos, enviados por formulários, ou até interações feitas com servidores de banco de dados devem passar por um filtro. Um filtro é uma das formas mais significantes de segurança. Precisamos sempre fazer checagem dos dados tanto no cliente (browser) como no servidor (PHP). 29.7. Manipulação de Erros Todos que navegam pela internet, já devem ter se deparado com algum site indisponível. O erro nesse caso não é o site está indisponível, afinal problemas podem acontecer. A gravidade consiste em, quando ocorrem problemas, informações como endereço do servidor de banco de dados, variáveis do sistema e outras informações serem exibidas pelo browser, assim pessoas mal intencionadas poderão tirar proveito dessa falha e prejudicar o sistema. 29.8. Limitador de Acesso Um limitador de acesso é mais um recurso para ser implementado em um projeto com foco em segurança. Um exemplo típico é uma função que reage a tentativas mal sucedidas de login por um usuário, o que pode ser caracterizada como uma possibilidade de quebrar uma senha. Também pode ser conhecido como rate limit.
93
Projeto E-JOVEM 29.9. Segurança na Internet Podemos citar alguns problemas relacionados a segurança da web: •
•
•
Informações transmitidas entre o servidor web e browser poderiam ser interceptadas por um sniffer. Esse problema pode ser solucionado usando protocolos de criptografia (HTTPS, SSL, TLS). Problemas no servidor web poderiam facilitar o vazamento de informações confidenciais. Embora esse risco exista, os servidores web estão bem mais robustos e estáveis, atualmente sendo um risco bem menor. Problemas com o browser também podem fazer com que informações confidenciais também vazem. Esse problema não foi completamente resolvido, mas temos disponível pelo menos meia dúzia de browsers de boa qualidade.
Problemas que ainda não foram realmente apresentadas uma solução são: • •
Um programa (CGI, PHP, etc.) com alguma falha de programação pode abrir precedentes para que um servidor ou até mesmo uma rede inteira esteja exposto. Com o avanço tecnológico, é comum uso de softwares de terceiros associados tanto ao servidor web como ao browser. Esses programas são conhecidos como plugins e extenções. Aqui existe um risco especial, pois um terceiro (fabricante do plugin) está envolvido no processo em que inicialmente havia apenas duas entidades (servidor web e browser).
29.10. Estrutura de um Projeto Aplicações web precisam manter em algum lugar informações que não podem ser visualizado de modo algum tato por usuários da web quanto pelos usuários do sistema operacional. Geralmente precisamos armazenar dados de acesso a bancos de dados, senhas para acesso a outros sistemas e talvez uma senha mestre para administração do site. Como exemplo, poderíamos estar usando um arquivo chamado config.inc para armazenar as informações de configuração do banco. Como a extensão .inc não é conhecida pelo servidor, se digitássemos no browser o caminho HTTP://www.meuservidor.com.br/config.inc todas as informações contidas no arquivo seriam exibidas. Uma forma de conter isso seria renomear o arquivo de inclusão para config.inc.php 29.11. Configuração do PHP A configuração do PHP é feira no arquivo php.ini. Existem diferenças entre configuração do PHP em ambiente de desenvolvimento e em um ambiente de produção. São eles: •
Ambiente de desenvolvimento – deve proporcionar uma grande quantidade de informações para que o programa possa ser escrito da melhor forma possível.
94
Projeto E-JOVEM •
Ambiente de produção – deve oferecer as informações necessárias para os usuários usufruírem da aplicação com o melhor desempenho possível e com a segurança esperada.
É importante ressaltar que, ao modificar qualquer uma diretriz do PHP, o servidor precisará ser reiniciado para que as alterações entrem em vigor. Vejas diretrizes que poderemos alterar no php.ini: • •
• • •
Register_globals: [on | off] – tem a função de registrar automaticamente variáveis que foram enviadas pelos métodos POST, GET e pelo uso de cookies. Display_erros: [on | off] – serão exibidas mensagens de alerta no decorrer da execução do script. Podemos usá-la como “ON” em ambiente de desenvolvimento, mas em ambiente de produção o essa diretriz precisa está configurada como “OFF”. Log_erros: [on | off] – essa diretriz completa a display_erros. Ao habilitar, erros ocorridos serão gravados no arquivo de erro do apache. Upload_max_filesize: 2M – define o tamanho máximo para upload de arquivos. Include_path: “.” – especifica a lista de diretórios em que a função include() e suas variantes procurarão o arquivo.
29.12. Gerenciamento de Erros Manipular erros e avisos é uma tarefa muito importante, mais muitos programadores e administradores de sistemas não conferem a isso a devida importância. É muito importante que mensagens internas com informações do sistema não sejam exibidas para o usuário final, obviamente não só pela razão estética, mas principalmente para evitar incidentes de segurança, pois quase sempre as informações provenientes de uma exceção gerada pelo sistema exibem nomes de funções, classes, variáveis, seus valores e outras informações. Podemos manipular erros com a função set_error_handler(). Essa função pode ser usada para definir como manusear os erros durante a execução do script. Ela envia a mensagem de erro para uma função definida pelo programados. Essa função precisa aceitar cinco parâmetros, são eles: 1. 2. 3. 4. 5.
Código do erro. Descrição do erro. Nome do arquivo envolvido no problema (opcional). Número da linha que houve o erro (opcional). Contexto em que o erro aconteceu (opcional). É um array que aponta para a tabela de símbolos ativos na posição em que ocorreu o erro, ou seja, esse array conterá todas as variáveis que existiam no escopo de execução no momento do erro.
95
Projeto E-JOVEM
29.13. Configuração de servidores Compartilhados Talvez seu sistema PHP esteja hospedado num servidor compartilhado com vários outros sistemas de terceiros. Neste caso certamente a empresa de hospedagem não permitirá que as diretrizes de configuração do PHP sejam alteradas, afinal isso poderia causar problemas para seus clientes. Nesses casos é possível usar a função ini_set(). A função ini_set() define valores às diretrizes de configuração do PHP, e esses valores são validos durante a execução do script. Dessa forma, é interessante manter as configurações das diretrizes em um arquivo separado e incluí-lo no início da execução do programa com a função include(). Exemplo: 29.14. Ataques pelos Formulários Por ser um meio de entrada legitimo de dados, os formulários são usados como porta de entrada para ataques. Isso se os dados que forem enviados por formulários não forem tratados da forma correta. Veja os exemplos: •
•
•
Abuso no envio de e-mails (span) – é muito comum em sites um local para formulário de contato. Este é um recurso legal para que os clientes entrem em contato com os fornecedores rapidamente. Mensagens indesejáveis enviadas dessa forma fazem parte de um nicho muito particular de spans difíceis de combater. Para evitar esse tipo de transtorno filtre toda a entrada de dados do sistema. Ataques por upload de arquivo – é fundamental analisar a presença de vírus e códigos maliciosos no arquivo. Podemos verificar a extensão do arquivo, por exemplo, se estivermos esperando uma imagem aceitaríamos arquivos (.JPG, .PNG ou .GIF). Não seria necessário recebermos um arquivo (.EXE). CAPTCHA – é acrônimo de Completely Automated Public Turing Test To Tell Computers And Humans Apart (teste público completamente automatizado para distinguir computadores e humanos). É um tipo de teste pergunta-resposta usado em conjunto com o formulário para determinar se o usuário é um humano. Entre outras coisas, isso pode evitar que scripts também conhecidos como robôs possam acessar
96
Projeto E-JOVEM determinadas partes de um site e colher informações. Veja um exemplo de captcha abaixo: 29.15. Inibindo a Exposição do código-fonte O include() é uma das funções que traz maior poder para o desenvolvedor web, mas, se usarmos de forma incorreta, podemos ter sérios problemas relacionados a segurança. Não atribuir extensões aos arquivos se não .php, pois o Apache não reconhece extensões como .inc e outras usadas por programadores. • Não armazená-los no diretório de trabalho do servidor web, definido pela diretriz DocumentRoot do apache HTTP Server. •
29.16. Escondendo nomes de Arquivos Usuários mal intencionados terão mais dificuldade de achar brechas de segurança caso não conheça detalhes de um website. Por essa razão, pode ser uma boa esconder a extensão dos arquivos.Veja o exemplo abaixo: Vamos supor que ao clicar no menu, o usuário passe por parâmetro o arquivo que será incluído. Imagine o link assim: HTTP://www.exemplo.com.br/?inc=../contato.php $inc = $_GET[‘inc’]; include($inc); ?> Nesse exemplo encontramos os seguintes problemas: • • •
Usuário consegue ver o local onde estão armazenados os arquivos. Extensões dos arquivos visíveis. Por receber o caminho completo, podemos receber um caminho indesejável.
Poderíamos usar o mesmo link retirando a extenção do arquivo e colocando via php. Ficando assim: HTTP://www.exemplo.com.br/?inc=contato
97
Projeto E-JOVEM $inc = $_GET[‘inc’]; include(‘../’. $inc .’.php’); ?> Veja que com poucas alterações podemos esconder a extensão do arquivo e os diretórios onde estão localizados. 29.17. Evitando Injeção de Código Uma pratica muito comum e uma das mais utilizadas, consiste em infiltrar um código de terceiros em seus scripts para ser executado no seu servidor. Exemplo: HTTP://www.exemplo.com.br/?quiz=questao15.php Nesse caso vemos que a variável quiz recebe um valor legitimo. A injeção de código acontece quando o atacante altera os dados da variável para inserir arquivos externos que certamente terão seus códigos maliciosos, alterando a chamada da url da seguinte forma: HTTP://www.exemplo.com.br/?quiz=http://malicia.com.br/code.inc Para evitar esse problema usaremos uma técnica conhecida como White list e Black list 29.18. White list Técnica que se baseia numa lista em que estarão catalogados nomes de arquivos que podem ser incluídos em uma pagina por uso da função include() e suas variantes. 29.19. Black list Técnica semelhante a White list, mas menos restritiva, afinal tem por objetivo informar quais arquivos não poderão ser inseridos. Seria fazer o contrario, onde os arquivos da Black list não poderiam ser incluídos. Logo percebemos que essa técnica é não é muito eficiente, pois o array teria que ser enorme. 29.20. Dados de Sessão Expostos É muito comum que sites PHP sejam armazenados em servidores compartilhados, isso pode se tornar um problema quando as informações de sessões de clientes e fornecedores são armazenadas em áreas compartilhadas do servidor. Ao iniciarmos uma sessão, criamos um arquivo de controle em um diretório no servidor web. É comum o uso do diretório /tmp. Nele serão armazenados os arquivos temporários. Entretanto esse diretório poderá ser usado por todos os usuários da maquina, ou seja, salvo pelas permissões atribuídas aos arquivos de dados de sessões, esses arquivos ficam expostos a
98
Projeto E-JOVEM todos os usuários do servidor web. O problema é que nem sempre as empresas de hospedagem implementam permissões para os arquivos de sessões. Uma alternativa é estabelecer que cada sistema instalado no servidor possua seu próprio diretório temporário para armazenar os arquivos. Isso pode não ser viável pois demanda configurações que os administradores de servidores compartilhados não estão sempre dispostos a fazer. Outra forma é usar a função session_set_save_handler(), que alem de permitir o armazenamento dos dados de controle de sessão em uma tabela de banco de dados, pode auxiliar em uma outra alternativa para armazenar os dados de controle de sessões de forma criptografada. 29.21. Roubo de sessões Basicamente existem três formas de conseguir a identificação de uma sessão: • • •
Presumi-la Capturá-la Defini-la
Presumir um identificador é um trabalho praticamente impossível, pois o PHP gera números de forma aleatória. A captura pode ser facilmente evitada usando criptografia entre o servidor web e o browser. A fixação de sessões é um ataque que define previamente um identificador de sessão e geralmente é explorado em conjunto com técnicas de engenharia social. 29.22. Autenticação Geralmente os mecanismos de autenticação usados são feitos em formulários, o que garante uma boa apresentação e personalização do sistema. Mas também é possível usar o método de autenticação proveniente do protocolo HTTP. O PHP é capaz de receber as variáveis originadas da autenticação HTTP e tratá-las da maneira mais adequada para verificar a legitimidade das informações seja em um banco de dados, em um arquivo ou em um servidor LDAP. Para que a autenticação HTTP seja possível, será necessário enviar os cabeçalhos correspondentes para o browser, e esse se comportará como se o próprio servidor web estivesse gerenciando a autenticação.
99
Projeto E-JOVEM 29.23. Criptografia O php possui muitos recursos para embaralhar informações e, usado métodos tão sofisticados, torna impossível realizar a operação contraria. Como exemplo veremos a função md5() que retorna uma string criptografada. Quando quisermos verificar a senha digitada com a senha armazenada, basta aplicar a função md5() novamente. 29.24. SQL Injection Sql infection é o uso por usuários não autorizados de queries arbitrarias, uma falha que está se tornando muito comum. A exploração dessa vulnerabilidade ocorre em razão dos deslizes cometidos pelo desenvolvedor. Para que ocorra SQL Injection são necessários dois problemas na programação: • •
Falha no filtro para armazenar informações no banco de dados. Falha ao filtrar informações recebidas do banco de dados.
Vamos supor que tenhamos um formulário de login e senha. Caso ao invés de preencher o login e senha corretamente, colocássemos o valor 1’ OR 1=’1 isso faria com que nossa sql ficasse da seguinte forma: SELECT * FROM usuários WHERE login =’1’ OR 1=’1’ AND senha =’1’ OR 1=’1’ Como a opção OR 1=’1’ será sempre verdadeira, o resultado será todo o conteúdo da tabela usuários do bando de dados. Dessa forma o usuário efetuaria login com o primeiro registro retornado. Também poderíamos entrar sabendo o login de alguém. Para isso ao invés de digitarmos 1’ OR 1=’1 digitaríamos admin’# . com isso, após o caractede #, todo o restante da query seria ignorado por ser um comentário de SQL. Veja como ficaria: SELECT * FROM usuários WHERE login =’admin’# OR 1=’1’ AND senha =’1’ OR 1=’1’ Para resolver esses problemas precisamos filtrar corretamente as variáveis de entrada. Nesse caso o uso da função addslashes() do PHP resolveria o problema, pois as aspas não seriam tratadas como caracteres da query SQL.
100
Projeto E-JOVEM 29.25. Reagindo a Ameaças O que fazer? O mais correto é notificar os responsáveis pelos hosts envolvidos com o objetivo de que tomem conhecimento do ocorrido, procurem descobrir as causas e dêem solução ao problema. Como fazer? Precisamos saber quais são as partes envolvidas no ataque. Para isso, é fundamental ter logs que reportem os incidentes a fim de saber o endereço IP que originou o ataque. Então podemos acessar a base do whois que conhece o endereço IP que originou o ataque. Existem diversos servidores de whois espalhados pela internet, um dos mais famosos pode ser encontrado em HTTP://www.pil.net/whois.html. basta informar o endereço IP no formulário para sabermos país, e-mail, endereço e nomes dos responsáveis. Quando enviarmos um e-mail reportando o problema, precisamos ficar atento ao idioma. Caso não seja seu pais ou um pais que use a mesma língua que a sua. Prefira enviar em inglês. Será importante no e-mail enviar as seguintes informações: • • • •
Informações de contato Logs gerados pelo firewall e/ou Apache, se necessário. Mensagens geradas pelo script PHP. Demais informações relevantes.
29.26. Propriedade intelectual Atualmente falasse muito em direitos autorais e violação de propriedade intelectual. Assim como existem pessoas interessadas em musicas, filmes, seriados, vídeos e etc. também existem pessoas em busca de conseguir códigos de programas. E se você escrever bons códigos corre um grande risco de ser algo dessas pessoas. As técnicas vistas anteriormente, junto com capacidade de manter-se atualizado para eventuais problemas serão suficientes para uma boa segurança, desde que os códigos estejam armazenados em um servidor particular gerenciados por você. Mas se escrevermos códigos para rodar em servidores terceiros, precisamos de alguma forma de obscurecer o código fonte. Para isso existem softwares que fazem esse trabalho, a maioria propõe realizar mais do que isso, sendo capazes de controle de licença e muito mais. O mais conhecido é o Zend Guard, produzido pela Zend Technologies Ltd. Instituição que mantem o PHP. Esse produto é a forma usada pela Zend de gerar renda e, assim, manter o projeto PHP.
101
Projeto E-JOVEM
Com isso chegamos ao fim com o conteúdo de PHP, você deve acessar o conteúdo educandus na web para obter mais detalhes sobre o que tiver dúvidas. Agora trazemos Exercícios resolvidos e propostos.
30.
Exercícios Resolvidos
1. Qual a diferença entre include() e include_once() e entre require() e require_once()? include() e require() inclui um arquivo na págine e include_once() e require_once() se arquivo já tenha sido incluído, não é feita a operação de incluir a página outra vez. E são case-insensitive se rodados no Windows. 2. Criar uma página simples com PHP: echo "Hello world!"; ?> 3. Criar uma página HTML com script PHP incorporado: EXEMPLO Linha em HTML echo "Linha em PHP"; ?> 4. Criar uma página utilizando a função phpinfo: phpinfo(); ?> 5. Incluir comentários (para uma linha e para várias linhas) em uma página PHP: // comentando uma linha /* comentando várias linhas */ echo "teste"; ?>
102
Projeto E-JOVEM 6. Criar uma página utilizando constantes: SINTAXE: define (nome_da_constante,valor_da_constante); define("meu_nome","Fulano"); define("meu_ra",123456789); echo "O meu nome é " .meu_nome; echo " "; echo "O meu RA é " .meu_ra; ?> 7. Criar uma página utilizando variáveis: $base=5; $altura=3; $area=$base*$altura/2; echo "A base é: $base "; echo "A altura é: $altura "; echo "A área é: $area "; ?> 8. Criar dois scripts para observar a diferença entre aspas duplas e aspas simples: $texto1="exemplo"; $texto2="Esse $texto1 utiliza aspas duplas"; echo $texto2; ?> $texto1="exemplo"; $texto2='Esse $texto1 utiliza aspas simples'; echo $texto2; ?> 9. Criar uma página utilizando caracteres de escape: $texto="Estou colocando \"aspas duplas\" dentro de uma string."; echo $texto; ?> 10. Criar uma página utilizando arrays ("vertical"): $uninove[0]="Vila Maria"; $uninove[1]="Memorial"; $uninove[2]="Vergueiro"; echo $uninove[0]; echo " "; echo $uninove[1]; echo " "; echo $uninove[2]; ?>
103
Projeto E-JOVEM 11. Criar outra página utilizando arrays ("horizontal"): $uninove=array(0=>"Vila Maria",1=>"Memorial",2=>"Vergueiro"); echo $uninove[0]; echo " "; echo $uninove[1]; echo " "; echo $uninove[2]; ?> 12. Suponha que uma aplicação WEB, escrita em PHP, receba dados livres do usuário em um campo de formulário. Os dados recebidos são armazenados em uma variável "entrada", que é inserida diretamente, sem filtros, na consulta abaixo. $consulta = "SELECT * FROM localidades WHERE nome='$entrada'"; Em seguida, a aplicação executa essa consulta no banco de dados. Desconsiderando mecanismos de defesa no banco de dados ou configurações especiais no servidor PHP, essa aplicação é vulnerável a ataques do tipo: a) Slash Overflow b) SQL Injection c) PHP Leak d) PHP Bypass e) Smurf 13. Crie um script php para fazer a seqüência de fibonacci:
Projeto E-JOVEM
return $seq; }// end gera_seq_fibonacci. /* Testando a função */ echo "
"; print_r($fibonacci = gera_seq_fibonacci(1,20)); ?> 14. Faça script que imprima os dados do formulário abaixo
Oi . Você tem anos.
15. Faça script que recebe nome e idade do usuário e os imprime na tela. 16. Faça script que escreva frases em html e PHP.
Exercicio 16 A primeira linha e normal. echo " A segunda linha ja e escrita pelo PHP." ; ?> Nisto, vem uma terceira mais complexa... echo " E logo a seguir, a quarta ainda mais complicada!" ; ?>
105
Projeto E-JOVEM
17. Escreva scrpt php para enviar arquivos para um servidor via ftp: 18. Faça script para manusear variaveis alterando cor e também atribuindo valores, ao final imprima os resultados:
Exercicio 2 Exemplo de utilizacao de variaveis:
$inteiro=10; $real=20.0; $caracter= 'V'; $cor1= "#FF0000"; $cor2= "#0000FF"; ?> > A variavel $inteiro tem o valor echo $inteiro ?>. > A variavel $real tem o valor echo $real ?>. 106
Projeto E-JOVEM > O caracter escolhido e o echo $caracter ?>.
19. Faça um scrpt no qual você concatene duas variáveis e as imprima na tela. 20. Faça script que imprima na tela "Tenha um bom fim-de-semana!" Se o dia atual é sexta-feira, caso contrário ele irá imprimir "Tenha um bom dia!":
Projeto E-JOVEM 22. Faça um script que envie arquivos via upload. print $_FILE[‘foto’][‘name’]; // imprime o nome original do arquivo no computador do usuário. print $_FILE[‘foto’][‘ type’]; // O tipo mime do arquivo, se o browser deu esta informação. Um exemplo pode ser "image/gif". print $_FILE[‘foto’][‘ size’]; // O tamanho, em bytes, do arquivo. print $_FILE[‘foto’][‘ tmp_name’]; // O nome temporário do arquivo, como foi guardado no servidor. print $_FILE[‘foto’][‘ error’]; // O código de erro associado a este upload de arquivo. ['error'] foi adicionado no PHP 4.2.0 ?> 23. O que são variáveis pré-definidas? São variaveis contendo uma referencia padrão do PHP, por exeplo: $GLOBALS, $_GET, $_POST, $_COOKIE E OUTRAS. 24. Por meio de qual keyword você pode usar uma variável definida no script dentro de uma função? Pela keyword dollar ($). 25. Se eu tenho uma página com frames (quadros) onde em uma página é definida uma variável de sessão, eu conseguirei resgatar a variável de sessão em uma outra página paralela que está em outro servidor? Por quê? NÃO. PORQUE Isso somente durará até o fechamento do browser. 26. Quais as principais vantagens das sessions sobre os cookies em relação à segurança? SESSIONS, como visto no modulo, só dura enquanto não fechar o browser ao passo que o cookie fica na maquina por um periodo definido pelo programador ou definido pelo padrão.
108
Projeto E-JOVEM
27. Quais as diferenças entre sessões e cookies? Sessões, podemos buscar em banco de dados de forma segura, ao paso que os cookies podem ser excluidos pelo usuario da máquina, perdendo desta forma os dados gravados anteriormente. 28. O que o script abaixo irá mostrar: PHP $frase = "O PHP é uma linguagem"; function mostraValor() { global $frase; $frase .= " de programação"; echo $frase; } mostraValor(); O PHP é uma linguagem de programação 29. Crie um cookie que dure 6 meses para expirar setcookie("cookie", "teste", time() + 3600*24*182); ?> 30. Faça script para gerar login e senhas aleatórios: Autenticação com arquivo texto print_r($_GET); print ' '; if (intval($_GET[tam]) <= 0) $_GET[tam] = 8; # podemos modificar o vetor $_GET print_r($_GET); print ' '; if (intval($_GET[qtde]) > 0) ListaUsuariosSenhas($_GET[qtde]); else
109
Projeto E-JOVEM ListaUsuariosSenhas(); # gera uma string aleatória com $tam caracteres function GeraString () { global $_GET; $_GET[tamanhonovo] = 15; $str = ''; for ($i = 1; $i <= $_GET[tam]; $i++) { if ($i % 2 == 0) $str .= GeraVogal(); else $str .= GeraConsoante(); } return ($str); } # gera uma vogal aleatória function GeraVogal () { $ascii_vogal = array(97, 101, 105, 111, 117); $vogal = chr($ascii_vogal[rand(0,4)]); return ($vogal); } # gera uma consoante aleatória function GeraConsoante () { $ascii_consoante = PHP e MySQL - Verão IME-USP - 2006 Prof. Thiago Rodrigo Carneiro exercicios-2006-6.php 1/2 80 81 array(98,99,100,102,103,104,106,107,108,109,110,112,113,114,115,1 16,118,119,120,121,122); $consoante = chr($ascii_consoante[rand(0,20)]); return ($consoante); } # listagem de usuários e senhas function ListaUsuariosSenhas ($qtde = 10) { for ($j = 1; $j <= $qtde; $j++) { $usuario = GeraString(); $senha = GeraString(); $senhas[$usuario] = $senha; print $usuario.' - '.$senha.' '; } if (sizeof($senhas) == $qtde) return TRUE; return FALSE; } # o vetor $_GET pode ser modificado dentro de uma função quando declarado como global print_r($_GET); print ' '; ?>
110
Projeto E-JOVEM 31. Script para alterar um arquivo Remoto Abertura de arquivo remoto if (!isset($_REQUEST[acao])) { print ''."\n"; } elseif ($_POST[acao] == 'abrir') { if (!file_exists ($_REQUEST[nomearquivo])) $erro = '
Projeto E-JOVEM 32 Faça script para imprimir e manipular datas: print "Hoje é ".date("d.m.Y")." às ".date("H:i:s")." "; # imprime instruções print "
O formulário de inscrição só estará disponível até às 20.18hs de 03/02/2005. Faça a sua inscrição rapidamente!
"; # guarda timestamp atual $atual = time(); # guarda timestamp da data limite $limite = mktime(20,18,0,2,3,2005); # imprime formulário até a data limite if ($atual <= $limite) print "
Oba, eu posso acessar o formulário!
"; else print "
O prazo para as inscrições já se encerrou!
"; # saudação conforme a hora do dia $hora = intval(date("H")); if ($hora >= 0 && $hora < 6) $saudacao = "Vai dormir!"; elseif ($hora >= 6 && $hora < 12) $saudacao = "Acordou bem?"; elseif ($hora >= 12 && $hora < 18) $saudacao = "Daqui a pouco é hora de ir para casa ..."; else $saudacao = "Boa noiteeeee!"; print $saudacao; ?>
33. Faça um script para gerar números para loteria: if (!isset($_GET[urna]) || intval($_GET[urna]) <= 0) $_GET[urna] = 100; // total de números na urna if (!isset($_GET[sorteio]) || intval($_GET[sorteio]) <= 0) $_GET[sorteio] = 10; // total de números a serem sorteados # sorteio dos números for ($n = 1; $n <= $_GET[sorteio]; $n++) { do { $bola = rand (1, $_GET[urna]); } while ($sorteado[$bola] == TRUE); $sorteado[$bola] = TRUE; } # após o sorteio, suponha que sorteamos 3, 8, 17, 18 e 25. Deste modo, $sorteado será assim: # $sorteado[3] = TRUE, $sorteado[8] = TRUE, ... até $sorteado[25] = TRUE e não há outras posições preenchidas # imprime números sorteados print 'Os números sorteados foram: '; ksort($sorteado); // ordena vetor foreach ($sorteado as $num => $status) print $num.' '; ?>
112
Projeto E-JOVEM 34. Faça um script para simular o sorteio de bingo if (!isset($_REQUEST[c]) || intval($_REQUEST[c]) < 2 || intval($_REQUEST[c] > 8)) $_REQUEST[c] = 5; # número de dezenas d if (!isset($_REQUEST[d]) || intval($_REQUEST[d]) < 10 || intval($_REQUEST[c] > 100) || $_REQUEST[d] <= $_REQUEST[c]*$_REQUEST[c]) $_REQUEST[d] = 100; # gerando a cartela function GeraCartela() { global $_REQUEST, $cartela; for ($a = 1; $a <= $_REQUEST[c]; $a++) { for ($b = 1; $b <= $_REQUEST[c]; $b++) { $sorteado = Sorteio($tanacartela); $tanacartela[$sorteado] = 1; $cartela[$a][$b] = $sorteado; } } } # imprimindo a cartela function ImprimeCartela($cartela) { global $_REQUEST; print '
35. Faça script que gere numeros randômicos e faça as quatro operações, onde o resultado deve ser impresso na tela. $a = rand (0,10); $b = rand (1,10); $soma = $a + $b; $diferenca = $a - $b; $produto = $a * $b; $quociente = $a / $b; $resto = $a % $b; # arredonda o quociente para duas casas decimais $quociente = round ($quociente, 2); print "
Os números sorteados foram ".$a." e ".$b.".
"; print "
A soma é ".$soma.".
"; print "
A diferença é ".$diferenca.".
"; print "
O produto é ".$produto.".
"; print "
O quociente da divisão é ".$quociente.".
"; print "
O resto é ".$resto.".
"; ?>
31.
Exercícios Propostos
1. Faça um formulário em PHP para cadastro de colaboradores (funcionários). Um colaborador pode ter de 0 a 5 dependentes. Para cada um dos dependentes você deverá armazenar as informações: Nome, sexo (“F”, “M”) e ano de nascimento. •Dica:
115
Projeto E-JOVEM –Desenhe um formulário só para funcionário, no qual você colherá o número de dependentes; –No formulário seguinte desenhe um campo nome, sexo, e ano de nascimento para cada um dos dependentes; –Associe os nomes dos campos a um vetor. 2. Foi visto em aula que formulários HTML podem enviar dados a um servidor Web por dois métodos: GET e POST. Pergunta: Em um mesmo formulário HTML, pode-se configurá-lo para enviar dados utilizando ambos os métodos? (Pesquise!) 3. Escreva um algoritmo que leia dois números e imprima o produto desses números. 4. Faça um algoritmo para ler dois números e mostrar o maior deles. 5. Faça um algoritmo que leia o nome e idade de N pessoas e mostre: •
A soma das idades;
•
A média das idades;
•
Quem é a pessoa mais velha e qual a sua idade;
•
Quem é a pessoa mais nova e qual a sua idade.
6. Escreva um algoritmo que leia dois números que deverão ser colocados, respectivamente, nas variáveis $va e $vb. O algoritmo deve, então, trocar os valores de $va por $vb e viceversa. Imprima posteriormente o conteúdo destas variáveis. 7. Faça um algoritmo que leia valores para as variáveis $a, $b e $c e mostre o resultado da seguinte expressão: ( $a - $b ) * $c
8. Faça um algoritmo que mostre o resultado da expressão abaixo: ( ( $x - 5 ) * y ) – z
9. Faça um algoritmo que tenha três variáveis $a, $b e $c. Desenvolva um programa que leia: •
Valores para as três variáveis;
116
Projeto E-JOVEM •
Peça do usuário uma expressão que ele deseje que seja impressa (Dica: Pesquise se existe em PHP uma função para tal para tal propósito).
•
Eventualmente o usuário de sua página pode desejar testar outras expressões. Guarde o valor das variáveis nas postagens seguintes.
10. Faça um algoritmo que leia duas notas, seus respectivos pesos e mostre o valor de sua média ponderadas.
( nota1 * peso da nota1 ) + ( nota 2 * peso da nota 2 ) Média Ponderada = soma dos pesos
11. Faça o mesmo algoritmo acima para N notas com seus respectivos N pesos. 12. Maria quer saber quantos litros de gasolina precisa colocar em seu carro e quanto vai gastar para fazer uma viagem até a casa de sua irmã. Dados que precisam ser solicitados a Maria: •
Distância de sua casa até a casa de sua irmã;
•
Qual o consumo de seu carro em Kilômetros por litro [km/l];
•
Qual o preço da gasolina no posto onde ela abastece.
13. Faça um algoritmo que leia um valor inteiro em segundos e forneça como resultado esse valor no formato hh:mm:ss 14. Faça um algoritmo que leia três comprimentos de aresta de um susposto triãngulo. Seu algoritmo deve informar: •
Se as arestas dadas podem ou não formar um triângulo;
•
Caso afirmativo, que tipo de triângulo: equilátero, isóceles ou escaleno;
•
Ainda no caso afirmativo, qual o valor dos ângulos entre as arestas.
Lembre-se que: •
O comprimento de cada lado de um triângulo é menor que a soma dos comprimentos dos outros dois lados;
117
Projeto E-JOVEM •
Um triângulo é eqüilátero quando o comprimento de seus três lados são iguais;
•
Um triângulo é isósceles quando o comprimento de dois de seus lados são iguais;
•
Um triângulo é escaleno quando o comprimento de seus três lados diferem entre si.
15. Escreva um programa de ajuda para vendedores. A partir de um valor total recebido, deve-se calcular: •
O total a pagar com desconto de 10%;
•
O valor de cada parcela, no parcelamento de 3X sem juros;
•
A comissão do vendedor, no caso da venda ser a vista (5% sobre o valor do desconto);
•
A comissão do vendedor, no caso da venda ser parcelada (5% sobre o valor total).
16. Escreva um programa que leia um número de 0 a 99 e mostre o seu correspondente por extenso. 17. Escreva um programa que leia uma data de nascimento (dia, mês e ano) e indique qual o signo da pessoa em questão. Dados: Signo
Período
Áries
21/março a 20/abril
Touro
21/abril a 20/maio
Gêmeos
21/maio a 20/junho
Câncer
21/junho a 22/julho
Leão
23/julho a 22/agosto
Virgem
23/agosto a 22/setembro
Libra
23/setembro a 22/outubro
Escorpião
23/outubro a 21/novembro
Sagitário
22/novembro a 21/dezembro
Capricórnio
22/dezembro a 20/janeiro
118
Projeto E-JOVEM Aquário
21/janeiro a 19/fevereiro
Peixes
20/fevereiro a 20/março
18. Escreva um programa para ler uma temperatura em Fahrenheit e apresentá-la convertida em graus Celsius (Centígrados). No mesmo programa permita que o usuário faça a conversão inversa. ( Fahrenheit - 32 ) * 5 Celsius = 9 19. Escreva um programa que leia uma data de aniversário e informe se ela é válida ou não. 20. Faça um programa que leia o nome e o time de futebol de várias pessoas e informe quantas pessoas são de cada time. 21. Uma pesquisa sobre características físicas de uma região coletou os dados abaixo, referente a cada habitante: •
Ano de nascimento (de 1900 até o ano atual);
•
Sexo (masculino / feminino);
•
Cor dos olhos (pretos, castanhos, azuis, verdes, outros);
•
Cor dos cabelos (preto, castanho, louro, ruivo);
•
Renda mensal.
22. Faça um programa que leia todos os dados desta pesquisa, por habitante. Seu programa deverá ter um link para um relatório onde poderemos visualizar: •
A quantidade de habitantes da região que foram cadastrados;
•
A maior e a menor idade dos habitantes;
•
A idade média e a idade mediana dos habitantes;
•
A porcentagem de indivíduos do sexo feminino com olhos pretos ou castanhos e que tenham renda mensal maior que R$ 1.000,00;
•
A quantidade de indivíduos do sexo masculino com cabelos ruivos e renda menor que R$ 1.000,00.
119
Projeto E-JOVEM 23. Faça um programa para leitura de dados da turma. Os dados a serem coletados são: •
Ano de nascimento;
•
Ano a partir do qual começou a trabahar com computação;
•
Altura;
•
Sexo;
•
Idiomas que fala;
•
Atividades de lazer/hobby.
24. Analise de código Exercício "vermelho", "banana" => "amarelo"); /* um exemplo de como isto vai ficar */ echo "O Morango é $str["morango"] " $first = $str["banana"]; $first =(strlen($first)-1) = "a"; echo "A banana é $first. "; //Uma saída print_r($str); echo " "; var_dump($str); ?> • •
Tente descobrir onde está o erro neste script. Os comentários existentes estão bem integrados (têm a sintaxe correcta)?
25. Perguntas de Verdadeiro e Falso •
PHP pode escrever scripts que rodem do lado do cliente? [V] | [F]
•
Para correr PHP preciso de um servidor FTP? [V] | [F]
•
uso de short-tags, tais como e ?> é mais benéfico do que as outras tags porque assim perco menos tempo a escrever o código. [V] | [F]
•
O PHP é mantido por uma comunidade de programadores pela internet e está acessível a toda a gente. [V] | [F]
26. Escreva um código que exiba a mensagem "Olá Mundo!" no browser.
120
Projeto E-JOVEM •
Que instrução preciso de usar para exibir essa mensagem?
27. O php sempre reconhece os campos "name" do HTML como variáveis? 28. O que faz este script? 29. Escreva um script php que escreva as frases da forma abaixo, utilizando-se de uma array para armazenar os meses do ano e as estruturas de laço para informar os valores dos mesmos: Ciclo while • • • • • • • • • • • •
Mês: Dezembro Mês: Janeiro Mês: Fevereiro Mês: Março Mês: Abril Mês: Maio Mês: Junho Mês: Julho Mês: Agosto Mês: Setembro Mês: Outubro Mês: Novembro
Ciclo for • • • • • • • • • • • •
Mês: Dezembro Mês: Janeiro Mês: Fevereiro Mês: Março Mês: Abril Mês: Maio Mês: Junho Mês: Julho Mês: Agosto Mês: Setembro Mês: Outubro Mês: Novembro
Mês: Dezembro Mês: Janeiro Mês: Fevereiro Mês: Março Mês: Abril Mês: Maio Mês: Junho Mês: Julho Mês: Agosto Mês: Setembro Mês: Outubro Mês: Novembro
30. A saída de um script php, deve ser da forma apresentada abaixo, utilizando-se de funções para calculo de cada situação: A soma de 3 com 2 é 5 ! A diferença entre 3 e 2 é de 1 ! O produto entre 3 e 2 é de 6 ! A divisão de 3 por 2 é 1.5 ! O resultado de 3+(2*3) é de 9 ! O resultado de 2/(3-2) é 2 ! O resultado de 3*((2/3)-2)+2 é de -2 ! 31. Escreva um script que através dos valores de uma variável do tipo array, monte um campo do tipo select, contendo todos os elementos do array. 32. O que é PHP? 33. Dê outros exemplos da utilidade do PHP. 34. Como funciona o PHP? 35. Esse exemplo abaixo irá funcionar? Titulo echo "Ola mundo"; ?>
122
Projeto E-JOVEM
36. Ache os erros abaixo:
a ) echo "ola mundo; ?> b ) $1 = 123; ?> c ) $nome "Jose";?> d ) $nome == "José";?>
37. É possível copiar o código fonte PHP de uma pagina da web? 38. Mini Projeto: 1-Crie um banco de dados chamado bdCliente
2- Crie a tabela tbContatoCliente que possua os campos • Código (inteiro); • Nome (Varchar(30)); • Telefone (VarChar(10)); • Endereço (VarChar(60)); 3- Faça uma consulta no seu banco de dados bdCliente que mostre: • Todos os clientes • Nome de todos os clientes • Nome e código de todos os clientes • Todos os clientes que moram na Rua K • Todos os clientes cujo telefone começa com 9 4- Faça uma página em HTML chamada cadastra.html com os campos: • Código • Nome • Endereço 123
Projeto E-JOVEM • Telefone
5- Escreva um código em PHP chamado recebe.php que receba os dados da página cadastra.html e mostre-os na tela.
6- Faça com que os dados recebidos sejam enviados para a tabela tbContatoCliente que está no banco de dados bdCliente.
7- Insira na página cadastra.html um botão que chame uma página consulta.php que mostra todos os dados cadastrados na tabela tbContatoCliente.
8- Insira na página cadastra.html um botão que chame uma página consulta_por_nome.php que tenha um campo texto chamado nome que deverá ser preenchido pelo usuário. Este campo depois de preenchido e pressionado o botão consultar (que deverá ser inserido nessa página) deverá consultar se o nome digitado está na tabela. Se estiver enviar para uma janela todo o registro.
9- Faça uma consulta pelo nome e os dados (nome e telefone) deverão se mostrados dentro de uma caixa de texto.
10- Escreva um programa que faça o cadastramento de código e nome de um produto qualquer.
11- Ao ser preenchido o formulário de cadastramento o programa deverá ser redirecionado para uma página que mostrará o produto cadastrado na página. Essa página deverá ter dois botões (ou links). Um link deverá gravar os dados mostrados e o outro deverá direcionar a página para um formulário já
124
Projeto E-JOVEM preenchido com os dados para fazer uma alteração.
12- Faça as operações de exclusão e consulta também para este exercício.
39. Faça um programa em PHP que carregue um vetor de seis elementos numéricos inteiros sorteados aleatoriamente, calcule e mostre: • A quantidade de números pares; • Quais os números pares; • A quantidade de números ímpares; • Quais os números ímpares; 40. Qual a diferença entre scripts client-side e server-side? 41. O que acontece se digito echo "$var" ? e echo "\$var"? 42. O que acontece se digito echo "8/2" ? e echo "\8/2" e echo 8/2; ? 43. Para mostrar o resultado da soma de dois números, qual a instrução que devo usar? o
( ) echo 1+2;
o ( ) echo "1+2"; 44. Verdadeiro ou falso? •
• • • •
( ) é correto digitar: $var= "3"; $var1=1; $soma = $var + $var1; ?> ( ) não se faz declaração de variáveis e tipos em php. os tipos são identificados pelo php a cada instrução. isso se chama "tipagem dinâmica" ( ) no printf e no echo é obrigatório o uso de parênteses ( ) o índice de um vetor é sempre inteiro positivo ( ) um vetor deve ter em todas as suas posições sempre valores de um mesmo tipo
45. Para que serve a função gettype()? 46. Para que serve a função unset()? 47. Para que serve a função isset()? 125
Projeto E-JOVEM 48. Qual a diferença entre isset() e empty()? 49. Crie um script usando laço FOR e WHILE que escreva um mesmo texto em cada linha com tamanhos de fonte diferentes. Para isso tome como base a seguinte tag HTML Texto , onde x varia de 1 a 7 50. Considere duas variáveis, $linha e $coluna, no início de um script, inicializadas pelo programador com quaisquer valores. Crie um script que crie uma tabela HTML de $linha linhas e $coluna colunas e dentro de cada célula informe as coordenadas da mesma. 51. O que são “headers” e como estes são tratados em PHP? Escreva um pequeno programa que exemplifique a utilização de headers. 52. O que são “locks” e para que servem? Apresente um exemplo de acesso a tabelas que necessite da utilização de locks. 53. O que são sessões? Cite e descreva algumas situações onde se é recomendado o uso de sessões e situações onde se deve evitar o uso das mesmas. 54. Descreva o funcionamento dos seguintes esquemas de autenticação: ● Via HTTP (descreva também os mecanismos que PHP oferece para fazer autenticação via HTTP); ● Via banco de dados. 55. Por que a utilização de páginas de redireção (recibo) é necessária? Dê um exemplo (não é necessário código PHP, apenas um caso de uso informal). 56. Faça uma página HTML que contenha um formulário com os campos nome, endereço, email, senha e confirmação de senha. Esse formulário deverá ser enviado para um script PHPque irá verificar a existência e a integridade dos dados, mostrá- los e possibilitar ao usuário voltar à página anterior caso haja algum erro ou confirmar os dados. 57. Escreva um esquema para armazenar os dados do formulário da questão anterior num banco de dados MySQL. Estenda o código que recebe e verifica os dados do formulário para armazená - los no banco de dados. Você deve verificar se o campo email existe no banco de dados; se já existir, reapresente o formulário indicando o erro, por exemplo, "Este email já está cadastrado".
126
Projeto E-JOVEM 58. Faça uma página com o conteúdo de acesso restrito. O acesso ao conteúdo desta página somente será permitido caso o usuário efetue login no sistema (faça também uma página de login) (utilize variáveis de sessão). 59. Escreva um programa em PHP que apresente três conteúdos distintos dependendo do privilégio do usuário. Para usuários não “logados”, apresenta um formulário que deve ser preenchido com nome (“login”) e senha. Neste caso, a página deve também ser responsável pelo recebimento dos dados do formulário e pela verificação de credenciais num banco de dados. Usuários credenciados podem pertencer a duas categorias, a dos usuários com acesso do tipo 'R' (acesso restrito) e a dos usuários do tipo 'T', que podem realizar todas as operações. Aos usuários do tipo 'R', após a verificação de credenciais, deve ser apresentado um menu com links para as páginas 'a.php' e 'b.php', enquanto que aos usuários do tipo 'T' devem ser apresentados também links para as páginas 'c.php' e 'd.php'. 60. Você foi encarregado de escrever uma página web de tal forma que cada novoacesso é contabilizado por um contador que é exibido. Deve ser considerado um novo acesso um acesso feito de um navegador que não acessa a página há mais de 2 horas. 61. Escreva em PHP o código relevante para esta funcionalidade usando cookies mas não empregando quaisquer funções mysql. 62. Modifique o programa anterior de tal forma que cookies não sejam necessários, mas agora utilizando um banco de dados mysql. 63. Crie um formulário de inserção de scraps (semelhante ao usado no Orkut) (destinatário, remetente, conteúdo) e, após o envio de um scrap, exibir todos os scraps ordenados pela data de envio (do mais recente ao mais antigo) com possibilidade de alteração e exclusão para cada scrap.