You are on page 1of 66

LinguagemPHP

Instituto Federal de S ao Paulo Campus Guarulhos


Prof. Thiago Schumacher Barcelos
Vers ao 3.0
Compilada em 7 de fevereiro de 2013

Indice
1 Introduc ao 5
2 Hist orico e fundamentos de aplicac oes Web comPHP 6
2.1 Hist orico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Servidores Web e aplicac oes Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Arquitetura tpica de uma aplicac ao Web utilizando PHP . . . . . . . . . . . . . . . . . . . . 7
3 Fundamentos da linguagemPHP 9
3.1 Seu primeiro programa em PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Vari aveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.1 Modalidades de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.3 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.1 Operadores aritm eticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.2 Operadores relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3.3 Operadores l ogicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3.4 Operadores para strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4 Estruturas de controle de uxo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.1 If . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.2 While e Do While . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4.3 For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4.4 Switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.5 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4 Processando requisic oes 21
4.1 Formul arios em HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.1 Caixa de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.2 Check box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.1.3 Radio button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 3
4.1.4 Caixa combo e lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.1.5 Bot ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1.6 Juntando tudo: a tag <form> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 Uma introduc ao ` as requisic oes HTTP: GET e POST . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3 Obtendo os par ametros no c odigo PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.4 Validando par ametros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.4.1 Exist encia de par ametros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.4.2 Tipo de dado e formato dos par ametros . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.4.3 Par ametros com c odigo mal-intencionado . . . . . . . . . . . . . . . . . . . . . . . . 29
4.5 Mais exemplos com requisic oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5 Modularizando programas 37
5.1 O conceito de modularizac ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2 Escrevendo func oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2.1 Uma observac ao sobre escopo de visibilidade de vari aveis . . . . . . . . . . . . . . . 38
5.3 Criando bibliotecas de func oes: a func ao include() . . . . . . . . . . . . . . . . . . . . . . 39
5.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6 Gerenciando estado emrequisic oes 42
6.1 Preservando dados e o protocolo HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.2 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.3 Sess oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.3.1 Criando e utilizando sess oes em PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.4 Utilizando sess oes (1): p agina de login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.5 Utilizando sess oes (2): carrinho de compras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
7 Acessando bancos de dados 51
7.1 Por que utilizar um banco de dados? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.2 O acesso a bancos de dados na linguagem PHP . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7.3 Func oes do plugin mysqli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7.3.1 Tratando comandos SQL de alterac ao de dados . . . . . . . . . . . . . . . . . . . . . . 54
7.3.2 Tratando consultas SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.4 Construindo aplicac oes maiores com o conceito de controlador . . . . . . . . . . . . . . . . 57
7.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
A Validando formul arios comjQuery 61
A.1 Introduc ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
A.2 O exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Agradecimentos
Ao Prof. Felipe Mancini, pelas in umeras contribuic oes em exemplos e exerccios para esta apostila, e
pela parceria na organizac ao e oferecimento da disciplina;
A todos os alunos que j a passaram pela disciplina Linguagem para Desenvolvimento Web 2 no Curso
T ecnico em Manutenc ao e Suporte em Inform atica do IFSP Campus Guarulhos, pela participac ao e
d uvidas que levam ao contnuo aperfeicoamento desta apostila;
Ao Programa de Incentivo ` a Produc ao Acad emica do IFSP, atrav es do qual obtive o incentivo em
horas-aula para a confeccc ao desta apostila e diversas atividades de ensino e pesquisa.
4
CAPITULO 1
Introduc ao
Esta apostila surgiu com o objetivo principal de dar suporte ` a disciplina Linguagem para Desenvolvi-
mento Web 2 do Curso T ecnico em Inform atica do Instituto Federal de Educac ao, Ci encia e Tecnologia
de S ao Paulo - IFSP - Campus Guarulhos, que apresenta uma introduc ao ` a Linguagem PHP.
O texto foi escrito assumindo que o leitor n ao tem conhecimento de nenhuma linguagem de progra-
mac ao emparticular, por emtemalguma experi encia eml ogica de programac ao e construc ao de p aginas
Web utilizando a linguagem HTML.
Os captulos s ao organizados de acordo como planejamento das aulas e s ao acompanhados de v arios
exerccios de xac ao. Apesar do objetivo nal ser capacitar o aluno a desenvolver pequenas aplicac oes
comerciais, os exerccios muitas vezes envolvem aplicac oes divertidas (como, por exemplo, pequenos
jogos) tentando mostrar que programar pode tamb em ser uma atividade prazerosa e que pode gerar
resultados interessantes rapidamente. Acompanhando a leitura e resolvendo os exerccios, o leitor es-
tar a capacitado a construir, utilizando PHP, sites din amicos que executam processamento de dados no
modelo requisic ao / resposta, acessam bancos de dados e fazem controle de sess ao e autenticac ao.
Bons estudos!
O autor
Todos os direitos reservados aos autores. N ao e permi-
tida a modicac ao ou utilizac ao de partes desta apostila
sempr evio consentimento dos autores.
Para apontamento de eventuais erros, crticas e sugest oes,
entre em contato pelo email tsbarcelos@ifsp.edu.br.
5
CAPITULO 2
Hist orico e fundamentos de aplicac oes Web
comPHP
Ap os ler este captulo, voc e dever a ser capaz de:
Conhecer o hist orico e origens da linguagem PHP;
Compreender o conceito de servidor Web e de uma aplicac ao baseada na Web;
Conhecer a arquitetura de funcionamento de uma aplicac ao baseada em PHP.
2.1- Hist orico
Pode-se dizer que o PHP e uma linguagemque surgiupara ser o mais simples possvel e, como tempo,
foi adquirindo mais funcionalidades at e chegar ao seu estado atual. A linguagem surgiu em 1994, cri-
ada pelo programador dinamarqu es Rasmus Lerdorf como uma s erie de rotinas, escritas em linguagem
C, para dar suporte a automatizac ao de pequenas funcionalidades da sua home page, como exibir seu
pr oprio currculo e controlar o n umero de visitas ` a pagina. A sigla, naquele momento, signicava Perso-
nal Home Page Tools.
Em 8 de junho de 1995, Lerdorf disponibilizou publicamente o c odigo fonte da linguagem, que na-
quele momento ele j a havia denominado como PHP Vers ao 2. Sua sintaxe foi inspirada na sintaxe da
pr opria linguagem C e da linguagem Perl.
Em 1997, Zeev Suraski e Andi Gutmans, dois programadores israelenses, reescreveram o interpreta-
dor da linguagemproduzindo o PHP Vers ao 3. A partir da a sigla passa a ter o signicado PHP: Hypertext
Processor (Processador de Hipertexto).
Atualmente, o PHP est a na vers ao 5.4 e tem sido expandido principalmente para dar suporte ` a
programac ao orientada a objetos.
2.2- Servidores Web e aplicac oes Web
Antes de comecar a programar em PHP, temos que compreender o seu principal prop osito (pelo me-
nos, neste curso): desenvolver aplicac oes din amicas na Web. Uma aplicac ao Web e diferente daquelas
que s ao executadas diretamente no seu computador por uma caracterstica: ela, na verdade, est a sendo
executada em uma outra m aquina, denominada servidor, que est a conectada via rede ` a m aquina onde
ela ser a acessada via um navegador, denominada cliente.
A m aquina cliente, em geral, precisa ter instalado apenas um navegador (browser), que ir a solicitar
informac oes ao programa que est a sendo executado no servidor. Este programa no servidor, por sua
vez, ir a processar essa solicitac ao e devolver como resposta uma p agina HTML contendo a resposta ` a
solicitac ao feita. Essa p agina HTML pode conter inclusive campos de formul ario e ac oes que podem
disparar uma nova solicitac ao pelo usu ario. Esse e o chamado ciclo de requisic ao e resposta.
Entretanto, esse programa que e executado no servidor n ao precisa ser construdo a partir da estaca
zero pelo programador; ele e disponibilizado por diferentes empresas e organizac oes e e denominado
6
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 7
servidor Web. Ele j a e construdo para permitir o atendimento de requisic oes vindas de muitas m aquinas
diferentes ao mesmo tempo, com exibilidade de congurac ao e instalac ao de m ultiplas aplicac oes di-
ferentes no mesmo servidor.
Os dois servidores Web mais utilizados para o desenvolvimento de aplicac oes s ao o Apache HTTP Ser-
ver, da Apache Foundation
1
e o Internet InformationServices (IIS), da Microsoft. Oprimeiro e umproduto
de c odigo aberto (open-source) e, dessa forma, pode ser baixado da Internet e instalado livremente. O
segundo e atualmente embutido em v arias vers oes server da famlia Windows de sistemas operacionais.
2.3- Arquitetura tpica de uma aplicac ao Web utilizando PHP
Por ser considerada uma linguagem de scripting, o PHP opera em conjunto com um servidor Web,
atuando como um processamento adicional no ciclo de requisic ao e resposta. A arquitetura de sistemas
que se consagrou no mercado para desenvolvimento de aplicac oes PHP e identicada pela sigla LAMP
(Linux / Apache / MySQL / PHP). Vamos descrever o papel de cada um dos componentes da arquitetura.
Linux. O sistema operacional Linux e tipicamente utilizado pelo custo zero de aquisic ao e uma relativa
maior estabilidade;
Apache. O Apache HTTP Server, descrito na sec ao anterior, e o servidor Web mais utilizado e nasceu
para o sistema operacional Linux;
PHP. Nossa linguagemde estudo adapta-se facilmente ao servidor da Apache, devido a exist encia de um
plugin fornecido juntamente com a distribuic ao do PHP;
MySQL. O banco de dados MySQL foi um dos primeiros bancos de dados de c odigo aberto est avel
e escal avel o suciente para suportar aplicac oes Web. A MySQL AB, mantenedora do software,
aproveitou-se dessa caracterstica para divulgar fortemente seu banco de dados, inclusive sendo
uma das respons aveis pela popularizac ao da arquitetura LAMP.
O ambiente de desenvolvimento que voc e utilizar a em aula ser a baseado na arquitetura LAMP. Na
gura 2.1 vemos umesquema da arquitetura tpica de uma aplicac ao Web e do mecanismo de requisic ao
e resposta.
1
http://httpd.apache.org/
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 8
Figura 2.1: Esquema da arquitetura tpica de um sistema Web e do mecanismo de requisic ao e resposta
CAPITULO 3
Fundamentos da linguagemPHP
Ap os ler este captulo, voc e dever a ser capaz de:
Embutir c odigo PHP no c odigo de p aginas HTML;
Utilizar constantes e vari aveis;
Utilizar operadores aritm eticos e relacionais;
Utilizar estruturas de controle de uxo e express oes;
Utilizar vetores.
3.1- Seu primeiro programa emPHP
Para nos familiarizamos com nosso ambiente de desevolvimento, nossa primeira aplicac ao em PHP
ser a bastante simples e ter a como objetivo exibir uma mensagem do tipo Ol a, mundo! em uma p agina
HTML. Digite o c odigo abaixo em um arquivo e salve-o com o nome hello.php:
<html>
<body>
<?php
echo("Ola mundo!");
?>
<body>
</html>
C odigo 3.1: Primeiro programa em PHP
A princpio, boa parte desse c odigo deve ser familiar a voc e, j a que se trata de HTML puro.
Aprincipal diferenca est a nas tags <?php e ?>. Elas denemo incio e o nal de c odigo PHP embutido
no c odigo HTML. Quando o servidor Web encontra essas tags em algum ponto do c odigo HTML, todo o
conte udo interno ` as tags e repassado para o interpretador do PHP, que ir a executar o c odigo e, na maioria
dos casos, devolver uma sada em texto que e mesclada ao c odigo HTML.
A chamada echo("Ola mundo!"); e uma func ao do PHP que imprime uma string, passada como
par ametro, na sada que no caso, e nossa p agina HTML.
Como a func ao echo e muito utilizada a maior parte do tempo para gerar a sada de um pro-
grama PHP, ela admite uma sintaxe mais simples, sem o uso de par entesis no exemplo anterior,
echo "Ola mundo!"; geraria o mesmo resultado.
Utilizando o Apache no ambiente Windows, basta copiar o arquivo para a pasta htdocs da sua
instalac ao. No caso de utilizar o ambiente Linux, o arquivo deve serr copiado para o diret orio /var/www.
9
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 10
Normalmente, emumambiente de desenvolvimento, o servidor Apache e executado na sua m aquina lo-
cal; se esse for o seu caso, sua p agina estar a disponvel acessando a URL http://localhost/hello.
php. L a estar a o resultado da sua primeira aplicac ao!
1
3.2- Vari aveis
AlinguagemPHPtrabalha comoito tipos primitivos de dados, dos quais quatro s ao de nosso interesse
especial neste momento:
boolean Valores booleanos verdadeiro e falso. Na linguagem, s ao denidas as constantes True e False.
integer N umeros inteiros, positivos e negativos.
oat N umeros de ponto utuante, positivos e negativos. As regras usuais para denic ao de constantes
se aplicam(ponto para separac ao de casas decimais, sinal de menos para identicar negativos). Ex:
5; 3.1415; -76.32
string Cadeias de caracteres, de tamanho arbitr ario. H a duas formas de denir constantes: com aspas
simples (exemplo) ou com aspas duplas ("exemplo"). Discutiremos a seguir a diferenca entre
ambos.
As vari aveis em PHP n ao tem tipo de dados denido; por isso, elas n ao tem que ser declaradas antes
do primeiro uso e podem receber valores de diferentes tipos de dados.
Toda vari avel deve ter o nome iniciado por um cifr ao ($). A atribuic ao de valores e feita com o opera-
dor de atribuic ao (=). Veja alguns exemplos:
$final = True; // Tipo boolean
$num1 = 5; // Tipo intege
$num2 = -3.765; // Tipo double
// As duas modalidades de definir strings:
$texto1 = "Um texto, com aspas duplas";
$texto2 = Um texto, com aspas simples;
C odigo 3.2: Exemplos de atribuic ao de valores
Voc e deve ter notado as linhas nalizadas com barras duplas (//). Este e um indicador de co-
ment arios: todo o restante da linha e ignorado pelo interpretador da linguagem.
3.2.1 Modalidades de strings
Se uma constante do tipo string e denida entre aspas simples, todos os caracteres denidos entre
as aspas v ao compor a string literalmente. Por outro lado, se a string for denida entre aspas duplas, e
possvel utilizar uma caracterstica da linguagem chamada expans ao de strings alguns caracteres espe-
ciais s ao substitudos na denic ao da string. Neste momento vamos conhecer dois tipos de caracteres
especiais para expans ao:
Caracteres de escape. S ao sequ encias de dois caracteres iniciados pela barra invertida. S ao substitudas
por caracteres especiais, de acordo com a tabela abaixo:
1
Seu professor pode orient a-lo sobre eventuais diferencas na sua congurac ao local. O diret orio onde s ao armazenados os
arquivos PHP a serem disponibilizados pelo servidor Web pode ser alterado, e e congur avel atrav es do arquivo httpd.conf.
Verique a documentac ao do Apache para maiores detalhes.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 11
Caracter Substituic ao
\n Nova linha (caracter ASCII c odigo 10)
\r Retorno de carro (caracter ASCII c odigo 13)
\t Tabulac ao horizontal (caracter ASCII c odigo 9)
\\ Barra invertida \ (j a que a pr opria barra e um caracter de escape)
\$ Cifr ao (j a que o cifr ao e um caracter de escape)
\" Aspas duplas
Vari aveis. O nome de uma vari avel, iniciado por cifr ao ($), e substitudo pelo valor respectivo da
vari avel.
Vejamos alguns exemplos:
String Resultado
echo(Uma linha \n Outra linha); Uma linha \n Outra linha
echo("Uma linha \n Outra linha"); Uma linha
Outra linha
echo("Texto1\tTexto2"); Texto1 Texto2
"$refri = Coca-Cola;
echo("Tomei um copo de $refri"); Tomei um copo de Coca-Cola
3.3- Operadores
3.3.1 Operadores aritm eticos
A seguir, os operadores aritm eticos para operac oes com tipos num ericos:
Operac ao Smbolo Exemplo Descric ao
Negac ao - -$a Oposto de -$a
Adic ao + $a + $b Soma de $a e $b
Subtrac ao - $a - $b Subtrac ao de $a e $b
Multiplicac ao
*
$a
*
$b Multiplicac ao de $a por $b
Divis ao / $a / $b Divis ao de $a por $b
Resto da divis ao % $a % $b Resto da divis ao de $a por $b
3.3.2 Operadores relacionais
Os operadores relacionais permitem comparac oes entre vari aveis e constantes, devolvendo sempre
um valor booleano (True ou False):
Descric ao Exemplo Resultado
Igualdade $a == $b True se $a igual a $b
Desigualdade $a != $b True se $a diferente de $b
Desigualdade $a <> $b True se $a diferente de $b
Menor que $a < $b True se $a estritamente menor que $b
Maior que $a > $b True se $a estritamente maior que $b
Menor ou igual $a <= $b True se $a menor ou igual a $b
Maior ou igual $a >= $b True se $a maior ou igual a $b
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 12
3.3.3 Operadores l ogicos
Os operadores l ogicos recebem como operandos dois valores ou vari aveis booleanas e devolvem um
resultado booleano, de acordo com a tabela abaixo:
Descric ao Exemplo Resultado
E $a and $b$ True se $a e $b s ao verdadeiros
E $a && $b$ True se $a e $b s ao verdadeiros
Ou $a or $b$ True se pelo menos um dentre $a e $b s ao verdadeiros
Ou $a || $b$ True se pelo menos um dentre $a e $b s ao verdadeiros
Ou Exclusivo $a xor $b$ True se $a ou $b s ao verdadeiros, mas n ao ambos
N ao ! $a True se $a e falso
Note que os operadores de desigualdade, E e OU tem duas formas alternativas cada um; isso vem da
origem hbrida do PHP, sendo uma das formas inspirada na sintaxe da linguagem C.
3.3.4 Operadores para strings
A operac ao usual de concatenac ao de duas strings e feita utilizando-se o operador . (ponto). Exem-
plos:
$str1 = "Ola";
$str2 = $str1 . "mundo";
echo($str2); // Resulta em "Olamundo"
$str3 = Um . Dois;
echo($str2); // Resulta em "Um Dois"
3.4- Estruturas de controle de uxo
Para compreender as estruturas de controle de uxo em PHP, temos que lidar com um conceito co-
mum a todas elas: o conceito de bloco de c odigo.
Emqualquer linguagemque siga o paradigma da programac ao estruturada, agrupamos nosso c odigo
em blocos que ser ao executados ou n ao dependendo do controle de uxo denido pelo programa. Em
PHP, os blocos s ao delimitados por chaves, de abertura de bloco ({) e de fechamento de bloco (}).
O m de cada linha de comando e indicado pelo ponto-e-vrgula.
3.4.1 If
A sintaxe b asica da estrutura de selec ao if e a seguinte:
if (<expressao booleana>) {
<bloco de codigo>
}
<expressao booleana> pode ser substitudo por qualquer express ao, utilizando operadores rela-
cionais ou n ao, que resulte em um dos valores booleanos True ou False. Exemplos:
Verique que ao embutir o c odigo acima em uma p agina HTML, teramos como sada as tr es linhas,
denidas pelos tr es comandos echo().
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 13
$x = 10;
$y = 20;
if ($x <= $y) {
echo("x e menor que y!\n");
}
$a = 3;
$b = 4;
$c = 5;
if (($c
*
$c) == ($a
*
$a + $b
*
$b)) {
echo("a, b e c sao lados de um triangulo retangulo.\n");
}
if ($a + $b + $c > $x and $c
*
$c > $y) {
echo("Opa, ambas as condicoes sao verdadeiras!");
}
C odigo 3.3: Exemplos do uso do if simples
if ($a > $b) {
echo(Caso verdadeiro, executamos esta!);
}
else {
echo(Caso falso, executamos esta!);
}
C odigo 3.4: Exemplo do uso do else
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 14
Oif pode ser acompanhado da estrutura opcional else, que e executada se a condic ao booleana do
if foi avaliada como falsa (exemplo do C odigo 3.4).
Se for necess ario avaliar uma segunda condic ao para executar o bloco denido pelo else, ele pode
ser encadeado com um novo if (exemplo do C odigo 3.5).
if ($salario < 500) {
echo(Ganha mal!);
} else if ($salario < 1500) {
echo(Remediado!);
} else if ($salario < 3000) {
echo(Melhorando!);
} else {
echo(Cuidado com a Receita Federal! :-P);
}
C odigo 3.5: Exemplo do uso do else..if encadeados
3.4.2 While e Do While
Veremos agora as estruturas de repetic ao com teste no incio (while) e com teste no nal
(do...while). Elas tem a seguinte sintaxe:
while (<expressao booleana>) {
<bloco de codigo>
}
do {
<bloco de codigo>
} while (<expressao booleana>);
Exemplos:
$i = 10;
echo("Vou imprimir os numeros de 1 a 10 em ordem inversa!\n");
while ($i >= 1) {
echo("Agora e a vez do $i\n");
$i = $i - 1;
}
$j = 1;
do {
echo("Entrei aqui uma vez.\n");
$j = $j - 1;
} while ($j > 1);
C odigo 3.6: Exemplos de uso do while e do...while
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 15
3.4.3 For
O for e a estrutura de repetic ao indexada por uma vari avel. Sua sintaxe, baseada naquela adotada
pela linguagem C, e um pouco diferente do que estamos acostumados em outras linguagens:
for (<inicializacao>; <condicao>; <atualizacao>) {
<bloco de codigo>
}
<inicializacao> e o comando que dene o valor inicial da vari avel indexadora do laco.
<condicao> e uma condic ao booleana que e avaliada a cada passagem pelo laco; enquanto ela for ver-
dadeira, o laco e executado mais uma vez. <atualizacao> e o comando que dene como a vari avel
ser a atualizada uma vez que ocorreu mais uma passagem pelo laco.
Um laco indexado por uma vari avel $i, variando de 1 at e 10 (inclusive), e descrito no c odigo 3.7.
for ($i = 1; $i <= 10; $i = $i + 1) {
echo("A variavel vale $i.\n");
}
C odigo 3.7: Laco for: exemplo de par ametros
Na primeira passagem pelo laco, $i vale 1. Ao t ermino da primeira passagem, o comando de
atualizac ao $i = $i + 1 e executado e dessa forma, $i passa a valer 2. Essa sequ encia prossegue at e
que a condic ao $i <= 10 resulte emFalse.
3.4.4 Switch
Oswitch e a estrutura que permite a comparac ao do valor de uma vari avel com diferentes constan-
tes. Ele atua como uma forma mais compacta de escrever essa s erie de comparac oes com a estrutura
if...else if.
Considere uma vari avel $i, inteira. As duas estruturas abaixo representam formas equivalentes de
implementar as mesmas comparac oes:
if ($i == 0) {
echo("i vale 0");
} else if ($i == 1) {
echo("i vale 1");
} else if ($i == 2) {
echo("i vale 2");
}
switch($i) {
case 0:
echo("i vale 0");
break;
case 1:
echo("i vale 1");
break;
case 2:
echo("i vale 2");
break;
}
C odigo 3.8: C odigos equivalentes usando if...else if e switch
Cada bloco case corresponde ao c odigo que ser a executado caso a vari avel esteja assumindo aquele
valor. Note que ao nal de cada bloco est a presente o comando break ele e obrigat orio para forcar a
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 16
interrupc ao da execuc ao do bloco de c odigo naquele momento, encerrando o switch. Esta e mais uma
particularidade do PHP herdada da linguagem C.
Em particular, se o bloco fosse escrito assim:
switch($i) {
case 0:
echo("i vale 0");
case 1:
echo("i vale 1");
case 2:
echo("i vale 2");
}
e $i tivesse o valor 0, os tr es blocos case seriam executados!
Oswitch tem tamb em o bloco especial default, que e executado caso nenhuma das comparac oes
anteriores tenha sido verdadeira. Ele e usualmente o ultimo bloco do c odigo.
switch($i) {
case 0:
echo("i vale 0");
break;
case 1:
echo("i vale 1");
break;
case 2:
echo("i vale 2");
break;
default:
echo("i nao vale 0, nem 1, nem 2");
}
C odigo 3.9: Exemplo do uso do bloco default
Note que como o bloco default foi o ultimo a ser denido, ele n ao precisa ser nalizado combreak.
Ao contr ario da linguagem C, o switch em PHP permite a comparac ao de tipos string, como no
exemplo a seguir:
switch ($fruta) {
case "abacaxi":
echo("A fruta e abacaxi!");
break;
case "banana":
echo("A fruta e banana!");
break;
case "maca":
echo("A fruta e maca!");
break;
}
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 17
3.5- Vetores
Considere o exemplo abaixo, de umvetor tradicional. Ele representa o mapeamento de n umeros com
n umeros ou seja, dado umndice do vetor, podemos obter o n umero armazenado naquela respectiva
posic ao.
1 2 3 4 5 6 7 8 9 10
40 28 -12 36 -8 62 2 0 39 8
Umvetor e criado atribuindo-se a uma vari avel o resultado da chamada da func ao especial array(),
que recebe como par ametros uma lista, separada por vrgula, de elementos do tipo chave => valor.
O vetor do exemplo acima seria inicializado da seguinte forma:
$v = array(1 => 40, 2 => 28, 3 => -12, 4 => 36, 5 => -8,
6 => 62, 7 => 2, 8 => 0, 9 => 39, 10 => 8);
O acesso aos elementos e feito referenciando o ndice do vetor entre colchetes, como nos exemplos
abaixo:
echo($v[3]); // Imprime -12
$i = 8;
echo($v[$i]); // Imprime 0 ($v[8])
echo($v[$i + 2]); // Imprime 8 ($v[10])
echo($v[1] / $v[7]); // Imprime 20 (40 / 2)
Esses s ao os vetores como aprendemos a trabalhar em v arias linguagens de programac ao. Por em,
vetores em PHP tem um comportamento mais gen erico: ele e utilizado como um mapa de valores, ou
seja, uma estrutura que permite uma associac ao livre entre valores de tipos de dados iguais ou n ao
2
.
Dessa forma, o ndice do vetor (tamb em chamado de chave), ao inv es de ser um inteiro, pode ser
uma string tamb em. Imagine que queremos armazenar emumvetor as notas de alunos de uma sala; por
conveni encia, a chave desse vetor pode ser uma string representando o nome dos respectivos alunos:
$notas = array("Antonio" => 5.5, "Beatriz" => 8.0, "Carlos" => 6.5);
// Imprime o elemento do vetor mapeado pela string "Antonio":
echo($notas["Antonio"]);
$media = $notas["Antonio"] + $notas["Beatriz"] + $notas["Carlos"];
$media = $media / 3;
echo("A media da classe e $media");
Al emdisso, os valores de umvetor n ao precisamser todos do mesmo tipo de dados, como no exemplo
a seguir:
$pessoa["nome"] = "Jose da Silva";
$pessoa["salario"] = 2500.30;
$pessoa["efetivo"] = true;
H a uma s erie de func oes uteis para manipulac ao de vetores, busca e ordenac ao. Inicialmente e im-
portante apresentarmos a func ao count(), que devolve a quantidade de elementos presentes atual-
mente no vetor. Exemplo:
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
2
Esse tipo de estrutura de dados e denominado de tabela de hash, ou hashtable
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 18
$result = count($a);
echo("O vetor a tem $result elementos."); // $result vale 3 neste momento
$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
$result = count($b);
echo("O vetor b tem $result elementos.");
// $result vale 3 tambem.
// Os ndices nao precisam ser consecutivos (outra diferenca)
Um vetor associativo pode ser percorrido facilmente utilizando-se a estrutura de repetic ao especial
foreach (para cada). Sua sintaxe e:
foreach($v as $chave => $valor)
Onde $v e um vetor (associativo ou n ao), e $chave e $valor s ao duas vari aveis que receber ao os
valores respectivos de cada chave e valor armazenados no vetor. O laco encerra sua execuc ao quando
todos os elementos do vetor forem percorridos.
Note que a estrutura foreach tamb em pode ser utilizada para vetores indexados numericamente; a
unica diferenca e que as chaves obtidas ser ao, naturalmente, num ericas.
No exemplo abaixo, um vetor associativo e inicializado e impresso dentro das c elulas de uma tabela
HTML:
$produtos = array("Maca" => 1.50, "Banana" => 0.80, "Laranja" => 1.30);
echo "<table>";
echo "<tr><td>Produto</td><td>Preco</td></tr>";
foreach ($produtos as $prod => $preco) {
echo "<td>" . $prod . "</td>";
echo "<td>" . $preco . "</td>";
}
echo "</table>";
As chaves e valores do vetor $produtos ser ao atribudas, respectivamente, ` as vari avies $prod e
$preco. Note que utilizamos a sintaxe alternativa do echo, sempar entesis, o que ajuda a deixar o c odigo
umpouco mais limpo.
`
Amedida que utilizarmos mais e mais c odigo PHP embutido no HTML, isso ser a
importante para manter a legibilidade do c odigo. Utilizamos tamb ema concatenac ao de strings para ge-
rar corretamente o texto a ser exibido em cada linha da tabela, dentro das tags HTML <td> e </td>.
3.6- Exerccios
1. Converta os seguintes programas em Pascal para PHP:
3
3
Por enquanto, a sada do programa em PHP ser a muito semelhante ` a sada de um programa Pascal, mas como podemos
embutir c odigo PHP no HTML, logo teremos possibilidades bem mais interessantes...
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 19
(a) Program Media;
Var N1, N2, N3: real;
S, M: real;
Begin
N1 := 5.5;
N2 := 7.0;
N3 := 4.0;
S := N1 + N2 + N3;
M := S / 3;
Writeln(M);
End.
(b) Program maior;
Var N1, N2, N3: real;
Begin
N1 := 3;
N2 := 9;
N3 := 1;
If (N1 > N2) Then
If (N1 > N3) Then
Writeln(N1 e o maior)
Else
Writeln(N3 e o maior)
Else
If (N2 > N3) Then
Writeln(N2 e o maior)
Else
Writeln(N3 e o maior);
End.
(c) Program quadrados;
Var N, Q: Integer;
Begin
N := 0;
While(N <=100) do
Begin
N := N + 1;
Q := N
*
N;
Writeln(O quadrado de , N, e , Q);
End;
End.
2. Inicialize uma vari avel integer, uma oat e uma booleana. Imprima em uma p agina os valores
delas, uma em cada linha, com fonte em negrito.
3. Imprima as temperaturas de 50

C a 50

C, de 1 em1 grau, e para cada valor imprima a temperatura


correspondente emgraus Fahrenheit. A convers ao pode ser feita pela f ormula F = 1, 8.C+32, onde
C e a temperatura em graus Celsius e F e a temperatura em graus Fahrenheit.
4. Altere o exerccio anterior de forma a gerar as temperaturas em uma tabela de duas colunas, utili-
zando a tag <table> do HTML.
5. Considere uma dvida de $1000, a ser paga em parcelas mensais, nas seguintes condic oes: a cada
m es, $100 s ao pagos, e o saldo restante e atualizado com juros de 1%. Por exemplo:
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 20
No primeiro m es, paga-se $100 e o saldo de $900 e atualizado: 900 1.01 = 909. Mostre, em uma
tabela, o valor remanescente da dvida a cada m es a partir do primeiro (use a nomenclatura m es
1, m es 2, etc.)
6. Gere uma p agina com os 50 primeiros n umeros pares.
7. Imprima os n umeros de 2 at e 200, e ao lado de cada um deles, se ele e primo ou n ao.
8. Refaca o exerccio anterior, mas desta vez troque a cor de fundo da linha da tabela para cinza claro
(c odigo: #DDDDDD) somente se o n umero for par.
9. Exerccios com vetores. Todos os exerccios deste item s ao aplicac oes do uso de vetores em pro-
gramas que processam requisic oes. Se o conceito de vetores for novo para voc e, e recomend avel
fazer todos os exerccios.
(a) Inicialize um vetor de n umeros inteiros, com 10 elementos aleat orios entre 0 e 50 (utilize a
func ao rand() do exerccio 5). Imprima cada elemento do seu vetor em uma linha de uma
tabela.
(b) Inicialize um vetor com os nomes dos 5 primeiros colocados do Campeonato Mundial de
F ormula 1 deste ano
4
. Construa um formul ario com uma caixa de texto para pesquisa. O
usu ario deve entrar com o nome de um piloto e, ao submeter o formul ario, o programa deve
vericar se algum elemento do vetor e igual ao nome inserido, e imprimir Achei ou N ao
achei de acordo.
(c) Inicialize um vetor de 10 n umeros inteiros e construa um trecho de c odigo PHP que encontra
qual o menor e o maior elementos do vetor, bem como seus respectivos ndices. Encontre
tamb em a m edia dos elementos do vetor.
4
Se voc e n ao entende nada de F1, use os 5 primeiros times do Brasileir ao, funciona tamb em:-)
CAPITULO 4
Processando requisic oes
Ap os ler este captulo, voc e dever a ser capaz de:
Congurar formul arios HTML para passagem de par ametros para p aginas PHP;
Compreender a diferenca entre as requisic oes do tipo GET e POST;
Obter e validar valores passados como par ametro.
At e agora, estudamos a linguagem PHP de forma muito similar a qualquer linguagem para desen-
volvimento de aplicac oes para desktop. Al emdisso, os programas que apresentamos nos exemplos e que
voc e desenvolveunos exerccios simplesmente geramuma sada, semnenhuma entrada correspondente
vinda do usu ario.
Neste captulo, primeiro voc e conhecer a (ou ir a revisar) a construc ao de formul arios em HTML, de
forma que possamos montar a interface de entrada de nossos programas na Web. Ent ao, vamos utili-
zar um dos m etodos fornecidos pelo PHP para obter esses par ametros e process a-los de acordo com as
necessidades da aplicac ao.
4.1- Formul arios emHTML
Umformul ario e composto por umoumais campos de entrada de dados, que devemser devidamente
agrupados emuma tag <form>...</form>. Oformul ario deve ter tamb emao menos umcontrole para
submiss ao dos dados, que e normalmente um bot ao. Primeiramente, vamos apresentar as tags para
construc ao dos controles de entrada de dados e quais propriedades podem ser conguradas em cada
caso.
Em todos os casos abaixo, a tag de criac ao do controle deve ser acompanhada do atributo name,
denindo um nome unico para o controle (e tamb em para o valor a ser passado como par ametro na
submiss ao do formul ario, como veremos a seguir).
4.1.1 Caixa de texto
A caixa de texto e denida com a tag <input> e o atributo type="text". O atributo size pode ser
utilizado para denir a quantidade m axima de caracteres que podem ser inseridos. Exemplos:
Nome: <input type="text" name="nome" value="Mickey" size="20" />
<br/><br/>
Sobrenome: <input type="text" name="sobrenome" size="35" />
21
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 22
Note que a primeira caixa de texto j a e preenchida com um valor padr ao, devido ` a presenca do atri-
buto value. Veremos a seguir que essa funcionalidade pode ser muito util quando for necess ario gerar
um formul ario j a preenchido com valores previamente fornecidos pelo usu ario, por exemplo.
4.1.2 Check box
A check box e denida com a tag <input> e o atributo type="checkbox". O atributo value, neste
caso, dene qual valor ser a passado como par ametro na submiss ao do relat orio caso a checkbox esteja
selecionada. Exemplos:
Resposta sim ou nao:
<input type="checkbox" name="resposta" value="1" checked="checked" /><br/>
Tenho um carro:
<input type="checkbox" name="veiculo" value="carro" checked="checked" /><br/>
Tenho um aviao:
<input type="checkbox" name="veiculo" value="aviao" />
O atributo checked="checked" dene se a check box estar a selecionada como padr ao na exibic ao
do formul ario e tem func ao semelhante a do value na caixa de texto.
4.1.3 Radio button
A denic ao do radio button e an aloga a da check box, coma diferenca que somente umitempode ser
selecionado por vez. Exemplo:
<input type="radio" name="sexo" value="M" checked="checked" /> Masculino
<br/>
<input type="radio" name="sexo" value="F" /> Feminino
<br/>
Neste caso, somente uma das tags <input> deve ter o atributo checked="checked".
4.1.4 Caixa combo e lista
A caixa combo e a lista s ao denidas atrav es da tag <select>. A diferenca da lista para a caixa combo
e denida atrav es do atributo size, que dene quantos itens podem ser exibidos na lista. Se size=1,
temos uma combo, caso contr ario, uma lista.
Internamente ` a tag <select>, devem ser denidos os itens da lista, entre tags
<option>...</option>. Cada tag deve ter o atributo value para denir qual o valor passado
como par ametro na submiss ao do formul ario.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 23
Veculo: <br/>
<select size=4 name="veiculo">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</select>
<br/><br/>
Motorizacao:
<select size=1 name="motor">
<option value="10">1.0</option>
<option value="14">1.4</option>
<option value="20">2.0</option>
</select>
4.1.5 Bot ao
Um bot ao pode ser denido por tr es valores do atributo type da tag <input>: button, submit e
reset. O atributo value, nestes tr es casos, dene o texto que aparecer a no bot ao.
Um bot ao com type="button" tipicamente precisa ser associado a um pequeno programa em Ja-
vascript para executar alguma ac ao. Descrever seu funcionamento est a fora do escopo deste captulo.
Um bot ao com type="reset" automaticamete ir a limpar todos os campos do formul ario ao ser
clicado. Deve ser utilizado com cuidado, pois acion a-lo por engano pode ser um aborrecimento para a
maioria dos usu arios.
Neste momento estamos especialmente interessados no type="submit". Ao clicar esse bot ao, os
dados do formul ario s ao submetidos para a URL denida na tag <form>, cujo funcionamento veremos
a seguir.
4.1.6 Juntando tudo: a tag <form>
Para que umconjunto de controles e os respectivos dados inseridos pelo usu ario sejamconsiderados
como um pacote unico para envio para o servidor, todas as tags referentes a um mesmo formul ario
devem estar agrupadas em uma tag <form>...</form>.

E obrigat oria a presenca de um atributo action, que dene a URL de destino dos dados a serem
passados. Nonossocaso, odestinoser a sempre umarquivoPHPpresente noservidor.

Ebastante comum
denir tamb em o atributo method, com o valor "get" ou "post". Na pr oxima sec ao vamos discutir a
diferenca entre os m etodos GET e POST de submiss ao de par ametros.
Considere que queremos construir um formul ario para permitir a entrada de um nome de fun-
cion ario, seu respectivo sal ario e o estado civil (este, via uma caixa combo), e que os dados devem ser
enviados para o script testesoma.php. Seu c odigo seria o seguinte:
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 24
<form action="testeform.php" method="get">
Nome: <input type="text" size=40 name="nome"/> <br/>
Salario: <input type="text" size=10 name="salario"/> <br/>
Estado civil:
<select size=1 name="estcivil">
<option value="1">Solteiro</option>
<option value="2">Casado</option>
<option value="3">Divorciado</option>
</select>
<br/><br/>
<input type="submit" value="Gravar"/>
</form>
C odigo 4.1: Exemplo do c odigo de um formul ario simples.
4.2- Uma introduc ao ` as requisic oes HTTP: GET e POST
Uma vez que j a somos capazes de construir formul arios e submeter seus dados a um script PHP,
o pr oximo passo e obter esses dados em tempo de execuc ao do script. Por em, antes disso, vale a pena
fazermos uma pequena pausa para compreender o que realmente acontece ao clicarmos o bot ao submit
em um formul ario.
Em qualquer aplicac ao na Web, todos os dados que trafegam em ambos os sentidos (cliente-servidor
e servidor-cliente) s ao denidos segundo as regras de umprotocolo denominado HTTP(Hypertext Trans-
fer Protocol, ou Protocolo de transfer encia de hipertexto). Em lihhas gerais, uma requisic ao HTTP nada
mais e do que um texto formatado seguindo algumas regras especiais.
O protocolo HTTP dene que par ametros denidos pelo usu ario podem ser enviados juntamente
com a requisic ao por dois m etodos diferentes: GET e POST.
O m etodo GET foi, historicamente, o primeiro a ser denido. Nele, os par ametros s ao passados na
pr opria URL, utilizando a sintaxe:
http://servidor/pagina.php?param1=valor1&param2=valor2&param3=valor3
Ou seja, ap os a URL que dene a p agina PHP, e inserido um ponto de interrogac ao e uma lista de
par ametros e seus respectivos valores, separados por &.
`
A esta altura voc e j a deve ter deduzido que os
nomes dos par ametros nada mais s ao do que aqueles denidos com o atributo name em cada campo do
formul ario.
Considere por exemplo o formul ario denido no C odigo 4.1. Se preenchermos o campo Nome com
a string Thiago, o campo Sal ario com a string 1000 e a combo Estado Civil com Solteiro (correspondente
ao valor 1), teremos a formac ao da seguinte URL
1
:
http://localhost/testeform.php?nome=Thiago&salario=1000&estcivil=1
A principal limitac ao do m etodo GET e que uma URL e limitada a 100 caracteres. Caso o formul ario
emquest aotenha uma quantidade muitogrande de par ametros, ouinclua caracteres que n aopertencam
` a tabela ASCII, e necess ario usar o m etodo POST. Criado para superar as limitac oes do m etodo GET,
o POST inclui os valores dos par ametros no pr oprio corpo da requisic ao HTTP. Dessa forma, nenhum
dado e acrescentado na URL.
1
Evidentemente, considerando que o arquivo est a hospedado localmente.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 25
Como regra geral, voc e deve utilizar o GET apenas para requisic oes pequenas ou quando e necess ario
localizar erros na submiss ao de dados (j a que a identicac ao dos dados enviados e mais f acil); nos demais
casos, o POST e o m etodo mais robusto a utilizar.
4.3- Obtendo os par ametros no c odigo PHP
Chegamos, ent ao, a um dos principais pontos fortes da linguagem: a obtenc ao autom atica dos valo-
res passados como par ametro para uma p agina. H a duas modalidades de obtenc ao: via o vetor global
$_REQUEST e via a chamada de func ao extract()
2
.
$_REQUEST e umvetor de strings que armazena os valores de todos os par ametros passados. Onome
do par ametro e a chave do respectivo elemento do vetor. Por exemplo, se foi passado um par ametro
opcao cujo valor e 1, $_REQUEST["opcao"] vale 1.
Considere o formul ario que construmos no C odigo 4.1. Se direcionarmos a submiss ao do formul ario
para o script denido abaixo, o resultado ser a a exibic ao dos par ametros enviados.
<p>
<?php
echo("Ola, " . $_REQUEST["nome"]);
echo("<br/>");
switch ($_REQUEST["estcivil"]) {
case "1":
$estado = "Solteiro";
break;
case "2":
$estado = "Casado";
break;
case "3":
$estado = "Divorciado";
break;
}
echo("Seu salario e " . $_REQUEST["salario"] .
" e seu estado civil e " . $estado);
?>
</p>
C odigo 4.2: Exemplo de obtenc ao de par ametros via REQUEST sem vericac ao
Note que os comandos echo() podem (e devem) mesclar a impress ao de vari aveis com tags de
formatac ao HTML.
`
A medida que os scripts envolverem formatos de sada mais complexos, isso se tor-
nar a mais comum.
Com a func ao extract(), uma vari avel ser a inicializada para cada um dos par ametros enviados na
requisic ao. Sua sintaxe e a seguinte:
extract($_REQUEST, opcoes);
O primeiro par ametro e o nome do vetor do qual se desejam extrair os dados no caso, o vetor
$_REQUEST. O segundo par ametro e uma constante PHP que dene como os dados ser ao importados
como vari aveis. As possibilidades oferecidas s ao apresentadas na Tabela 4.1.
Assim, o mesmo c odigo acima, utilizando a func ao extract() seria o seguinte:
2
At e a vers ao 5.3 do PHP, tamb em era disponibilizada a func ao import request variables(), especca para a extrac ao
dos valores passados como par ametro. Como a func ao extract() j a existia para permitir a extrac ao de dados de qualquer
vetor, seu uso e encorajado em substituic ao ` a chamada import request variables() a partir da vers ao 5.4.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 26
Constante Descric ao
EXTR_OVERWRITE Se a vari avel a ser criada j a existe, substitua seu
valor pelo valor importado.
EXTR_SKIP Se a vari avel a ser criada j a existe, mantenha o
seu valor e descarte o valor importado.
EXTR_IF_EXISTS S o sobrescreve a vari avel se ela j a foi criada an-
teriormente; caso contr ario, n ao faz nada.
Tabela 4.1: Opc oes de extrac ao de dados da func ao extract()
<p>
<?php
extract($_REQUEST, EXTR_OVERWRITE);
echo("Ola, " . $nome);
echo("<br/>");
switch ($estcivil) {
case "1":
$estado = "Solteiro";
break;
case "2":
$estado = "Casado";
break;
case "3":
$estado = "Divorciado";
break;
}
echo("Seu salario e " . $salario .
" e seu estado civil e " . $estado);
?>
</p>
C odigo 4.3: Exemplo de obtenc ao de par ametros via extract() sem vericac ao
4.4- Validando par ametros
Obter a entrada do usu ario e um desao. A construc ao de um formul ario e obtenc ao de seus dados e
uma tarefa tecnicamente simples, por emo principal problema reside emvalidar se os dados informados
correspondem ao que e esperado pela l ogica de execuc ao do programa. Nesta sec ao iremos discutir
v arias situac oes de validac ao de par ametros que podem ocorrer em seus programas.
4.4.1 Exist encia de par ametros
Da forma como nosso script de exemplo est a denido at e o momento, ele s o pode executar seu traba-
lho caso sejam passados os par ametros nome, salario e estcivil. Se alguma p agina mal construda
(ou mesmo um usu ario desavisado) acessa a URL do script sem passar os par ametros, as vari aveis cor-
respondentes n ao ser ao denidas, o que pode afetar a l ogica de execuc ao.
Para evitar esse problema, utilizaremos a func ao isset(). Ela recebe como par ametro uma vari avel
qualquer e devolve o valor booleano true caso a vari avel j a tenha sido denida no c odigo, e false caso
contr ario. Essa e uma forma pr atica de barrar a execuc ao de scripts cujos par ametros n ao tenhamsido
passados corretamente. No C odigo 4.4 foi includa a vericac ao da exist encia dos par ametros, antes de
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 27
gerar a p agina de resposta. Caso algum par ametro esteja faltando, uma mensagem de erro alternativa e
gerada.
<p>
<?php
extract($_REQUEST, EXTR_OVERWRITE);
if (isset($nome) && isset($salario) && isset($estcivil)) {
echo("Ola, " . $nome);
echo("<br/>");
switch ($estcivil) {
case "1":
$estado = "Solteiro";
break;
case "2":
$estado = "Casado";
break;
case "3":
$estado = "Divorciado";
break;
}
echo("Seu salario e " . $salario .
" e seu estado civil e " . $estado);
}
else {
echo("<h2>Parametros nao configurados. Erro!</h2>");
}
?>
</p>
C odigo 4.4: Exemplo de obtenc ao de par ametros via extract() com vericac ao
4.4.2 Tipo de dado e formato dos par ametros
Considere no nosso exemplo que o par ametro salario foi enviado, por emseu valor n ao e num erico.
Para vericar se uma vari avel e de um tipo num erico ou e uma string que representa um n umero, utili-
zamos a func ao isnumeric().
Podemos tamb em desejar vericar se uma data e v alida. Para tanto, podemos utilizar a func ao
checkdate(mes, ano, dia), que verica se os valores passados correspondem a uma data v alida
no calend ario gregoriano, devolvendo como resultado um valor booleano. Veja o exemplo abaixo:
$dia1 = 11;
$mes1 = 11;
$ano1 = 1981;
$result = checkdate($mes1, $dia1, $ano1);
echo($result); // Resulta em verdadeiro
$dia1 = 31;
$mes1 = 02;
$ano1 = 2009;
$result = checkdate($mes1, $dia1, $ano1);
echo($result); // Resulta em falso
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 28
Por em, somente essa func ao n ao basta para resolver o problema: o usu ario normalmente vai digitar
uma data completa na caixa de texto, e por isso ainda resta o trabalho de quebrar essa data nos tr es
componentes. Para isso utilizamos a func ao explode(caracter, string), que divide a string pas-
sada como par ametro em pedacos, delimitados pelo caracter passado como par ametro. Veja alguns
exemplos:
$s = "12e13e14e15";
$v = explode("e", $s); // vetor $v = ("12", "13", "14", "15")
$w = explode("1", $s); // vetor $w = ("2e", "3e", "4e", "5")
$s = "Alberto, Beatriz, Carlos";
$x = explode(",", $s); // vetor $x = ("Alberto", " Beatriz", " Carlos")
$s = "04/06/1988";
$z = explode("/", $s); // vetor $z = ("04", "06", "1988")
Ent ao, cada um dos pedacos da string pode ser passado para a func ao checkdate() para a
vericac ao. O c odigo 4.5 mostra um exemplo dessa validac ao, cobrindo todas as possveis situac oes
de erro. Na pr atica, n ao e necess ario indicar todas essas variac oes de erros para o usu ario; al em disso, se
houver a necessidade de executar essa vericac ao v arias vezes, o c odigo pode ser modularizado em uma
func ao, cuja sintaxe aprenderemos no pr oximo captulo.
<html><body>
<form action="testedata.php" method="get">
Entre com uma data (DD/MM/AAAA):
<input type="text" name="data" size="10"><br>
<input type="submit" value="Verificar data">
</form>
<?php
extract($_REQUEST, EXTR_OVERWRITE);
if (isset($data)) {
$v = explode("/", $data);
if (count($v) == 3) {
$result = checkdate($v[1], $v[0], $v[2]);
if ($result == true) {
echo "Data valida";
} else {
echo "Data tem tres partes, mas e invalida";
}
} else {
echo "Data nao tem tres partes";
}
}
?>
C odigo 4.5: Vericac ao de validade de datas utilizando explode() e checkdate()
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 29
4.4.3 Par ametros comc odigo mal-intencionado
O segundo problema e um pouco mais sutil: como a vari avel que representa um par ametro e uma
string, caso ela seja impressa semnenhumtratamento pr evio, existe a possibilidade de umprogramador
mal-intencionado incluir c odigo HTML ouJavascript no meio da string, e consequentemente esse c odigo
passa a fazer parte da nossa p agina. Emespecial, como o c odigo Javascript e execut avel, essa e uma s eria
falha de seguranca; v arios procedimentos para roubo de informac ao se baseiam na t ecnica de incluir
c odigo imprevisto (ou malicioso) em p aginas web.
Para evitar esse tipo de problema podemos utilizar duas func oes da linguagem. A func ao
strip tags() recebe como par ametro uma string e devolve a string sem quaisquer tags HTML que
estavam presentes. A func ao html special chars() substitui alguns caracteres que tem signicado
especial para o HTML (&, " (aspas duplas), (aspas simples), < e >) pelo seu c odigo de escape equiva-
lente
3
.
Considere nosso exemplo anterior, onde as vari aveis $nome e $salario s ao diretamente utilizadas
para exibic ao na tela. Por seguranca, podemos executar as linhas
$nome = html_special_chars(strip_tags($nome));
$salario = html_special_chars(strip_tags($salario));
Como regra geral, considere que strip tags() funciona como uma garantia que a entrada do
usu ario n ao cont em tags de formatac ao; j a html special chars() e uma garantia que a sada n ao
perder a a exibic ao correta caso contenha algum dos caracteres especiais.
Uma forma de impedir que os dados da requisic ao n ao modiquem indevidamente o valor de uma
vari avel que n ao corresponde a uma entrada do usu ario e utilizando a opc ao EXTR_SKIP da func ao
extract(), que impede que o valor de uma vari avel pr e-existente seja modicado. Veja o exemplo
do C odigo 4.6. O par ametro quantidade deve ser enviado pelo usu ario atrav es do formul ario. Entre-
tanto, se um par ametro chamado numrepeticoes for enviado atrav es da modicac ao direta da URL de
chamada do c odigo variavel.php, ele poderia modicar o valor j a denido para a vari avel antes da
chamada de extract(). E isso seria muito simples, bastando que um usu ario digitasse no navegador:
http://localhost/variavel.php?quantidade=5&numrepeticoes=15
Se a opc ao da func ao extract() fosse EXTR_OVERWRITE, o valor da vari avel $numrepeticoes se-
ria alterado indevidamente para 15. Com a opc ao EXTR_SKIP, o novo valor enviado de forma deso-
nesta e descartado, n ao prejudicando o funcionamento do c odigo.
4.5- Mais exemplos comrequisic oes
Com os m etodos de entrada e validac ao que vimos nesse captulo, podemos implementar uma s erie
de exemplos simples de processamento. Vejamos um deles: criar um formul ario que leia 3 n umeros,
calcule e mostre:
1. A soma dos 3 n umeros;
2. O produto dos 3 n umeros;
3. A m edia aritm etica dos 3 n umeros.
O C odigo 4.7 mostra nossa proposta para o exerccio apresentado.
3
Por exemplo, o sinal de menor que (<) e substitudo por &lt; o & e substtudo por &amp
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 30
<html>
<body>
<form action="variavel.php" method="get">
Digite a quantidade: <input type="text" name="quantidade"><br>
<input type="submit" value="Enviar">
</form>
<?php
// A variavel $numrepeticoes nao deve ser modificada
// pela entrada do usuario
$numrepeticoes = 5;
// Vamos tentar obter o valor da variavel $quantidade
extract($_REQUEST, EXTR_SKIP);
if (isset($quantidade) && $quantidade > 0) {
for ($i = 1; $i <= $numrepeticoes; $i++) {
echo "Mes: $i Quantidade: $quantidade<br>";
}
}
?>
</body>
</html>
C odigo 4.6: Impedindo a modicac ao de uma vari avel usando a opc ao EXTR SKIP
Vamos testar esta soluc ao! Primeiramente crie uma nova pasta dentro do Apache chamei-a de
apostila para meu exemplo e crie um novo arquivo. Ent ao copie o c odigo acima no arquivo criado e
salve-o com o nome formulariosimples.php.
Faca uma requisic ao a este arquivo no navegador. Odocumento que ser a aberto e mostrado na Figura
4.1.
Inserindo os valores solicitados e pressionando o bot ao Calcular, nosso pequeno aplicativo mos-
trar a os valores processados. Um exemplo desta operac ao e mostrado na Figura 4.2.
Todo o processamento e realizado a partir da linha 2, com a obtenc ao das vari aveis correspondentes
aos par ametros enviados pelo usu ario. Note que o c odigo PHP est a inserido em uma estrutura if, que
comeca na linha 3 e naliza na linha 13. Isso e necess ario para garantir que nenhum par ametro passado
tenha o valor em branco
4
.
Os c alculos s ao realizados entre as linhas 4 e 6 lembre-se, n ao e necess ario declarar as vari aveis
$soma, $multiplicacao e $media. Ent ao, os resultados s ao exibidos e formatados pelo echo.
A partir da linha 18, aparece o c odigo HTML do nosso formul ario. Como ele n ao e composto por
c odigo PHP, sua exibic ao n ao e afetada pela execuc ao das linhas 2 a 11, com a excec ao de um pequeno
truque de sintaxe. Veja, por exemplo, a linha 19. Nela, um pequeno bloco de c odigo PHP imprime o
valor da vari avel $primeiro no meio do atributo value da caixa de texto. Caso a vari avel inicializada
a partir dos dados da requisic ao esteja denida, seu valor e o valor padr ao da caixa de texto primeiro.
Caso contr ario, a tag de denic ao da caixa de texto ter a o atributo value="" (ou seja, o mesmo que n ao
denir nenhumvalor). Assim, ao incorporar esse valor vari avel no meio do nosso c odigo HTML, torna-se
possvel manter na caixa de texto o valor que o usu ario digitou, mesmo ap os ser executada a requisic ao
5
.
Al em disso, na primeira vez em que o programa e chamado, as caixas de texto cam vazias, como e de se
esperar.
4
Quando uma vari avel, por exemplo $x, n ao tiver sido criada, isset($x) resulta falso, e $x != resulta em verdadeiro.
Assim, qualquer uma das duas formas de vericac ao e v alida. Neste exemplo, usamos a segunda delas.
5
Requisic oes em HTML tem p essima mem oria, como veremos no Captulo 6.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 31
1 <?php
2 extract($_REQUEST, EXTR_OVERWRITE);
3 if ($primeiro != && $segundo != && $terceiro != ) {
4 $soma = $primeiro + $segundo + $terceiro;
5 $multiplicacao = $primeiro
*
$segundo
*
$terceiro;
6 $media = ($primeiro + $segundo + $terceiro) / 3;
7
8 echo "A soma e: " . $soma . "<br>";
9 echo "A multiplicacao e: " . $multiplicacao . "<br>";
10 echo "A media e: " . $media . "<br><br><br>";
11 }
12
13 ?>
14
15 <html><body>
16 <form action=formulariosimples.php method=post name=queryForm>
17 Insira o valor do primeiro numero:
18 <input type=text name=primeiro size=42
19 value=<?php echo $primeiro; ?>>
20 <br><br>
21 Insira o valor do segundo numero:
22 <input type=text name=segundo size=42
23 value=<?php echo $segundo; ?>>
24 <br><br>
25 Insira o valor do terceiro numero:
26 <input type=text name=terceiro size=42
27 value=<?php echo $terceiro; ?>>
28 <br><br>
29 <input type=submit value=Calcular>
30 </form>
31 </body></html>
C odigo 4.7: Exemplo de c alculo simples: arquivo formulariosimples.php
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 32
Figura 4.1: Visualizac ao do formul ario arquivo formulariosimples.php
Figura 4.2: Visualizac ao do formul ario com a resposta a uma requisic ao arquivo
formulariosimples.php
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 33
4.6- Exerccios
1. Revis ao de l ogica. Todos os itens deste exerccio s ao exemplos simples da aplicac ao de conceitos
de l ogica de programac ao
6
. Em cada um deles, construa o formul ario PHP para entrada de dados,
e gere a sada correspondente na pr opria p agina.
(a) Escreva umprograma que l e uma temperatura emCelsius e imprime ovalor desta temperatura
em Farenheit. A f ormula de convers ao e F = C
9
5
+ 32.
(b) Um lote de v arias pecas id enticas deve ser embalado em caixas que cabem 48 pecas em cada
caixa. Dada a quantidade de pecas do lote, determinar a quantidade de caixas necess arias e a
quantidade de pecas que deixar ao de ser embaladas por n ao completarem uma caixa
7
.
(c) Um atleta sabe quantas horas e quantos minutos gastou em uma corrida. Deseja saber o
tempo em segundos.
(d) Dado um valor em segundos, determinar o seu valor equivalente em horas, minutos e segun-
dos (Ex. 3h 2040). Teste seu algoritmo para o n umero 12040.
(e) Elabore um programa que dada a idade de um nadador, classique-o em uma das seguintes
categorias:
Infantil A: 5 - 7 anos
Infantil B: 8-10 anos
Juvenil A: 11-13 anos
Juvenil B: 14-17 anos
Adulto: maiores de 18 anos
(f ) Um banco conceder a um cr edito especial aos seus clientes, vari avel com o saldo m edio no
ultimo ano. Faca um programa que leia o saldo m edio de um cliente e calcule o valor do
cr edito de acordo com a tabela abaixo. Monte como resposta uma tabela informando o saldo
m edio e o valor do cr edito.
Saldo m edio Percentual
De 0 a 200 Nenhum cr edito
De 201 a 400 20% do valor do saldo m edio
De 401 a 600 30% do valor do saldo m edio
Acima de 601 40% do valor do saldo m edio
(g) Uma empresa conceder a um aumento de sal ario aos seus funcion arios, vari avel de acordo
com o cargo, conforme a tabela abaixo. Faca um programa que leia o sal ario e o cargo de
um funcion ario e calcule o novo sal ario. Se o cargo do funcion ario n ao estiver na tabela, ele
dever a, ent ao, receber 40% de aumento. Mostre o sal ario antigo, o novo sal ario e a diferenca.
C odigo Percentual
101 10%
102 20%
103 30%
104 35%
(h) Dados 3 n umeros reais, verique se estes podem ser lados de um tri angulo. Caso verdade, de-
ver a ser indicado qual tipo de tri angulo poder a ser formado: is osceles, escaleno ou eq uil atero.
Utilize operadores l ogicos.
6
Caso voc e tenha diculdades em algum deles, agora e a hora de revisitar seu livro de l ogica!!!
7
Dica: o PHP n ao possui a operac ao de divis ao inteira, como em outras linguagens, mas voc e pode utilizar a func ao
intval() para obter a parte inteira de uma divis ao. Por exemplo: intval(5/2) == intval(2.5) == 2
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 34
Para ser um tri angulo: A < B + C; B < A + C; C < A + B;
Tri angulo eq uil atero: A = B = C;
Tri angulo Iis osceles: A = B ou B = C ou A = C;
(i) Dado um n umero de 3 algarismos, construir outro n umero de quatro algarismos de acordo
com a seguinte regra: a) os tr es primeiros algarismos, contados da esquerda para a direita s ao
iguais aos do n umero dado; b) o quarto algarismo e dgito de controle calculado da seguinte
forma: primeiro algarismo + segundo algarismo * 3 + terceiro algarismo * 5; o dgito de controle
e igual ao resto da divis ao dessa soma por 7.
(j) Escrever um algoritmo que gera e escreve os n umeros mpares entre dois valores informados
pelo usu ario.
(k) Dados dois n umeros inteiros A e B, construa um algoritmo para calcular a soma de todos os
inteiros existentes entre A e B.
(l) Imprima os n umeros inteiros de 1 a 5000. Toda vez que um m ultiplo de 5 for impresso, ele
deve ser impresso em vermelho (use a tag HTML <font color="red"> para isso).
(m) Faca um formul ario com uma caixa de texto chamada limite, cujo valor deve ser num erico
e maior que 2. O programa deve imprimir os n umeros pares a partir do 2, e parar de imprimir
quando a soma dos n umeros j a impressos for maior que o limite digitado pelo usu ario.
(n) Dado umpas A, com5.000.000 de habitantes e uma taxa de natalidade de 3%ao ano, e umpas
B com 7.000.000 habitantes e uma taxa de natalidade de 2% ao ano, Construa um algoritmo
que calcule quanto tempo e necess ario para que a populac ao do pas A ultrapasse a populac ao
do pais B.
2. Faca um formul ario que recebe tr es valores num ericos, correspondentes a tr es lados de um
tri angulo. Seu programa deve receber esses par ametros e vericar se correspondem aos lados de
um tri angulo ret angulo, utilizando o Teorema de Pit agoras (a
2
= b
2
+ c
2
).
3. Faca umprograma que l e dois n umeros reais atrav es de duas caixas de texto e a operac ao aritm etica
atrav es de uma caixa combo (+, -,
*
ou /). O programa deve retornar o resultado da operac ao
recebida sobre estes dois n umeros.
4. O card apio de uma lancheria e o seguinte:
Especicac ao C odigo Preco
Cachorro quente 100 1,20
Bauru simples 101 1,30
Bauru com ovo 102 1,50
Hamb urger 103 1,20
Cheeseburguer 104 1,30
Refrigerante 105 1,00
Escreva um programa que mostre os itens do card apio em uma caixa combo; o c odigo do lanche
deve ser o valor enviado como par ametro na requisic ao enviada pelo formul ario. Mostre tamb em
uma caixa de texto para o usu ario inserir a quantidade do itemdesejado a comprar. Uma check box
deve permitir que o usu ario peca por recheio extra, nesse caso o preco de cada lanche e acrescido
de $0,25. O programa deve ent ao calcular o valor total a ser pago.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 35
5. Conversor de medidas universal: Faca um formul ario com uma caixa de texto que receber a um
valor num erico e uma caixa combo com as seguintes opc oes: Celsius para Fahrenheit; Fahrenheit
para Celsius; Centmetro para Polegada; Polegada para Centmetro. A convers ao correspondente
ao par ametro passado deve ser efetuada. O programa dever a emitir uma mensagem de erro em
vermelho (c odigo: #FF0000) caso o valor passado como par ametro n ao seja num erico.
6. Calculadora de juros: Uma aplicac ao nanceira e remunerada mensalmente a uma taxa de juros t,
sendo que 0 t 100. Se o capital inicial investido e C e o tempo emmeses do investimento e m, o
valor nal da aplicac ao pode ser calculado como F = C.(1 +t/100)
m
. Construa uma interface para
a entrada de C, de duas taxas diferentes e de um prazo de meses m. A aplicac ao deve mostrar, em
dois ListBox, a evoluc ao mensal dos valores da aplicac ao nos dois cen arios propostos. Sua interface
deve se parecer com o diagrama abaixo.
7. Calend ario autom atico: Faca um programa que permita a entrada de um m es e de um ano. O seu
programa deve imprimir uma tabela com sete colunas, uma para cada dia da semana, conside-
rando a posic ao correta para o dia da semana em que cai o dia 1 do respectivo m es. Considere
que o dia 1 de janeiro de 1900 foi uma segunda-feira
8
. Asada do seu programa deve ser semelhante
` a gura abaixo:
8
A dica para resolver este exerccio est a no rodap e, lido apenas por alunos atentos como voc e: dois dias de umm es que caem
no mesmo dia da semana devem ter o mesmo resto quando divididos por 7.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 36
8. Sugest oes para jogo de loteria: Faca um programa que permita a gerac ao de palpites para jogar em
diferentes loterias. Para isso, o formul ario deve solicitar o menor n umero possvel, o maior n umero
possvel, e a quantidade de n umeros a sortear (por exemplo, para a Mega-Sena, o menor n umero e
1, o maior e 60, e s ao sorteados 6 n umeros). Ent ao, seu programa deve sortear e exibir a quantidade
de n umeros pedidos. A dica e utilizar a func ao rand(min, max), que sorteia um n umero inteiro
maior ou igual a min e menor ou igual a max
9
.
9. Modique o programa anterior para incluir uma caixa de vericac ao N ao repetir n umeros. Caso
ela esteja selecionada, seu programa n ao poder a repetir n umeros no sorteio. Voc e dever a utilizar
vetores para implementar essa funcionalidade.
10. Exerccios comvetores - parte 2
(a) Faca um formul ario com uma caixa de texto para obter uma lista de n umeros de ponto u-
tuante separados por vrgula. Utilize a func ao explode() para criar um vetor a partir da sua
entrada. Da, encontre o menor e o maior elementos do vetor.
(b) Obtenha a m edia dos elementos de um vetor de n umeros de ponto utuante obtido a partir
da mesma t ecnica do exerccio anterior.
(c) Obtenha um vetor de n umeros inteiros e um n umero qualquer X. Seu programa deve calcular
a quantidade de vezes que X encontra-se neste vetor.
(d) Escreva um programa que obt em um vetor V de n umeros inteiros e inverte a ordem dos ele-
mentos, utilizando o pr oprio espaco de mem oria do vetor. Exemplo: Para V = {4, 9, 10, 8, 6}, o
vetor V invertido e {6, 8, 10, 9, 4}.
(e) Escreva umprograma que obt emumvetor de n umeros inteiros e ordena os elementos dovetor
em ordem crescente. Exemplo: Para V = {4, 9, 10, 8, 6}, o vetor V ordenado e {4, 6, 8, 9, 10}.
(f ) Uma papelaria vende l apis a R$ 0,30, borrachas a R$ 0,40 e cadernos a R$ 12,50. Inicalize um
vetor onde a chave dos elementos e o nome do produto, e o valor respectivo e o seu preco
(como em $produtos[borracha] = 0.30;). Construa um formul ario com uma caixa
combo, com os tr es produtos, e uma caixa de texto para quantidade. Ao submeter o for-
mul ario, seu programa deve obter o preco unit ario do produto escolhido no vetor, multiplicar
pela quantidade de produtos pedidos e exibir o valor total do pedido.
9
E caso seu programa lhe ajude a ganhar algum pr emio de verdade, n ao esqueca deste humilde servidor... :-)
CAPITULO 5
Modularizando programas
Ap os ler este captulo, voc e dever a ser capaz de:
Compreender o conceito de modularizac ao de programas em PHP;
Escrever func oes e procedimentos;
Implementar sites que exigem a criac ao de diversos arquivos.
5.1- Oconceito de modularizac ao
Quando precisamos escrever programas maiores em PHP, surge inevitavelmente a necessidade de
quebrar problemas maiores em problemas menores. Isso normalmente acontece por dois motivos: (a)
algumas tarefas do nosso programa precisam ser executadas v arias e v arias vezes
1
ou (b) uma mesma
tarefa precisa ser executada a partir de p aginas diferentes.
Para isso, utilizamos o conceito de m odulos de c odigo pequenos pedacos de c odigo separados do
programa principal, que podem ser chamados quando necess ario. Um m odulo pode ser de dois tipos:
Func ao. Um m odulo que ao t ermino de sua execuc ao devolve em um valor, que pode ser manipulado
posteriormente. J a utilizamos algumas func oes em PHP, tais como explode() (que devolve um
vetor) e sqrt() (que devolve uma raiz quadrada, ou seja, um n umero real).
Procedimento. Um m odulo que executa alguma tarefa relevante, mas n ao devolve um valor. Tamb em
j a usamos alguns procedimentos, tais como import_request_variables() e echo().
Apesar dessa diferenca, linguagens derivadas do C, como e o caso do PHP, Java e C++ chamamambos
os tipos de m odulo de func oes
2
.
Func oes e procedimentos podem receber dados como entrada para o processamento que efetuam.
Esses dados s ao chamados de par ametros de entrada e s ao denidos como vari aveis, conforme veremos
na pr oxima sec ao.
5.2- Escrevendo func oes
Como exemplo inicial, considere uma func ao que recebe como entrada dois n umeros, e devolve
como resultado a soma desses n umeros. A func ao seria denida da seguinte forma:
function soma($a, $b) {
$c = $a + b;
return $c;
}
1
E copiar e colar c odigo n ao e uma alternativa, j a que uma mudanca ou correc ao de erro precisaria ser feita emv arios lugares
diferentes do c odigo. Nossa vida caria muito complicada bem r apido
2
O truque conceitual e denir que um procedimento e simplesmente uma func ao que devolve... o nada!
37
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 38
O comando return e seguido por uma express ao que dene o valor devolvido pela func ao (nesse
caso, o valor da soma armazenado na vari avel $c). A execuc ao de return encerra imediatamente a
execuc ao da func ao. As vari aveis $a e $b que aparecem entre par entesis ao lado do nome da func ao s ao
os par ametros de entrada quando executamos a func ao em algum ponto do c odigo, deve ser enviado
um valor para cada par ametro de entrada denido na declarac ao.
No ponto do c odigo em que novamente precisamos executar a tarefa implementada pela func ao,
fazemos uma chamada ` a func ao, referenciando-a pelo seu nome, como se fosse mais um comando em-
butido da linguagem. Veja no exemplo abaixo:
$entrada1 = 4;
$entrada2 = 8;
// Os valores de entrada sao os valores das variaveis
$resultado = soma($entrada1, $entrada2);
// Neste ponto, a variavel $resultado vale 12
Vejamos outro exemplo de func ao com uma tarefa mais util no c odigo 5.2. Suponha que uma loja
virtual concede um desconto de 10% se uma compra e efetuada ` a vista; outros 5% de desconto adici-
onais s ao concedidos se o valor da compra e superior a R$ 300,00. Nesse caso, nossa func ao ter a dois
par ametros de entrada: o valor da compra ($compra) e uma vari avel booleana indicando se a compra
ser a feita ` a vista ($avista).
1 function CalculaValorFinal($compra, $avista) {
2 if (is_numeric($compra) && is_bool($avista)) {
3 if ($avista == true) $final = $compra
*
0.9;
4 if ($compra > 300) $final = $final
*
0.95;
5
6 return $final;
7 }
8 else
9 return 0;
10 }
C odigo 5.1: Exemplo de func ao: CalculaValorFinal()
Note que na linha 2 introduzimos a vericac ao de validade dos par ametros de entrada lembre-se
que as vari aveis n ao temtipo de dado pr e-denido, e dessa forma a vericac ao e fundamental para evitar
que o c odigo que chama a func ao envie valores inv alidos para os par ametros $compra e $avista.
Vejamos no c odigo 5.2 o exemplo de um procedimento, respons avel por imprimir os itens do menu
de umsite. Oprocedimento recebe como par ametro de entrada umvetor associativo, comos nomes das
sec oes do site e os respectivos links para cada p agina.
5.2.1 Uma observac ao sobre escopo de visibilidade de vari aveis
Ao escrever m odulos, temos que entender pela primeira vez um fen omeno denominado escopo de
visibilidade das vari aveis. Observe, por exemplo, o c odigo 5.2, da func ao CalculaValorFinal(). Os
par ametros, representados pelas vari aveis $compra e $avista s ao manipulados dentro do c odigo da
func ao para gerar o resultado nal. Por em, sua exist encia est a limitada ao tempo que a func ao e execu-
tada, e esse fato se aplica a todas as vari aveis criadas dentro da func ao.
Issosignica que, aot erminoda execuc aoda func ao, $compra, $avistae $finals aodestrudas ou,
em outras palavras, essas vari aveis s o s ao visveis dentro do c odigo da func ao. Dessa forma, n ao se deve
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 39
function ImprimeMenu($v) {
if (is_array($v)) {
echo <table border="0"><tr>;
foreach ($v as $nome => $link) {
echo <td bgcolor="#DDDDDD">;
echo "<a href=\"$link\">$nome<\a>";
echo </td>;
}
echo </tr></table>;
}
}
C odigo 5.2: Exemplo de func ao: ImprimeMenu()
considerar que uma vari avel criada dentro de uma func ao continua disponvel fora do seu c odigo. O
inverso tamb emn ao e recomend avel: uma func ao n ao deve contar coma exist encia de vari aveis de fora
criadas antes de sua execuc ao; todos os dados necess arios para o processamento devem ser denidos
como par ametros de entrada.
5.3- Criando bibliotecas de func oes: a func ao include()
Considere o exemplo da func ao ImprimeMenu() descrita acima. Se quisermos realmente reaprovei-
tar seu c odigo para imprimir o menu em v arias p aginas do site, seria interessante declarar a func ao uma
unica vez, em um arquivo separado. Assim, todas as p aginas acessariam a func ao a partir de um mesmo
lugar, e sua manutenc ao futura seria facilitada.
Para isso, podemos utilizar a func ao include("nomedoarquivo"), que executa todo o c odigo do
arquivo especicado como par ametro. Se o arquivo em quest ao for composto somente por c odigo de
declarac ao de func oes, o resultado ser a que todas as func oes estar ao disponveis a partir desse ponto.
Considere que a nossa func ao foi declarada no arquivo funcoes.php. No exemplo do c odigo 5.3, o
arquivo index.php executa o arquivo funcoes.php antes de chamar a func ao que imprime o menu do
site.
<?php
include("funcoes.php");
?>
<html>
<body>
<center>
<h1>Empresa X</h1>
<?php
$v = MenuDoSite();
ImprimeMenu($v); ?>
</center>
</body>
</html>
C odigo 5.3: Arquivo index.php imprime o menu do site atrav es da func ao ImprimeMenu()
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 40
E a func ao MenuDoSite()? Para realmente separar a denic ao do menu das p aginas do site, deni-
mos essa func ao, tamb em declarada emfuncoes.php, para apenas gerar e devolver o vetor associativo
com os nomes das sec oes do site e nomes dos links. Assim, se em algum momento as sec oes se modi-
cam, o arquivo funcoes.php e a unica parte do c odigo a ser modicada. Veja no c odigo 5.3 como ca a
vers ao nal do arquivo.
<?php
function MenuDoSite() {
$menu = array("Sobre nos" => "sobre.php",
"Produtos" => "produtos.php",
"Servicos" => "serv.php",
"Loja virtual" => "loja.php");
return $v;
}
function ImprimeMenu($v) {
if (is_array($v)) {
echo <table border="0"><tr>;
foreach ($v as $nome => $link) {
echo <td bgcolor="#DDDDDD">;
echo "<a href=\"$link\">$nome<\a>";
echo </td>;
}
echo </tr></table>;
}
}
?>
C odigo 5.4: Arquivo funcoes.php: uma pequena biblioteca de func oes
Mesmo que a tarefa da func ao MenuDoSite() pareca muito pequena para ser modularizada emuma
func ao, futuramente isso pode ser util: se a congurac ao das sec oes do site passar a ser armazenada em
uma tabela de umbanco de dados, nossa func ao poder a ser respons avel por trazer esses dados e gerar da
mesma forma o vetor $v, tornando o acr escimo de funcionalidade totalmente transparente para o resto
do c odigo do site
3
.
5.4- Exerccios
1. Considere o c odigo PHP abaixo:
1 <?php
2 extract($_REQUEST, EXTR_OVERWRITE);;
3
4 /
*
Suponha que existem campos chamados
5 caixa1, caixa2, caixa3, caixa4 e caixa5
6 no formulario chamador
7
*
/
8
3
Lembre-se que o acesso a banco de dados ser a estudado no Captulo 7
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 41
9 $soma = $caixa1 + $caixa2 + $caixa3;
10
11 function CalculaMedia($x, $y, $z) {
12 $soma = $x + $y + $z;
13 echo $soma;
14 $media = $soma / 3;
15 return $media;
16 }
17
18 $resultado = CalculaMedia($soma, $caixa4, $caixa5);
19
20 echo $resultado;
21 ?>
No c odigo acima, o que ser a impresso nas linhas 13 e 20?
2. Construa uma func ao Login($usuario, $senha) que devolve o valor booleano true para qua-
tro combinac oes diferentes de login e senha, ` a sua escolha.
3. Construa uma func ao Media($v) que recebe um vetor $v e devolve a m edia dos elementos do
vetor.
4. Construa uma func ao ImprimeVetor($v) que recebe um vetor $v e imprime seus elementos em
uma tabela. O maior elemento num erico do vetor deve ser impresso na cor azul (#0000FF) e o
menor elemento, na cor vermelha (#FF0000).
5. Construa e teste uma func ao JogoDaVelha($pos), em que o par ametro $pos e um vetor de nove
posic oes, que correspondem ` as 9 casas do jogo da velha. Cada posic ao do vetor deve ter apenas o
caracter O ou X. A func ao deve vericar todas as possibilidades de vit oria dos jogadores e devolver:
(i) o caracter O, se o jogador que joga com o crculo venceu; (ii) o caracter X se o jogador que joga
com o xis venceu; (iii) o caracter N se nenhum dos dois venceu.
CAPITULO 6
Gerenciando estado emrequisic oes
Ap os ler este captulo, voc e dever a ser capaz de:
Compreender o conceito de sess ao em requisic oes Web;
Utilizar sess oes e cookies para gerenciar o estado em sess oes;
Implementar usos tpicos de sess oes, como p aginas de login e carrinhos de compras.
6.1- Preservando dados e o protocolo HTTP
Devido ` a sua simplicidade, o protocolo HTTP traz um fundamental problema para a construc ao de
aplicac oes mais complexas: ele e dito um protocolo sem estado. Vamos entender o que isso signica.
Vimos anteriormente que uma aplicac ao Web e baseada emciclos de requisic ao e resposta, sendo que
emPHP os dados da requisic ao e gerac ao da resposta s ao tratados por umarquivo de extens ao
*
.php. Ao
nalizar a execuc ao do arquivo, os dados de todas as vari aveis s ao descartados.

E como se se a execuc ao
daquele mini-programa tivesse sido realmente nalizada em outras palavras, e como se o estado da
requisic ao se perdesse.
Por em, h a algumas situac oes onde gostaramos que alguns dados fossem preservados ` a medida que
requisic oes a v arias p aginas fossem feitas. Considere os exemplos abaixo:
Um site tem p aginas que podem ser visualizadas somente por usu arios autorizados. Em uma
p agina especial, o usu ario efetua sua autenticac ao (login) e desse momento em diante os dados
do usu ario devem estar disponveis para todas as p aginas que exigem autenticac ao.
Em uma loja online, o usu ario pode navegar por v arias p aginas escolhendo os produtos que deseja
comprar. A cada compra, os dados e quantidades de produtos comprados devem estar disponveis
a todas as p aginas at e o nal do processo e efetivac ao da compra.
Para solucionar problemas como esses, h a dois mecanismos para preservar os dados: os cookies e as
sess oes. Vamos ver as caractersticas dos dois mecanismos e como implement a-los em PHP.
6.2- Cookies
Um cookie e um pequeno arquivo-texto armazenado na m aquina cliente, cujos dados s ao enviados
em resposta a uma requisic ao HTTP feita a um site. Os dados de um cookie s ao enviados novamente ao
site em todas as novas requisic oes feitas; dessa forma, o cliente atua como um reposit orio dos dados
que se deseja preservar.
Tecnicamente falando, esses s ao os passos seguidos no protocolo HTTP para o envio de um cookie:
1. O navegador na m aquina cliente faz uma requisic ao a um site
42
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 43
GET /pagina.php HTTP/1.1
Host: www.site.com
2. O servidor envia no cabecalho da resposta o comando SetCookie:, que dene que o navegador
deve gravar um cookie com o valor passado, associado ao site da requisic ao
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: nome=valor
Todo cookie e composto por pares (nome, valor), como no exemplo acima.
3. Em toda nova requisic ao feita pelo navegador ao mesmo site, os dados do cookie ser ao enviados
atrav es do comando Cookie.
GET /pagina.php HTTP/1.1
Host: www.site.com
Cookie: nome=valor
Para solicitar o envio de um cookie, devemos chamar a func ao setcookie(nome, valor), onde
os par ametros nome e valor denem o nome e valor do cookie a ser enviado no cabecalho da res-
posta HTTP, conforme o mecanismo que estudamos acima. Como essa func ao modica diretamente o
cabecalho a ser gerado pelo servidor, n ao pode ser denido nenhumcaracter de sada antes da chamada
da func ao. Veja o exemplo abaixo:
<?php setcookie("visitado", "S"); ?>
<html>
<body>
<h1>Bem-vindo a esta pagina!</h1>
<?php
if (isset($_COOKIE["visitado"])) {
echo("Voce ja visitou esta pagina antes!");
}
?>
</body>
</html>
C odigo 6.1: Exemplo de envio de cookies utilizando setcookie()
Na primeira requisic ao a esta p agina, o cookie visitado com o valor S, e enviado junto com a res-
posta e gravado no cliente. A partir da segunda requisic ao, o valor do cookie j a e enviado. Para obter o
seu valor, o PHP disponibiliza o o vetor associativo superglobal $_COOKIE, e as chaves de seus elemen-
tos correspondem aos nomes denidos para os cookies. Assim, e possvel descobrir se a p agina j a foi
visitada por um determinado cliente.
Apesar do cookie ser uma soluc ao simples e independente de linguagem, ele tem duas limitac oes
fundamentais:
Onavegador pode bloquear o recebimento de cookies. Apesar desse ser umrecurso pouco utilizado
atualmente, de qualquer forma n ao e possvel garantir que o usu ario n ao v a utiliz a-lo
1
.
1
Quandoorecursode cookies comecoua ser implementado, por volta de 1995-96, havia otemor, divulgadona imprensa, que
os cookies representariamuma invas ao de privacidade e que poderiamroubar dados do computador cliente, da o recurso de
bloque a-lo pelo navegador. Por em, como voc e pode constatar, e bastante difcil que a gravac ao de dados feita por um cookie
represente algum risco.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 44
Figura 6.1: Esquema da implementac ao de sess oes com o uso de cookies
Agravac ao de dados de umcookie e limitada ao momento do envio do cabecalho da resposta HTTP.

E difcil atualizar esses dados ou contar com estruturas de armazenamento mais sosticadas.
Para superar essas limitac oes, o PHP e outras linguagens implementam o conceito de sess ao, que
estudaremos a seguir.
6.3- Sess oes
Uma sess ao pode ser entendida como uma area de armazenamento de dados, gerenciada pelo ser-
vidor, cujos dados podem ser lidos e atualizados pelas p aginas e s ao mantidos mesmo ap os v arias
requisic oes. A vantagem do uso de sess oes e que seus dados s ao disponibilizados em uma estrutura
de alto nvel pela linguagem, podendo ser lidos e escritos facilmente em qualquer ponto do c odigo.
Uma sess ao deve ser aberta antes de sua utilizac ao. Quando a sess ao e aberta, o PHP gera umn umero
identicador unico (sid) para a sess ao. Esse n umero e armazenado em um cookie no cliente, que dessa
forma permite que o servidor seja informado a cada requisic ao da exist encia da sess ao. Na Figura 6.1
exibimos esse esquema de implementac ao de sess oes.
6.3.1 Criando e utilizando sess oes emPHP
Uma sess ao deve ser inicializada antes do seu uso atrav es da chamada da func ao session_start();
todas as p aginas que desejam acessar dados da sess ao j a inicializada devem chamar essa func ao
tamb em. A sess ao ca aberta e seus dados disponibilizados at e que seja chamada a func ao
session_destroy().
Os dados da sesss ao s ao mantidos no vetor superglobal $_SESSION. Para adicionar umdado ` a sess ao,
basta criar uma chave no vetor e atribuir um valor a ela.
Quando a p agina inicial.php for requisitada pela primeira vez, a chamada ` a func ao
session_start() inicializa uma sess ao. A atribuic ao $_SESSION[valor] = 1; dene um ele-
mento do vetor que ser a mantido atrav es das requisic oes. Vamos comprovar que o elemento continua
disponvel ao requisitar a p agina pagina2.php.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 45
<?php session_start(); ?>
<html><body>
Esta e a primeira pagina. Vamos definir um valor na sessao.<br>
<?php $_SESSION[valor] = 1; ?>
Valor vale: <?php echo($_SESSION[valor]); ?>
<br>
<a href="pagina2.php">Proxima pagina</a>
</body></html>
C odigo 6.2: Exemplo de criac ao de sess ao - arquivo inicial.php
<?php session_start(); ?>
<html><body>
Esta e a segunda pagina. Aqui o valor ainda vale:
<?php echo($_SESSION[valor]); ?>
<br>
<a href="pagina3.php">Proxima pagina</a>
</body></html>
C odigo 6.3: Exemplo de criac ao de sess ao - arquivo pagina2.php
Nesse caso, como a sess ao j a havia sido inicializada, a chamada a session_start() apenas torna
visveis na p agina os dados que j a haviam sido armazenados no vetor $_SESSION. Dessa maneira, e
possvel acessar diretamente o elemento $_SESSION[valor].
6.4- Utilizando sess oes (1): p agina de login
Muitos sites da Web necessitam de algum mecanismo de autenticac ao, ou seja, apenas usu arios que
se identicam podem ter acesso a areas restritas do site. Sess oes ou cookies permitem a implementac ao
desse mecanismo, que pode ocorrer da seguinte maneira:
Uma p agina exibe um formul ario com campos de login e senha. Para o campo de senha, utiliza-se
a tag input type="password", que impede a exibic ao dos caracteres digitados;
Ao submeter o formul ario, os valores de login e senha s ao comparados com os valores v alidos.
Normalmente, esses dados est ao armazenados em um banco de dados;
Caso os valores sejam v alidos, e armazenado um cookie indicando que o acesso e permitido, ou e
aberta uma sess ao com um valor indicando essa mesma ocorr encia
2
;
Todas as p aginas de acesso restrito do site devem vericar se o login foi feito, atrav es da presenca
do cookie ou valor na sess ao antes de exibir seus dados. Caso o login n ao tenha sido feito, uma
mensagem de erro deve ser exibida.
2
Ambas as possibilidades s ao tecnicamente possveis, mas a abordagem utilizando sess oes e mais recomendada porque
diculta que um programador mal-intencionado falsique um cookie, obtendo acesso ao site sem se autenticar
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 46
No c odigo 6.4 ilustramos como pode ser feita uma implementac ao bem simples da autenticac ao.
Nesse exemplo, s o e possvel acessar com o login usuario e a senha 12345, mas na pr atica, ser a ne-
cess ario o acesso a banco de dados para validar v arios valores diferentes de login e senha
3
; al em disso
aplicac oes maiores dever ao modularizar a funcionalidade de forma mais ecaz
4
.
<?php
// Mesmo que o login seja invalido, temos que inicializar a sessao
session_start();
?>
<html>
<head><title>Teste de login</title>
<body>
<form action="testelogin.php" method="get">
Login: <input type="text" name="login"><br>
Senha: <input type="password" name="senha"><br>
<input type="submit" value="Entrar">
</form>
<?php
extract($_REQUEST, EXTR_OVERWRITE);;
if (isset($login) and isset($senha)) {
// Dados enviados, vamos verificar se sao validos
if ($login == "usuario" and $senha == "12345") {
// Dados validos, liberar um link para entrar no site
echo(<a href="restrito.php">Entrar no site</a>);
// Alem disso, e necessario guardar na sessao
// que o login foi realizado
$_SESSION[login] = $login;
}
else {
echo("Acesso nao permitido!");
}
}
?>
</body>
</html>
C odigo 6.4: Exemplo de funcionalidade de login - arquivo testelogin.php
O c odigo 6.5 mostra como pode ser implementada uma p agina de acesso restrito. Note que para exi-
bir a mensagem de erro, a p agina utiliza o recurso de inclus ao de arquivos que aprendemos no Captulo
5; assim, a p agina de erro s o precisa ser implementada uma unica vez.
6.5- Utilizando sess oes (2): carrinho de compras
Outra funcionalidade bastante utilizada e o carrinho de compras. Em um site cujo objetivo e vender
produtos, o usu ario normalmente navega por v arias p aginas, buscando os produtos que deseja comprar.

E interessante simplicar o processo de compra ao m aximo para o usu ario; quando ele encontra um
produto que deseja comprar, simplesmente indica a intenc ao de compr a-lo adicionando o produto ao
3
No Captulo 7 aprenderemos a acessar bancos de dados
4
Veja o exerccio 1 para um exemplo de modularizac ao da funcionalidade de login
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 47
<?php
// Agora, para obter os dados da sessao, caso existam
session_start();
if (isset($_SESSION[login])) {
echo "<h1>Bem vindo ao conteudo restrito!</h1>";
}
else {
// Voce pode definir um arquivo com o logo da empresa,
// uma mensagem padrao, etc...
include("erro.php");
}
?>
C odigo 6.5: Exemplo de p agina de acesso restrito - arquivo restrito.php
carrinho. Tecnicamente falando, isso corresponde a adicionar uma identicac ao do produto comprado
e sua respectiva quantidade comprada ` a sess ao, de forma a totalizar facilmente todos os itens comprados
quando o usu ario deseja nalizar o processo de compra.
Vamos construir um exemplo bem simples de carrinho de compras. O arquivo testecart.php
(C odigo 6.6) dene um vetor com tr es produtos de uma papelaria. Uma tabela e criada, onde cada li-
nha representa um produto e tem um formul ario, com um bot ao que envia o nome do produto em uma
requisic ao ` a pr opria p agina.
Quando a p agina e chamada em resposta ` a uma requisic ao (linha 14), denimos uma entrada no
vetor $_SESSION, com chave igual ao nome do produto e valor igual a quantidade de itens a comprar,
indicados no formul ario. Essa quantidade e adicionada ` a posic ao correspondente do vetor $_SESSION.
Note que a chamada usual ` a session_start(), que garante a exist encia da sess ao, continua em seu
lugar: no topo da p agina.
No arquivo testelistcart.php (C odigo 6.7) implementamos a funcionalidade de listagem dos
itens do carrinho de compras essa funcionalidade ser a util, por exemplo, quando o usu ario quiser re-
visar os itens j a comprados no momento de efetivar uma venda, ou mesmo para cancelar um item. Uti-
lizando o vetor $_SESSION, a implementac ao ca simples: basta utilizar o laco foreach para montar a
tabela de nomes e suas respectivas quantidades.
6.6- Exerccios
1. Implemente o C odigo 6.4, alterando o c odigo para utilizar a func ao Login() do exerccio 2 do
Captulo 5.
2. O objetivo deste exerccio e implementar uma soluc ao completa de formul ario em PHP. Voc e deve
criar um formul ario com os seguintes campos: nome, e-mail, sexo (radio button), escolaridade
(select), telefone xo, telefone celular, data de nascimento (em um unico campo) e senha. Voc e
deve vericar se todos os campos foram preenchidos de modo que, caso haja erros, seja exibida
uma mensagem para cada erro (acima do formul ario) e o formul ario possa ser corrigido com os
campos anteriormente preenchidos carregados. Caso n ao haja erros, deve ser gravado um cookie
como nome do usu ario. Ao entrar novamente na p agina, podemocorrer duas ac oes: ouo usu ario j a
se cadastroue osistema reconhece issopela confer encia docookie e, ent ao, exibe todos os registros,
ou o usu ario deve preencher o formul ario.
3. Tabela de Campeonato de Futebol. Monte um formul ario com duas caixas combo e duas caixas
de texto. Ambas as caixas combo devem ter o nome de cinco times de futebol, e as duas caixas de
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 48
1 <?php
2 session_start();
3
4 $produtos = array(lapis => 0.30,
5 borracha => 0.40,
6 caderno => 12.50);
7 ?>
8
9 <html><body>
10 <h1>Produtos da papelaria</h1>
11
12 <?php
13 extract($_REQUEST, EXTR_OVERWRITE);
14 if ($produto <> "") {
15 $_SESSION[$produto] = $_SESSION[$produto] + $qtde;
16 echo "<p>Produto adicionado ao carrinho com sucesso!</p>";
17 }
18 ?>
19
20 <table border="1">
21 <tr>
22 <td><b>Produto</b></td>
23 <td><b>Preco</b></td>
24 <td><b>Quantidade</b></td>
25 </tr>
26 <?php
27 foreach ($produtos as $prod => $preco) {
28 echo
29 <tr>
30 <td> . $prod . </td>
31 <td> . $preco . </td>
32 <form action="testecart.php" method="get">
33 <td>
34 <input type="text" name="qtde" size="2">
35 </td>
36 <td>
37 <input type="hidden" name="produto" value=" . $prod . ">
38 <input type="submit" value="Adicionar ao carrinho">
39 </td>
40 </form>
41 </tr>
42 ;
43 }
44 ?>
45 </table>
46 </body></html>
C odigo 6.6: Exemplo de p agina para compra de produtos com carrinho de compras - arquivo
testecart.php
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 49
texto devem permitir a entrada do placar de um jogo entre os dois times (por exemplo, se na pri-
meira caixa combo, o usu ario seleciona Corinthians, digita 2, seleciona S ao Paulo na segunda caixa
combo, e digita 3, isso registra um jogo Corinthians e S ao Paulo, com placar de 2 3). Armazene
a pontuac ao dos times na sess ao. A vit oria de um time vale 3 pontos e o empate vale 1 ponto para
cada time. Imprima uma tabela coma pontuac ao atualizada dos times a cada inserc ao de umjogo.
[Adicional: ordene os times em ordem decrescente de pontuac ao!]
4. Jogo da velha online. Implemente um jogo da velha, utilizando sess oes. Seu programa deve soli-
citar o nome dos jogadores 1 e 2 (um joga com o caracter O e o outro com o caracter X) e desenhar
a tela do jogo, onde as 9 posic oes do jogo s ao representadas por radio buttons (Figura 6.2). O jo-
gador escolhe a posic ao desejada e clica em Jogar. Ent ao, a p agina e recarregada, com a posic ao
correspondente marcada com o caracter do jogador, e as demais posic oes continuam sendo repre-
sentadas por radio buttons (Figura 6.3), dessa vez para que o segundo jogador faca sua jogada. O
funcionamento continua dessa forma, sucessivamente, at e que um jogador complete uma linha,
uma coluna, ou uma diagonal com o seu caracter. Para vericar se um jogador venceu, utilize a
func ao JogoDaVelha(), do exerccio 5 do Captulo 5.
Figura 6.2: Congurac ao inicial do jogo da velha
Figura 6.3: Congurac ao do jogo da velha ap os uma jogada do primeiro jogador
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 50
1 <?php
2 session_start();
3 ?>
4 <html>
5 <body>
6 <h1>Conteudo do carrinho de compras</h1>
7
8 <table border="1">
9 <tr>
10 <td><b>Produto</b></td>
11 <td><b>Quantidade</b></td>
12 </tr>
13 <?php
14 foreach ($_SESSION as $produto => $qtde) {
15 echo <tr><td> . $produto . </td>
16 <td> . $qtde . </td></tr>;
17 }
18 ?>
19 </table>
20
21 </body>
22 </html>
C odigo 6.7: Exemplo de listagem dos itens do carrinho de compras - arquivo testelistcart.php
CAPITULO 7
Acessando bancos de dados
Ap os ler este captulo, voc e dever a ser capaz de:
Compreender o conceito de conex ao a um banco de dados em PHP;
Compreender o funcionamento do plugin mysqli;
Construir aplicac oes que acessem bancos de dados.
7.1- Por que utilizar umbanco de dados?
Se voc e est a tendo seu primeiro contato com um banco de dados neste curso, esta sec ao foi escrita
para voc e. Se esse conceito j a lhe e familiar, e possvel pular essa sec ao sem qualquer problema.
Amaioria das aplicac oes comerciais lida comuma quantidade razo avel de dados (por exemplo, pense
emumsistema de controle de uma videolocadora, de umsupermercado, umsistema de controle de folha
de pagamento dos funcion arios de uma empresa). Esses dados s ao armazenados em arquivos no disco
rgido e, no caso de um sistema web, esses arquivos cariam armazenados no servidor. A princpio, o
programador interessado em armazenar os dados teria as seguintes preocupac oes:
Denir a estrutura de dados do arquivo, ou seja, denir emque ordemos dados seriamorganizados
empacotes (ou registros) a seremarmazenados ou recuperados de uma s o vez (por exemplo, para
um sistema de uma videolocadora, um registro de dados poderia ser composto pelo c odigo do
lme, ttulo do lme e quantidade de exemplares disponveis na loja).
Controlar a leitura e gravac ao dos dados e tamanho do arquivo. Na leitura e escrita de arquivos em
disco, o programador e respons avel por informar em qual posic ao cada registro ser a gravado. Uma
gravac ao sobre uma posic ao j a utilizada pode sobrescrever os dados anteriores, tal como aconte-
ceria em uma ta cassete
1
. A posic ao exata de gravac ao de um dado pode depender de alguns
c alculos; por exemplo, se um registro de dados ocupa 10 bytes e j a foram gravados 40 registros, o
arquivo j a tem 10 40 = 400 bytes utilizados. Assim, a pr oxima gravac ao aconteceria no byte de
n umero 401.
Parece ser um grande trabalho, e e mesmo. Infelizmente, ele s o tende a crescer ` a medida que o sis-
tema cresce e armazena mais informac oes. Para minimizar o problema para o programador, foram cri-
ados os Sistemas Gerenciadores de Banco de Dados (ou simplesmente SGBDs), que consistem em uma
camada intermedi aria entre a aplicac ao e os arquivos em disco. O programador precisa apenas denir,
em alto nvel, quais s ao as estruturas de dados a serem armazenadas em cada arquivo (chamado aqui
de tabela) e o SGBD se encarrega de organizar a leitura e escrita dos arquivos em disco da forma mais
eciente possvel.
Dentre outras caractersticas interessantes implementadas por um SGBD est ao o controle de
seguranca no acesso ao banco de dados e a garantia de recuperac ao de dados corrompidos. A discuss ao
1
N ao uso mais tas cassete h a cerca de 10 anos, mas infelizmente n ao achei exemplo melhor...
51
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 52
desses t opicos est a al em do escopo desta apostila; recomendamos que o leitor interessado procure um
livro especco da area.
7.2- Oacesso a bancos de dados na linguagemPHP
V arias extens oes ` a linguagem PHP s ao fornecidas por plugins, que s ao bibliotecas adicionais de
func oes que, uma vez instaladas, podem ser chamadas diretamente pela linguagem. O acesso a ban-
cos de dados e implementado tamb em dessa forma. Atualmente, s ao fornecidos plugins para acesso aos
seguintes SGBDs:
Firebird;
IBM DB2;
Microsoft SQL Server;
MySQL;
Oracle;
Paradox;
PostgreSQL;
Sybase.
E mais alguns sistemas menos conhecidos e utilizados. A desvantagem do acesso via plugins e que
cada banco de dados ter a func oes com sintaxe e utilizac ao diferentes, apesar do mesmo objetivo nal.
Em linhs gerais, um plugin vai disponibilizar func oes que executam as seguintes operac oes, em ordem:
Abrir uma conex ao ao banco de dados. Como o servidor de banco de dados pode ser uma m aquina
sicamente diferente daquela do servidor web, a comunicac ao entre ambos e tipicamente feita
utilizando-se o protocolo de rede TCP/IP. Isso acontece mesmo que o servidor web e o servidor de
banco de dados sejam a mesma m aquina, como e comum no ambiente de laborat orio que voc e
deve usar. Assim, o primeiro passo e iniciar uma conex ao de rede com o servidor, atrav es da qual
todas as demais comunicac oes ir ao ocorrer.
Enviar umcomando SQL ao servidor. Quase todos os bancos de dados atualmente utilizam a lingua-
gem SQL (Structured Query Language) para a especicac ao das operac oes de manipulac ao de
dados a serem executadas. O plugin de acesso deve disponibilizar func oes que recebem como
par ametro uma string contendo o comando SQL e o enviam para o servidor.
Vericar a resposta do servidor. Note que o plugin n ao deve fazer qualquer vericac ao sobre a validade
do comando SQL enviado, j a que essa e uma atribuic ao do SGBD. Assim, caso o comando enviado
tenha algumerro, o servidor de banco de dados dever a enviar a informac ao sobre o erro na resposta
ao comando, que ser a capturada emPHP atrav es da chamada a uma outra func ao. Al emdisso, caso
o comando SQL enviado seja uma consulta, os resultados da consulta tamb em dever ao ser obtidos
dentro da resposta ` a requisic ao.
Neste captulo, vamos estudar o uso do plugin mysqli, para acesso ao banco de dados MySQL. A
raz ao e simples: como vimos no Captulo 2, o MySQL foi o primeiro banco de dados suportado pelo
PHP e a base instalada de sistemas com a combinac ao PHP-MySQL e bastante signicativa. Mesmo na
construc ao de uma aplicac ao nova, partindo do zero, o uso do MySQL em seu estado atual e uma boa
opc ao.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 53
7.3- Func oes do plugin mysqli
Como vimos na sec ao anterior, o primeiro passo para acessar o MySQL e obter uma conex ao no
mysqli isso e obtido a partir da chamada ` a func ao mysqli_connect(). Sua sintaxe e a seguinte:
mysqli_connect(host, usuario, senha, nome_bd)
Vamos entender o signicado de cada um dos par ametros. host refere-se ao nome na rede da
m aquina que faz o papel de servidor do MySQL; usuario e senha devem ser um login e senha v alidos
no servidor e nome_bd e o nome do banco de dados a ser utiizado pela conex ao.
Suponha que temos um servidor MySQL sendo executado na m aquina SRV1, com login usuario e
senha 12345. Se quisermos acessar o banco de dados clientes a chamada completa ` a func ao seria:
$c = mysqli_connect("SRV1", "usuario", "12345", "clientes");
A vari avel $c que recebe o retorno da func ao representa uma refer encia ` a conex ao feita com o banco
de dados, caso ela tenha sido bem sucedida
2
. Essa refer encia ser a necess aria em todas as pr oximas
chamadas.
Por em, v arios problemas podem ter acontecido no momento da conex ao ao banco. O servidor pode
estar fora do ar, ou os dados de autenticac ao (usu ario e senha) podem estar incorretos, ou mesmo o
banco de dados referenciado pode n ao existir. Em quaisquer desses casos, n ao e possvel prosseguir.
Para vericar a ocorr encia de um erro, utilizamos duas func oes:
mysqli_connect_errno(): devolve 0 se n ao houve nenhum erro na ultima conex ao feita. Se
houve um erro, devolve o c odigo do erro, que ser a diferente de 0.
mysqli_connect_error(): recebe como par ametro a vari avel que representa a conex ao e de-
volve uma string com o texto da mensagem do ultimo erro, enviado pelo MySQL.
Podemos assim vericar a ocorr ecia de um erro na conex ao:
$c = mysqli_connect("SRV1", "usuario", "senha", "clientes");
if (mysqli_connect_errno() == 0) {
// Conexao Ok, podemos continuar!
} else {
$msg = mysqli_connect_error();
echo "Erro na conexao SQL!<br>";
echo "O MySQL retornou a seguinte mensagem: $msg";
}
Uma vez que temos uma conex ao v alida, podemos executar dois tipos de comandos SQL: as con-
sultas, utilizando o comando SELECT, cuja resposta s ao linhas de uma ou mais tabelas, e comandos de
alterac ao (INSERT, DELETE, UPDATE), que modicam linhas de uma tabela sem devolver nenhum re-
sultado como resposta. Ambas s ao executadas atrav es do comando mysqli_query(), cuja sintaxe e a
seguinte:
mysqli_query(conexao, comando)
Onde conexao deve representar a vari avel devolvida na execuc ao do mysqli_connect() e
comando e uma string contendo o c odigo SQL a ser executado no servidor. A forma de tratar o resul-
tado da func ao muda ligeiramente de acordo com o tipo do comando SQL passado, como veremos a
seguir.
2
Na realidade, a vari avel $c e umobjeto que representa a conex ao. Omysqli fornece vers oes orientadas a objeto de todas as
func oes discutidas neste captulo. Essas vers oes s ao omitidas aqui pois focamos a apresentac ao do PHP como uma linguagem
procedural.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 54
7.3.1 Tratando comandos SQL de alterac ao de dados
Para comandos de alterac ao de dados, a func ao mysqli_query() devolve true se a execuc ao acon-
teceu com sucesso e false caso contr ario. Em caso de falha, a func ao mysqli_error() pode ser cha-
mada para devolver a mensagemde erro gerada pelo MySQL
3
. Ela recebe como par ametro a vari avel que
representa a conex ao.
$result = mysqli_query($c, "INSERT INTO pessoa(id, nome, limitecredito) " .
"VALUES(1, Jose, 5000)");
if ($result == true) {
echo "Execucao bem sucedida do INSERT!";
} else {
$msg = mysqli_error($c);
echo "Falha no INSERT! Mensagem de erro: $msg";
}
Note que estamos separando a consulta em duas strings concatenadas apenas como um truque
para melhorar a est etica do c odigo. As strings s ao delimitadas por aspas duplas pois precisamos usar as
aspas simples dentro do c odigo SQL para delimitar as suas strings, de acordo comas restric oes de sintaxe
daquela linguagem.
Usando a funcionalidade de expans ao de strings, e muito simples adaptar o exemplo acima, adici-
onando um formul ario para que o usu ario digite os dados que deseja inserir na tabela pessoa, como
vemos no C odigo 7.3.1.
7.3.2 Tratando consultas SQL
Se o comando SQL executado for uma consulta, a func ao mysqli_query() devolve uma refer encia
ao resultado da consulta, que pode ser manipulado por duas outras func oes:
mysqli_num_rows(resultado)
mysqli_fetch_assoc(resultado)
mysqli_num_rows() devolve um inteiro representando a quantidade de linhas que o resultado da
consulta cont em. Normalmente, ao executar a consulta, esse e o primeiro passo para sua manipulac ao.
Ent ao, deve ser chamada a func ao mysqli_fetch_assoc() para obter os resultados de cada linha con-
tida no resultado. A func ao deve ser chamada tantas vezes quantas forem as linhas contidas no resul-
tado; assim, podemos usar um laco para percorrer todas as linhas trazidas na consulta. Cada chamada
` a func ao mysqli_fetch_assoc() devolve um vetor associativo; as chaves correspondem aos nomes
dos campos na tabela e cada valor associado e o valor daquele campo na linha atual da tabela.
Considere a tabela pessoa, que usamos no exemplo anterior. Se a tabela contiver os dados de exem-
plo mostrados na Tabela 7.1, a func ao mysqli_num_rows() devolve o valor 3. No C odigo 7.2, mostra-
mos um exemplo completo de consulta a todos os dados da tabela pessoa. Os dados ser ao impressos
na p agina em uma tabela HTML.
Na linha 7, a vari avel $consulta recebe o resultado da consulta, se houver
4
. A partir dela, a
func ao mysqli_num_rows($consulta) devolve o n umero de linhas retornado pela consulta. O
laco da linha 12 executa tantas repetic oes quantas forem as linhas da consulta, e em cada execuc ao
mysqli_fetch_assoc($consulta) devolve um vetor associativo com os campos da linha da tabela
3
Quando a aplicac ao est a em testes, e interessante imprimir o resultado de mysqli error() para identicar a causa de
possveis erros. Por em, quando a aplicac ao estiver nalizada, e aconselh avel retirar essas chamadas. Um usu ario mal intencio-
nado pode obter informac oes por esse meio sobre o ambiente do servidor para uma possvel invas ao. Por exemplo, note que e
muito f acil descobrir qual banco de dados e utilizado e sua vers ao.
4
Essa vari avel tamb em e do tipo objeto
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 55
<html>
<body>
<form action="insercao.php" method="get">
ID: <input type="text" name="id"><br>
Nome: <input type="text" name="nome"><br>
Limite de credito: <input type="text" name="limitecredito"><br>
<input type="submit" value="Inserir">
</form>
<?php
extract($_REQUEST, EXTR_OVERWRITE);
// Verificando se os parametros foram inseridos
if ($id == "" or $nome == "" or $limitecredito == "") {
echo "Preencha todos os campos!";
return; // Encerra o programa imediatamente
}
$c = mysqli_connect("SRV1", "usuario", "senha", "clientes");
if (mysqli_connect_errno() == 0) {
// Conexao Ok, podemos continuar!
$cmd = "INSERT INTO pessoa(id, nome, limitecredito) " .
"VALUES($id, $nome, $limitecredito)"
$result = mysqli_query($c, $cmd);
if ($result == true) {
echo "Execucao bem sucedida do INSERT!";
} else {
$msg = mysqli_error($c);
echo "Falha no INSERT! Mensagem de erro: $msg";
}
} else {
$msg = mysqli_connect_error();
echo "Erro na conexao SQL!<br>";
echo "O MySQL retornou a seguinte mensagem: $msg";
}
mysqli_close($c);
?>
C odigo 7.1: Exemplo completo de inserc ao de dados atrav es de um formul ario
id nome limitecredito
1 Jos e 5000
2 Maria 4000
3 Jo ao 4500
Tabela 7.1: Dados de exemplo da tabela pessoa
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 56
1 $c = mysqli_connect("SRV1", "usuario", "senha", "clientes");
2
3 if (mysqli_errno() == 0) {
4 // Conexao Ok, podemos continuar!
5
6 $consulta = mysqli_query($c, "SELECT
*
FROM pessoa");
7 $n = mysqli_num_rows($consulta);
8
9 echo <table border="1">;
10 echo <tr><td>ID</td><td>Nome</td><td>Limite de credito</td></tr>;
11
12 for ($i = 0; $i < $n; $i++) {
13 // $linha e um vetor associativo
14 $linha = mysqli_fetch_assoc($consulta);
15
16 //Imprimindo os elementos...
17 echo <tr><td> . $linha[id] . </td>;
18 echo <td> . $linha[nome] . </td>;
19 echo <td> . $linha[limitecredito] . </td></tr>;
20 }
21
22 echo </table>;
23
24 } else {
25 $msg = mysqli_error();
26 echo "Erro na conexao SQL!<br>";
27 echo "O MySQL retornou a seguinte mensagem: $msg";
28 }
C odigo 7.2: Percorrendo uma tabela utilizando repetic ao
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 57
trazida. Note que nas linhas 17 a 19, os elementos do vetor $linha tem como chave os nomes das colu-
nas da tabela. Os nomes das colunas da tabela devem ser referenciados exatamente como na denic ao
no MySQL, j a que o resultado da func ao mysqli_fetch_assoc diferencia a graa em mai usculas ou
min usculas.
7.4- Construindo aplicac oes maiores como conceito de controlador
Mostramos nas sec oes anteriores alguns exemplos onde as operac oes de manipulac ao de banco de
dados s ao implementadas em diferentes arquivos (e correspondendo a diferentes telas): inserc ao, lis-
tagem, exclus ao, e assim por diante, cada funcionalidade necessitaria de um arquivo diferente para ser
implementada. Para a construc ao de uma p agina de cadastro que executasse todas as operac oes b asicas,
essa estrat egia n ao seria interessante.
Para tornar as nossas aplicac oes mais modularizadas, apresentamos nesta sec ao uma estrat egia de
implementac ao de aplicac oes Web em geral, chamada de padr ao Modelo-Vis ao-Controlador (ou sim-
plesmente MVC). A id eia b asica do padr ao MVC e separar, no c odigo, a funcionalidade de manipulac ao
do banco de dados (implementada totalmente emPHP) da funcionalidade de exibic ao desses dados (im-
plementada emsua maior parte emHTML, apenas coma inserc ao de alguns comandos echo() quando
os dados a exibir s ao din amicos).
O controlador e um arquivo, somente com c odigo PHP, que recebe par ametros via requisic ao HTTP,
faz o processamento solicitado (ou seja, as operac oes no banco de dados) e redireciona a resposta para
outra p agina (normalmente, para o mesmo formul ario que chamou o controlador), permitindo que o
usu ario continue interagindo com o sistema.
Para redirecionar a resposta a uma requisic ao para outra p agina, usamos a func ao
header("Location: http://meusite.com/minhapagina.php");
Essa func ao adiciona ao cabecalho da resposta HTTP o comando Location, que indica que o na-
vegador no cliente deve carregar a p agina informada como par ametro. Esse truque permite que uma
p agina PHP que n ao imprime nenhum caracter possa redirecionar para uma outra p agina.
Considere a tabela pessoa, apresentada anteriormente. Vamos construir um controlador para cen-
tralizar as quatro operac oes a serem feitas sobre os dados: inserc ao, exclus ao, alterac ao e consulta. No
C odigo 7.3, mostramos o esquema geral do c odigo do controlador, com a operac ao de inserc ao imple-
mentada. O C odigo 7.4 mostra o formul ario preparado para enviar dados para o arquivo do controlador,
bem como receber mensagens de erro eventualmente enviadas por ele. Note como o c odigo do for-
mul ario ca bastante reduzido com essa estrat egia.
O controlador sempre espera receber um par ametro acao, a partir do qual e denida a operac ao
a ser executada, a partir da linha 16. Note que esse par ametro e enviado como um campo oculto do
formul ario, utilizando o type="hidden". Quando, por exemplo, a acao enviada para o controlador e
inserir, os demais par ametros esperados s ao utilizados para construir a linha do comando INSERT e
efetuar a inserc ao da mesma forma que nos exemplos anteriores. A diferenca e que as mensagens de erro
n ao s ao mais impressas; passam a ser atribudas a uma vari avel da sess ao. Quando redirecionamos de
volta para o formul ario, a mensagem de erro enviada (se houver) e impressa no alto da p agina.
Utilizando esta estrat egia, sua aplicac ao tende a ser mais facilmente administrada e estendida. In-
corporar novas ac oes em um controlador pr e-existente e mais simples. O design gr aco das p aginas
pode ser alterado mais facilmente, j a que h a menos c odigo PHP atrapalhando a leitura e compreens ao
das tags HTML. Nos exerccios deste captulo, voc e ser a convidado a completar o desenvolvimento do
controlador descrito, incorporando as operac oes de buscar, alterar e excluir registros. Vamos l a!
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 58
1 session_start(); // Para passar dados para cadastro.php
2 extract($_REQUEST, EXTR_OVERWRITE);
3
4 // Obtendo a conexao
5 $c = mysqli_connect("SRV1", "usuario", "senha", "clientes");
6
7 // Verificando por erros
8 if (mysqli_connect_errno() != 0) {
9 $err = mysqli_connect_error();
10 $msg = "Erro na conexao SQL!<br>";
11 $msg = $msg . "O MySQL retornou a seguinte mensagem: $err";
12 $_SESSION[msg] = $msg;
13 return;
14 }
15
16 if ($r_acao == "inserir") {
17 $cmd = "INSERT INTO pessoa(id, nome, limitecredito) " .
18 "VALUES($id, $nome, $limitecredito)"
19 $result = mysqli_query($c, $cmd);
20
21 if ($result == true) {
22 $_SESSION[msg] = "Insercao com sucesso!";
23 } else {
24 $err = mysqli_error($c);
25 $_SESSION[msg] = "Falha na insercao! Erro: $err";
26 }
27 }
28 else if ($r_acao == "buscar") {
29 // Agora e sua vez! Vide exerccio XXX
30 }
31 else if ($r_acao == "alterar") {
32 // Agora e sua vez! Vide exerccio XXX
33 }
34 else if ($r_acao == "deletar") {
35 // Agora e sua vez! Vide exerccio XXX
36 }
37
38 // No final, sempre redirecionamos para cadastro.php
39 $nome_do_servidor = $_SERVER[SERVER_NAME];
40 header("Location: http://$nome_do_servidor/cadastro.php");
C odigo 7.3: Exemplo parcial de um controlador
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 59
1 <?php session_start(); ?>
2 <html>
3 <body>
4 <!-- Caixa para a mensagem de erro que pode ser sido armazenada na sessao -->
5 <center>
6 <b><?php echo $_SESSION[msg]; ?></b>
7 </center>
8 <form action="controlador.php" method="get">
9 ID: <input type="text" name="id"><br>
10 Nome: <input type="text" name="nome"><br>
11 Limite de credito: <input type="text" name="limitecredito"><br>
12 <input type="hidden" name="acao" value="inserir">
13 <input type="submit" value="Inserir">
14 </form>
C odigo 7.4: Exemplo parcial do arquivo cadastro.php interface para um programa com o uso de con-
trolador
7.5- Exerccios
1. Modique a func ao Login($usuario, $senha) do exerccio 2 do Captulo 5 para que agora
seja feita uma busca em uma tabela usuarios, com campos login e senha pelos valores pas-
sados como par ametro. A func ao deve devolver true apenas se foi encontrada uma linha com os
par ametros passados, permitindo assim o login.
2. Construa uma p agina de login, com os campos usuais, chamada login.php. Ent ao, construa um
controlador que recebe como par ametros login e senha, chama a func ao Login() e, caso o re-
sultado seja positivo, redireciona para uma p agina restrito.php. Caso o resultado seja nega-
tivo (ou seja, os dados de login est ao incorretos), o controlador redireciona de volta para a p agina
login.php, mandando uma mensagem de erro dentro da sess ao. Essa mensagem deve ser im-
pressa para o usu ario emlogin.php.
3. Crie um formul ario com a estrutura dos campos da tabela pessoa (Tabela 7.1) e dois bot oes:
Pr oximo e Anterior. Toda vez que o usu ario clicar em Pr oximo, deve ser exibido o pr oximo registro
(se houver), e toda vez que clicar em Anterior, deve ser exibido o registro anterior (menos quando
o primeiro registro estiver sendo exibido. Dica: armazene na sess ao o n umero do registro atual e
utilize o modicador LIMIT do SELECT, disponvel no MySQL.
4. Crie uma p agina listagem.php, que exibe, em uma tabela HTML, os 10 primeiros registros
de uma tabela qualquer do banco de dados. Implemente os links Proxima pagina, Pagina
anterior, Primeira e

Ultima, para permitir navegac ao entre os registros.


5. Implemente a ac ao "buscar" no controlador. O c odigo da ac ao deve efetuar a busca na tabela
pessoa. Se uma linha foi trazida, armazenar os dados na sess ao, imprimindo-os posteriormente
dentro das caixas de texto em cadastro.php. Se nenhuma linha foi trazida, armazenar a mensa-
gem N ao encontrado! em $_SESSION[msg]. Para enviar dados para o controlador, adicione
um novo formul ario em cadastro.php, com uma caixa de texto para o usu ario digitar o ID da
linha a ser buscada.
6. Modique o arquivo cadastro.php da seguinte forma: se algumitemgerado no exerccio anterior
foi enviado na sess ao, altere a linha 12, mudando o campo para "alterar" (assim e possvel a
alterac ao de um registro que foi previamente trazido em uma busca).
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 60
7. Implemente a ac ao "alterar" no controlador. Ela deve receber os mesmos par ametros que a
ac ao "inserir", mas executar o comando SQL UPDATE na tabela.
8. Implemente a ac ao "deletar". Ela deve esperar umpar ametro $r_id, como IDda linha a apagar
da tabela. Implemente uma forma de chamar a ac ao "deletar" a partir do cadastro.php.
AP ENDICE A
Validando formul arios comjQuery
Ap os ler este ap endice, voc e dever a ser capaz de:
Efetuar a validac ao de formul arios antes do envio com o plugin Validation;
Utilizar caixas de entradas com m ascaras com o plugin MaskedInput.
A.1- Introduc ao
Neste ap endice n aovamos tratar exatamente de PHP, mas de algumas t ecnicas utilizandoa linguagem
Javascript. OJavascript e uma linguageminterpretada que pode ser embutida emp aginas HTML e, dessa
forma, e executada pelo navegador, no lado cliente. O fato de scripts (pequenos programas) escritos em
Javascript serem executados no lado cliente abre a possibilidade de implementar in umeros recursos nas
p aginas de uma aplicac ao Web de forma a torn a-la mais din amica
1
. N ao e objetivo dessa apostila esgotar
o assunto, e convidamos o leitor interessado a procurar outros livros e refer encias.
As t ecnicas que vamos apresentar neste ap endice t em como objetivo solucionar uma das maiores
diculdades com que o programador principiante se depara: fazer a validac ao dos dados que o usu ario
insere em um formul ario HTML. Um formul ario de cadastro normalmente cont em dezenas de itens,
cada qual com uma especca regra de validac ao: alguns campos n ao podem ser deixados em branco,
outros devem aceitar apenas valores num ericos, outros devem contem um endereco de email v alido, e
assim por diante. Felizmente, existem bibliotecas de func oes JavaScript j a desenvolidas que facilitam a
implementac ao da validac ao nas p aginas HTML talvez a mais popular destas seja o jQuery, uma bibli-
oteca construda como objetivo de facilitar a manipulac ao de elementos do HTML atrav es do Javascript.
No restante deste ap endice vamos apresentar, atrav es de um exemplo, como o jQuery pode ser utilizado
para a validac ao dos dados de um formul ario.
A.2- Oexemplo
No nosso exemplo, iremos construir um formul ario de cadastro simples com os campos nome,
endereco, telefone, email e quantidade de itens (supondo que o formul ario serve para algum tipo de
compra). A vers ao original do formul ario e apresentada no C odigo A.1.
Os requisitos de validac ao que vamos implementar ao longo do exemplo s ao os seguintes:
Todos os campos, com excec ao do endereco, s ao de preenchimento obrigat orio;
O campo telefone deve seguir o padr ao brasileiro, precedido por dois dgitos de DDD, no formato
(99) 9999-9999;
O campo email deve ser preenchido com um email em formato v alido;
O campo da quantidade de itens deve ser num erico e maior que zero.
1
As aplicac oes web que implentam tais recursos formam aquilo que atualmente se denomina a Web 2.0
61
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 62
<html>
<body>
<i>Os campos marcados com
*
sao de preenchimento obrigatorio</i>
<form method="get" action="">
Nome: <input type="text" name="nome">
*
<br>
Endereco: <input type="text" name="endereco"><br>
Telefone: <input type="text" name="telefone">
*
<br>
Email: <input type="text" name="email">
*
<br>
Quantidade de itens: <input type="text" name="qtde">
*
<br>
<input class="submit" type="submit" value="Enviar">
</form>
</body>
</html>
C odigo A.1: C odigo inicial do formul ario
Inicialmente, precisaremos baixar o c odigo do jQuery e dos plugins associados que utilizaremos, nos
seguintes enderecos:
jQuery: http://www.jquery.com
Plugin Validation: http://bassistance.de/jquery-plugins/jquery-plugin-validation/
Plugin MaskedEdit: http://digitalbush.com/projects/masked-input-plugin/
Os arquivos comextens ao .js cont emo c odigo das bibliotecas e s ao relativamente pequenos, de forma
a facilitar a sua inclus ao nas aplicac oes web sem aumentar signicativamente o tempo de download das
mesmas.

E uma boa pr atica manter esses arquivos em um diret orio separado do seu servidor, por exem-
plo jscripts. Ap os esse passo, vamos adicionar a tag <script> na sec ao <head> do nosso exemplo,
para permitir o uso das func oes do jQuery e do plugin. As tags adicionadas s ao mostradas no C odigo
A.2
2
.
A maioria das func oes do jQuery exigem que os elementos HTML tenham o atributo id denido. No
nosso caso, a tag <form> deve ser modicada da seguinte forma:
<form id="cadastro" method="get" action="">
A seguir, as tags dos elementos que ser ao validados devem ser alteradas para adicionar o atributo
class, que devem contem um ou mais valores denidos na Tabela A.2.
O pr oximo passo consiste em incluir um pequeno script com a linha:
2
Os nomes de arquivos mostrados no exemplo correspondem ` a vers ao mais atual no momento da escrita da apostila. Pro-
cure usar sempre a vers ao mais atual das bibliotecas mencionadas.
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 63
<head>
<script src="/jscripts/jquery-1.6.1.min.js" type="text/javascript">
</script>
<script src="/jscripts/jquery.validate.min.js" type="text/javascript">
</script>
<script src="/jscripts/jquery.maskedinput-1.3.min.js" type="text/javascript">
</script>
</head>
C odigo A.2: C odigo para uso das bibliotecas do jQuery e dos plugins
Valor Funcionamento
required O campo e requerido para que o formul ario seja enviado
url O campo deve conter uma URL v alida
email O campo deve conter um endereco de email v alido
date O campo deve conter uma data
3
digits O campo deve conter somente dgitos
Tabela A.1: Alguns valores possveis para o atributo class
Valor Funcionamento Exemplo
minlenght O campo deve ter comprimento mnimo em caracteres minlenght="2"
maxlenght O campo deve ter comprimento m aximo em caracteres maxlenght="50"
min O campo e num erico e deve ter um valor mnimo min="0"
max O campo e num erico e deve ter um valor m aximo max="0"
Tabela A.2: Alguns valores possveis para os atributos adicionais
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 64
<script type="text/javascript">
$(document).ready(function() {
$("#cadastro").validate();
}
);
</script>
Basicamente, a chamada $(document).ready() permite denir uma func ao a ser execu-
tada quando a p agina for completamente carregada. Essa func ao, sem nome, executa o m etodo
$("#cadastro").validate(), que ativa a vericac ao do formul ario de acordo com a congurac ao
feita. $("#cadastro") e uma vari avel do jQuery que referencia o elemento do documento HTML com
id cadastro, ou seja, nosso formul ario.
<html>
<head>
<script src="/jscripts/jquery-1.6.1.min.js" type="text/javascript">
</script>
<script src="/jscripts/jquery.validate.min.js" type="text/javascript">
</script>
<script src="/jscripts/jquery.maskedinput-1.3.min.js" type="text/javascript">
</script>
<script type="text/javascript">
$(document).ready(function() {
$("#cadastro").validate();
}
);
</script>
</head>
<body>
<i>Os campos marcados com
*
sao de preenchimento obrigatorio</i>
<form id="cadastro" method="get" action="">
Nome: <input type="text" name="nome" class="required">
*
<br>
Endereco: <input type="text" name="endereco"><br>
Telefone: <input type="text" name="telefone" class="required">
*
<br>
Email: <input type="text" name="email" class="required email">
*
<br>
Quantidade de itens: <input type="text" name="qtde" class="required">
*
<br>
<input class="submit" type="submit" value="Enviar">
</form>
</body>
</html>
C odigo A.3: C odigo do formul ario ap os congurado para as vericac oes b asicas
No nosso exemplo, usaremos os valores required e email para denir a validac ao dos campos de
preenchimento obrigat orio e do campo email, incluindo o script acima e modicando nosso arquivo da
forma apresentada no C odigo A.3.
Algumas validac oes adicionais s ao possveis adicionando atributos ` as tags das caixas de texto. Na
Tabela A.2 apresentamos alguns desses valores.
No nosso exemplo, precisamos adicionar o atributo min na caixa de texto do campo quantidade de
itens para garantir que o valor inserido e maior ou igual a um. A alterac ao e a seguinte:
Quantidade de itens:
<input type="text" name="qtde" class="required" min="1">
*
<br>
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 65
Figura A.1: Mensagens de erro padr ao em ingl es
Com essa ultima alterac ao, a validac ao estar a funcionando; por em, as mensagens de erro seguem
um padr ao em ingl es. Na Figura A.1 apresentamos como aparecer ao as mensagens de erro padr ao caso
nenhum campo tenha sido preenchido. Para customizar as mensagens de erro, e necess ario incluir o
par ametro adicional messages na chamada ao m etodo validate(), adicionando as mensagens que
devem ser exibidas para cada campo e em cada crit erio de validac ao. Os nomes dos campos s ao os
mesmo denidos no formul ario e os nomes dos crit erios s ao os mesmos includos anteriormente. No
C odigo A.4 apresentamos a alterac ao no script para congurar as mensagens.
<script type="text/javascript">
$(document).ready(function() {
$("#cadastro").validate({
messages: {
nome: "O campo nome e requerido",
telefone: "O campo telefone e requerido",
email: {
required: "O campo email e requerido",
email: "Por favor, digite um email valido"
},
qtde: {
required: "O campo quantidade e requerido",
min: "A quantidade deve ser maior ou igual a 1"
}
}
}
);
}
);
</script>
C odigo A.4: Alterac ao no script para customizar as mensagens de erro
Agora, temos que implementar o formato xo de entrada de dados para o campo telefone; essa fun-
cionalidade e fornecida pelo plugin MaskedEdit, cujo c odigo j a foi adicionado ` a nossa p agina no comeco
do nosso exemplo. O formato xo de entrada chamado m ascara e denido apenas incluindo uma
chamada ao m etodo mask() na vari avel jQuery que representa o campo telefone:
$("#telefone").mask("(99) 9999-9999");
Alinha acima deve ser adicionada dentrodoblocofunctionj a denidoanteriormente. Opar ametro
do m etodo mask() e uma string denindo a m ascara. O caracter 9 dene uma posic ao num erica na
m ascara; o caracter a dene uma posic ao para inserc ao de uma letra (mai uscula ou min uscula) e o ca-
Instituto Federal de S ao Paulo - Linguagem PHP - Prof. Thiago S. Barcelos [Vers ao 3.0] 66
Figura A.2: Preenchimento do campo telefone com a m ascara de validac ao denida
racter
*
dene uma posic ao que aceita n umeros ou letras. Qualquer outro caracter usado na m ascara
ser a mostrado sem modicac oes na sada, como e o caso dos par entesis na m ascara acima. A gura A.2
mostra o formato do campo durante a digitac ao do usu ario.
Assim, vimos neste ap endice como a biblioteca jQuery fornece alguns recursos de implementac ao
simples, mas ao mesmo tempo poderosos para melhorar a entrada de dados em nossas aplicac oes Web.

You might also like