Você está na página 1de 768

Prim eiros Elogios ao Use a Cabea!

PHP & MySQL

PHP e MySQL so duas das tecnologias de desenvolvimento web mais populares


de hoje em dia, e este livro mostra aos leitores o porqu. Criar um site sem elas,
atualmente, to inimaginvel quanto fazer web design sem CSS. Este livro uma
tima introduo e tambm uma boa fonte de risadas. E o livro que eu queria ter
tido quando estava aprendendo.
Harvey Quamen, Professor ssociado de Ingls e Humanities Computing,
Universidade de Alberta

Tudo o que nos acostumamos a aceitar como trabalho pesado no processo de aprendizado
tcnico foi abandonado, e em seu lugar foi criado um incomum mtodo de aprendizado
divertido. Eu tenho plena confiana de que a srie Use a Cabea! ir revolucionar a
indstria de livros tcnicos, e que estes mtodos acabaro se tornando o padro. Aposto
que at a minha av tecnofbica poderia aprender tcnicas de PHP e MySQL aps uma
nica leitura. Ela provavelmente ainda se divertiria ao faz-lo!
Will Harris, Administrador de Bancos de Dados, Powered By Geek

Ler Use a Cabea! PHP 8c MySQL como assistir a uma aula do professor legal. Faz voc
ficar com vontade de aprender.
----Stephanie Liese, Desenvolvedora Web

Usando imagens e humor, o livro fcil de digerir, e ainda por cima apresenta um slido
conhecimento tcnico.
Jereme Alien, Desenvolvedor Web

Aps uma desafiadora e ultrarrpida primeira leitura, e vrios projetos prticos divertidos,
como por exemplo Meu cachorro foi abduzido por aliengenas e a Agncia de
Encontros Mismatch, no vejo a hora de adicionar um pouco de PHP aos meus sites.
David Briggs. Engenheiro de Software e Escritor de Livros Tcnicos
Elogios ao Use a Cabea! HTML com CSS & XHTM L

Eric e Elisabeth Freeman claramente entendem do assunto. medida que a Internet vai
se tornando mais complexa, fica cada vez mais importante criar pginas web atraentes. O
design elegante o cerne de todos os captulos aqui, e cada conceito apresentado com
doses iguais de pragmatismo e inteligncia.
Ken Gold-Stein, Vice-Presidente Executivo & Diretor-Gerente, Disney Online
A web seria um lugar muito melhor se todo designer HTML comeasse lendo este livro.
L. David Baron, Diretor Tcnico de Layout & CSS, Mozilla Corporation,
http://dbaron.org/
Eu escrevo HTML e CSS h dez anos, e o que antes era um longo processo de aprendizado
por tentativa e erro agora acaba de ser reduzido a um nico e atraente livro. HTML
costumava ser algo que voc simplesmente ficava fuando at que as coisas ficassem
bem na tela, mas com o advento de padres web e a exigncia de melhor acessibilidade,
prticas de programao preguiosas j no so mais aceitveis... nem do ponto de vista
empresarial, nem do ponto de vista da responsabilidade social. Use a Cabea! HTML
com CSS & XHTML lhe ensina como fazer as coisas corretamente desde o princpio, sem
fazer com que o processo parea impossvel de aprender. A linguagem HTML, quando
corretamente ensinada, no mais complicada do que aprender ingls, e os Freemans
izerm um excelente trabalho em manter todos os conceitos compreensveis.
Mike Davidson, Presidente & CEO, Newsvine Inc.
Ah, timo. Vocs fizeram um livro de XHTML simples o suficiente para que um CEO
consiga entend-lo. O que faro a seguir? Um livro de contabilidade simples o suficiente
para que o meu desenvolvedor consiga entender? Se continuar assim acabaremos tendo de
fazer coisas como colaborar e trabalhar em equipe.
Janice Fraser, CEO, Adaptive Path
Este livro tem humor, charme, mas o mais importante: tem corao. Eu sei que parece
algo ridculo de se dizer sobre um livro tcnico, mas eu realmente percebo que, no seu
cerne, este livro (ou pelo menos os seus autores) realmente est preocupado em fazer os
leitores aprenderem o material. Isso se faz notar no estilo, na linguagem e nas tcnicas. O
aprendizado - realmente entender e compreender - pelo leitor claramente o objetivo
nmero um na mente dos Freemans. E obrigado, obrigado, obrigado pela forte e
sensvel insistncia que o livro prega pelo respeito aos padres. timo ver um livro para
iniciantes, o qual acredito, que vai ser amplamente lido e estudado, fazer uma campanha
to eloquente e persuasiva pelo valor do respeito aos padres na programao de pginas
web. Encontrei aqui at mesmo alguns argumentos que ainda no tinham-me ocorrido
- argumentos que eu posso me lembrar e usar quando as pessoas me perguntam, e elas
perguntam, qual a vantagem de respeitar os padres, e por que eu devo faz-lo? Agora
eu tenho mais munio! Tambm gostei do fato de o livro apresentar alguns fundamentos
sobre a mecnica de como realmente colocar a pgina no ar - FTP, fundamentos do
servidor web, estruturas de arquivos, etc.
Robert Neer, Diretor de Desenvolvimento de Produto, Movies.com
Elogios ao Use a Cabea! JavaS cript

To prtico e til, e to bem-explicado. Este livro faz um excelente trabalho dt^apresentar


um iniciante total ao JavaScript, e mais uma prova da eficincia do mtodo d ensino
Use a Cabea! De todos os outros livros de JavaScript, Use a Cabea! JavaScript
timo para aprender, comparado com outros livros de referncia do tamanho de listas
telefnicas.
Alex Lee, Estudante, Universidade de Houston

Uma excelente opo para o desenvolvedor JavaScript iniciante.


Fletcher Moore, Desenvolvedor e Designer Web, Georgia Institue of
Technology

Mais um timo livro no clssico estilo Use a Cabea!


TW Scannell

O JavaScript vem sendo h bastante tempo o sistema por trs das pginas web, no lado
do cliente, mas vem sendo tambm mal entendido e mal utilizado. Com Use a Cabea!
JavaScript, Michael Morrison apresenta uma introduo direta e fcil de entender sobre
a linguagem, removendo quaisquer mal entendidos que possam ter existido e mostrando
como us-la da forma mais eficiente para melhorar suas pginas web.
Anthony T. Holdener UI, Desenvolvedor de aplicaes web e autor de Ajax: O
Guia Definitivo

Uma pgina web tem trs partes - contedo (HTML), aparncia (CSS) e comportamento
(JavaScript). Use a Cabea! HTML apresentou os dois primeiros, e este livro usa a mesma
abordagem divertida e prtica para introduzir o JavaScript. A forma divertida com que o
livro apresenta o JavaScript, e as muitas formas como ele refora as informaes para que
voc no as esquea, fazem deste um livro perfeito para iniciantes usarem para comear a
aprender a tomar suas pginas web interativas.
Stephen Chapman, Dono da Felgall Pty Ltd., editor de JavaScript de about.com

Este o livro que eu estive procurando para recomendar aos meus leitores. E simples o
suficiente para totais iniciantes, mas inclui aprofundamentos suficientes para ser til aos
usurios mais avanados. E toma divertido o processo de aprendizado. Este pode acabar
sendo o nico livro de JavaScript de que voc precisar.
Julie L. Baumler, Editora de JavaScript de BellaOnline.com
Outros livros da srie Use a Cabea!
U se a C ab ea! Java

U se a C ab ea! A nlise & Projeto O rientado a O bjetos (A & P O O )

U se a C a b ea! A jax Iniciao R pida

U se a C ab ea! H T M L com C S S e X H T M L

U se a C a b ea! P adres de Projeto

U se a C a b ea! S ervlets e J S P

U se a C a b e a! P M P

U se a C a b ea! S Q L

U se a C abea! D esenvolvim ento d e S oftw are

U se a C a b ea! JavaS cript

U se a C ab e a! C #

U se a C abea! P H P & M y S Q L

U se a C ab ea ! Fsica

U se a C ab e a! lgebra

U se a C ab e a! A jax Profissional

U se a C ab ea ! E statstica

U se a C ab e a! R uby on Rails
Use a Cabea! PHP & MSQL

v -
ALTA BOOKS
EDI TORA
Rio de Janeiro 2010
Use a Cabeal PHP & MySQL
Copyright 2010 da Starlin Alta Con. Com. Ltda.
ISBN: 978-85-7608-502-7
Produo Editorial: Translated From Original: Head First PHP & MySQL ISBN: 978-0-
Starlin Alta Con. Com. Ltda. 596-00630-3
Use a Cabea.! PHP & MySQL 2010 Starlin Alta Con. Com. Ltda.
Gerncia de Produo: Authorized translation of the English edition of Head First PHP & MySQL
Maristela Almeida 2009 Lynn Beighley and Michael Morrison. This translation ispublished
and sold by permission of OReilly Media, Inc., the owner of all rights to
Coordenao Administrativa: publish and sell the same. PORTUGUESE language edition published by
Anderson Cmara Editora Starlin Alta Con. Com. Ltda. Copyright 2010 by Editora Starlin
Alta Con. Com. Ltda.
Superviso de Produo:
Angel Cabeza Todos os direitos reservados e protegidos pela Lei ne 9.610/98. Nenhuma
parte deste livro, sem autorizao prvia por escrito da editora, poder
Traduo: ser reproduzida ou transmitida sejam quais forem os meios empregados:
Marcelo Santos eletrnico, mecnico, fotogrfico, gravao ou quaisquer outros. Todo o
esforo foi feito para fornecer a mais completa e adequada informao,
Reviso Gramatical: contudo a editora e o(s) autor(es) no assumem responsabilidade
Ftima Regina Flix pelos resultados e usos da informao fornecida. Recomendamos aos
leitores testar a informao, bem como tomar todos os cuidados necessrios
Reviso Tcnica; (como o backup), antes da efetiva utilizao. Este livro no contm
Giuliana Cirelli CD-ROM, disquete ou qualquer outra mdia.
Formada em Engenharia Eltrica
com nfase em eletrnica. Erratas e atualizaes: Sempre nos esforamos para entregar
Especializada em Programao a voc, leitor, um livro livre de erros tcnicos ou de contedo;
em linguagem C++ e nos porm, nem sempre isso conseguido, seja por motivo de
mudana de software, interpretao ou mesmo quando alguns
ambientes de desenvolvimento deslizes constam na verso original de alguns livros que
Eclipse e Visual Studio. traduzimos. Sendo assim, criamos em nosso site, www.altabooks.com.
br, a seo Erratas, onde relataremos, com a devida correo, qualquer
Diagramao: erro encontrado em nossos livros.
Haroldo Sodr Avisos e Renncia de Direitos: Este livro vendido como est, sem
garantia de qualquer tipo, seja expressa ou implcita.
Fechamento:
Luis Rodrigues Marcas Registradas: Todos os termos mencionados e reconhecidos
como Marca Registrada e/ou comercial so de responsabilidade de seus
proprietrios. A Editora informa no estar associada a nenhum produto
e/ou fornecedor apresentado no livro. No decorrer da obra, imagens, nomes
de produtos e fabricantes podem ter sido utilizados e, desde j, a Editora
informa que o uso apenas ilustrativo e/ou educativo, no visando ao
lucro, favorecimento ou desmerecimento do produto/fabricante.
Impresso no Brasil
O cdigo de propriedade intelectual de Io de julho de 1992 probe
expressamente o uso coletivo sem autorizao dos detentores do direito
autoral da obra, bem como a cpia ilegal do original. Esta prtica generalizada,
nos estabelecimentos de ensino, provoca uma brutal baixa nas vendas dos
livros a ponto de impossibilitar os autores de criarem novas obras.

ALTA BOOKS
EDI TORA
Rua Viva Cludio, 291 - Bairro Industrial do Jacar
TFP- 9n07<vn31 -R in Ar Tan^irn-Tfl 71 377R-SW0/S41 0 R iy- 71 3777-17^3
Para os meus pais, que frequentemente usam aplicaes web e
esto sempre me apoiando
- Lynn Beighley

Para Rasmus Lerdorf, que iniciou sozinho a linguagem que


acabaria se tornando o PHP como ns o conhecemos. Prova
duradoura de que realmente basta uma pessoa para liderar a
todos ns em direo a um caminho novo e mais esclarecido.
- Michael Morrison
o(s) autor{es)

Os Autores de Use a Cabepa! PttP S- MySQL

\,VtC^
Mo'r'f'SOir'

Lynn Beighley uma escritora de


fico presa no corpo de uma escritora Michael Morrison tem sido um
de livros tcnicos. Aps descobrir que contribuinte entusiasmado ao mundo
escrever livros tcnicos realmente dava online desde quando mantinha um BBS
dinheiro, ela aprendeu a aceitar e no seu Commodore 64, na poca em
desfrutar a profisso. Depois de voltar que ser nerd era bem menos maneiro
escola para obter um Mestrado em do que hoje em dia. Alguns milhares de
Cincia da Computao, trabalhou bauds depois, ele ainda fica fascinado
para os acrnimos NRL e LANL. com o progresso que fizemos, e com que
Depois, descobriu o Flash e escreveu rapidez. Michael no tem mais um BBS,
seu primeiro best-seller. Vtima de um mas ainda se mantm bastante envolvido
timing infeliz, mudou-se para Silicon com os equivalentes modernos e com
Valley pouco antes da grande crise. as ferramentas que usamos para cri-los.
Passou alguns anos trabalhando para Ele passa a maior parte do seu tempo
o Yahoo! e escrevendo outros livros oficial escrevendo sobre tecnologias
e cursos de treinamento. Finalmente relacionadas com a web, tendo escrito
rendendo-se sua vocao de escritora, ou co-escrito mais de cinquenta livros,
mudou-se para a rea de Nova Iorque a respeito desde programao de
para obter um MFA em Escrita Criativa. jogos para celulares at XML. Entrou
Sua tese, escrita no estilo Use a Cabea!, no universo Use a Cabea! com Use a
foi defendida diante de uma sala lotada Cabea! JavaScript e no parou mais.
de professores e colegas estudantes.
Foi extremamente bem-recebida, e ela Michael tambm o fundador da Stalefish
terminou seu curso, terminou Use a Labs (www.stalefishlabs.com, uma empresa
Cabea! SQL, e acabou de terminar Use de entretenimento especializada em jogos,
a Cabea! PHP f MySQL. Ufa! brinquedos e mdia interativa. E j foi
visto passando tempo fora da Internet (o
Lynn adora viajar, escrever e inventar qu?!) andando de skate, jogando hquei
histrias detalhadas sobre totais no gelo e cuidando do seu lago de carpas
estranhos. Ela tem um pouco de medo com sua esposa Masheed. Ele at mesmo
de OVNIs. dorme, de vez em quando.
contedo

Contedo (Sumrio)
Introduo xxvii
1 Est Vivo: A dicionando Vida s Suas Pginas Estticas 1
2 Com o Tudo se Com bina: Conectando-se ao MySQL 59
3 C riando os Seus Prprios Dados: Crie e P reen ch a um Banco de Dados 103
4 Sua Aplicao na Web: Aplicaes Realistas e Prticas 159
5 Q uando um Banco de Dados N o o Suficiente: T rabalhando com
Dados A rm azenados em Arquivos 223
6 Presum a que Esto Todos Q ueren d o Te Pegar: T o m an d o a Sua Aplicao Segura 295
7 L em bra de Mim?: C riando A |icaes Web Personalizadas 345
7V4 C om partilhar Cuidar: Elim ine Cdigo D uplicado 417
8 C olhendo Dados: C ontrole Seus Dados, C ontrole Seu M undo 427
9 Vivendo M elhor Atravs das Funes: Funes String e Personalizadas 501
10 Regras Para Substituio: Expresses Regulares 561
11 D esenhando Grficos Dinmicos: Visualizando seus Dados...e Mais! 605
12 Interfaces com o M undo: Republicao e Servios Web 657
i Os Dez Principais Tpicos (Q ue N o A bordam os): Sobras 713
ii Um Lugar para Brincar: C onfigure um A m biente de Desenvolvim ento 731
iii O b ten h a A inda Mais Proveito: Amplie Seu PHP 749
ndice Remissivo 755

Contedo (a coisa real)


Introduo
Seu crebro ligado no PHP e MySQL. voc est tentando
aprender alguma coisa, enquanto o seu crebro est lhe fazendo um favor ao

certificar-se de que voc no aprenda. Seu crebro est pensando melhor guardar

espao para coisas mais importantes, como por exemplo, quais animais selvagens

evitar e se fazer yoga em baixo d'gua uma boa ideia". Ento, como enganar o seu

crebro, fazendo-o pensar que a sua vida depende de aprender PHP e MySQL?

A quem se destina este livro? xxvi


Sabemos o que voc est pensando xxix
Metacognio xxxi
Faa seu crebro lhe obedecer xxxiii
Leia-me xxxiv
Reviso tcnica xxxvi
Agradecimentos xxxvii
ix
contedo (sumrio)

Adicionando Vida s Suas Paginas Estticas

Est Vivo
Voc tem criado timas pginas web com HTML, com
toques de CSS. Mas tem percebido que os visitantes do seu site no podem
fazer muita coisa alm de olhar passivamente o contedo das pginas. A comunicao

est unidirecional, e voc gostaria de mudar isso. Na verdade, o que voc realmente

gostaria de saber o que o seu pblico est pensando. Mas para isso preciso

permitir que os usurios digitem informaes em um formulrio web, para que possa

saber o que eles tm em mente. E tambm precisa ser capaz de processar essas
informaes, para que elas lhe sejam entregues. Est comeando a parecer que vai

precisar de mais do que HTML para levar seu site para o prximo nvel.

HTML esttico e chato 2


PH P d vida s pginas web 3
U m form ulrio ajuda Owen a descobrir to d a a histria 5
Form ulrios so feitos de HTM L 6
O form ulrio HTML apresenta problem as 8
HTML roda no cliente 10
PHP roda no servidor 11
Os scripts PHP rodam no servidor 12
Use PHP para acessar os dados do form ulrio 16
Os scripts PHP precisam ficar em um servidor! 18
O servidor transform a PHP em HTML 22
Algumas regras PH P para o seu cdigo 25
E ncontrando o nom e p erfeito para a sua varivel 26
Variveis servem p ara arm azenar dados de scripts 31
POST um a varivel especial que arm azena
dados do form ulrio 33
$_POST transporta os dados do form ulrio p ara o seu script 34
C riando o corpo da m ensagem de em ail com PHP 44
At m esm o texto simples pode ser form atado... um pouco 46
Newlines precisam de aspas duplas 47
Crie um a m ensagem de em ail para Owen 48
As variveis arm azenam as partes do email 49
Enviando um a m ensagem de em ail com PHP 50
Owen com ea a receb er emails 53
Owen com ea a p erd e r emails 54
contedo (sumrio)

C o n e c ta n d o -s e M /S o L

Como Tudo se Combina


Saber como as coisas se encaixam, antes de comear a
construir, uma boa ideia. Voc criou seu primeiro script PHP, e ele est
funcionando bem. Mas obter os seus resultados em um email j no bom o suficiente.

Agora precisa de uma forma de guardar os resultados do seu formulrio, para que possa

mant-los pelo tempo que precisar, e ter acesso a eles quando quiser. Um banco de dados

MySQL pode armazenar seus dados para voc. Mas preciso conectar seu script PHP ao

banco de dados MySQL para fazer isso acontecer.

O form ulrio de Owen funciona bem . Bem at demais... 60


MySQL excelente p ara arm azenar dados 61
Owen precisa de u m banco de dados MySQL 62
Crie um banco de dados e um a tabela MySQL 64
A instruo INSERT em ao 67
Use SELECT para ob ter dados da tabela 70
Deixe o PHP lidar com as coisas tediosas do SQL 73
O PHP perm ite usar os dados do form ulrio web de Owen 74
Conecte-se ao seu banco de dados a p artir do PHP 76
Insira dados com um script PHP 77
Use funes PH P p ara falar com o banco de dados 78
Conecte-se com m ysqli_connect() 80
C onstrua a query INSERT n o PHP 85
Consulte o banco de dados MySQL com PHP 86
E ncerre sua conexo com mysqli-close{) 87
$_POST fornece os dados do form ulrio 91
Owen precisa de ajuda p ara p en eirar seus dados 96
1 Owen sai em busca de Fang 98
contedo (sumrio)

Crie e rteencjici um Betnco de Dcufos


Criando os Seus Prprios Dados
Nem sempre voc tem os dados de que precisa.
s vezes voc mesmo tem que criar os dados que pretende usar, s vezes

precisa criar as tabelas que iro armazenar esses dados E s vezes precisa criar

o banco que armazenar os dados que precisa criar. Confuso? Voc no ficar.

Prepare-se para aprender como criar seus prprios bancos de dados e tabelas. E

se isso no for o suficiente, ainda criar, no processo, a sua primeira aplicao


combinando PHP e MySQL.
A loja Elvis est aberta 104
E lm er precisa de um a aplicao 105
Visualize o projeto da aplicao de Elm er 106
Tudo com ea com um a tabela 109
Faa contato com o servidor MySQL 110
Crie um banco de dados para os emails de Elm er 111
Crie um a tabela d en tro do banco de dados 112
customermafling(tf; JPrecisamos definir os nossos dados 113
I C onhea alguns tipos de dados MySQL 114
Crie sua tabela com um a consulta 117
SELECIONE o banco de dados antes de us-lo 120
DESCRIBE revela a estru tu ra das tabelas 123
I Elm er est p ro n to para arm azenar dados 125
Crie o script A dicionar Email 126
O outro lado da aplicao de E lm er 133
O funcionam ento in te rn o do script Enviar Email 134
Em prim eiro lugar, o b ten h a os dados 135
mysqli_fetch_array() obtm os resultados da consulta 136
L oop para um WHILE 139
Loop atravs dos dados com while 140
Voc tem email... de Elmer! 145
As vezes, as pessoas querem sair 146
Rem ovendo dados com DELETE 147
Use WHERE e DELETE para apagar
dados especficos 148
M inimize o risco de apagam entos acidentais 149
Q ueroSerElvis.com um a aplicao web 154
contedo (sumrio)

A p l i c a r e s R e a lis ta s e p r tic a s
Sua Aplicao na Web
s vezes voc precisa ser realista e repensar seus planos.
Ou ento planejar com mais cuidado logo no comeo. Uma vez lanada a sua
aplicao na Web, voc poder descobrir que no planejou suficientemente bem.

Coisas que pensou que funcionariam podem no ser boas o suficiente no mundo

real. Este captulo d uma olhada em alguns problemas do mundo real que podem

ocorrer quando voc transfere sua aplicao do ambiente de testes para um site real. E

enquanto isso, lhe mostraremos exemplos de cdigos PHP e SQL importantes.

MateMe&vfccoM
itocywrlIrWraT*. Ja*rw>w
Elm er tem alguns clientes irritados 160
Mafc*MaBvfewiflnfl'l&l
P rotegendo Elm er de... Elm er 163
Er*3u-, Exija bons dados do form ulrio 164
A lgica p o r trs da validao de Enviar Email 165
Seu cdigo pode tom ar decises com IF 166
Testando em busca d a verdade 167
IF verifica mais do q ue apenas igualdade 168
A lgica p o r trs da validao de Enviar Email 171
Funes PHP para verificar variveis 172
Teste m lplas condies com AND e O R 179
Os usurios do form ulrio precisam de feedback 183
Facilite a en trad a e a sada do PHP 193
Use um flag para evitar cdigo duplicado 194
Codifique o form ulrio HTM L apenas um a vez 195
Um form ulrio que referencia a si raesm o 199
A ponte a ao do form ulrio p ara o script 200
V erifique se o form ulrio foi subm etido 202
Alguns usurios ain d a esto insatisfeitos 206
As linhas da tabela precisam ser identificveis individualm ente 208
Cusni*r<*! retncwefl. As chaves prim rias possibilitam a identificao individual 210
nD&nny derviyQJWflh^gunMdlsk\
Qhro*WvflfllJwsfigelierraabdueiMn-W
0S&/tKrJe Das caixas de verificao at as IDs dos clientes 215
O DcnDaowarapefs^ing-fiopT.m
Faa loop atravs de um array com foreach 216

xiii
contedo (sumrio)

T r a b a lh a n d o c o m D a d o s A r m a z e n a d o s m A ^ u lV o s

Quando um Banco de Dados No o Suficiente


No acredite no hype... peio menos no naquele sobre
OS banCOS de dados. Certamente os bancos so maravilhosos para se
armazenar todo tipo de dados que envolvam texto, mas e quanto aos dados binrios?

Coisas como imagens JPEG e documentos PDF? Faz sentido armazenar todas essas

figuras da sua coleo de palhetas raras de guitarra em uma tabela de banco de

dados? Geralmente no. Esses tipos de dados normalmente so armazenados em


arquivos, e ns os deixaremos nos arquivos. Mas inteiramente possvel ter o melhor

de dois mundos - este captulo revela que voc pode usar arquivos e bancos de dados

juntos para criar aplicaes PHP cheias de dados binrios.

Guitarristas virtuais gostam de com petir 224


A im agem a prova 225
aplicao precisa arm azenar im agens 226
Planejando os uploads de arquivos grficos no G uitar Wars 231
O banco de dados das pontuaes mximas precisa ser ALTERado 232
Com o fazer p ara o usurio enviar a imagem? 236
Insira o (nom e do) arquivo grfico no banco de dados 238
D escubra o nom e do arquivo enviado 239
Para o n d e foi o arquivo enviado? 244
Crie um lar para os arquivos grficos enviados 248
Dados com partilhados precisam ser com partilhados 254
Sero necessrios dados d o script com partilhado 255
Pense em require_once com o um inserir 256
O mais im portante para as pontuaes mximas a ordem 258
H om enageando o G uitar W arrior n m ero um 261
Form ate a m aior pontuao com HTML e CSS 262
So perm itidas apenas im agens pequenas 267
A validao de arquivos to rn a a aplicao mais robusta 268
}-

P laneje um a pgina A dm in 272


G ere links para rem oo de pontuaes na pgina A dm in 275
Os scripts so capazes de com unicarem -se uns com os outros 276
Sobre GETs e POSTs 278
GET, POST e a rem oo d e pontuaes 280
Isole a m aior pontuao p ara ser rem ovida 283
C ontrole o quanto voc p o d e rem over com LIM IT 284
contedo (sumrio)

T o r n a n d o ct -S u a A p l i c a ? S e g u r a
Presuma que Esto Todos Querendo Te Pegar
Seus pais estavam certos: no fale com estranhos, ou peio
menos no confie neles. Na pior das situaes, no d a eies as chaves para
acessar os dados da sua aplicao, presumindo que no vo fazer nada de
errado. Vivemos num mundo cruel, e voc no pode partir do princpio que
todos so confiveis. Na verdade, como desenvolvedor de aplicaes web voc
precisa ser metade incrdulo e metade adepto de teorias de conspirao. Sim,
as pessoas em geral so ms e elas definitivamente querem te pegar! OK, talvez
isso seja um pouco de exagero, mas muito importante levar a segurana a
srio e elaborar as suas aplicaes de forma que elas fiquem protegidas contra
qualquer um que pretenda causar danos.

O dia em que a msica m o rreu 296


Para o n d e foram as pontuaes? 297
Segurana contra os brbaros 299
Protegendo a pgina G uitar Wars A dm in 300
i A autenticao H TTP exige cabealhos 302
ij Tudo Sobre o Cabealho 304
C ontrole os cabealhos com PH P 305
A utenticando com cabealhos 306
Crie um script A utorizar 314
G uitar Wars Episdio II: A taque dos Clones de P ontuao 318
Subtrao p o r adio 319
A segurana req u er interveno h u m an a 320
Planeje m oderao n o G uitar Wars 321
A bra espao p ara aprovaes com ALTER 322
Pontuaes no-aprovadas no so dignas 327
O hack de um m ilho de pontos 330
Tudo em m oderao...? 331
Com o exatam ente ela fez isso? 333
E nganando o MySQL com com entrios 334
O form ulrio A dd Score recebeu um a injeo de SQL 335
Proteja seus dados co n tra injees de SQL 336
U m INSERT mais seguro (com parm etros) 337
A validao de form ulrios n u n ca inteligente dem ais 339
Cessar fogo! 341

XV
contedo (sumrio)

C d ^ n d p A p l i ^ ^ s W e b p e r S 9 n c i^ ld c t

7
Lembra de Mim?
Ningum gosta de ser esquecido, especialmente

usurios de ap lic a e s Web. Se a aplicao tiver que trabalhar a


noo de comunidade, ou seja, se for planejado que os usurios interajam com
a aplicao de uma forma pessoal, ento ela ter de se lembrar dos usurios.
Voc detestaria ter que se apresentar novamente sua famlia a cada vez que
entrasse em casa. No precisa faz-lo porque seus parentes possuem uma
coisa maravilhosa chamada memria. Mas aplicaes web no se lembram das
pessoas automaticamente - preciso que um desenvolvedor web esperto use

as ferramentas disponveis (PHP e MySQL, talvez?) para criar aplicaes web

personalizadas que realmente sejam capazes de se lembrar dos usurios.

Dizem que os opostos se atraem 346


O negcio do Mismatch so os dados pessoais 347
O Mismatch precisa dos logins dos usurios 348
Preparando o banco de dados para os logins 351
| Construindo uma interface de usurio para o login 353
Crip to grafe as senhas com SHA() 354
Comparando senhas 355
To v*w pis, m nsedtolog In to a r
Mstfiatch* o* ww nrte-match^er Autorizando usurios com H TTP 358
:YotrpuiwerdV
tftbtsentJft.thsdear' <
. : ijntftl* Fazendo login dos usurios com autenticao H TTP 361
,PasstwrdiJ**M Um formulrio para novos usurios se cadastrarem 365
AemftfTbjy ths passwwd in my keythain
~wesO Do que feito o cookie? 375
Use cookies com PHP 376
Repensando o fluxo dos logins 379
Um login baseado em cookies 380
Fazer logout significa apagar cookies 385
As sesses no dependem do cliente 389
Lastiume:
BmGendfr:
iue: >frwfci
UCity: ; 0^ Mismatch *ViewProfte Mantendo-se atualizado com os dados das sesses 391
Ushtmws jneses Renove o Mismatch com as sesses 392
FfctState:
nxe FPStnwne: Joijao
g

Gfflda1;
Nsiks
Mate
Faa Logout com sesses 393
BSrtbate 1981-H-Q3
Locatnu Athecs,G Complete a sesso de transformaes 398
Os usurios no esto se sentindo bem-vindos 404
As sesses tem vida curta... 406
Woukl you like to
...mas os cookies podem durar para sempre! 407
Sesses + Cookies = Persistncia de login superior 409
contedo (sumrio)

Elimine Cdigp Duplicado


Compartilhar Cuidar
Guarda-chuvas no so a nica coisa que pode ser
Compartilhada. Em qualquer aplicao web, voc poder encontrar
situaes em que um mesmo cdigo encontra-se duplicado em mais de um
lugar. Isso no s um desperdcio de recursos, como tambm pode levar
a problemas de manuteno, uma vez que voc inevitavelmente acabar
fazendo modificaes e estas tero de ser efetuadas em mais de um lugar.
A soluo eliminar o cdigo duplicado, compartilhando-o. Em outras
palavras, voc mantm o cdigo duplicado em apenas um lugar, e depois,
apenas referencia esse cdigo sempre que precisar dele. A eliminao de
cdigo duplicado resulta em aplicativos mais eficientes, de manuteno

mais fcil, e finalmente, mais robustos..

O Mismatch est em pedaos 421


R econstruindo o M ismatch a p artir de u m tem plate 422
R econstrua o M ismatch com tem plates 424
O M ismatch est novam ente em p... e m uito m elh o r organizado 426

0 dbefilho aparece o ali de


cada pagina do Mismatch, e exibe
titulo da aplidaSo juntamente tom
w ttulo especfico
un> trtulo espet$\to pagina..

Cada pagina do Mismatch


<^ue for pevsowtaada pav o
usurio exigira um todig de
login, o <\ual mantm registro
do usurio-

0 vodape -fomeCe Contedo


a parte de baixo de todas
as paginas do AWatch,
^w inclui um aviso de
.opyv-:*Ll

XVII
contedo (sumrio)

C^nttole Seus a<fcs, Seu Mund>


Colhendo Dados
Nada como uma boa colheita de dados no outono, um sem-fim de
informaes prontas para serem examinadas, classificadas, comparadas, combinadas,
enfim, qualquer coisa que a sua excelente aplicao web precisar que seja feito.
Compensador? Sim. Mas assim como as colheitas na vida real, preciso muito trabalho
duro e uma boa dose de conhecimento para se obter controle sobre os dados em um
banco MySQL. Os usurios da web exigem mais do que dados estticos e enfadonhos.
Eles querem dados enriquecedores... dados compensadores... dados relevantes. Ento,
o que voc est esperando? D a partida no seu trator MySQL e mos obra!

Fazendo o desenco n tro p erfeito 428


Os desencontros se referem aos dados 429
M odele o banco de dados com um schem a 431
Ju n te vrias tabelas 436
Chaves estrangeiras em ao 437
As tabelas po d em com binar linha p o r lin h a 438
eT U m a linha leva a m uitas outras 439
C hecando linhas de muitas-para-muitas 440
Crie um questionrio M ismatch 445
C oloque as respostas no banco de dados 446
E possvel com and ar u m form ulrio com dados 450
G ere o form ulrio do questionrio M ismatch 456
P rocure p o r um pouco de norm alidade 462
Ao normalizar, pense em term os de tom os 463
Trs passos para se criar um banco de dados norm alizado 465
A lterando o banco de dados do M ismatch 469
Ento, o M ismatch realm ente norm al? 470
U m a consulta d en tro de um a consulta
d entro de um a consulta... 472
Vamos todos ju n ta r as tabelas 473
Ligue os pontos 474
C ertam ente podem os fazer mais com os in n e r jo in s 475
A pelidos para tabelas e colunas 477
Joins, ao trabalho! 478
Cinco passos para um desen co n tro com sucesso 485
Com pare usurios pela desencontrabilidade 487
Tudo o que precisam os um loop FO R 488
contedo (sumrio)

Funpes String e pers>ncillzulas


Vivendo Melhor Atravs das Funes
As funes levam as suas aplicaes para um nvel superior.
Voc j vem usando as funes internas do PHP para realizar as coisas. Agora hora
de dar uma olhada em mais algumas funes internas realmente teis. E depois voc
aprender a criar suas prprias funes personalizadas para lev-lo mais alm do que
sequer imaginava que fosse possvel. Bem, talvez no to longe que voc comece a usar
espadas laser, mas as funes personalizadas certamente simplificam o seu cdigo e o
tornam reutilizvel.

Strings e funes personalizadas 501


Um bom trabalho arriscado difcil de en c o n trar 502
A busca no deixa m argem p ara erros 504
; As consultas SQL p o dem ser flexveis com LIKE 505
; Transform e um a string em palavras individuais 510
Im plode() cria um a string a p artir de substrings 513
Pr-processe a string de busca 519
Substitua caracteres de busca indesejados 520
A consulta precisa de term os de busca legtim os 524
Copie elem entos no-vazios para um novo array 525
As vezes voc s precisa de p arte de u m a string 528
Extraia substrings do incio o u do fim 529
Podem os classificar nossos resultados com m ltiplas consultas 532
As funes lhe perm item reutilizar cdigo 536
C onstrua um a consulta com um a funo personalizada 537
Funes personalizadas: o quo personalizadas elas realmente so? 538
SWITCH tom a m uito mais decises do que IF 542
D a build_query() a capacidade de classificar 545
Podem os paginar os nossos resultados 548
O b ten h a apenas as linhas de q ue voc precisa com LIMIT 549
C ontrole os links das pginas com LIMIT 550
M antenha registro dos dados da paginao 551
D efina as variveis da paginao 552
Revise a consulta para ter resultados paginados 553
Gere os links de navegao da pgina 554
M ontando o script Search com pleto 557
O script Search com pleto, continua... 558

xix
contedo (sumrio)

E x p te s s P e s le g u lc tfe s
Regras Para Substituio
As funes string so adorveis. Mas, ao mesmo tempo,
so lim itadas. Certamente elas podem realizar tarefas como lhe dizer a
extenso da sua string, truncar a string, trocar certos caracteres por outros. Mas
s vezes voc precisa de liberdade para lidar com manipulaes de texto mais
complexas. aqui que as expresses regulares podem ajudar. Elas podem
modificar strings de forma precisa, com base em um conjunto de regras, em vez
de um s critrio.

A Riskyjobs perm ite que os usurios subm etam currculos 562


D ecida com o dever ser a aparncia dos seus dados 566
F orm ule u m padro p ara nm eros telefnicos 569
Confira padres com relao a expresses regulares 570
Crie padres usando m etacaracteres 572
Ajuste os padres com classes de caracteres 579
V erifique os padres com preg_m atch() 584
Padronize os dados dos nm eros de telefone 591
Livre-se dos caracteres indesejados 592
C onferir endereos de em ail p o d e ser com plicado 596
Sufixos de dom nios esto p o r toda a parte 598
Use PH P para verificar o dom nio 599
Validao de email: m on tan d o o q uadro 600
contedo (sumrio)

ViSUcdizctndo seus Dados--. eM as!


Desenhando Grficos Dinmicos
claro que todos ns conhecemos o poder de uma boa
consulta e os consequentes resultados satisfatrios.
Mas os resultados de consultas nem sempre falam por si mesmos. s vezes
til apresentar os dados de uma forma diferente, uma forma mais visual. O PHP
possibilita o fornecimento de uma representao grfica dos dados: grficos pizza,
grficos em barra, diagramas de Venn, desenhos Rorschach, qualquer coisa. Vale
de tudo para ajudar os usurios a compreender os dados que fluem atravs da sua
aplicao. Mas nem todos os grficos teis, em aplicaes PHP, se originam do seu
banco de dados. Por exemplo, voc sabia que possvel evitar ataques de bots de
spam com imagens geradas dinamicamente?

G uitar Wars Reloaded: A V ingana das M quinas 606


N enhum form ulrio de in p u t est a salvo 607
Precisamos separar os hum anos das m quinas 608
Podem os vencer a autom ao usando a autom ao 611
G ere o texto d a senha de CAPTCHA 613
Visualizando a im agem CAPTCHA 614
P or d en tro das funes grficas GD 616
D esenhando texto com um a fonte 620
G ere um a im agem CAPTCHA aleatria 623
A sanidade re to rn a ao G uitar Wars 625
A dicione CAPTCHA ao script A dicionar P ontuao 627
Cinco graus de oposio 630
P ondo a desencontrabilidade em tabela 631
A rm azenando dados do grfico com barras 632
L endo entre as linhas com o sen h o r dos grficos 635
De um array p ara ou tro 636
Crie um array de tpicos desencontrados 638
Form ulando um plano para execuo de
grficos de barras 639
Amassando as categorias 640
A m atem tica das categorias 641
Fundam entos dos grficos de barras 644
D esenhe e m ostre a im agem do grfico de barras 647
Im agens individuais do grfico de barras para todos 650
Os usurios do M ismatch esto gostando dos
grficos de barras 653

xxi
contedo (sumrio)

fepukliCcL9 e SetViPS Web

U
Interfaces com o Mundo
Existe um grande mundo l fora, mundo esse que a sua
aplicao web no pode se dar ao luxo de ignorar ou o que
talvez seja mais, voc que no gostaria que o mundo ignorasse a sua aplicao.
Uma excelente maneira de fazer o mundo not-la tornar os seus dados
disponveis para republicao, o que significa que os usurios podero assinar o
contedo do seu site, em vez de ter de visit-lo diretamente para encontrar novas
informaes. No apenas isso, a sua aplicao pode fazer interfaces com outras
aplicaes, atravs dos servios web, e pode tirar proveito dos dados de outras
pessoas para fornecer uma experincia mais rica.

Owen precisa avisar ao mundo sobre Fang 658


Envie dados sobre abdues aliengenas para as pessoas 659
O RSS envia contedo web para as pessoas 660
O RSS na verdade XML 651
Do banco de dados para o news reader 666
Visualizando RSS 669
O que interessa a um comunicador 671
Gere um envio RSS dinamicamente 672
Crie um link para o envio RSS 676
Um vdeo rale mais que mil palavras 678
Obtendo contedo web de terceiros 680
Republicando vdeos do You Tube 681
; Fazendo uma requisio de vdeo no You Tube 682
Owen esta pronto para criar uma requisio REST 686
O You Tube fala XML 690
Deconstruindo uma resposta XML do You Tube 694
Visualize os dados de vdeo XML 695
A lgutts clie n te s de em ail tm supo rte a
co nte do p u sh perm itindo que vo c Acesse os dados XML com objetos 696
De elementos XML para objetos PHP 697
receba a tu a liz a e s do site d a m e sm a
c o m o re ce be m e n s a g e n s de email.

Penetre nos dados XML com objetos 698


No sem um namespace! 699
Cada vez mais avistamentos de Fang 701
M u ito s n a v e ga d o re s
w eb tam b m lhe
perm item e xam inar
co nte do pu sh " que
revela rap idam ente a s Disponibilize vdeos para visualizao 702
n o tic ia s m a is re ce ntes
p u b lic a d a s e m um
de term inado site.
Formate os dados de vdeo para exibio 703
A t m e sm o d isp o sitiv o s
m v e is provm a c e s s o a
co nte do 'push*, o q ual
enviado a uto m aticam e nte
quando e lg o s e m o d ific a no
contedo (sumrio)

$oL>ras
Os Dez Principais Tpicos (Que No Abordamos)
Mesmo depois de tudo isso, ainda tem mais um pouco Ainda
temos mais algumas coisas que voc precisa conhecer. No seria certo ns as

ignorarmos, mesmo que s precisem de uma breve meno. Portanto, antes de guardar

o livro, d uma lida nestes pequenos, mas importantes pargrafos sobre PHP e MySQL.

Alm disso, uma vez concludo este aqui, s faltaro mais dois pequenos apndices... e

o ndice... e talvez algumas propagandas... e a o livro realmente acaba. Promessa!

#1. A dapte este livro para funes PHP4 e mysql 714


#2. Permisses do usurio n o MySQL 716
#3. Relato de erros p ara o MySQL 718
#4. Erros PHP com tratam ento de excees 719
#5. PHP orientado a objetos 721
#6. T om ando segura a sua aplicao PHP 723
#7. Proteja sua aplicao de scripts cross-site 725
#8. Precedncia de operadores 727
#9. Q ual a diferena en tre PHP 5 e PHP 6 728
#10. Reutilizando o PHP de terceiros 730

xxiii
contedo (sumrio)

C^nfgute um Ambiente de DesenVplVimentP


1 1 Um Lugar para Brincar
I I Voc precisa de um lugar para praticar suas recm-
adquiridas habilidades em P H P e M yS Q L, porm sem tornar
OS SeUS dados vulnerveis na web. sempre uma boa ideia ter um
local seguro para desenvolver sua aplicao PHP antes de lan-la no mundo (ou seja,

na web). Este apndice contm instrues para a instalao de um servidor web, do

MySQL e do PHP, para lhe fornecer um lugar seguro onde possa trabalhar e praticar.

Crie um am biente de desenvolvim ento PHP 732


D escubra o que voc tem 732
S e rv id o r
Voc tem um servidor web? 733
Voc tem o PHP? Q ual verso? 733
Voc tem o MySQL? Q ual verso? 734
Com ece pelo Servidor Web 735
Passos para a instalao do PHP 737
Instalando o MySQL 738
Passos para a instalao do MySQL n o Windows 739
H abilitando o PH P n o Mac OS X 742
Passos p ara a instalao d o MySQL no Mac OS X 742
Passando do am biente de prod u o para um site no a r 744
D um p seus dados (e as suas tabelas) 745
Prepare-se p ara usar seus dados 745
Mova os dados consolidados para o servidor ativo 746
Conecte-se ao servidor ativo 747
contedo (sumrio)

Arapllie Seu
99 Obtenha Ainda Mais Proveito

III Sim, voc pode programar com PHP e MySQL e criar


timas aplicaes Web. Mas voc sabe que ainda deve haver mais a
se explorar. E h. Este pequeno apndice ir lhe mostrar como instalar a extenso

mysqli e a extenso biblioteca grfica GD. Em seguida, mencionaremos mais

algumas extenses do PHP que voc poder querer baixar. Porque s vezes no

tem problema em querer sempre mais.

E stendendo o seu PHP 750


E no Mac.. 753

XXV
Como Usor Este LVrc>
Introduo

Nesta seo, respondemos iporfc^ie per^wvfca--


u&ivfcdo> por <^we oi <^ue eles doSodVm isso e um
livro de PtfP e M y$U

xxvii
como usar este fivro

A quem se destina este livro?


Se voc puder responder sim a todas estas perguntas:
Voc um web designer com experincia em HTML ou
XHTML, e deseja melhorar as suas pginas?

Voc deseja ir alm do simples HTML e aprender,


entender e se lembrar como usar PHP e MySQL para
criar aplicaes web?

Voc prefere conversas informais e estimulantes, em vez


de aulas enfadonhas e acadmicas?

ento este livro para voc.

Quem provavelmente deve fugir deste livro?


Se voc puder responder sim a qualquer um a destas perguntas:
Voc no tem conhecimento nenhum
sobre conceitos bsicos de
programao, tais como variveis e loops?
(Mas mesmo que jamais tenha programado antes, voc provavelmente
ser capaz de absorver os conceitos-chaves de que precisa, neste livro.)

Voc um super desenvolvedor web PHP procurando


por um livro de referncia?

Voc tem medo de tentar algo diferente? Voc prefere


arrancar um dente do que misturar listras com xadrez?
Voc acha que um livro tcnico no pode ser srio se
um dos exemplos um banco de dados sobre abdues
aliengenas?

ento este livro no para voc.

Nota Ao d.fjH a.e.fc d o d t f l d r k e t i

de frredi-fxj.
introduo

Sabemos o que voc est pensando


Como isso aqui pode ser um livro de PHP e MySQL srio?
Por que tantas figuras? ^ rcU-c
E realmente possvel aprender desta forma? Isto ;
,mF'rtKit'
Sabemos o que o seu crebro est pensando
Seu crebro p ede novidade. Ele est sem pre buscando, vasculhando,
esperando p o r algo fora do com um . Ele foi construdo dessa form a, e
isso lhe ajuda a se m anter vivo..
Assim, o que o seu crebro faz com todas as coisas rotineiras, comuns,
normais, que voc encontra? Faz todo o possvel para evitar que elas
interfiram no trabalho real do crebro - registrar coisas que sejam
importantes. Ele no se d ao trabalho de armazenar as coisas chatas;
elas nunca conseguem passar pelo filtro isto aqui obviamente no
im portante.
Com o o seu crebro sabe o que ou no im portante? S uponha que
voc esteja fazendo um a cam inhada n a selva e um tigre pule n a sua
frente; o que acontece com a sua m ente e o seu corpo?
Os neurnios se acendem . As em oes fluem. A qumica dispara.
E assim que o seu crebro sabe que...
Isto deve ser importante! No se esquea!
Mas im agine que voc esteja em casa ou em um a biblioteca. um a
rea segura, aconchegante, livre de tigres. Voc est estudando. Se
p rep a ra n d o para um a prova. O u tentando a p re n d er algum difcil
assunto tcnico que o seu chefe acha que s vai levar um a sem ana, dez
dias no mximo.
S um problema. Seu crebro est tentando lhe fazer um grande favor. Ele
est tentando se certificar de que este contedo obviamente desimportante
no ocupe recursos que so escassos. Recursos esses que so mais bem
empregados armazenando-se as coisas realm ente importantes. Como
tigres. Como o perigo do fogo. Como esconder rapidam ente ajanela do
navegador com o vdeo de discos voadores no You Tube, antes que o seu
chefe aparea.
E n o h um a form a simples de dizer ao seu crebro ei, crebro,
m uito obrigado, mas no im porta o q u anto este livro seja chato,
e quo poucas em oes eu esteja sentindo neste exato m om ento,
eu realm ente q uero que voc se lem bre destes assuntos.

Videos de H/Ms no You


Tube sa obviawewte ais
mievessa>vfces para o seu
ievebv-o do ^ue um liw-o
de TJ.

xxix
como u sar este livro

tntendeni9s cjue o JetPr c[e um JiVtP cfa sne ^\Jse a C^ea!

Ento, o que preciso para se aprender algo? Primeiramente, voc precisa


entender o assunto, e depois se certificar de que no vai esquec-lo. No
adianta tentar entulhar fatos dentro da sua cabea. Com base nas pesquisas
mais recentes em cincia cognitiva, neurobiologia e psicologia da educao,
necessrio muito mais do que texto em uma pgina para um verdadeiro
aprendizado. Ns sabemos como chamar a ateno do seu crebro

Alguns dos princpios de aprendizado Use a Cabeal:


Use o recurso visual. Imagens so muito mais memorveis do que palavras
sozinhas, e tomam o aprendizado muito mais eficiente (at 89% de melhoria em
estudos sobre lembrana e transferncia). Eias tambm tornam as coisas mais
compreensveis. Coloque as palavras dentro ou perto das imagens s quais
elas se referem, em vez de na parte de baixo da pgina ou na pgina seguinte, e
os estudantes tero duas vezes mais probabilidade de conseguir resolver problemas
relacionados ao contedo.
U se um e stilo co iw e rsacio n al e personalizado.
Em estudos recentes, os estudantes tiveram um desempenho
at 40% melhor, em testes ps-aprendizado, quando o
contedo falava diretamente ao leitor, usando um estilo
conversacional, em primeira pessoa, do que quando se usava
um tom mais formal, Conte histrias, em vez de lecionar. Use 1
casual. No se leve muito a srio. Hm que voc prestaria mais c
estimulante conversa informal ou uma aula?
F a a o e stu d an te pe n sa r um pou co m a is profun
Em outras palavras, a no ser que voc ativamente exercite os
neurnios, no vai acontecer muita coisa dentro da sua cabe
precisa estar motivado, engajado, curioso e inspirado para res
problemas, chegar a concluses e gerar conhecimento novo. f
isso, voc precisa de desafios, exerccios e perguntas que prov
o raciocnio, bem como de atividades que envolvam ambos os
hemisfrios do crebro e vrios sentidos.
O btenha - e m antenha - a a te n o do leitor. Tod<
passamos por uma situao de "eu realmente quero aprender
no consigo passar da pgina um acordado". O seu crebro pr
em coisas que sejam fora do comum, interessantes, estranhas,
assunto tcnico novo e difcil no precisa ser enfadonho. O se
mais rapidamente se no for.
Provoque a s e m oes. Ns sabemos que a sua capacid
algo depende largamente do contedo emocional. Voc se lei
que se importa. Voc se lembra de algo quando sente algo. N<
de histrias de partir o corao sobre um garoto e seu cachori
emoes como surpresa, curiosidade, diverso, "que ... essa?
fera! que vem quando voc resolve um quebra-cabeas, apre
acha que difcil ou percebe que voc sabe algo que o Bob "e
do departamento de engenharia, no sabe.
U**a pequena domdo- Na verdade, ns
e**os Kistria de pariir o doraa sobre
um $\rci# e seu Sherro - o dadhorro -oi
abduzido por aliengenas, e vode ajudar
* 3 k/flB-f-SrioJ.
introduo

Metacognipo: pensando sobre pensar


Se voc realmente quer aprender com mais rapidez e mais profu
preste ateno ao modo como prestamos ateno. Pense sobre c
pensa. Aprenda sobre como voc aprende.
A maioria das pessoas no faz aulas de metacognio ou de teori
aprendizado na escola. Sempre se esperou que ns aprendsseir
raramente nos ensinaram a aprender.
Mas ns partimos do princpio de que, se voc est com este livro
porque realmente quer aprender a criar sites baseados em bane
dados, usando PHP e MySQL. E provavelmente no quer despenc
tempo. Par poder usar o que voc ir ler neste livro, ter de se lei
do que leu. E para isso, voc precisa entender o assunto. Para tirai
proveito possvel deste livro ou de qualquer livro ou experincia d
assuma a responsabilidade sobre o seu crebro. Focalize o seu
crebro neste contedo.
O segredo fazer o seu crebro ver o novo material que voc
est aprendendo como sendo Realmente Importante. Crucial
para o seu bem-estar. To importante quanto um tigre. Caso
contrario, voc se ver numa batalha constante, com o seu
crebro fazendo o possvel para que o novo contedo no
seja gravado..
Ento, com o que voc faz com que o seu
crebro tra te o PHP e My SQL com o se ele fosse um
tig re fam into?
Existe a forma lenta e tediosa, e existe a forma mais rpida e mais
eficiente. A forma lenta pura repetio. Voc obviamente sabe
possvel aprender e se lembrar at dos assuntos mais chatos, se
continuar empurrando repetidamente a mesma coisa para o seu
crebro. Com suficiente repetio, seu crebro diz ele no sent
isto realmente importante, mas continua olhando as mesmas c
repetidas e repetidas vezes, ento suponho que deve ser importa
A forma mais rpida fazer qualquer coisa que aumente a atividade
cerebral, e de preferncia, diferentes tipos de atividade cerebral. As
listadas na pgina anterior so uma grande parte da soluo, e so o
que comprovadamente ajudam o seu crebro a trabalhar em seu fav
exemplo, alguns estudos mostram que colocar palavras dentro das f
que elas descrevem (em vez de coloc-las em algum outro lugar na f
como, por exemplo, em uma legenda ou no corpo do texto) obriga
crebro a tentar entender a relao entre as palavras e a figura, e ist<
mais neurnios se ativarem. Quando mais neurnios se ativam, h n
chances de o seu crebro entender que isto algo a que 'rale a pena
ateno, e possivelmente registrar.
Um estilo conversacional ajuda porque as pessoas tendem a pres
mais ateno quando percebem que esto envolvidas em uma cc
uma vez que, nessa situao, espera-se que elas acompanhem o <
est sendo dito para saber quando e como responder. O mais fai
que o seu crebro no necessariamente liga se a conversa e
voc e um livro! Por outro lado, se a escrita tiver um estilo form;
seu crebro o perceber da mesma forma como a experincia d
uma lio sentado em uma sala de aula cheia de estudantes pass
No preciso ficar acordado.
Mas as figuras e o estilo conversacional so apenas o incio...
XXXI
como usar este f/vro
rn t i V' A Ta PiU de -tenror
Aqui esta o que NOS fizemos:
Ns usamos figuras, porque o seu crebro est ajustado para prestar ateno
em sinais visuais, e no em texto. Pelo menos no que concerne ao seu
crebro, uma imagem realmente vale por mil palavras. E quando texto e
imagens precisam trabalhar juntos, ns colocamos o texto dentro das figuras, Um D esencontro !
porque o seu crebro funciona de forma mais eficiente quando o texto se
encontra dentro da coisa a que ele se refere, em vez de em uma legenda ou tilno
escondido em algum lugar dentro do texto.
Ns usamos redundncia, dizendo a mesma coisa de formas diferentes e com
diferentes tipos de mdia, e visando a mltiplos sentidos, para aumentar a
chance de o contedo ser registrado em mais de uma rea do seu crebro.
Ns usamos conceitos e figuras de formas inesperadas, porque o seu crebro
est ajustado para prestar ateno em novidades, e usamos figuras e ideias com
pelo menos algum contedo emocional, porque o crebro est ajustado
para prestar ateno bioqumica das emoes. Aquilo que nos faz sentir
algo mais provvel de ser lembrado, mesmo que esse sentimento no seja
nada mais que um pouco de humor, surpresa ou interesse.
Ns usamos um estilo personalizado, conversacional, porque o seu
crebro est ajustado para prestar mais ateno quando ele acredita que
voc est envolvido em uma conversao do que quando pensa que est
passivamente ouvindo uma apresentao- Seu crebro faz isso mesmo
quando voc est lendo.
Ns inclumos mais de 80 atividades, porque o seu crebro est ajustado
para aprender e se lembrar mais quando voc faz algo do que quando l
sobre algo. E fizemos os exerccios desafiadores, porm resolvveis, porque
isso o que a maioria das pessoas prefere.
Ns usamos vrios estilos de aprendizado, porque voc poder preferir lente isto'
procedimentos passo-a-passo, enquanto que outras pessoas podero querer
entender o quadro geral primeiro, e outras ainda s querem ver um exemplo.
Mas indepen dentemente do seu mtodo preferido de aprendizado, todo
mundo se beneficia em ver o mesmo contedo representado de diversas fornias.
Ns inclumos contedo para ambos os hemisfrios do seu crebro,
porque quanto mais partes do seu crebro voc utiliza, maior a
probabilidade de voc aprender e se lembrar, e maior o tempo
durante o qual conseguir se manter focado. Uma vez que trabalhar
um lado do crebro frequentemente significa que o outro lado ter um M wL J U L / x Z
tempo para descansar, voc poder ser mais produtivo nos estudos, por um
perodo de tempo maior.
Ns inclumos estrias e exerccios que apresentam mais de um ponto
de vista, porque o seu crebro est ajustado para aprender com mais
profundidade quando forado a fazer avaliaes e julgamentos.
Ns inclumos desafios, com exerccios e fazendo perguntas que nem sempre
tem uma resposta direta, porque o seu crebro est ajustado para aprender
e se lembrar quando precisa trabalhar em algo. Pense no seguinte: no
possvel fazer seu corpo ficar em forma apenas olhando as pessoas malhando
na academia. Mas ns fizemos nosso melhor para garantir que, quando
estiver trabalhando duro, ser sempre nas coisas certas, para que no tenha NAO
que gastar um neurnio sequer a mais do que o necessrio processando um CCNFE
exemplo difcil de entender ou tentando decifrar um texto difcil, cheio de ;$B3p3
termos tcnicos obscuros ou sisudo demais. scaaSsi?
Ns usamos pessoas. Nas estrias, exemplos, figuras, etc., porque, bem,
porque voc uma pessoa. E o seu crebro presta mais ateno nas pessoas
do que nas coisas.
introduo
Veja o que fazer para que o seu
crebro se curve em sinal de submisso
Ok, fizemos a nossa parte. O resto com voc. Estas dicas funcionam
como um ponto de partida; oua o seu crebro e descubra o que
funciona e o que no funciona para voc. Experimente coisas diferentes.
fceH* jsta pjina c cole na
porta da sua geladeira.
V devagar. Quanto m ais voc entende, Converse sobre o que est lendo.
menos voc tem que memorizar. Em voz alta
No leia, simplesmente. Pare e pense. Quando Falar ativa um a parte diferente do crebro. Se voc
o livro lhe apresentar um a pergunta, no pule quer entender algo ou aum entar as suas chances
direto para a resposta. Imagine que um a pessoa de se lem brar do assunto depois, pronuncie-o em
real est lhe fazendo a pergunta. Q uanto mais voz alta. Melhor ainda, tente explic-lo, em voz alta,
aprofundadam ente voc forar o seu crebro a a outra pessoa. Voc aprender mais rapidamente
pensar, maior a sua chance de realm ente aprender e poder descobrir ideias que no tinha percebido
e se lem brar do que aprendeu. ainda durante a leitura,
Faa os exerccios. Faa su a s prprias | lOua o seu crebro.
anotaes. Preste ateno para saber se o seu crebro
Ns elaboram os os exerccios, mas se os est ficando sobrecarregado. Se voc perceb er
fizssemos para voc, isso seria com o ir que est com eando a ler superficialm ente ou
academ ia e ter algum para m alhar p o r voc. esquecer o que acabou de ler, h o ra de fazer
E no basta s olhar os exerccios. Use um um a pausa. U m a vez que voc passa de certo
lpis. H m uita evidncia de que a atividade po n to , n o possvel a p re n d er mais rpido
fsica du ran te o processo de aprendizado pode ten tan d o absorver mais e mais con te d o e
m elhorar este ltim o. p o d er at prejudicar o processo.

Leia a s se e s No Existem i ^Sinta algo.


Perguntas Idiotas. Seu crebro precisa saber q ue isto
im portante. Envolva-se com as estrias. Crie
Todas elas. Elas n o so co m en t rio s o p cio n ais
as suas prprias legendas para as fotos.
fazem p a rte do c o n te d o central! N o as deixe
R esm ungar sobre um a piada ruim ainda
de lado.
m elh o r do q ue no sentir nada.
Que isso seja a ltima coisa que voc
l antes de dormir. Ou pelo menos a Escreva bastante cdigo.
ltima coisa desafiante S existe um a form a de aprender a programar:
P arte do a p re n d iz a d o (esp e cia lm e n te a escrevendo um m onte de cdigo. E isso que
tra n sfe r n c ia p a ra a m e m ria d e lo n g o voc ir fazer ao longo deste livro. Programar
p razo) o c o rre dep o is q u e voc fec h a o livro. um a habilidade, e a nica form a de se ficar
Seu c re b ro p rec isa de algum te m p o p ara bom nela praticando. Ns iremos lhe oferecer
rea liza r to d o o p ro ce ssam en to . Se voc te n ta r muitas oportunidades de praticar: cada captulo
ab so rv er novas in fo rm a es d u ra n te esse ter exerccios que apresentam problemas para
te m p o , u m a p a rte do q u e voc ac ab o u de voc resolver. N o deixe de faz-los - um a boa
a p r e n d e r se r p e rd id a . parte do aprendizado acontece quando voc
resolve os exerccios. Ns inclumos solues -
i Beba gua. Em grande quantidade. no tenha m edo de dar um a olhada na soluo
Seu crebro funciona m elhor q uando envolvido caso no consiga resolver algum exerccio! (
em um bom banho. A desidratao (que pode com um um pequeno detalhe atrapalhar toda a
acontecer antes m esm o de voc sentir sede) resoluo) Mas tente resolver o problem a antes
p rejudica as funes cognitivas. de olhar as solues. E, definitivamente, faa o
exerccio funcionar antes de passar para a parte
seguinte do livro.
0 PHP o MySQL. Ke er*>'rte* rar ^
vjeb reais nao sc es^ueta y
de envia-las e C*perimer>t-!as em um
servidor yeb vevdadeiro.. XXXIII
como usar este livro

Leia-me
Isto uma experincia de aprendizado, e no um livro de referncia. Ns
deliberadamente retiramos tudo que pudesse atrapalhar o aprendizado de
qualquer que seja o assunto tratado em um determinado ponto do livro. E
na primeira leitura, voc precisa comear pelo comeo, porque cada captulo
assume que voc aprendeu o que viu no anterior.
Ns comeamos ensinando alguns conceitos simples de
programao e fundamentos de conexo a banco de dados,
em seguida apresentamos funes PHP e instrues MySQL
mais complexas, e finalm ente mostramos alguns conceitos
mais complexos sobre aplicaes.
Embora seja importante permitir aos usurios adicionar dados e a retirar
dados de uma aplicao web, antes disso, preciso primeiramente, entender a
sintaxe tanto do PHP quanto do MySQL. Assim, ns comeamos apresentando
instrues PHP e MySQL que voc pode experimentar na prtica. Assim,
voc poder imediatamente fazer algo com PHP e MySQL, e comear a se
sentir estimulado em usar essas tecnologias. Depois, mais adiante no livro, lhe
mostraremos as boas prticas de projeto de aplicaes e de bancos de dados.
Nesse ponto, j ter um slido domnio da sintaxe de que vai precisar e poder
se concentrar em aprender os conceitos.
Ns no abordaremos todas as instrues, funes ou
palavras-chaves do PHP ou MySQL
Teria sido possvel colocar cada instruo, funo e palavra-chave do PHP e do Na verdade, voe
MySQL neste livro, mas ns achamos que iria preferir um livro que no fosse pode wsv o
do tamanho de um catlogo telefnico, e lhe ensinasse as instrues, funes tovn este SWvoj
e palavras-chaves mais importantes. Apresentaremos aquelas que voc precisa -z/ndo al$uas
conhecer, e que usar em 95% do tempo. E aps terminar este livro, ter a
confiana para procurar sozinho informaes sobre aquela funo de que modi itadoes ao
precisa para terminar a aplicao que acabou de escrever. ^ ^ todifto. ^Consulte
^A o
Ns estamos abordando o PHP 5 e o MySQL 5.0.
Devido ao fato de muita gente ainda usar o PHP 4 ou 5, ns evitamos usar
cdigos especficos para o PHP 4, 5 ou 6 sempre que possvel. Sugerimos que
voc use o PHP 5 ou 6 e o MySQL 5 ou 6 ao estudar os conceitos deste livro.
No desenvolvimento deste livro, nos concentramos no PHP 5 e no MySQL
5, ao mesmo tempo nos certificando de que o cdigo fosse compatvel com
verses posteriores.
Voc precisa de um servidor web com suporte a PHP.
O PHP precisa ser executado atravs de um servidor web para funcionar
corretamente. Voc precisa do Apache ou de algum outro servidor web
instalado na sua mquina local, ou em alguma mquina qual voc tenha
algum acesso, para que possa executar comandos MySQL sobre os dados.
Consulte os Apndices ii e iii para instrues sobre como instalar e estender o
PHP e o MySQL.
introduo

Ns usamos o MySQL.
Embora exista uma linguagem SQL Padro, neste livro ns usaremos a
sintaxe particular do MySQL. Com apenas algumas poucas modificaes na
sintaxe, o cdigo deste livro dever funcionar no Oracle, MS SQL Server,
PostgreSQL, DB2 e em mais alguns outros Sistemas de Gerenciamento de
Bancos de Dados Relacionais (Relational Database Management Systems ou
RDBMSs) existentes. Voc ter de pesquisar as funes e a sintaxe particulares
do PHP, para se conectar a esses outros RDBMSs. Se fssemos abordar todas
as variaes de sintaxe para cada comando, este livro teria muito mais pginas
do que tem. Ns gostamos das rvores, por isso nos limitamos ao MySQL.
As atividades NO so opcionais.
Os exerccios e atividades no so opcionais; fazem parte do contedo central
do livro. Alguns deles servem para ajudar a memorizao, outros para o
entendimento e alguns iro lhe ajudar a pr em prtica o que acabou de
aprender. No deixe de faz-los. As palavras cruzadas so a nica coisa que
no precisa fazer, mas so boas para dar ao seu crebro uma chance de pensar
de uma forma diferente nas palavras e termos que voc est aprendendo.
A redundncia intencional e importante.
Uma diferena importante de ura livro Use a Cabea! que ns queremos
que voc realmente entenda o assunto, E queremos que termine este livro
lembrando-se do que aprendeu. A maioria dos livros de referncia no tem
a reteno e a recuperao como alvo, mas este um livro de aprendizado, e
portanto, ver alguns conceitos aparecendo mais de uma vez.
Os exemplos so os mais simplificados possveis.
Nossos leitores nos dizem que frustrante ter que navegar por 200 linhas
de um exemplo, procurando pelas nicas duas linhas que eles precisam
entender. A maioria dos exemplos deste livro mostrada dentro do menor
contexto possvel, para que a parte que voc est tentando aprender fique
clara e simples. No espere que todos os exemplos sejam super robustos ou Vrios cios
sempre completos - eles foram escritos especificamente para o propsito
didtico, e no so necessariamente 100% funcionais. exemplos, pov-e*,
so aplidadoes wb
Ns colocamos todos os cdigos de exemplo e aplicaes na Web, para que o*p|eiasf dapas
voc possa copiar e colar partes deles no seu editor de texto ou Terminal
MySQL ou ento envi-los como esto para o seu prprio servidor web, para poderosas..
de +azer Coisas bew
realizar testes. Voc os encontrar em
h t t p : / / w w w .a lta b o o k s . c o m .b r
Os endereos de websites de terceiros podem ser alterados ou desatualizados
a qualquer momento pelos seus mantedores, sendo assim, a Alta Books no
controla ou se responsabiliza por qualquer contedo de websites.
Os exerccios Poder do Crebro no tem respostas.
Para alguns deles, no existe uma nica resposta; para outros, parte da
experincia didtica das atividades Poder do Crebro voc decidir se e em
que contexto as suas respostas esto corretas. Em alguns dos exerccios Poder
do Crebro, voc encontrar dicas para lhe guiar na direo correta.
XXXV
equipe de reviso

Reviso tcnica
v W e AH 1>vid Bri99s Will Hav*-is Stephanie Liese Steve /VJilano

Revisores Tcnicos: Hv-vey ChHs Shi-Ple-tt


Jereme Allen um desenvolvedor web snior com
experincia no uso das tecnologias mais avanadas
para a criao de aplicaes web. Ele tem mais de
nove anos de experincia no uso de PHP, MySQL,
bem como vrios outros frameworks, sistemas
operacionais, linguagens de programao e software
de desenvolvimento.
David Briggs um a u to r de livros tcnicos e
e n g en h eiro de localizao de software que vive
em B irm ingham , Inglaterra. Q u an d o n o est Q uando Steve Milano no est escrevendo cdigo
sendo detalhista sobre com o guiar os usurios para o The Day Job ou tocando punk rock com sua
atravs de algum software p articu larm en te difcil, banda, a O nion Flavored Rings, em algum poro mal
n o tem n ad a que ele goste m ais do que ir ao ventilado, ele provavelmente est em casa com seu
p arq u e local com sua esposa, P aulette e Cleo, o laptop, negligenciando a com panhia felina de Ralph
cachorro da famlia. ou a com panhia hum ana de Bianca.
Will Harris o responsvel p o r um d epartam ento H arvey Q uam eii desistiu de u m a carreira em
de TI que fornece servios para 11 em presas program ao de com putadores p ara se ju n ta r
em 4 continentes, e o Vice-Presidente da filial ao chique e glam ouroso m u n d o universitrio.
em Las Vegas do PASS (Professional Association A tualm ente, Professor Associado de Ingls
for SQL S erver). A noite, ele en tra n u m a cabine e H um anities C om puting na Universidade
telefnica, coloca o seu uniform e web 2.0, e sai de Alberta, onde d aulas sobre cybercultura,
p o r a ajudando os designers e desenvolvedores literatura do sculo XX e desenvolvim ento web -
do Powered By G eek a garantir q ue as suas incluindo PHP e MySQL.
plataform as de dados perm aneam flexveis, Chris Shiflett o Chefe de Tecnologia da O m niTI,
portteis, de fcil m anuteno e RPIDAS, onde lidera a prtica de segurana de aplicaes
usando MySQL e Rails. Ele tam bm gosta de web e guia a iniciativa de desenvolvim ento web.
passar seu tem po com sua esposa, H eather, suas Chris um reconhecido ld er nas com unidades
lindas filhas M ara e EUie, e seu cachorro Swiper de segurana do PHP e de aplicaes web - um
Stephanie liese um a instrutora tcnica e b logueiro bastante lido em shiflett.org, um
desenvolvedora web em Sacram ento, Califrnia. p o p u lar palestrante em conferncias no m undo
Q uando ela no est p regando as virtudes do todo, e o fu n d ad o r do PHP Security Consortium .
cdigo que obedece aos padres ou rem ovendo Seus livros incluem Essential PHP Security
bugs de algum layout CSS, voc a encontrar (O Reilly) e H TTP D evelopers H and b o o k (Sams).
suando em um a pesada aula de yoga.
introduo

Agradecimentos
Nossos editores:
Muito obrigado a Brett McLaughlin pela incrvel
sesso de storyboarding que nos colocou
no caminho certo, e pelo seu compromisso
inquebrantvel com o aprendizado cognitivo.
Este livro no existiria se no fosse pelo esforo,
pacincia e persistncia hericos de Sanders
Kleinfeld. Ele sempre conseguia apanhar os pinos
com os quais estvamos fazendo malabarismo, toda
vez que inevitavelmente deixvamos cair um (ou
trs!), e somos gratos por isso. Esperamos que ele
tenha a chance de descansar por alguns dias antes
de encarar um outro projeto to difcil quanto este.

A equipe OReilly:
Obrigado a Lou Barr pelas suas
fenomenais habilidades em
design, que fizeram este livro ter
uma aparncia to boa.
Obrigado tambm a Brittany Smith por Sanders teineid
todo o seu trabalho em cima da hora e
a Caitrin McCollough por colocar no ar
os sites de exemplo. E a Laurie Petrycki
por acreditar que ns poderamos
escrever mais um timo livro da srie
Use a Cabea!

E tambm:

Finalmente, muitssimo obrigado a Elvis Wilson


por elaborar os vdeos de aliengenas no You Tube
p a r a o C a p tu lo 12. tim o tra b a lh o ! E s p e c ia lm e n te
considerando que ele um simples diretor de arte do
tempo das cavernas.

xxxvii
1 Adicionando Vida s Suas Pginas Estticas

* + Est Vivo

Voc tem criado timas pginas web com HTML, com recursos de
CSS mas tem percebido que os visitantes do seu site no podem fazer muita coisa alm de olhar
passivamente o contedo das pginas. A comunicao apresenta-se de forma unidirecional e
voc gostaria de mudar isso. Na verdade, o que voc realmente gostaria de saber o q u e o s e u

p b lic o e s t p e n s a n d o . Mas para isso precisa permitir que os usurios digitem informaes em

um formulrio web, para que possa saber o que eles tm em mente. E seu site precisa ser capaz

de processar essas informaes, para que elas lhe sejam entregues. Est comeando a parecer

que voc ir precisar de mais do que HTML para levar seu site para o prximo nvel.

este um novo captulo 1


as vezes somente HTML no suficiente

HTML esttico e chato


O HTML timo para se criar pginas web, at a voc j sabe. Mas, e
quando voc precisa que as pginas realizem alguma ao? Suponha que
seja necessrio fazer uma busca em um banco de dados ou enviar um
email... como fazer? O HTML deixa a desejar, porque uma linguagem sem
vida, elaborada para exibir informaes que nunca se modificam.

0 HTML- c Wo ^and
a m-temao e apen*

towparblHar wa do
seu VidHo de estim^o-- mas
ao tawfco guando desej Estas pessoas
ir>'tera^iv' to cs visitantes esta em busda
do seu site-
interao.

Cm pginas HTML
O servidor web representa uma grande parte
do problema com o HTML esttico, uma vez
pureis, 9 seiVidor
que ele funciona como nada mais que um s i m p l e s m e n t e s e tV e
mecanismo de entrega sem graa. O navegador
requisita uma pgina, o servidor responde HTML esttico, <jue
com HTML, fim da histria. Para transformar
sites em aplicaes web interativas, o servidor SP e de eXibt
precisa assumir um papel novo, mais dinmico...
um papel possibilitado pelo PHP. coijtdp.
adicionando vida s suas pginas estticas
Co uma pequena
ajuda
o do 'servido-/
ct vioor'
PttP d vida s pginas web Com ?H? na parada,
O PHP lhe permite manipular o contedo das pginas 9 seVxdot Web
web no servidor, imediatamente antes de a pgina ser
enviada ao navegador cliente. Funciona da seguinte e c a p e is d e e r a r
maneira: um script PHP executado no servidor, e pode
alterar ou gerar cdigo HTML vontade. Uma pgina
HTML ento entregue ao navegador, que no sabe e
pginas HTML de
nem liga se h PHP envolvido na produo ou zyuste do
HTML, no lado do servidor.
fotma dinmica, em
- j 0 dodifto HTML destas
tempp real.
PttP Sdo
*T 'rto T M i P0'" PHP, e pode se ainia2hados o
^ lr's nriodiiar dinawitamene,
no^maS|as f defendendo do que a ^ wvidor web, o^de
ri* . fo, jarado v - r 530 P^essados e
dinamita^ente 1 depois os resultados
aivavs de PHP, no entreves ao
servi d cv ^vegader o,o
Painas HTML.
Servidor w eb

Navegador
w eb clien te

N A
Os srip-b PHP onW
Pginas HTML dinwtas^^ t d p HTML e ftdiy>
SC rwodi-f3w> e 'res^ost de sdnpt PHP, oi V * s
igita frogvamiida deterwinaw o modo towo o
td ',50 HTML t .angulado-
presente nos sdripis
PHP, -tornandoos 0 PHP armazina e retira
intnveiwente le*veis. dados de um banto de
Banco de ddos e os incorpora ao
dados MySQL odigo HTML gerado.

voc est ago/ 3


Ces no espapo
E ste o O w en . E le p e r d e u se u c a c h o r r o , F an g . M as
e n c o n tr a r se u c o n o sc re s tr in g e a u m a sim p les la re fa
d c p r o c u r a r p e l o b a i r r o . A c o n t e c e q u e F an g f o i a b d u z i d o
p o r a lie n g e n a s , o q u e e x p a n d e a b u sc a d e O w e n p o r to d o
o u n iv e rso . O w en sa b e u m p o u c o d e HTM L. e CSS e a c h a
q u e u m site p e rs o n a liz a d o p o d e r ia aju d -lo a re so lv e r seu
p ro b le m a , a o p e r m itir q u e o u tra s p esso as c o m p a r tilh e m
suas p r p ria s e x p e ri n c ia s d e a b d u o a lie n g e n a .

M as, p a ra o b te r in fo rm a e s d as pesso as, O w en p re c is a r


d e u m fo rm u l r io w eb c a p a z d e r e c e b e r in p u t ( e n tr a d a
d e d a d o s ) d os u su rio s e n o tific -lo s o b re esse in p u t. S em
p r o b le m a - o H T M L p o ssu i vrias tags p a r a a c ria o d e
f o rm u l rio s w eb.

Os de-balves sao as o
sWos t yt
avrebatado * < M a 50 tcu
_ Y&r um V3' lwz
adicionando vida s suas pginas estticas

Um formulrio ajuda Owen a descobrir toda a histria


O novo site de Owen, AliensMeAbducteme.com, tem por objetivo conect-lo com
abduzidos que possam ajudar a esclarecer um pouco sobre o desaparecimento de Fang.
Owen sabe que precisa de um formulrio HTML para requisitar histrias de abduo dos
visitantes e que precisa descobrir se por acaso, eles viram Fang durante as suas jornadas
interestelares. Mas Owen precisa de ajuda para conseguir montar o site e coloc-lo no ar.
Eis o que ele tem em mente para o formulrio.

Este o tampo para 0


ewieveo de emaii do visitante-

, 0 VJK <^uer uma


dcsrio -Psifii
si dos
aliehs.

Owtr, espera <\ue al^wcm


responda sim, ^*e eles viram
*a espawave aliengena-

^uais^uv fiomentirios
adiciowais So o lo t d a a^ct.
vjen deseja redeber uma
mensagem de ema! guando o
usuirio submeter o -formulrio-

O que voc achou do form ulrio HTM L de Owen?


ste -formulrio c Voc consegue pensar em quaisquer problemas com os quais Owen
lOO%t pur HTML./ poder se deparar quando tentar obter dados sobre abdues
usando este formulrio? V em frente, ponha suas ideias no papel.
.vrs. . .

.r?:..!A .:... X }. .....................*................................................

voc est aqui 5


formulrio htm l do Owen
Se predisar de um
re-resdo de memria
Formulrios so feitos de HTML sobre domo driar
O formulrio Relate uma Abduo de Owen (baixe este cdigo atravs formulrios HTML, de

do site da altabooks.com.br) se compe, inteiramente, de tags e atributos uma olhada o Cap-Wo


HTML. H campos de texto para a maioria das perguntas, botes de l^vde Use a Cabea!
rdio para descobrir se o visitante viu Fang e uma rea de texto para HTML tom CSS \
*rtTML
comentrios adicionais. E o formulrio est configurado para enviar os
dados recebidos para o endereo de email de Owen. O w n ira redeber o doniedo
V ailV ' c um ^robotoo ue permi-te deste -formulrio enviado
t^uc dados t -formulrios seja para ele este endereo de
r ^ail - fohha a<^ui o seu
enviados por email-
/ endereo para testar
<p>Share your story of alien abduction:</p> ^ o +ormulro.
<form method="post" action="m a ilto :owen@aliensabductedme.com"> ste valor diz. ao servidor
fc-.
<label for="firstname >t'irst fi'SIHS"!<./label>------- ---- ----- -
domo e*viar 05 dados.
cinput type=11text" id="firstname" name="firstname" /><br /> Ser post ou wt - N5
<label for="lastname">Last name:</label>' explidaremos a di-ferena
Cinput type="text" id="lastname" name="lastname" /><br /> mais rente-
clabel for='email">What is your email address?</label>
As tajs input dizem ao
Cinpuf*~type="text" id="email" name="email" 7><br />
-formulrio para esperar
<label for="whenithappened">When did it happen?c/label> irvformadoes, a\ui.
<input type="text" id=TTwhenithappened" name="whenithappened" /xbr />
clabel for="howlong">How long were you gone?</label>
<input type="textM id="howlong" name="howlong" /xbr />
<label for="howmany">How many did you see?</label> 0 atributo type diz. a ao do
cinput ty^C="text" id="howmany" name= "howmany' /xbr /> -formulrio para esperar texto.
<label or=aliendescription">Describe them:</label>
<input type="text" id="aliendescription" name^'aliendescription" size="32" /xbr />
<label for="whattheydid">What did they do to you?</label>
<input type="text" id="whattheydid" name="whattheydid" size="32" /xbr />
<label for="fangspotted">Have you seen my dog Fang?</label>
Yes cinput id=fangspotted" name="fangspotted" type="radio" value="yes" />
No cinput id="fangspotted" name="fangspotted" type="radio" value="no" />cbr />
cimg src="fang. jpg" width=,'100" height="175"
alt="My abducted dog Fang." />cbr />
clabel for="other">Anything else you want to add?c/label>
ctextarea id="other" name="other"x/textareaxbr />
cinput type="submit" value="Report Abduction" name="submit" />
c/form>

0 -formulrio -fidS dontdo 0 botao submeter"


dentro de ta$s <orm> de Nenhuma surpresa a^ui - o diz. a -formulrio
abertura e de -fedbamento- -formulrio e \0% puro para exedutar a ao
tot ligo HTML/ exposta ali.
adicionando vida s suas pginas estticas

T fe sr O r v c

Teste o form ulrio R elatar um a Abduo.


Baixe o cdigo da pgina Relatar uma Abduo no site
da Alta Boks, em www. altabooks. com.b r . O cdigo
estar no cadastro deste Livro. O folder chi contm o
formulrio de Owen em report.html, bem como uma folha
de estilo (style.css) e uma imagem de Fang (fang.jpg). t
O
style.cssJ^(M8f
Abra a pgina report.html em um editor de texto e WnM fan9 -jpg
troque o endereo de email de Owen pelo seu. Em seguida, report.

abra a pgina em um navegador web, digite algumas


informaes no formulrio e clique no boto Relatar
Abduo (Report Abduction).

$u3ho v<* submete o W ulrio,


isso resulta nos dados a serem
Aliens Abducted Me - Report an Abduction enviados... ou $so.
Share your story of alien abduction;
First name: Aif 0 -formuiario HTML- nao
Lost names Nad sab) reataentci iomo enviar
W hat is jo u r emafl ad/lress? jaJfnfgiriie
^a^reen.ccm
uma mensagem dt email,
When did tt happen?
How hmg were you gpne? 111 hours entao ele delega a trea
How many did you see? Idoze ns para o progva^a de email
!ilttifi greec* me?K
Descrfte them;
W hat did they do to you? ;asksdnttfaboutItfO do prprio usurio
Have you seen my dog Fang? Yes Q N 08

0 s dados do -formulrio irvao sao enviados p a r a ^ y


Owen, a no ser <^ue o usurio manualmente
envie esta estranha mensagem de email-

Ento, o que voc achou? Voc recebeu os


dados do form ulrio com o um a m ensagem de
em ail na sua ca ix a de entrada?
voc est aqui 7
mailto - m idia

0 formulrio HTML apresenta problemas


O formulrio Relatar uma Abduo est no ar, operante, mas ele
no consegue obter muitas inforaiaes dos usurios. Ser que a
abduo de Fang corresponde a um incidente isolado... ou tem algo
de errado com o formulrio. Vejamos o que os usurios tm a dizer.
Quando clico no boto, ele
abre o meu programa de email,
o Outlook, e nada do que digitei,
durante 15 minutos, ficou
registrado no formulrio!

Eu observei algo parecido com


o seguinte no campo Assunto:
?When=<&Where=. Estou confuso.
Apareceu um email em
branco. Todas as respostas que
O eu tive o trabalho de digitar foram
ignoradas. Deveriam abduzir este
formulrio idiota!

No aconteceu nada, porque


o meu navegador no tem um
cliente de email padrao... seja
esta extraindo mais -kusW o do ue
T ' T motivo> 0 de
la o que isso signifique.
'Wmaao dos visitantes do seu site.

O que est acontecendo


aqui? Voc tem ideias
sobre com o co n serta r o
form ulrio?
adicionando vida s suas pginas estticas

P a rece estar tudo OK com


o formulrio. Ser que o
problema tem algo a ver com
aquela parte do "mailto"?

O
o

Sim. O cdigo HTML do form ulrio est correto, m as


m ailto no um a boa m aneira de enviar dados
O formulrio de Owen funciona bem at o usurio clicar no boto Relatar
Abduo. Nesse ponto, voc passa a depender do recurso de m a ilto para
empacotar os dados do formulrio em uma mensagem de email. Mas este
emal no enviado automaticamente - ele criado no programa de mail
padro do computador do usurio. E o pior: o usurio precisa enviar ele
mesmo o email, para que os dados sejam realmente enviados para voc!
Voc no tem nenhum controle sobre a entrega do email, significando que
ele poder ou no - fazer a viagem do seu formulrio web, passando pelo
navegador do usurio e pelo seu cliente de email, at chegar a voc como
uma mensagem de email. Nada bom.
Voc precisa de uma forma para ter o controle sobre a entrega do
formulrio web. Mais especificamente, voc precisa que o PHP empacote
os dados em uma mensagem de email, e depois se certifique de que essa
mensagem ser enviada. Isto envolve desviar a sua ateno do cliente
(HTML, m a ilto , etc.) para o servidor (PHP).

0 ormulrio esta
timo, a te voee
t\\t no boWRelatav
Abduo - enta? tudo
dcsntoron!

voc est aqui 9


lado-cliente versus lado-servidor

HTML roda no cliente


O formulrio de Owen foi escrito em HTML puro, com uma ao
m a ilto que tenta enviar os ciados via email. Embora a pgina re p o rt
htm l venha de um servidor web, ela preenchida e processada
inteiramente no navegador web do usurio.
O navegador requisita a
pgina web de Owen, a
qual inclui o formulrio

0 software
navegador do seu
domputador roda
a\ui, ta mbem O servidor retorna o
torMctido orno cdigo HTML para a 0 sa-bwave servidor web
C L lW T t . pgina web. de O^tT voda a\ui> tambem
donHedido domo SERVlPR
O usurio preenche o
formulrio e o submete.

A tag de ao do formulrio
diz ao navegador para
pedir ao programa de email
do usurio que crie uma
mensagem de email.

O programa de email do usurio


cria uma mensagem com os servidor jamais
dados do formulrio - mas o entra em dontato
usurio que precisa envi-los, to m os dados
manualmente, a Owen. digitados em
O papel do servidor, aqui, limita-se a apenas entregar a pgina web ao -formulrios <^ue
navegador. Quando o usurio submete o formulrio, o navegador (cliente!) usem mailto-
precisa resolver sozinho a questo de como fazer os dados serem enviados
via email. O cliente no est. equipado para entregar dados do formulrio -
esse um trabalho para o servidor.
adicionando vida s suas pginas estticas

PHP roda m o servidor


O PHP lhe permite controlar os dados que o usurio digita no
formulrio, enviando-os para voc de forma transparente. O usurio
digita o seu caso de abduo no formulrio, clica no boto Relatar
Abduo e pronto! O cdigo PHP cria a mensagem de email, a envia
para voc e ento gera uma pgina de confirmao para o usurio.
^ Eu---- ---
gostaria de 0 O navegador requisita a
^ receber a pgina "Relatar pgina web de Owen.
7 uma Abduo1', por favor.

O servidor responde com o cdigo


HTML para a pgina web.
O usurio preenche o formulrio e o submete,
enviando os dados a um script PHP presente
no servidor.

O servidor envia uma confirmao


em HTML ao navegador.
O**:* vetebe, to u*
ayadaveWen-te atado.
M arque os lugares onde voc ach a que os scripts PHP devem residir:

| | no cliente X no servidor j^j em ambos j^j em nenhum dos dois


voc est aqui 11
php uma linguagem do lado-servidor

Os scrpts PHP rodam mo servidor


O cdigo PHP roda no servidor e armazenado em sciipts PHP que
geralmente tem a extenso . php. Os scripts PHP frequentemente se
parecem bastante com pginas HTML normais, porque contm tanto
cdigo HTML quanto CSS. De fato, quando o servidor executa um script
PHP, o resultado final sempre HTML e CSS puros. Assim, todo script
PHP acaba se transformando em HTML e CSS, uma vez terminada a sua
execuo no servidor.
Vamos dar uma olhada mais detalhada no modo como o script PHP
modifica o fluxo do formulrio web de Owen.
O navegador do cliente requisita uma pgina HTML -

r e p o r t htm l

O O servidor retorna a pgina HTML

hc t\\tr M boto "Relatar Abduo", 0


usuatrio submete os dados do ww.ulirio
para o sfivift PHP do servidor.

O usurio preenche o formulrio e o submete,


fazendo o navegador repassar os dados para um
script PHP no servidor.
adicionando vida s suas pginas estticas

0 PBP uma linguagem de programao


do lado do serVidPT (serVe-side) -pofs ele
rpda em um serVidor Web.

O servidor retoma uma pgina de HTML puro,


gerada pelo script PHP.
Embora Onome da pagina aparea tom
uma extenso fhp no navegador, ela t
0 sdript PttP v-oda no furo HTML, neste ponto.
servidor!

O navegador exibe a pgina


de confirmao.

Aliens Abducted Me - Report an Abduction


Youwereabductedlast Nororiberaod weregonefor I bows
describedicta
Was Fau<h*rc?Do
Y"ouremail6*hca

0 usurio ve A
uma pgma de ^
tonirma^ao.
O servidor executa o script PHP, o qual
envia um email e gera uma pgina de
confirmao em HTML.
O email enviado
para a Caixa de
Entrada de Owen.
o atributo action do formulrio

O atributo action dos elem entos do form ulrio o que


con ecta este ltim o ao script PHP, fazendo o script ser
executado quando o form ulrio subm etido.
Os formulrios so criados usando-se a tag HTML <f orm> e cada tag
<f orm> possui um atributo action. O arquivo cujo nome voc inclui
com o atributo action usado pelo servidor web para processar o
formulrio quando este submetido. Assim, se o script PHP de Owen
se chamar report.php, ento a tag <f orm> para conect-lo ao
formulrio se parecer com o seguinte:

< fo rm a c t i o n =s m ethod = " p o s tM>

Quando o usurio clica no boto Relatar Abduo a ao do


s tc t o YiOTnt o formulrio faz o script report.php ser executado no servidor,
seu sflrip-l PHP- para processamento dos dados.
0 atvibwto dtion
da iao| <<**>
t o c faz. o
<html>
s tric t PHP sec
ey-edu-tado o
<head>
</hLidt>e>Alie:1S Me - an Abduction</title>
<body>
^ 2>^lie?!.,AhdUCt6d Me " RePrt an Abduction</h2 > o -ovwuUrio c
<link rel- stylesheet" type="text/css"
</head>
<body>
= 1 css" />
-ext/css href="style. submetido-
<h2>Aliens Abducted Me - Report an Abdoction</h2>
<E>ghare your story of alien abduction:</n>
re p o rth tm l
mr-msttu g'.hi'i.L Igbai
/IfC'rm method- post11 COI>xun=--report.J
action-repSTt.php-r^ ^ ---

input type- teXi_ id="irstnameM na,-ns="firstname" /xbi

reportphp
adicionando vida s suas pginas estticas

nty? existeni
T e rg u n ta s id P tc ts

T ** 0 que significa PHP?

PHP um acrnimo que originalmente significava Personal Home


Pages (Pginas Pessoais). De alguma forma, o acrnimo teve o seu
significado modificado para PHP: Hypertext Processor (Processador
de Hipertexto PHP). Este ltimo considerado um acrnimo recursivo,
porque ele referencia a si mesmo - um acrnimo (PHP) dentro do
acrnimo. Inteligente? Confuso? Voc decide!

* Mesmo que o meu navegador esteja mostrando que o nome da


pgina termina com .php, ela ainda puro HTML? Como possvel?

Isso possvel porque a pgina comea a sua vida como cdigo


PHP no servidor, mas transformada em cdigo HTML antes de ser
enviada para o navegador. Assim, o servidor executa o cdigo PHP e o
converte em HTML antes de envi-lo para ser visualizado no navegador.
Isso significa que, mesmo que o arquivo .php contenha cdigo PHP,
o navegador nunca v esse cdigo - ele v apenas o cdigo HTML,
resultado da execuo do cdigo PHP no servidor.

* Mas no verdade que toda pgina web se origina no servidor,


inclusive as pginas HTML puras, em arquivos .html?

Sim. Todos os arquivos que compem um site ficam armazenados


no servidor - . html , . c s s , . php, etc. Mas nem todos
eles so processados peio servidor. Os arquivos HTML e CSS, bem
como arquivos grficos, so enviados diretamente para o navegador do
cliente, sem preocupaes sobre o contedo deles. Os arquivos PHP so
diferentes porque contm cdigos que so processados e executados no
servidor web. No o cdigo PHP que enviado ao navegador, e sim os
resultados obtidos ao se executar o cdigo PHP, - esses resultados so
HTML e CSS puros.

voc est aqui 15


seu 1a scrip t php

Use PHP para acessar os dados do formulrio


Ento, Owen precisa de um script PHP capaz de fazer com que as informaes do formulrio
cheguem a ele de forma mais confivel do que atravs do e-mail. Vamos criar esse script.
No se preocupe em entender tudo agora - ns chegaremos l:
O.*riftsPHP M , a Vi nw
frequentemente as doisas -fica per-feitamente
to * ttp * r* tc o & > -
mi o w a ^ es. normal um script PHP
j X * bastante . w ^ a niluir ia^s c atributos
<html> jjma HTML normal- do pWf5 HTML normais.
<head> propriamente dito.
J
<title>Aliens Abducted Me ort an Abduction</title>
</head> 0 blodo de ddijo
inteiro PHPo
<body>
restante do stript c
<h2>Aliens Abdus? d Me - Report an Abduction</h2> HTML normal-

I
j| fcsU pedao dc
PHP obtem
os dados do
formulrio, para
<\*e eles possa
ser exibidos
tomo parte de
uma pgina de
dottirmadao.

| || usamos
PHP para $erar
ddi^o HTML a
partir dos dados
do -formulrio-

</body> jftssim domo uma p^ina v/cb normal,


s^ ip t PHP termina ehando
</html> ^uis^uer tajs HTML abertas.
adicionando vida s suas pginas estticas

T f e f iT O R f V E
Modifique o form ulrio de O wen de form a que e le use
um script PHP para processar os dados do form ulrio.
Crie um novo arquivo de texto chamado r e p o r t . php e digite nele
todo o cdigo da pgina anterior. Esse o script que ir processar o
formulrio web de Owen.
O script PHP ainda no est conectado ao formulrio; abra a pgina
report.html em um editor de textos e modifique a ao do
formulrio para report .php em vez de mailto. report.html p^ty

:form action = method = "post": reportphp ar>g.jpg


Abra a pgina r e p o r t . htm l em um navegador web, digite algumas
informaes do seu caso de abduo no formulrio e clique no
boto Relatar Abduo.
Dpersdeftd do seu havendo*-,
voe podara ve*- uma p^ih
'web Com ww ie*to esquisito ou
Aliens Abducted Me - Report an Abduction Possivelmente apenas o to i$o-
fotvfce PttP do sript report php.
Share y o o r s to iy o f afiB a bd uctio n ;

First name:
Last name:
5Nadir
ilasrHov^'Der Aliens Abducted Me - Report an Abduction
W hat is your email address? >alfin*er*al|s
W ie n did it happen?
How Long -were you gone? :3=il hre----------Y o u v , M u c d ', SwbeaJLhappewd". echo and gone
w e re fo r .
How m any did vou see? 5 iio w _ lo n g ; echo ^ ,
Dtsc-rEb them: :<w.ywn*.. Descrioetem:1.Sa^des^iior^M
W hat did they do to you?
Have you seen my * * 6 Fang?
Yes O Nc Yournail aadnsssK .
W as F ang *e re ?

-mm

<raeta '* _
Pteasivoisterme. <<b/ohdeya>dv Aiia* Abducc-d epcr-fc ar,
aC
i
I
f
1 want tadd? <h2>JUiece bducfced
R e p o rt A ixiu e t ioQ < /h 2 >

^ M e S a q u e assim mesmo que o script PHP deveria funcionar?


Escreva aqui a sua opinio, e o que acha que est acontecendo.
. f / . . d . . M M y U / ^ % .
s ^ r ^ . ..0 .. .................. ....................

voc est aqui 17


colocando scripts php no servidor

Os scripts PHP precisam ficar em um servidor!


A no ser que voc, por acaso, tenha um servidor web rodando no seu se vt tiv er
computador local, o script re p o rt .php no poder ser executado ur* servidor web
quando voc submeter o fo rm u l rio Relatar uma Abduo. Lembre-se, o instalado lodalmetc,
PHP uma linguagem de programao e precisa de um ambiente onde e ele tiver suporte a
possa rodar. Esse ambiente um servidor web com suporte a PHP. Scripts P^P>enta poder
PHP e pginas web que dependem deles precisam ser colocadas em um testar os stripts PHP
servidor web real, no basta apenas abrir um script diretamente a partir de diretamente no seu
um sistema de arquivos local. tomputador.

$0 tontrrio de paginas HTML-


podem ser abertas Totalmente em w*
navegador web, os stripts PttP
sempre ser waberW atravs de um
IXRLi a partir de um servidor web
Os navegadores web
no sabem nada sobre
PHP e, portanto, no
so capazes de rodar
scripts PHP. $e stript PHP representa
apenas um monte de
tdigo sem sentido para o
navegador web.

0 servidor web
entende este
tdigo PHP e Os servidores web com suporte
e*etuta o stript! a PHP so equipados para
rodar scripts PHP e transform-
los em pginas HTML que os
navegadores possam entender.

Wma -forma ra>ida de saber se uma


pagina web esta sendo entregue por
um servidor web c olhar se a U R L
tometa tom wKttp:M. Pginas web Os scripts PHP deVem ser
abertas tomo arquivos letais sempre
iomeam tom W-file'W eXecutadPS em um serVdPT
W e b , o u e n t o n a q u n c f n t o .
adicionando vida s suas pginas estticas

Coloque os seus scripts PHP no servidor


E perfeitamente vlido criar e editar scripts PHP no seu computador local. Porm, voc
precisa colocar os arquivos em um servidor web antes de execut-los. Os arquivos PHP,
frequentemente, so colocados junto com arquivos HTML em um servidor. No h nada fora
do comum em colocar scripts PHP no servidor web - basta coloc-los em um lugar onde as
suas pginas web possam acess-los. Para fazer o upload (envio) dos arquivos para o servidor,
voc precisar da ajuda de um utilitrio, como por exemplo, um programa de FTP (File
Transfer Protocol ou Protocolo de Transferncia de Arquivos).

A maioria dos sdripts


PHP apareie junto dom
outros arquivos, a
esma pasta, de*tro do
servidor. so, 3*
jeralmente, ha vezs, armazet^ads
pasta o servidor Cm urtv pst
web onde a maioria, prpria, par melhor
se no todos, os or^nizaddo no
arquivos sao servidor... mas fido
armazenados. style.css
_
fang.jpg
este daso.

Fazer o upload dos seus scripts PHP para um servidor web


no o suficiente - esse servidor tambm precisa ter o
PHP instalado nele. Alguns servidores incluem o PHP por
padro, alguns no.
ne existem
Se vo c n o
perguntas idptas tiv e r o P H P
T * Como eu posso saber se o meu servidor web tem o PHP instalado? in s ta la d o n o
seu s e rv id o r
Voc pode perguntar ao seu administrador, ou sua empresa de w e b , co n su lte
hospedagem de sites, ou ento pode realizar um pequeno teste, voc o Apndice ii.
mesmo. Crie um arquivo de texto chamado t e s t e . p h p e coloque o
Nele, encontrar instrues
seguinte cdigo nele:
para ter o PHP instalado e
<?php
ste ddi$o pede para
operante no seu servidor.
phpinfo()
?> o^t in-formaoes sobre o
PHP sejam mostradas no
Agora, envie (upload) o teste.php para oS&tf&W idor, e ento digite
a sua URL em um navegador web. Se o PHP estiver instalado no
seu servidor, aparecero vrias informaes detalhadas sobre o Lembre-se de deietar o sdript
PHP, incluindo a sua verso. Bingo! phpmo guando estiver terminado,
desta -forma, nin^uem mais
tonse^ue ver isto
voc est aqui > 19
test drive no seu script php

_ T Je s t O r iv e

Faa o upload dos arquivos da pgina


"R elatar um a Abduo e te s te o form ulrio...
novam ente.
Envie os arquivos report.html, report.php, style .
css efang.j pg para um servidor web que tenha o PHP
instalado. Digite a URL da pgina report,html no report php fan9-ipg
re p o rt

seu navegador, preencha o formulrio com informaes


do seu caso de abduo, e clique no boto Relatar
Abduo.

First name:
Last name:
W hat fs your email address?
W hen dfd it happen?
How tang w ire you gone?
How m any did you see?
Describe them:
W hat did they do to you?
Have you seen m y dog Fan g?

Anythm g else vou wfint tn add?


adicionando vida s suas pginas estticas

Legal. Agora s preciso adicionar um


pouco de cdigo PHP para enviar os
dados do formulrio por email.

Isso m esm o. O script report.php ainda precisa


de algum cdigo para en viar os dados para
Owen por em ail.
Mas isso no problema, porque o PHP oferece uma funo,
que um pedao de cdigo pronto reutilizvel, que voc
pode usar para enviar mensagens por email. Voc s precisa
determinar o que a mensagem deve informar, e ento pode
usar o PHP para cri-la e envi-la.

Um momentinho! Ns nem sabemos


como o script report.php original
funciona, e agora ainda temos de
torn-lo capaz de enviar emails. Isso,
tipo, muito difcil... o que vocs esto
pensando!?

verdade. Para fazer m ais coisas com o


PHP, preciso saber m ais sobre o PHP
Assim, para adicionar a funcionalidade de email
ao script report-php de Owen, voc ter de se
aprofundar um pouco mais no PHP e precisar ter um
entendimento slido de como o script funciona - pelo
menos at aqui.

voc est aqui > 21


como o cdigo php muda para htm l

0 servidor transforma PHP ew HTML


Para que se entenda como um script PHP funciona, o principal entender o que acontece
com o script quando ele executado no servidor. A maioria dos scripts PHP contm tanto
cdigo PHP quanto HTML, e o PHP executado e transformado em HTML antes de o
servidor enviar tudo - na forma de HTML - para o navegador web do cliente. No script
report.php de Owen, o cdigo PHP gera a maior parte do contedo HTML no corpo da
pgina de confirmao. O cdigo HTML em torno do PHP enviado sem modificaes.

Esie ddijo HTML caiado sem


modiidaes para c navegador.

Este tdigo PHP e


e*eutado pelo servidor
e gera o ddigo HTML
ontendo os dados <^*e
form digitados no
formulrio-

reportphp
Mais cdigo HTML estate,
*lu e transmitido pelo servidor
ao navegador sem modiaoes.
adicionando vida s suas pginas estticas

Este tod 130 HTML E sttido - isto r t o sc modi-Pida. >mmido - modi-pida


e chad em icmp dada vez.nue auu^
veal pe!o sdripi PHP, Orneie o iUr^WaVio/
o ^we perm'rte ao
dodi^o issuer doisas
iniereisar>-tes; demo
fo r exemple, indluir
dados <^ue adabaram
de ser digrfcados em
um formylario.
Thanks for submitting the form.<br />

You were them:


Describe abducted
<br last
/> November and were gone for 11 hours<br />
Was Fang there? no<br />
Your email

0 resul-fcado -filial do sdript


PHP e uma patina web ew*
HTML puro, <^we -foi gerada
dihdMnidamewte o servidor.

voc est aqui 23


anatomia do scrip t php do owen

Pescon$truindo o script PHP de Owen


O script report .php acionado pelo formulrio Relatar uma Abduo e o
seu trabalho (no momento) acessar os dados digitados e gerar uma pgina
de confirmao. Vejamos como.
O primeiro pedao de cdigo corresponde a HTML puro. Ele simplesmente report.php
configura a pgina que estamos criando, incluindo algumas tags HTML
requeridas em toda a pgina web. im, este cdigo
<html> HTML e mnimo
<head>
normalmente voe teria
<title>Aliens Abducted Me - Report an Abduction</title>
</head>
um POCTYPZ, tags
<body> <meta>j etc., mas
<h2>Aliens Abducted Me - Report an Abduction</h2> estamos mantendo as
Coisas simples, a^ui-
Aqui as coisas comeam a ficar interessantes. Estamos prontos para sair Pa<\ui em diante, estaremos
do cdigo HTML e entrar no PHP. A tag <?php abre uma seo de lidando tom cdigo PHP
cdigo PHP - tudo o que vier depois desta tag puro PHP. pelo menos at chegarmos
<?php <r tag de fechamento ?>

Este cdigo rene os dados do formulrio e os armazena em variveis individuais,


para que possamos acess-los posteriormente. As variveis do PHP permitem que
voc armazene valores, sejam eles nmeros, textos ou outros tipos de dados.
$when_it_happened - $_POST['whenithappened* Cada linha do cdigo PHP
$how_long = $_POST['howlong'];
reune os dados do field
$alien_description = $_POST['description'];
do formulrio para um
$fang_spotted = $_POST[Tfangspotted']
$email = $ POST['email']; nova varivel
Agora sim! Aqui, as variveis que acabamos de criar so colocadas em ao, sendo
inseridas no cdigo HTML, gerado dinamicamente. O comando echo ocasiona o
output (sada) de cdigo HTML, que retomado diretamente para o navegador web.
echo 'Thanks for submitting the form.cbr />'; FVoduz. a sada de
echo 'You were abducted ' . $when_it_happened; cdigo h t l para o
echo 1 and were gone for ' . $how_long . '<br />';
navegador
echo 'Describe them: 1 . $alien_description . '<br />
echo 'Was Fang there? ' , $fang_spotted . '<br
echo 'Your email address is ' . $email;

A tag ? > correspondente a <? encerra a seo de cdigo PHP. Daqui em


diante, estamos de volta ao cdigo HTML normal. M fecha o
?> ^ _____________ _____ _______ ____ ' PhP
Isto finaliza o cdigo PHP - depois desta tag, estamos de volta ao HTML normal.
</body>
</html> ^gora, termine a pagina fechando as tags
HTML <\ue havamos aberto-
adicionando vida s suas pginas estticas

o seu cdigo
Algumas regras PHP para o oun vida
O script r e p o r t. php de Owen revela algumas regras fundamentais da linguagem PHP, que
se aplicam a todo script PHP. Vamos dar uma olhada nelas.

O cdigo PHP sempre fica entre tags < ?php e ?>.

eu tdiy>, <?PhP h maioria do* s r ifb PHP so apenas paginas H T M L


ita a*\ui ^ tc*? to\<sp PHP inseridocm al^wm iu^ar - estas -fca^s
^ ^ __morirwa ao Srvidor ^uai pare do cdigo e PHP.

l y f Toda instruo PHP precisa terminar com ponto e vrgula (;)

echo 'Thanks for submitting the form.<br />';^

Sf^adasostu alKav,
cd,y>
v o -i^ se , 0 30 estiueCeu de i" t r " S a P f ^
olotar o "fon f vrJa*. 1. *> tarresy<m<k 3o ^
*o*tee iis d, ^ <** msb**
*\ue se pode imaginar.

Caso haja qualquer cdigo PHP em uma pgina web, uma boa
ideia nomear o arquivo com .php, e no com .html, no servidor.

K t essential, as e uwa boa


ideia ornear s tr ifb PHP tom a
extenso php-
reportphp

Os nomes de variveis PHP precisam comear com um cifro ($).

^----S- $em ail = $ _ P O S T [ em ail ' ] ;


0 ii-frao iden-i-Pida
dlrmefte a varivel PHP,
responsvel por armazenar Observando as variveis usadas no script r e p o r t. php, voc
m o^a^oes dentro de u consegue ver quaisquer outras regras do PHP referentes a
sdript PHP. variveis? Esreva-as aqui! j
....

voc est aqui 25


nomeando as variveis

A VciraVel
Ewo^itrsncloonoii^ pcfrrtopstra^ su^vskrvd corresponde a
Alm de comear com $, os nomes de variveis PHP so tambm case- y m C 91ltilllt
sensitive. Mas isso no tudo - existem outras regras importantes para T A T
os nomes que voc pode dar s suas variveis. Algumas delas se referem Pllclc- Y9 Ce pciO
sintaxe, significando que o seu cdigo falhar se voc as ignorar,
enquanto outras outras obras correspondem a apenas boas ideias armazenar dados, e
transmitidas de uma gerao de programadores PHP para outra. c a d a v a r i v e l t e m
Vamos comear com as regras oficiais que iro definitivamente causar um npnie li nico.
problemas se voc ignor-las ao nomear suas variveis. Siga estas regras
para criar nomes de variveis vlidas.
J n W ido!
ly fO primeiro caracter tem de ser um cifro ($).<:^ Sem dontar 0 h':'
tf* nome da varivel precisa ter no mnimo um caracter.
> e t requerido
no nome de ioda
varivel.
\y O primeiro caracter depois do cifro pode ser uma letra
ou um "underscore" (_), e os caracteres seguintes podem Invlido^ Nomes de
ser uma letra, um underscore ou um nmero. variveis PHP nao pode

fy
donter K-fens nem
Espaos e caracteres especiais, fora _ e $ , no so espados.
permitidos em nenhuma parte do nome de uma varivel

$fang^ 1 $when-- i t happened


Y sp o tte d
$ema i l Val'do ---------- --------- :_
/ r w h a t ^ 16^ d id _-
Invalido/ Hens no sa a l x e n j description
1/lid $h o w long I em nomes de
Vlido!-
= ---------- variveis PHP. Invlido/ Nomes
de variveis PHP
Se voc no seguir estas regras, o seu cdigo no funcionar. Existem predisam domedar
dom um di-frao (f).
ainda, outras regras que podem ser seguidas - por uma questo de
convenes de programao. Estas so regras que ajudam a tomar o
cdigo PHP um pouco mais consistente e facil de ser lido.
Os nomes das
Use minsculas nos nomes das variveis.
VoriaVes F HT
Em nomes de variveis com mais de uma palavra,
separe-as com "underscores". t
com ear

com um c i f r a i ) ,
Se voc ignorar estas duas ltimas regras, no sero geradas falhas
no seu cdigo. Certamente, voc encontrar cdigos PHP que no e YtfjQ fcpdem
seguem estas regras e, mesmo assim, funcionam perfeitamente. Isso
ocorre porque estas regras - sobre as quais estamos nos referindo - CU^e e S p a ^ S
tratam-se de uma conveno estilstica. Elas tomam-se teis quando
comeam a criar e nomear suas prprias variveis.
adicionando vida s su a s pginas estticas
no existem
p e rg u n ta s id io ta s
para os navegadores. 0 PHP no muda
- Faz diferena escrever os esse fato. 0 que o PHP lhe permite Lembre-se de que toda pgina
comandos PHP em maisculas fazer modificar o contedo HTML em web corresponde ao resultado de uma
ou minsculas? tempo real, inserindo dados como a comunicao de duas vias, envolvendo
data de hoje, informaes retiradas de uma requisio feita pelo navegador
K : Sime no. Emgeral, o PHPno um banco de dados, ou at mesmo cliente e uma resposta do servidor
"case-sensitive", portanto, vocpode valores calculados, como o valor total do web. A URL a base da requisio,
misturar maisculas e minsculas na pedido, em um site de compras. Assim, enquanto contedo retornado pelo
maioriados comandos. Issosignifica que o PHP permite que voc manipule o servidor a resposta. Os scripts PHP
voc pode usar echo, ECHOou EchO. HTML que compe as pginas web, em so requisitados da mesma forma
Entretanto, por umaquesto de conveno, vez de t-las criadas estaticamente, que pginas HTML normais, atravs
uma tima ideia ser consistente nos seus apenas uma vez. bastante comum ter de URLs digitadas no navegador ou
scripts. Amaioriados programadores PHP uma pgina HTML com cdigo PHP aqui linkadas a partir de outras pginas,
prefere usar minsculas na maior parte e ali para inserir dados importantes, ou ou como aes de formulrios. Isso
dos seus cdigos, e por isso quevera alterar programaticamente o HTML de explica porque a URL de uma pgina
grafia echo sendo usada nos exemplos de alguma forma. PHP mostra o nome do script.
cdigos deste livro.
O cdigo PHP inserido em A outra metade da equao a resposta
T * - Ento, mesmo sendo uma m um arquivo HTML precisa estar do servidor, que o cdigo resultante
prtica de programao, posso na sua prpria linha ou posso gerado pelo script PHP. Uma vez que
misturar maisculas e minsculas coloc-lo em uma linha HTML, a maioria dos scripts PHP gera HTML,
no meu cdigo PHP? como parte do atributo de uma faz sentido que esse cdigo seja HTML
tag HTML, por exemplo? e no PHP. Assim, no por acidente
que a URL referencie um arquivo .php
Mo completamente. A exceo no servidor, o que faz o cdigo PHP ser
corresponde aos nomes das variveis, Fora a necessidade de colocar o seu
executado no servidor, resultando em
o que tambm se aplica s localidades cdigo PHPdentro das tags <?php e ?>,
um contedo puramente HTML, que
de armazenamento de dados que no h restries sobre como inserir esse
retomado ao navegador.
voc cria. Vejamos a varivel $email cdigo no HTML. Naverdade, necessrio
usada no script "Relatar uma Abduo", colocar, frequentemente, umblocode
como exemplo. O nome desta varivel cdigo PHP no meio do cdigo HTML, por ^ As variveis PHP podem
"case-sensitive", portanto, voc no exemplo, quando estsendo configuradoo armazenar outros tipos de dados?
pode se referir a ela como $EMAIL ou atributode uma tag HTML. Esse umuso
SeMail. Todos os nomes de variveis, perfeitamente legtimo do PHP. Certamente. Voc pode us-las
em PHP, so "case-sensitive", por para armazenar dados Booleanos
isso, importante nomear as variveis T ^ " J vi cdigos PHP iniciados (verdadeiro/falso). Edados numricos
com cuidado e referenci-las de por <? como tag de abertura, em podem ser tanto nmeros inteiros
forma consistente, em todo o cdigo. vez de <?php. isso est certo? quanto de ponto flutuante (decimais).
Falaremos mais sobre nomes de H tambm os "arrays", os quais
variveis em outro momento. armazenam um conjunto de dados, bem
Na verdade, no. Tecnicamente
como objetos, os quais associam um
isso permitido, mas no
Realmente no tem problema recomendado. preciso que uma conjunto de dados ao cdigo usado
colocar cdigo PHP e HTML no para manipul-los. Os "arrays" sero
configurao do servidor esteja
mesmo arquivo? abordados um pouco mais adiante ainda
habilitada para que a tag abreviada
neste captulo, enquanto os "objetos"
(<?) funcione. Atag <? php usual
so assunto do Captulo 12. Existe
Nenhum problema. Na verdade, sempre funciona, ento melhor
simplesmente us-la, sabendo que o tambm um tipo de dado especial
em muitos casos, absolutamente chamado NULL, que representa
necessrio fazer isso. seu cdigo vai funcionar.
"nenhum vaior". Por exemplo, uma
varivel que no tenha nenhum valor
- E por que colocar PHP e HTML ? : Seo servidor web sempre atribudo a ela considerada NULL.
no mesmo arquivo? retoma HTML puro para o navegador
do cliente, por que as URLs mostram
o nome do script PHP, como, por
Porque o verdadeiro propsito um exemplo, paginaweb.php?
servidor web servir pginas web HTML
voc est aqui > 27
adicionando dados perdidos no owen

Clv-menta ci
unn desdVao
(desribe) dos aliens no
-ovrnulirio...

as a descrio a
aparece na pagina de
LorJtWmto
adicionando vida s suas pginas estticas

Aponte seu lpis


H um problema com os dados referentes descrio
dos aliens, no script report.php de Owen. Circule as
linhas do cdigo que voc acha que tem a ver com
o problema e escreva o que elas esto causando.
Alguma ideia do que h de errado?

<html>

<head>

<title>Aliens Abducted Me - Report an Abduction</title>

</head>

<body>

<h2>Aliens Abducted Me - Report an Abduction</h2>

<?php

$when__it_happened = $_POST ['whenithappened1] ;

$how_long = $_POST [howlong '];

$alien__description. = $_POST ['description1] ;


\
$fang_spotted = $_POST[1fangspotted']

$email * $_POST['e m a i l ;

echo 'Thanks for submitting the form.cbr />N:j

echo You were abducted ' . $when_it_happene^'; \

echo ' and were gone for ' . $how long .


* \
/ > > ' '<

echo 'Describe them: 1 . $alien description . '<br />


i . mi, c ik. /
echo Was Fang there? . $fang_spotted . '<br />;

iisiio 'Your email address is ' . $email;

?>

</body>

</html>

report, php

voc est aqui > 29


apontando soluo

F 3|^pottte seu lpis


S O U C O um Prklema com 05 dados referentes descrio
dos aliens, no script report.php de Owen. Circule as
linhas do cdigo que voc acha que tem a ver com o

ideiadoque deerrado?
problema e escreva o que elas esto causando. Alguma
h

<html>

<head>

<title>Aliens Abducted Me Report an Abduction</title>


s ta ImKa do cdigo
</head>
ob-tem a destvitao dos
<body>
aliens do respectivo
ta^po no -formulrio <h2>Aliens Abducted Me - Report an Abduction</h2>

ttTM U e os dados
Vmdz-ena em um3 <?php

varivel PHP Camada $when_it_happened = $_POST['wnenithappened'];

falien_jdesCription $how_long = $_POST['howlong'];

$alien_de script-i on = $JPQST[-description']?)

$fang_spotted = $_POST['fangspotted']
Este cdigo Combina a
$email = $_POST[email1];
descrio dos aliens Com
alguns ot-fcros -textos
e cdigos HTML e echo Thanks for submitting the form.cbr />';

envia tudo isso para o echo 1You were abducted . $when_it happened;

navegador. echo 1 and were gone for ' . $how_long . <br />';

$alien_description '<br />


echo 'Was Fang there? $fang_spotted^ '<br />'

echo 'Your email address is $email;


?>

</body>

</html>

Por al^vtm motivo, a variave) falien_ report php


description parece estar vazia- *ada bom.
adicionando vida s suas pginas estticas

Variveis servem para armazenar dados de scripts


As variveis PHP so como containers que armazenam informaes,
da mesma forma que um copo armazena uma bebida. Uma vez que
a varivel $alien_description est vazia, ns sabemos que os
dados correspondentes do formulrio no esto chegando at ela.
Assim, a varivel $a 1 ien_de scription permanece vazia, apesar
da nossa tentativa de atribuir alguns dados a ela.
Ns pveisa**os
de um dopo
elizmewte, trwsbordando
dopo endoniva-se desd<ries dos
vzio- igenas'
aienii
Este e e ftorvie da
varivel.
$a1ien_description
Saliendescription

Uma forma de consertar o script seria atribuir a string exata que estamos
esperando para a varivel $ a 1ien_de s cription, desta forma:

$alien_description = 'Homenzinhos verdes1

. pnp J PWP, 'pedaos de 4*xto,


0 13*
.wt IO dha-ad d stria y, deve
a atribuir <, valr da d .ta a s<mpre w u ] o t s ic i d ttilro d (
variave! da V erda. ^ rociclB S(. si |ej ou ^

Este cdigo armazena, definitivamente, o texto ' homenzinhos


verdes ' na varivel $alien_description. Mas ns resolvemos
um problema criando outro - este cdigo faz a descrio ser
sempre a mesma, independentemente do que o usurio digitar no
formulrio.

(x fc R S R Q
Por algum motivo, a atribuio dos dados do formulrio
referentes descrio dos aliengenas varivel
$aiien_description no est funcionando.
$alien description - $_POST['description 1];

O que voc acha que est errado com este cdigo?

voc est aqui 31


tudo sobre $_PO$T

O problema obviamente tem algo a


ver com aquele negcio de $_POST.
Mas no tenho ideia do que possa ser.

O
O problem a, de fato, tem algo a ver com $ _ p o s t ,
que um m ecanism o usado para que os dados do
form ulrio sejam transferidos para um script.
O cifro no incio de $ POST uma dica... $ POST um
Container! Mais especificamente, $_POST um conjunto de locais
de armazenamento usados para que os dados de um formulrio web
fiquem armazenados. No caso de Owen, todos os dados enviados
para script reportphp so armazenados quando algum preenche o
formulrio e clica no boto de Relatar Abduo. Assim, para acessar
os dados do foraiulrio e fazer qualquer coisa com eles, ns temos que
usar $_POST. Lembra-se deste cdigo?
$when_it_happened = $_POST['whenithappened1];

$how_long = $_POST ['howlong']; --------- -

$alien_description = $_POST['description'];

$fang_spotted = $_POST[1fangspotted'];

$email = $_POST [email1]; # esmo adonieCe a^ui,


exee-fco feio abo de <\uc os
, r is os. reere*tes o email
W t e a ***< *> * va* i e| c n il
abdu^o sao aonbuidcs a
varivel ?Kov#_jong.

Assim, os dados de cada campo do formulrio Relatar uma Abduo so


acessados usando-se $_P0ST . Mas o que exatamente $_P0ST... um a\,arivel?
adicionando vida s suas pginas estticas

t-POST uma varivel especial que armazena dados


do formulrio
$_POST uma varivel especial, conhecida tambm como superglobal,
porque ela interna ao PHP e fica disponvel para o script inteiro. $_POST
j existe quando o seu script executado - voc no a cria, como as outras
variveis no PHP.
A superglobal POST
Aliens Abducted Me - Report an Abduction armazena todos os dados
d't3'iiad os no iormularso-
Share your story of alien atdocton:

First name: ;A?f / $_POST[howlong>]


Lastnamei 1Madir f <html>
What is your esnafl address? \a ^r^1iYrealtfeep.e>m ;J <head>
When did it happen? \&sth ovemfcer <tifcle>Aliens
How toug wre y o u g o n e? ^11hoursTy </head>
How man} did you sec? ^daraus <body>
Describe them; ilittlesrceitihm <h2>Alens Afcd'
What did they do to yon? :asked aJsoistFOrgutetiOf>5
Have yoa seen my dog Fang? No & <?php
_ - y POSTr 'w hen it h a p p e n e d '1 ;
$how_long =(*$_P05T[1howlong']; *)
$alien__de$crIptlon~^'"$'_FfTt~*TSescription' ];
$fang_spotted = $_POST[f^gspotted11
$email = $_POST['email1J;

echo Thanks for submitting t\e form.cbr />',


:Pleasevot*?ornt. echo 'You were abducted ' . $w\en_it_happened;

VReportAbnhictiwT}
echo ' and were gone for . $h<Sw long . <br />';
echo Describe them: . $alien_oscription . '<br />
echo Was Fang there? 1 . $fang_spVtted . 1<br />;
?>echo Your email address is 1 .

</body>
</htmI>

A superglobal $_POST vinculada diretamente 0 nome


l
(por Quanto
" wr'

ao mtodo de submisso usado pelo formulrio tempo ) vem do atributo a^e usado
HTML. Se o mtodo tiver sido definido como post, a ta j <ipu-> Correspondente a este
ento todos os dados so empacotados dentro da Capo do Tormulario-
superglobal $_POST, onde cada informao pode
ser retirada e usada conforme necessrio. 0 E R > 0 __________________

JE /L'"/VV-
Como voc achaque
a superglobal $_p o s t
funciona? Como ela capaz
de armazenar mltiplos
0 reh>do de submisso do valores originrios de todas
iorwwlav-io determ ina o report html aquelas caixas de texto do
modo Corno S ddos so formulrio de Owen?
fornecidos ao script PHP.

voc est aqui 33


$_POST como um array

$-POST transporta os dados do formulrio para o seu script


$_POST um tipo especial de Container PHP, conhecido como array, que armazena um
conjunto de variveis sob um nico nome. Quando o usurio submete o formulrio de Owen,
os dados que ele digitou nos campos so armazenados no array $_POST, cujo trabalho
repassar esses dados para o script.
Cada elemento do array $_POST corresponde a uma
determinada informao, digitada em um determinado campo
do formulrio. Para acessar os dados referentes a um campo
especfico, voc usa o nome desse campo com $_POST.
Por exemplo, a durao da abduo armazenada em $_
POST [' howlong ' ]. O cdigo HTML do formulrio de Owen
revela o modo como os nomes do formulrio se relacionam
com os dados armazenados em $ POST.
<p>Share your story of alien abduction:</p>
<form method="post" action="report.php">
Clabel for="firstname">First name:</label>
<input type="text" id="firstr>ame" naree="firstname
Clabel for="lastname>Last name:</labei>
<input type="text" id="lastname" name="lastname" / x b r
<label for="email">What is your email address?</lab'
<input type="tex.t" id="email" name="email" / x b r

a rra y
<label for='whenithappened">When did it h /label>
<input type="text" id=nwhenithappened" na nithappened" 0
<label for="howlong">Hciw long were you go bel>
-------..........SWIfIffill
r= bowmany">How many aid you $ _ p o sr&
<input type="text" id="howinany" name="howman.y" / x b r />

p re e n c tld p co m
Clabel for=aliendescription">Describe them:</label>

clabel for="whattheydid">what ey do to""you?</label">"'


<input type="text" id="whattheyd: name="wh.attheydid"|Size="32" / X b r />
<label for="fangspotted">Have youl my dog Fang?</ll\jel> PS V cjpres <jue O
usuarfp dlgitpu
Yes <input id="fangspotted" name= angspotted" type="raaS,o" value="yes" />

="175" type="radio\value="no" / x b r />


No <input id="fangspotted" nairie="f
Cimg src="fang.jpg" width="100" he

n9 prmulrip*
alt="My abducted dog Fang." / X b r
<label for="other">Anything else you w add?</label>
<t ext area name="othern></textareaxbr
cinput type="submit" value="Report Abducti name="submit" />
</form>

0 nowC do trr^Q) HO
Wmulvio, deicvmina
o modo domo ele e
adessado de-bro do
array f J> 0 T

firstname aliendescription
iastname whenithappened howmany
Todos os dados do
$ POST -formulrio -fidam disponveis
atravs do arrav i PACT
adicionando vida s suas pginas estticas

r - ^A p on te seu lpis
X " Examine o cdigo de report.php que est fazendo
a descrio dos aliens ficar em branco e depois
escreva a soluo para o problema. Dica: use o
cdigo HTML do formulrio exposto na pgina
anterior para ajudar a isolar o problema.

<htrnl>'

<head>

<title>Aliens Abducted Me - Report an Abduction</title>

</head>

<body>

<h2>Aliens Abducted Me - Report an Abduction</h2>

<?php

$when_it_happened = $_POST['whenithappened'];

$how_long = $_POST['howlong'];

(^$a lien_description = $_POST[1description

$fang_spotted = $_POST['fangspotted']
Lembre-se1
anteriormente, os $email = $__POST [1email'];

isolamos o problem
para essas duas ImKas echo 'Thanks for submitting the form.<br />';
de tdigo.
echo 1You were abducted ' . $when_it_happened;

echo 1 and were gone for ' . $how_long . '<br />;

echo 'Describe them: ' , $alien_description . '<br / > ' ; y


*_________ ___ ____________________ ------ ^
echo 'Was Fang there? 1 . $fang_spotted . '<br />';

echo 'Your email address is ' . $email;

?>

c/body>

</html>

report php

voc est aqui 35


apontando soluo

ponte seu lpis


Solupo Examine o cdigo de report.php que est fazendo
a descrio dos aliens ficar em branco e depois
escreva a soluo para o problema. Dica: use o
cdigo HTML do formulrio exposto na pgina
anterior para ajudar a isolar o problema.

= " a l ie n d e script ion" name=(aU6ndescriptin^ si


<input type-"text id-

</head>
report.html
<body>
0 fiotwC do 3*po
Abducted Me - Report an Abduction</h2>
Cm \rportM>l
e "aliendcstvip-tioh,
< ?php
diievwte do wwe
"dcsCr'iyt usado Com $when_it_happened = SN^pST[whenithappened1];

fJ> 0T. $how_long = $_FOST ['howlon^J,


'aliendescvip-bo
$alien_description = $ POST[

$fang_spotted = $_POST['fangspotted

Ks pveCisamos $email = $_POST[1email1];

modiiicar i j > o s r
pra tonrigiv o echo Thanks for submitting the form.<br

nome do Cmpo-' echo 1You were abducted . $when_it_happened;

wa!icndestvip'tiohW. echo and were gone for ' . $how_long . '<br />';

echo 'Describe them: ' . $alien_description . '<br />';

echo 'Was Fang there? 1 . $fang_spotted . '<br />';

echo 'Your email address is 1 . $email;

?>

</body>

</html>

reportphp
adicionando vida s suas pginas estticas

- ___ T f e S T O R f V G -------------------------------------

C onserte e te s te o script.
Modifique a linha de cdigo problemtica em report .php e
depois a envie para o seu servidor web. Abra a pgina report.
html no seu navegador, preencha o formulrio com as
informaes do seu caso de abduo e clique no boto Relatar
Abduo para submeter o formulrio agora corrigido script.

voc est aqui 37


revisando o script php do owens

Aponte seu lpis

H alguns dados digitados no formulrio Relatar


uma A b duo que ainda no estamos usando.
Lembre-se, esses dados incluem informaes
vitais sobre um caso de abduo, as quais
poderiam ajudar Owen a encontrar seu co Fang.
Portanto, precisamos acessar ou filtrar todos os
dados do caso e armazen-los em variveis PHP.

fabilmznht o sdrift
vcfortfhf esta
i^snorSndo Cinto
dam^os o -ormulrie
v>3dreditvc!

<form method "p o s t a c t io n ^ "r e p o r t .php">


< Ia b e l fo x = "f ir E t n a m e "> F ir s t nam e:</label>
c in p u t t y p e = "t e x t id = firs tn a m e nam e ="firstn am e " /:
c la b e l fo r= "la st n a m e "> L a s t nam e:</Iabel>
< in p u t t y p e = "t e x t " id ^ 'la st n a itie r-ame="lastname,T /><
< la b e l f o r = e:nail">W hat i s your em ail a d d re ss ?< / ls b e
< in p u t t y p e = "t e x t " id = "e m a il" nam e="em ail" / X b r /> :
-clabel for="w henithappened">W hen d id i t happen?</lai:
c in p u t t y p e ^ 't e x t id = v.henithappened" name=ITwhenitl
35
clabel f o r = ^o w id n g How lo n g were you g o n e ?< / la b e l;
< in p u t t y p e ^ IS iit ^ id = "h o w lo n g " naine="howlong" AfljUiMigrise you wanttnaH/i -1
< la b e l f or^"howr.aiV?>How many d id you s e e ?< / la b e l> US?*??fltxiiiaSoin
< in p u t typeiHtfeex'C1' id="hbwmany" name="howmany" / x b
< la b e l f o r = "a lie n d e s c r ip t io n "> D e s c r ib e th e m :< / lab e l>
32
< in p u t ty p e 5 ^ -te x fi'^ id = "a iie n d e sc rip tio _ n " n a n e = "a lie n d e s c r ip t io n " s i z e = " "'
3
clabel for=Xjhatjtheydid">,i hat d id th e y do to yo u ?< / la b e l>
32
cinput ty p e = " t e x t " id = "w h a tth e y d id " n a m e = "w h a t t h e y d id "s iz e = " " / x b r />
Clabel for="fangsp o t t e d " > H a v e you seen m y ' d o g Fang?</JHit^l'
Yes Cinput id = fa n g sp o tte d " nam e="f.ngspotted" t y p e = "r a d i
No < in p u t id = "fa n g s p o t t e d " n am e ="fan gsp o tted " t y p e = "r a d io "
fl -ta^ <myut>
100
<irr,g s r c = "f a n g . ] p g " w id t h = " h e ig h t ="17 5
" de dada dawyo
3lt = "M y abdu.c.t^d dog F a n g ." / x b r />
< la b e l fo r=r^othe i?'>A n yth in g e ls e you want to a d d ?< / la b e l> do -oviwulario t
-ctextarea i^js no$Jfer' name=o t h e t ,></taxtarea><fcr />
< in p u t ty p e = "su b m it" v a lu e - " R spo^t A b d u ctio n " name=T>submit
ja dkave para
</form> fadesso aos dados,
-c/body>
</html> a p a rtir do PttP

Escreva o cdigo PHP a fim de criar quatro novas variveis que


armazenem os dados do formulrio que esto faltando: $naine,
$how_many, $ w h a t_ th e y _ d id e $ o th e r. Dica: Crie a varivel
$name de forma que ela armazene o nomexompleto do usuriu--'"
reporihtml

% .. .rir. .^_iPQ.r^. A. .L., W. !. ......................


%. .* .*.fa 2 .U/.. ....................
1 o.hr..,rr..i.^rXL .3^................
adicionando vida s suas pginas estticas

Seu trabalho ainda no terminou. A pgina de confirmao


gerada peio script PHP precisa usar essas novas variveis para
exibir mais informaes sobre a abduo.

FVedisamos p a rtir disto -


para isto/ Repare * quantidade
de ovas inormaoes exibidas.

Aliens Abducted Me - Report an Abduction


Yon were abducied fast November and -were gone for 11 Iruis
Describe them* little green
Was Fang there? do
Your email address is alfh@ihe}Tvsa%ree}Lcom
Tfrai&s for submitting fee form.
Yoa were abducted last November and were gone for 11 hours
f r f : Humber o f aliens: dozens
Desoibethess:M e greeain^n
The aliens did this: asked me about UFO regulations
Was Fang Sisre? 0
Otbef comments. Please vote for na.
Yonr ftrrmfl address is aifnStheyrealigiwn .com
0 nome do usurio nSo c esseindiai
para a pagina de dwi-irmaoj ^
vode precisar dele p o s t rio rit ,
quando enviarmos o email dom os
dados para Owen-

Usando todas as variveis que acabou de criar, exceto Sname,


complete o cdigo abaixo, o qual ir gerar uma pgina de
confirmao mais infrmativa.

echo 'Thanks for submitting the form.cbr />';

echo 'You were abducted ' . $when_it_happened;

echo ' and were gone for 1 . $how_long . '<br />';


echo 'Describe them: ' . $.alien_description . '<br />';
J ! /'>.' f * ^ \ . y, J jj
.Ochxk....Wr7:1t :..t kw.V... zf. ..z..t.--X. ay-rJ. d ...........SC.t. /.
echo 'Was Fang there? ' . $fang_spotted . '<br />';
1 -A ^ * J ** 3 ^ ,v Jv V "
....... & t . hM ?.......... \ A t .. /. <..............
echo 'Your email address is ' . $email;

voc est aqui


o script php do owert revisado

%^ponte seu lpis


Soluo
H alguns dados digitados no formulrio Relatar
uma Abduo que ainda no estamos usando.
Lembre-se: esses dados incluem informaes
vitais sobre um caso de abduo, as quais
poderiam ajudar Owen a encontrar seu co Fang.
Portanto, precisamos acessar ou filtrar todos os
dados do caso e armazen-los em variveis PHP.

^UaUen-be o sript
reportphp esta
i<y\orndo ivnto
apos do o r m u l d r i o .
|inacreditvel!

11
<form method=,p o s t " a c t io n re p o rt ,php">
c la b e i f o r = " f ir s t n a m e " > F ir s t nam e:</label>
c in p u t t y p e = "t e x t " id = "f ir s t n a m e " n a m e = "firstn am e " /
< la b e l fo r= "la st n a m e "> L a s t nam e:</labei>
< in p u t ty p e = t e x t " id = "la s tn a m e " name-',lastna^!e', /><
< la b e l fo r= "e m a il"> W h a t i s your em ail a d d re ss?< / la h e
< in p u t t y p e = "t e x t " id = "e m a il" nam e="em ail" / x b r />
< la b e l for="w henithaopened">W hen d id i t happen?</iafc
< in p u t t y p e = "t e x t " id ^ 'w h en ithap p e ne d " name="wh.enii:i
c la b e l for="how lDng">H ow lo n g were yon go n e ?< / la b e l; .
< in p u t t y p e = "t e x t " id "how leng name="howlong" /><b: . Epfe yog want to add?
< la b e i for="howmany">How many d id you se e ;< / la b e l>
< in p u t t y p e = "t e x t " id="howm any" naree="howmany" /><b;
< la b e l f o r = "a lie n d e s o r ip t io n "> D e c r ib e them:< / la b e l
=32
< in p u t t y p e = "t e x t " id = " a lie n d e s o r ip t io n " name=T,a l i e n d e s c r ip t io n " s i z e
< la b e i fo r= "w hatth eydid"> W hat d id they do to y c u ?< / la b e l>
32
< in p u t t y p e = "t e x t " id = "w h a tth e y d id " name=T,w h a tt h e y d id "_ s iz e = " " / x b r />
< la b e l fo r= "fa n g sp o tte d "> H a v e you seen my dog F a n g ? < / J S e l>
Yes < in p u t id = "fa n g sp o ti;e d " r.ame="fang spo t te d " t y p e = " r a d i
No < in p u t id = "fa n g s p o t t e d " .iam e="fangspotted" t y p e = "r a d io " A ta$ <put>
<img s r c = "f a n g . j p g " w id t h = "100 175
" h e ig h t = " " de cada capo
a lt = "M y abducted dog F a n g ." / x b r />
< la b e l f o r = " o th e r"> A n y th in g e ls e you want to a a d ?< / la b e l> do ioriwulario e
< te xta re a i d - " o t h e r " . name=o t h e r "> < / t e x t a r e a X b r />
1
c in p u t ty p e = "su b m it" va ltie= "R e p o rt A b d u o tio n " narr.e^ 'su b m it 11 a t h iv t para
</fcrm> atesso aos dados,
</j
</body>
a partis do PttP

este pao
Escreva o cdigo PHP a fim de criar quatro novas variveis que separa o
armazenem os dados do formulrio que esto faltando: Sname, priineiro
$how_many, $what_they_did e $other. Dica: Crie a varivel r>ore o

0 poK-i ihl ffexj..


$name de forma que ela armazene o nome completo do usurio. sobrenome.
j
fWrWrfcejuhbr % am C / ?JW$T.
varias strings de
texto em ura fbow^lry f J ?OSTCKowrr.ahyjj
so - um pvodsso f>wh^_tby_did 77 /_P.PSTtViaHttiKyclid/pi
Conkedide tomo
LoKtterac. fother =/_Pp$X
adicionando vida s suas pginas estticas

Seu trabalho ainda no terminou. A pgina de confirmao


gerada pelo script PHP precisa usar essas novas variveis para
exibir mais informaes sobre a abduo.

Predisamos p a rtir disto

0 nome do usuaHo no c essential


para a pagina de dn-firmaa> mas
vote prensar dele posteriormente
quando enviarmos o email tom os
dados para Owe-

0 Comando Usando todas as variveis que acabou de criar, As ta js <br />


edho usado exceto $name, complete o cdigo abaixo, o qual ir ajudam a -formatar as
para enviar as gerar uma pgina de confirmao mais informativa. inormadoes - no se
in-Pormacoes esquea de que estamos
ao navejador, echo 'Thanks for submitting the form.cbr />'; usando PttP para driar
na orma ttT M L .
de dontedo echo 'You were abducted ' . $when_it_happened;
HT/VJL." echo 1 and were gone for ' . $how_long 1<br />';
edbo 'Kumber of aliens; 1 . fbow_mny . '<br /> ]
Movamente, pontos'
finais so usados echo 'Describe them: ' . $alien_description . 1<br />';
para dondatenar edho lTbe aliens did tbis : 1 f>bat_tbey__did '<br /> ',
strings c varveis.......................................'/..........................................................................
echo 'Was Eang -fejl^re? ' . $fang_spotted . 1<br />';
edbo 'Other domments: 1 . fotber . (<br />',
echo 'Your email address is ' . $email;

voc est aqui 41


test drive no script php do owen

T fe S T D r i v e

A juste o script de Owen e te s te as m odificaes.


Adicione o cdigo das novas variveis a r e p o r t . php, bem como o cdigo que
envia as variveis para o navegador, com o HTML formatado. Em seguida, envie o
script para o seu servidor web, abra a pgina r e p o r t . htm l no seu navegador e
preencha o formulrio com as informaes do seu caso de abduo. Finalmente,
clique no boto Relatar Abduo para submeter o formulrio e ver os resultados.

nP existem
Perguntas idiotas
0 que realmente acontece quando eu fao a OK, ento como, exatamente, o servidor
concatenao de vrias strngs, usando pontos finais? transforma o cdigo PHP em cdigos HTML e CSS?

R: Concatenar, neste caso, signifi ca ju ntar H Em primeiro lugar, lembre-se de que, por padro,
diversas strings para formar outra, totalmente assume-se que 0 cdigo em um script PHP cdigo
diferente. 0 resultado final sempre uma nica string, HTML. Voc pode identificar 0 cdigo PHP dentro de um
no importa quantas tenham existido originalmente. script colocando-o entre tags <?php e ?>. 0 servidor
Assim, quando voc concatena strings como parte v essas tags e entende que deve rodar 0 cdigo dentro
de um comando echo, o PHP, primeiramente, as deias como PHP e todo 0 cdigo fora dessas tags
combina em uma s string e depois envia esta ltima informado ao navegador como sendo um HMTL.
para o navegador.
- Certo. Mas isso ainda no explica como o
T * * Quando eu concateno uma varivel com uma cdig^f^^jh^nsTrm aoiivW TM L/CSS. E ento?
string, a varivel precisa conter texto?
Ah, a que 0 comando echo entra erfccena. '
No. Embora a concatenao sempre resulte em / Voc pode pensar no echo como um comando
uma string, as variveis no precisam conter strings j para enviar as informaes que estejam fora do \
para que voc possa us-las em um processo de / domnio das tags <?php e ?>. Assim, 0 comando \
concatenao. Por exemplo, digamos que uma varivel echo representa a chave para a capacidade do
contenha um nmero; o PHP primeiramente converte 0 PHP de gerar cdigo HTML/CSS, dinamicamente.
nmero em uma string e depois a inclui na concatenao. Concatenando strings de texto com variveis PHP, voc
pode construir cdigo HTML em tempo real e depois
? : 0 que acontece com o cdigo PHP no navegadr? usar echo para envi-lo ao navegador como parte da
pgina web resultante. Um bom exemplo disso, no scrip
P.
* V- Nada. E isso porque 0 cdigo PHP nunca viste
\ re p o rt .php, quando a tag <br /> anexad
ao final de um pedao de texto para gerar uma queb
pelo navegador. O cdigo PHP executado no servidor\
de linha no HTML resultante.
e se transforma em cdigo HTML, este sim sendo
enviado para 0 navegador. Assim, 0 navegador nem
sequer fica sabendo da existncia do PHP - as pginas
web chegam como puros HTML e CSS.
adicionando vida s suas pginas estticas

A pgina de confirmao til


para o usurio, mas no para mim.
Ainda preciso que os dados do
formulrio sejam enviados para mim
atravs de um email.

O script PHP ainda precisa enviar os dados do formulrio


para Owen.
Da forma como est, o script re p o r t.p h p est usando os dados do
formulrio Relatar uma Abduo para gerar uma pgina de confirmao
HTML para o usurio. Mas isso ainda no est resolvendo o problema
original, que baseia-se no envio de uma mensagem por email para Owen,
uma vez submetido o formulrio. Ele quer apenas receber uma simples
mensagem de email em modo texto, mais ou menos como a seguinte:

Alf Nader foi abduzido em novembro passado e esteve


ausente por 1 1 horas.
r - Nmero de aliens: dzias
De Wma scmelKan-fee Descrio dos aliens: homenzinhos verdes
paji>a web d t Con-fVmaao,
esta ensaiem de email
O que eles fizeram: me perguntaram sobre leis para as OVNIs
Consiste em texto esttico, Fang foi visto: no
Combinado Com ddos do Outros comentrios: Por favor vote em mim.
-(oV-mulrio
Esta mensagem de email pode ser gerada a partir de cdigo PHP,
criando-se umastring que combine textos estticos como "O utros
c o m e n t rio s: " com dados do formulrio que estejam armazenados
em variveis.
Escreva aqui como voc criaria uma mensagem de email a partir de texto
esttico e variveis PHP.

'*...................................................................................................................
- tf -s

voc est aqui 43


construindo o corpo da msg no php

Criando o corpo da mensagem de email com PHP


Voc j viu como um ponto final pode ser usado em cdigos PHP maioria dos editores de
para concatenar vrias strings de texto em uma s. Agora precisa usar te x to , automaticamente,
novamente a concatenao para criar uma string que ser a mensagem
de email, com variveis sendo usadas juntamente com texto esttico.
quebra o te x to para a linha
seguinte, mesmo <\ue vote ndo
inclua no cdigo a sua prpria
V i v e is c te x to esttico
quebra de Wha (return)-
Sao ConCatenados em uma
unica string (a mehsagem
de email) usandose pontos
-Pinais.
5msg = ' was abducted and was gone for .

'Number of aliens: 'Alien description: . 'What they did:

Fang spotted: 'Other comment

Lembre-se^ cada
varivel armazena
Um problema ao se criar uma string desse tamanho que ela demanda uma string de texto
uma grande linha de cdigo PHP, difcil de ler e entender. Voc pode t i r a d a do -formulrio
dividir o cdigo PHP em vrias linhas, para deix-lo mais fcil de ser R elatar uma /'tbducao 5.
estudado. Certifique-se, apenas, de separar o cdigo em pontos onde
o espaamento no faa diferena, como por exemplo, entre duas
strings concatenadas e no no meio de uma string. Em seguida, coloque
um ponto e vrgula no final da ltima linha de cdigo, para finalizar a
instruo PHP.
i
[st na verdade apenas uma grande linha
. de cdigo dividida em varias linhas.
vT'
$msg = . 1 was abducted was gone for

'Number of aliens:

'Alien description:

'What they did: ^ de cdigo e Cuidadosamente


'Fang spotted: ' dividida, evitando-se separar uma
string no meio.
'Other comments:
Mode ainda precisa f inalizar a
^uando uma linha de Codigo instruo Com um ponto e virgula.
PHP e: deliberadamente,
dividida em varias linhas,
costum a-se indentar as linhas
U m a lon ga lin h a d e c6dgp p jjp pode
aps a primeira, para ^ue se
set diVidlda era Vatlas llnfcas, d esde <jue
perceba, Com mais -facilidade,
*\uais linhas Compoem u.a
Voc ten ha cm d ad na fcpra d e separar
mesma instruo no seu cdigo-
o edgo.
adicionando vida s suas pginas estticas

Esse cdigo PHP certamente ficou bonito. Mas


sem formatao, a mensagem de emai! no vai
fic a r toda bagunada?

Sim. S porque o cdigo PHP est bem organizado, no


quer d izer que o seu output (sada), auto m aticam en te,
tam bm fica r bonito.
Organizai o cdigo PHP para que voc possa entend-lo melhor
completamente diferente de formatar o output que os usurios iro ver.
Voc normalmente usar tags HTML para formatar o output do cdigo
PHP, uma vez que, na maioria dos casos, o PHP usado para se gerar,
dinamicamente, uma pgina web. Porm no neste caso.
Aqui, estamos gerando uma mensagem de email, que puro texto, e no
HTML. Precisamos lidar com o feto de que a mensagem, atualmente, se
parece com o resultado seguinte:

Alf Nader foi abduzido em novembro passado e esteve


ausente por 11 horas.Nmero de aliens: dzias Descrio
dos aliens: homenzinhos verdes O que eles fizeram: me
perguntaram sobre leis para as OVNIsFang foi visto.
noOutros comentrios: Por favor vote em mim.
I isto WftQ 't 0 <^e
Hm...
Owen metvte
pava 3 sua
de e -m a il

existem
Perguntas Idtas
- Existe alguma maneira de se usar
formatao HTML em emails que voc envia a
partir de um script PHP?

Existe. Mas isso requer um passo adicional,


que envolve definir o cabealho do tipo de contedo W E R 9
para a mensagem. Cabealhos e tipos de contedo
vo um pouco alm do escopo desta discusso, por
isso, estamos nos limitando a mensagens de email
em formato de texto simples. Voc aprender mais Como voc reformataria a
sobre os cabealhos no Captulo 6, portanto, no se mensagem de email para
preocupe - voc ver como enviar emails em HTML torn-la mais fcil de ler?
mais adiante.

voc est aqui 45


formatando texto com php

At mesmo texto simples pode ser


formatado... um pouco C oractees cie
Uma vez que Owen est enviando mensagens de email como texto escap e em P B P
simples, sem nenhuma formatao especial HTML, ele no pode
colocar tags <br /> para adicionar quebras de linha para separar comeam com uma
o contedo. Mas ele pode usar caracteres newline (nova linha) ,
que so escapados na forma \ n. Assim, em qualquer lugar do
email onde aparea \n, ser inserida uma quebra de linha, fazendo t>arra mVertlJa 00-
o contedo que vier a seguir se iniciar na linha seguinte. Eis o novo
cdigo para a mensagem de email, com os newlines adicionados:
^ t usado para
^uc seja* inseridos
darattergs newline na"
mensagem de email-
$msg = $name was abducted $when_i t_happened and was gone for $how_long 'M '
'Number of aliens: $how ma ' \ n 1

'Alien description: . $alien_defecription . '|

'What they did: . $what_they_did . '|||;r .

'Fang spotted: . $fang_spotted . Jjj|j, .

'Other comments: ' . SothGr;

A lf Nader foi abduzido em novembro passado e esteve


ausente por 1 1 h o r a ^ ^ m e r o de aliens: dzias^n}
Descrio dos aliens: homenzinhos verdes^rTp que eles
fizeram: me perguntaram sobre leis para as 0 \ 7N I.< g ^ ang
foi visto: n q g p u t r o s comentrios: Por favor v o t e t S mim.

0 \ n esta aparedewdo
-tomo te * t Psorml)
zm vez. de um
O que , exatamente, um caracter de escape? t a r a t te r newline
nada bom-
Um caracter de escape um caracter que: ou difcil de digitar
ou que, por algum motivo, poderia causar confuso no cdigo PHP.
Voc pode estar familiarizado com os caracteres de escape do HTML,
programados de uma forma um pouco diferente, como por exemplo,
& # 1 69 ou & c o p y para o smbolo de Copyright. O PHP tem um
conjunto bastante pequeno de caracteres de escape que so teis para
se escrever coisas que poderiam se confundir com a prpria linguagem,
como por exemplo, aspas simples (V), aspas duplas (V) e, claro,
newlines (\n).
adicionando vida s suas pginas estticas
\ B j
y
cisam de aspas duplas tontaier>a^ao
O problema com o cdigo de Owen que o PHP trata as strings de forma tto C wis
diferente, conforme elas se apresentem: dentro de aspas simples ou duplas. Mais netessavia,
especificamente, os caracteres newline (\ji) s podem ser escapados dentro de
aspas duplas. Assim, a mensagem de email com os dados do formulrio precisa ser urn vex. *\ue
as variveis
construda usando-se strings dentro de aspas duplas, para as newlines funcionarem, pode ser
Mas a histria das aspas simples x duplas no termina a. As strings dentro de aspas veerendiads
simples so consideradas como texto puro, enquanto que o PHP processa as strings diretamente
dentro de aspas duplas em busca de variveis. Quando uma varivel encontrada
dentro de uma string em aspas duplas, o PHP insere o seu valor dentro da string, dentro da
como se tivesse ocorrido uma concatenao. Assim, a string dentro de aspas duplas string entre
no s necessria para o funcionamento dos newlines na mensagem de email, como aspas jdvfIas-
tambm nos permite simplificar o cdigo, colocando as variveis diretamente na string.
$msg = "$name was abducted $when_it_happened and was gone for $how_long.\n"

"Number of aliens: $how many\n" .

"Alien description: $alien_description\n"


Os daracieres newline agora sao
"What they did: $what_they_did\n"t]
interpretados dorretamente,
"Fang spotted: $fang spotted\n" graas siring apresentada entre
aspas duplas.
"Other comments: $other";
Mas ainda predisamos dividir a mensagem em
Kao e pretiso dc u*a n o v a ) varias strings dondatendas para tornar o
linha guando -for a VmKa dodigo mais legvel
Pinal-
no existem
perguntas idiotas
? Se as aspas duplas so to legais, por que que por
que fizemos uso, praticamente, aspas simples, at agora?
usar um apstrofo em uma string dentro de aspas
simples, basta fazer escape dele como V, desta forma:
H e V s lost! '. 0 mesmo se aplica se voc quiser
usar uma s aspa dupla dentro de uma string delimitada
rJ ^ I^ m le jlJ ^ e m jT ie n te que ag aspas simBJj^no| por aspas duplas - use V. No preciso fazer escape
\ so processadas pelo PHP dienhuma manr^ o que das aspas quando no houver conflito, como por exemplo,
as tcrrna ideias~para switjsrqt ya"puiu luxlir/s&m ao usar um apstrofo em uma string contida entre aspas
nenhuma varivel inserida. Assim, continuaremos a usar duplas: "He's lost!".
aspas simples ao longo do livro, a no ser que haja um
bom motivo para usar as duplas. A coisa mais importante
Ento, com as aspas simples, pode-se usar V
nesta questo de usar aspas simples ou duplas para as
mas no \n. Como saber quais caracteres de escape
strings, tentar manter-se o mais consistente possvel.
eu posso usar dentro de aspas simples?

0 que acontece se eu tiver de usar um


As strings denlco^easpas simples s permitem os
apstrofo dentro de uma string que esteja dentro
caracteres de escapV eOodos os outros caracteres
de aspas simples, como por exemplo, em 1H e 1s
de escape s podem sfnSados em strings dentro de
l o s t ! (ele est perdido!)? aspas duplas.

R * a que os caracteres de escape so teis. Para


voc est aqui 47
envie email com PHP

Enviando uma mensagem de emaii com PHP A un


Ento, voc est pronto para escrever o cdigo PHP que enviar a mensagem m a lO , d ? B T \
a Owen por email. Isto requer a funo interna m ail () do PHP, a qual
envia uma mensagem com base em informaes que voc fornece. envia uma
m ensagem d e
0 e*dcrto~c ' t) "SSimto d
o^al wto email a partir
mail ($to, $subject, $msg) ;j de um sctipt.
^ iS
0 torpo da
mensagem.
Essas trs informaes so requeridas pela funo m ail (), portanto,
voc sempre tem de fomec-las. O endereo de email from no o ie *to 'FVom:' pretisa ser
exigido, mas ainda uma boa ideia inclu-lo. Para especificar o fi.oloi.ado antes do endereo,
campo from ao chamar a funo m ail (), preciso srimioutro ao sc espetiitar o enderedo
argumento da funo, junto a alguma concatenao de strings. de ail do remetewte-

mail($to, $subject, $msg, $email|;

0 ponto -final t til mais


uma vez* para tontaenar
From; dom o endereo de
email de Owen-
np existem
?efguntas idiotas
X * H mais alguma coisa que possa ser
especificada como parte de uma mensagem
de email, alm do endereo from?

Sim. Voc pode especificar tambm


Cada parte do emajl recipientes copy (cpia) e blind copy (cpia
t om etida -funo oculta) da mesma forma que o from - basta
mailO por ma variavel- usar' Cc: ' ou ' B c c : ' em vez de
1From: ' . Se quiser especificar tanto um from
quanto um copy, voc ter de separ-los com
uma combinao de caracteres return e newline
(\r\n), desta forma:

isso mesmo, dois taratteres de $from . n\r\nCc:" . $cc


esdape tola dos um no outro^

Pretisamos usar aspas duplas a^ui, uma


vez. <^ue estamos usando os taratteres
de estape V e \n.
i 'a n t f i i f f l f
adicionando vida s suas pginas estticas

Mas ento, como que


ns usamos, realmente,
a funo mail()?

B asta adicionar ao seu scrip t o cdigo para ch am ar m ail().


A linha de cdigo que chama a funo mai 1 () tudo o que voc precisa para
enviar a mensagem de email. Certifique-se de que este cdigo aparea no script
aps o cdigo que cria as variveis para o email, e pronto. Eis aqui o cdigo
completo para o script report.php de Owen, incluindo a chamada para a
funo m ail ().

<html>
<head>
<title>Aliens Abducted Me - Report an Abduction</title:
</head>
<body> Pegue todos os dados
<h2>Aliens Abducted Me - Report an Abduction</h2> do -formulrio no array
<?php fJP0ST e doio^ue-os
name = $_POST[1firstname1] . ' ' . S^POST['lastnaree'] em variaveis individuais-
$when_it_happened = $_POST[1whenithappened'];
$how_long = $_POST [1howlong];
$how_many = S_POST['howmany1];
$alien_deseription = $_POST['aliendescription']; C ertii^ue-se de
$what_they_did = $_POST[1whattheydid];
$fang_spotted = $_POST[fangspotted']; tirodar este enderedo
email = $_POST[1e m a i l ;
de email pelo seu
Sother = $_POST[other1];
prprio, para testar o
$to = ovien5aliensabductedme.com
sdript-
^subject = 'Aliens Abducted Me-- Abduction Report1,
$msg = "Snarne was abducted $wh.en_it_happened and was gone for $how_long.\n
"Number of aliens: $how_many\n .
nvi c a "Alien description: $alien_description\n" .
"What they did: $what_they_did\n" .
"Fang spotted: $fang_spotted\n" .
- '-'XIUmu-
rnmiri^ntg: Sn-t-hgr"-
.. Junte os
diierentes
^nail($to, $subject, $rc.sg, From:' . Semail)7^> pedacos da
echo 'Thanks for submitting the form.<br />'; mensagem a ser
echo 'You were abducted 1 . $when_it_happened; enviada para Owen.
echo 1 and were gone for 1 . $how_long . <br />';
echo 'Number of aliens: 1 . $how_jnany . '<br />;
echo 'Describe them: ' . $alien_description . '<br />;
echo The aliens did this: ' . $what_they_did . '<br />
um echo
echo
'Was Fang there? 1 . $fang_spotted . '<br />';
'Other comments: ' . $other . '<br />';
p%"m HT/WU echo 'Your email address is ' . $email;
em tempo real,
pva dh-irmr </body>
</html>
^ue O -formulrio
to submetido
Com sudesso.
reportphp
voc est aqui 51
email overload

Owen comepa a perder emails


A boa notcia que Owen est recebendo emails. A m notcia que ele est recebendo
muitos, muitos emails. Tantos que est tendo dificuldade em acompanh-los. A sua Caixa
de Entrada est lotada, e ele j apagou alguns acidentalmente... Owen precisa de uma
forma melhor de armazenar os dados sobre as abdues.
adicionando vida s suas pginas estticas

*
m u F

Os aliens mexeram com o seu crebro? Coloque as coisas no lugar


ligando cada componente HTML ou PHP descrio do que eles fazem.

Um software que serve para visualizar e interagir


com pginas web. Age como o lado do cliente em
comunicaes na web.
Um comando PHP usado para fazer o output de algum
i f contedo, como, por exemplo, texto simples ou cdigo HTML.
f instas tags so usadas para delimitar o cdigo PHP a fim de
! j que o servidor web saiba que deve process-lo e execut-lo.

^ Um array intemo do PHP que armazena os dados


submetidos usando o mtodo post.
Uma linguagem de programao usada para a criao
de scripts, que so executados em um servidor web.
Toda string precisa estar dentro de uma varivel.

Um software para enviar pginas web, o qual age


y ' como um servidor em comunicaes na web.
/ l _ Uma linguagem marcao usada para descrever a estrutura
/ do contedo das pginas web, que so visualizadas em um
navegador web.
Um nome usado para descrever as variveis internas do
^ PHP que ficam acessveis a todos os scripts.
Uma srie de campos de input, em uma pgina web,
usados para se obter informaes dos usurios.
Uma funo intema do PHP que envia mensagens de email.

SilpegfcW Um local de armazenamento, em um script PHP, que


tem o seu prprio nome e tipo nico de dados.
mailO \ Um tipo de armazenamento de dados em PHP que
permite que vrias informaes sejam armazenadas em
um mesmo local.

voc est aqui > 55


2 C o n e c ta n d o - s e a M y S o L

* Como Tudo se Encaixa

Saber como as coisas se encaixam, antes de comear a


construir, uma boa ideia. Voc criou seu primeiro script PHP e ele est
funcionando bem. Mas obter os resultados obtidos em um email j no bom o suficiente.
Agora voc precisa de uma forma de guardar os resultados do seu formulrio, para que
possa mant-los pelo tempo que precisar e ter acesso a eles quando quiser. Um banco de
dados MySQL pode armazenar estes dados para voc. Mas voc precisa conectar seu script
PHP ao banco de dados MySQL para fazer isso acontecer.

este um novo captulo 59


0 formulrio de Owen funciona bem. Pem at demais.
O novo formulrio
para os relatos timo, mas agora
estou recebendo emails demais. No consigo
beber cafena suficiente para ler todos eles
assim que os recebo.

O script de Owen estava funcionando bem


enquanto ele estava recebendo apenas
algum as respostas, mas agora ele est
recebendo cen ten as de em ails, m uito m ais do
que consegue organizar.
Ele j apagou alguns acidentalmente, sem os ler. E alguns esto
indo parar na pasta de spam, a qual ele nunca olha. Na verdade,
um email que lhe interessaria muito pode est escondido na
pasta de spam, neste exato momento... Owen precisa de uma
forma para armazenar todas as mensagens, de forma que
ele possa consult-las quando tiver tempo e encontrar
facilmente aquelas relativas ao seu co Fang.
Este relatrio
perdido mendiona
um dao (doo^)...
trata-se de
Sera prediso mais
do *^u uma xdara From: safiy@gmgs-4Jstnei:
Subject: AliensAductedMe-AbductionReport
inorrnaoes de

dc da-Pe para * <V4obef1,200612:1129PMCDT ^ue 0we pvedisa,

O'uzrt donseguir se To; [desesperadamente.


>andwasgenetor 1 day-

anter a par de SatiyJoneswasabducted3 daysago


todos os relatos de m <imfeef
Humbei ofaliens:green
descfipfion: four withsix mala***----
bdudoes o^ue esto w
Wien da did:
Whatleydid-
We justtaikedanqpiayed withContactms.
dHega*do r>a sua
Caixa de Enteada. A

O w en predisa jue mensagens aqui que um banco de dados MySQL viria a calhar..
domo est sejm armazenadas
de -forma segura em algum lugar Caso vode na saiba, a <*aior'sa das pessoas J
o*de ele possa donsuiti-las, em prohundia /Vjy$L soletv-hdo as ultimas
busda de possveis avistamewtos trs letv-as, ou seja, my sse <^u ele*.
de Fang.
conectando-se ao My SQL

0 "SOL-1
MySQL excelente para armazenar dados sini-Piia
Sru-tuved
Owen realmente precisa de uma forma de armazenar os dados dos relatos $uery Language
de abdues em um lugar seguro, que no a sua Caixa de Entrada de email.
O que ele precisa de um banco de dados, que uma espcie de gaveta de de Consulta
arquivos hi-tech, arrumada e super organizada. Uma vez que as informaes sb-wtwrada").
localizadas em um banco de dados ficam totalmente organizadas, voc pode
consultar a informao exata que precisar, quando precisar. 0 M /SoL
Os bancos de dados so gerenciados por um programa especial, chamado
servidor do banco de dados - no nosso caso, um servidor de banco qrnicfc&ena
de dados MySQL. Voc se comunica com esse servidor usando uma ciad os d eitr
linguagem que ele capaz de entender, que no nosso caso o SQL. O
servidor do banco de dados geralmente roda junto a um servidor web na de tabeleis
mesma mquina, com os dois trabalhando em conjunto na leitura e escrita
de dados e na entrega de pginas web. do banco de
0 servidor web prodess as requisies dados.
fo r fS^ihas y/eb, e*edufca srip-fcs PHP Computador Servidor
e reiema to n ie do HTML. Banco de dados M ySQ L
Navegador do Cliente

0 servidor de bastos de dados le e ----


esdreve dados de/par a o bano de dados 0 brio de dados
Os bancos de dados MySQL so organizados em tabelas, as quais armazenam propriawewfce d,-to
informaes em forma de linhas e colunas de dados relacionados. A maioria das dom re<\u*"t, e
aplicaes web usa uma ou mais tabelas dentro de um mesmo banco de dados, rm^^ado na
de forma mais ou menos parecida como usar diferentes pastas dentro de uma lerm de ar^tvos
mesma gaveta do armrio de arquivos. em u fosto ^
0 servidor do bato de Um bftdo de dados vidoj s t*3o
esdreve dados no pode don-ter ml-bpias ^etessariawe^te
-tabelas predisa ser assW-

SQ L e um a
linguagem de
consulta usada
p a v a <jue o c o r r a
Com os dados sobre as abdues armazenadas de forma segura em a comunicao
um banco de dados MySQL, Owen poder analisar, da forma que com um banco de
quiser, todos os relatos de pessoas que responderam sim questo de
se avistaram ou no Fang. Ele s precisa de um pouco de cdigo SQL
para se comunicar com o servidor do banco de dados.
dados AiySoL.
v o c est aqui 61
m ysql pode ajudar Owen

Owen precisa de um banco de dados MySQl


Ento, est decidido: os bancos de dados MySQL so teis e Owen precisa de A criao <Je
um para armazenar dados sobre as abdues aliengenas. Ele poder, ento, bcUlCPg cie
modificar o script reportphp para armazenar dados na tabelei, em vez de envi-
los para si mesmo, por email. A tabela manter os dados recebidos sos e salvos, dadps e tabelas
dando tempo a Owen para analis-los e filtrar potenciais avistamentos de Fang. M /S Q L exige
Mas vamos comear pelo comeo... um banco de dados!
Para se criar um banco de dados My5QL, faz-se necessrio um servidor c o m u n ic a o
MySOL com um software especial. A razo disso que, ao contrrio de co m . u m s e rV lJ o r
servidores web, um servidor de banco de dados precisa receber instrues
usando comandos SQL. M ySqL.

Eu sempre ouvi dizer que a


ferramenta utilizada faz toda a diferena
para se fazer um trabalho direito. Como eu vou 0 -brmihi urna
saber qual ferramenta MySQL usar para criar janela <^e omede usso via
meu banco de dados e minhas tabelas? lihHa de domndo, onde vde
pode digitar demandes QL~

M ySftl terminal
0we* predisa de
uma -ferramenta
para
dHdr seus ovos
bando de dados
e tabelas.

0 pbpMyAdmm e uma
0 pbpMyAdmm pbpMyAdmiH ferramenta grfica
f 6 .... ... k, bandos de dados e
m ----------- -------------------rtpvMn E' tabelas atvaves de m3
V j? mtev-ade v*fe.

Duas ferramentas MySQL populares so o terminal MySQL e o phpMyAdmin. Ambas lhe


permitem executar comandos SQL para criar bancos de dados e tabelas, inserir dados,
selecionar dados, etc., mas o phpMyAdmin d um passo alm, por fornecer tambm uma
interface grfica acessvel via web. Algumas empresas de web hosting incluem o phpMyAdmin
como parte do seu servio MySQL padro, j o terminal MySQL pode ser usado para se acessar
a maioria das instalaes do MySQL.
conectando~se ao My SQL

Voc precisa te r um servidor de banco de dados MySQL instalado antes


de vira r esta pgina.
E impossvel ajudar Owen sem um deste! Caso voc j tenha um servidor de banco de
dados MySQL instalado e funcionando, continue lendo. Se no, consulte o Apndice ii e
siga as instrues de instalao. Caso esteja usando um servio de web hosting que oferea
MySQL, pea ao administrador que instale o software. Vrias informaes so necessrias
para se acessar um servidor MySQL. Voc voltar a precisar delas posteriormente, portanto,
agora uma boa hora para entendermos quais so estas informaes. Marque-as aps ter
escrito ^informao correspondente.
Localizao do meu servidor MySQL (endereo IP ou nome do host): /,$

_ / CSo tenha
medo
Nome de usurio para o meu banco de dados: X2& & & este livro eaia
/ maos erradas,
[Tl Senha para o meu banco de dados: ^ ^sinta-se
vontade para ho
Vote predisa veriita r esdrever a senha,
todas estas daixas.
Com essas informaes em mos, s o que voc precisa fazer confirmar se o servidor
est funcionando. Marque uma das caixas de verificao abaixo para confirmar que voc
acessou com sucesso o seu servidor MySQL.
/
R7 Consigo acessar o meu servidor MySQL com sucesso, usando o terminal MySQL.
| i/| Consigo acessar o meu servidor MySQL com sucesso, usando o phpMyAdmin.
| | Consigo acessar o meu servidor MySQL com sucesso, usando........................................
prediso veriidar Caso tenha endontrado alguma
uma destas tres. .utra ferramenta \ue
W ione, esdreva o nome dela a\ui

voc est aqui 63


criando banco de dados e tabelas no m ysql

Crie um banco de dados e uma tabela MySQL


Algumas instalaes do MySQLj incluem um banco de dados. Se no for o caso
da sua, voc ter de criar seu prprio banco, usando o comando SQL CREATE
DATABASE no terminal MySQL. Mas, primeiro, abra o terminal em uma janela
de linha de comando - em geral, basta digitar mysql. Voc saber se entrou com
sucesso no terminal quando o prompt de comando mudar para mysql>.
Para criar o novo banco de dados para as abdues aliengenas, digite CREATE
DATABASE aliendatabase ; desta forma:

0 servidor M y$L geralmente apresenta uma resposta, Quando usar o -terminal,


para vote saber que o tom ado -teve sutesso vote deve to lo ta r um
ponto e vrgula apos
Antes de criar a tabela dentro do banco de dados, certifique-se de que o to*r*\dc-
nosso novo banco est selecionado. Digite o comando
USE aliendatabase;

1 File Edit Window Help PhoneHome

mysql> USE aliendatabase,


Database changed

O cdigo SQL usado para se criar uma tabela um pouco mais complexo, uma vez
que ele precisa dizer, exatamente, qual tipo de dados est sendo armazenado. Vamos
dar uma olhada no comando SQL antes de digit-lo no terminal:
sfce t um tom3ndo
usado para que seja triada
.iens_abduction
first_name varchar(30), uma nova tabela-
last_name varchar.(30) ,
when_it_happened varchar(30), Todo o resto so mormaoes
how_long varchar(30), detalhadas sobre quais
how_many varchar(30), tipos de dados podem ser
alien_description varchar(100) armazenados na tabela.
what_they_did varchar(100),
fang_spotted varchar (10)
other varchar(100),
email varchar(50)
Todos os tomndos SQL deitados no
terminai MySQL devem terminar tom
um ponto e vr^ula-
conectando-se ao My SQL

Para que a nova tabela seja criada, digite o comando CREATE TABLE
no terminal MySQL (ou baixe o cdigo do comando no site www.
a lta b o o k s.c o m .b r). Aps executar o comando com sucesso, aparecer
uma tabela a lie n s ab d u ctio n novinha em folha.

/\ resposta tt$uery
0)CU do servidor
/V]y$L iKe permita
saber <y*e a tabela
foi driada sem
problemas.

A sua instalao do MySQL poder incluir a ferramenta phpMyAdmin,


a qual lhe permite acessar seus bancos de dados e tabelas graficamente.
E possvel usar a interface do phpMyAdmin para criar bancos e
tabelas apenas com cliques do mouse ou ento digitar comandos SQL
diretamente, da mesma forma como no terminal MySQL. Clicando na l/ode pode digitar
aba SQL do phpMyAdmin, voc acessa uma caixa de texto que age como a^yi os mesmos
o terminal MySQL. domandos ^ue no
terminal /Vjy$L,
basta dlidar
em o para
*edut-ios.

Apos digitar o
dodig SQL,
dli^ue neste
b o ta o para
driar a tabela.

Assim, a guia SQL do aplicativo phpMyAdmin oferece uma maneira


para que comandos SQL sejam emitidos da mesma forma como se o
terminal MySQL estivesse sendo usando.

voc est aqui 65


introduzindo a instruo INSERT

Eu tenho um banco de
dados MySQL e uma
tabela; agora, como eu
insiro dados neles?

Voc usa a instruo SQL in s e rt para inserir


dados em um a ta b e la .
A linguagem SQL fornece todo o tipo de instrues
interessantes para se interagir com os bancos de dados. Uma
das mais usadas INSERT, que realiza o trabalho de criar e
armazenar dados em uma tabela.
D uma olhada na instruo abaixo, para ver como INSERT
funciona. Tenha em mente que esta no uma instruo SQL
verdadeira, e sim um modelo da instruo para lhe mostrar o
formato geral de INSERT.

s t a p a r te uma lista

palavras- 0 dos notes d as doluns


Seguem ais omes
do
c-Kavcs sera
seu bando de dados,
separados por vrgulas-
de dolunas, sendo
INSfcRT INTO <\ue ao Ha vrgula

i
IOf,.
inidiam & apos os ultmos.
mstrvdo-

O
t a b l e nam e { c o lu n a , n o m e l\ c o lu n a nom e2,

d a d os2 )
s
Segue mais valores,
sendo ^ue no ha
As aspas simples esta o vrgula apos o ul-timo-
/Vfais uma ^sta parte e uma lista
d o rre ta s . U se -a s sempre
palaw-as-ehave dos valores e dados a
do SQ L , e sta
\ue estiver inserindo te x to ,
serem in serid o s/sep arad o s
mgsi^ o gue seja a p f ^ s urn
a^ui indidando vrgulas- /
d t e r ; Como */Vf
\ue viva a
seguir os valores
estes predisam vir a
p a ra as dolwns- mesma ordeT ^ue os nomes d as dolunas.

Uma das coisas mais importantes a se iao que os valores, no segundo


conjunto de parnteses, precisam estar na mesma ordem que os nomes das colunas. assim que
o comando INSERT sabe qual dado vai para qual coluna, ao inserir os dados.
conectando-se ao My SQL

A instrupo INSERT em apo


Veja a seguir como uma instruo INSERT pode A ordem
ser usada para que os dados das abdues na im portante!
recm-criada tabela aliens_abduction sejam Os va lo re s a
armazenados. serem inseridos
devem ser listados
exatam ente na
Os nomes das suas
Bsbe e o m e sm a ordem
nome d a ta b e la na
qual os ddos sendo
tolvmas esto noprim eiro
tonjun-b t parn teses,
que os nomes d a s
colun as.
inseridos, t HhO o nome do
divididos por v W s .

i
bando de dados. s

aliens abduction (first_name, last_name,


- 0 0 0
when_it happened, how_long, how many, alien_description,
0
what they did, fang spotted, other, email)
o
O O O O
(1Sally' , 1Jones', '3 dias atrs , T1 dia', 'quatro',
O Q
'verde com seis tentculos', 'Ns s conversamos e brincamos com cachorro' ,
0 0
sim, 'acho que posso ter visto seu co.entre em contato'
f
/ 'sally0gregs-list.net')
Tdos estes
valores dontm
Os dados p ara dada
Ao donrrio do <\ue t e x to , e no
odorre no P^Ps as^
doluna e s b o no
segundo to n ju n to de
t^ r u ^ ^ L n a o nmeros, p o rta n to ,
nos os dolodmos
faventcses, tambem -termina* po5ftt c to d o s e n tr e aspas
divididos por vrgulas.
vrgula r ar,ilo w ato simples-
d e n tr o d e dod ^0

^A p on te sc lpis
A tabela aliens__abducton encontra-se abaixo, mas ela
ainda no tem quaisquer dados. Escreva os dados da abduo
de Sally na tabela. Voc pode escrever alguns dos dados fora
da tabela, se no houver espao dentro das clulas, bastando
ste s sa os nomes ligar com uma seta a informao clula respectiva.
das toluns-

2 'v aliens abduction

* B i rsls5t Ifuiwmwfnlr WS
X vA . . J - V ^ ^ S> J .1- .,,-1
1 's s>

r

voc est aqui >1 67


solues e no existem perguntas idiotas

ponte seu lpis A tabela aliens_abduction encontra-se abaixo,


Solupo mas ela ainda no tem quaisquer dados. Escreva
os dados da abduo de Sally na tabela. Voc pode
escrever alguns dos dados fora da tabela, se no
houver espao dentro das clulas, bastando ligar com
uma seta a informao clula respectiva.

Ms sc donversamos
verdes dom seis "fcentdulos e brindamos dom ui , , H y jx js -iis tx t
daihom,.
kxer visto o seu dao.
n-fcre em don-tto-
aliens iu ctio n
last name
fIHa' ^ I l l p
Sally Jones 3 dias a^rs 1 dia 1 *v* t'ro sim

no existem

ferguntas Idiotas
No sei se entendi bem a diferena entre ? E quanto ao phpMyAdmin? Onde posso
banco de dados e tabela. Ambos no fazem a mesma encontr-lo?
coisa: armazenar dados?
K : Ao contrrio do terminal MySQL, o phpMyAdmin uma
Sim. As tabelas servem como uma forma de dividir aplicao web que permite acesso a um banco de dados
os dados de um banco em grupos relacionados, para MySQL. Trata-se, na verdade, de uma aplicao PHP, motivo
que voc no acabe tendo um nico conjunto enorme de pelo quai voc sempre a acessa a partir de um servidor
dados. mais ou menos como a diferena entre colocar web, em vez de instal-la no seu prprio computador. Muitas
um monte de sapatos em uma mesma grande caixa e empresas de web hosting oferecem o phpMyAdmin como
colocar cada par dentro da sua prpria caixa - a caixa parte do seu servio MySQL padro, portanto ele poder j
grande o banco de dados, as caixas menores so as estar instalado para voc. Se no estiver, baixe e instale o
tabelas. Assim, os dados so armazenados em tabelas, programa, voc mesmo. Est disponvel, gratuitamente, em
e as tabelas so armazenadas em bancos de dados. www.phpmyadmin.net. Lembre-se apenas de que ele precisa
ser instalado em umservidor web e configurado para ter
? : O que exatamente o terminal MySQL? Como acesso aos seus bancos MySQL, da mesma forma como
o encontro no meu computador: qualquer outra aplicao PHP e MySQL.

O terminal MySQL uma tcnica para se acessar ? Eu tenho tanto o terminal MySQL quanto o
um banco de dados MySQL atravs de uma interface phpMyAdmin disponveis. Qual deles eu devo usar
de linha de comando. Em muitos casos, o terminal para acessar meu banco de dados?
no um programa a parte, e sim uma conexo que
voc estabelece usando a linha de comando de um ^ * . Essa uma questo pessoal. A vantagem do
programa terminal genrico, como por exemplo o phpMyAdmin que voc pode explorar seus bancos
aplicativo terminal do Mac OS X. 0 modo como voc de dados e tabelas visualmente, sem ter de digitar
acessa o terminal MySQL varia bastante, dependendo comandos SQL Isso pode ser bastante til, caso voc
de qual sistema operacional voc est usando e se tenha se familiarizado com o SQL e no queira digitar
o servidor MySQL est local ou remoto (localizado comandos manualmente para cada coisinha que precisar
em algum outro lugar que no o seu computador). O fazer. Entretanto, por agora, uma boa ideia que voc
Apndice II apresenta mais detalhes sobre como se concentre em realmente entender o modo de interagir
acessar o terminal MySQL. com os seus dados usando comandos SQL, e nesse caso,
qualquer uma das ferramentas funciona a contento.
conectando-se ao My SQL

T fe S T O R fv e
A rm azene um caso de abduo aliengena no seu banco de dados
com uma instruo SQL INSERT
Usando uma ferramenta MySQL, como o terminal MySQL ou a guia SQL do
phpMyAdmin, digite uma instruo INSERT para armazenar dados de uma abduo.
Como exemplo, eis aqui a instruo INSERT para a abduo de Sally Jones:
INSERT INTO aliens_abduction (first_name, last_name,

when_it_Jnappened, how_long, how_many, alien__description,

what__they_did, fang_spotted, otherr email)

VALUES ('Sally', 'Jones', '3 dias atrs', '1 dia', 'quatro',

verde com seis tentculos', 'Ns s conversamos e brincamos com seu cachorro',

'sim', 'Acho que posso ter visto o seu co. Entre em contato.',

'sally@gregs-list.net1}

*edu-fcar a instruo l^BRT


ho terminai /VJyS^L rsulta
cr uma ova imha de dados a
ser adiebnada -tabela a!ie*_
desdrip-tioft.
A instruo INSERT parece ter sido executada com sucesso. Como
voc acha que poderamos confirmar se os dados foram inseridos?
Escreva aqui.

voc est aqui 69


introduzindo a instruo SELECT

Use SELECT para obter dados da tabela


Inserir dados em uma tabela uma tarefa relativamente fcil, mas compreensvel sentir
certa apreenso caso voc no tenha confirmado se os dados realmente foram parar na
tabela. E mais ou menos como depositar dinheiro na sua conta de poupana, mas nunca
poder visualizar o saldo. A instruo SELECT a forma de ver o saldo de uma tabela
em um banco de dados. Ou, dizendo propriamente, SELECT permite que voc solicite os
dados das colunas contidos em uma tabela.
/^s SELECT, esdreva wa
lista das doiunds dujos dados sempre e -Peito im
y*er redeber j ^iadao a ma tabela espedida, e ao
L ao ba^do de dados, de -ror**a geral.
c o l u n a s U p || nom e_ da_teJbela
_ ,
A instruo
A \>arte FR0M da 'wsbrua o
mdiea a SELECT de \wai tabela SE LE C T
<^uere**os sclcdioftv" dados*
J o S q L o L rt m
As colunas fornecidas a uma instruo SELECT precisam ser
separadas por vrgulas. Independente de quantas colunas coluneis de dados
houver em uma tabela, somente os dados dos nomes das colunas d e u m a ta b e la
especificadas em SELECT so retomados. Esta instruo SELECT
extrai todos os nomes e sobrenomes dos abduzidos contidos na
tabela aliens abduetion:
Son>evte os dados
re f e re n te s a estas duas
h m strudao S E L E C T so
obem dados d a ta b e la
dotadas sao re to rn a d o s ^>or
aliens_abdudtioh.
e sta instv^ao SE L E C T .

SELECT first name/ last name FROM aliens abduction

Para verificar um INSERT, voc precisa de uma forma para


visualizar rapidamente, todos os dados da tabela e no apenas
algumas colunas. A instruo SELECT oferece um atalho voltado
exatamente para isso:
0 asterisdo, ou estrela*! <*iz-
S E L E C T f a r a o b tev to d o s os dados de
to d a s as doW^as da tabela-

N Nao t nedessirio
SELECT * FROM aliens abduetion csfedi-fidr uma lista
de dolunas, porque ^
signifida o btenha
to d a s elas^
conectando-se ao My SQL

T fe S T O R tv e

C ertifique-se de que a instruo INSERT funcionou, usando


SELECT para o b ter dados da tab ela.
Execute uma consulta SELECT, usando uma ferramenta MySQL, para visualizar
todo o contedo da tabela a lie n s ab d u ctio n . Certifique-se de que a linha de
dados que acabou de inserir est aparecendo nos resultados.

SELECT * FROM aliens abduction

soas doiuhas.

A fiow Jta S B iS C T revela


hiea liftKa de dados
srnxszindos n -tabela-

Quantas linhas de dados h na sua tabela?.......A.

voc est aqui 71


automatizando comandos SQL com PHP

verdade, cad a insero em um banco de dados


MySQL requer um a instruo INSERT.
E neste ponto que a comunicao com um banco de dados MySQL
realizada simplesmente atravs de comandos SQL fica tediosa. claro
que h muitos benefcios ao se armazenar os dados de Owen em um
banco, em vez de em emails na sua Caixa de Entrada, mas gerenciar os
dados manualmente, emitindo-se instrues SQL em uma ferramenta
MySQL, no uma soluo razovel.

Como voc acha que o problema de


insero de dados de Owen pode ser
resolvido?
conectando-se ao My SQL

Peixe o PHP lidar com as coisas tediosas do SQL


A soluo para o problema de Owen no evitar o comando SQL,
mas sim automatizar o SQL com a ajuda do PHP. O PHP possibilita a
emisso de instrues SQL em um cdigo de script que ser executado
no servidor, de forma que voc nem sequer precisa usar uma Ove* dria uma insbrudao
ferramenta MySQL. Isso significa que o formulrio HTML de Owen SQ L INSERT, a \ual'
pode chamar um script PHP para lidar com a insero dos dados no insere os dados do email
banco, sempre que novos dados forem submetidos - nada de emails, o bando.
nem ferramentas SQL, nem confuses!
0 -formulrio HTML $era
um emdil *\UC OwCn rdcbe t ]
^redisa emo didionV)
mnuaWen-te, as m<wa3es
ao bando de dados.

Sem PHP, preciso exe c u ta r uma


instruo SQL INSERT m anual para
arm azen ar cad a relatrio de abduo
no banco de dados.

Com PHP, um script PHP


a u to m atic am en te exe cu ta INSERT
quando o form ulrio subm etido.

<rphp ----

'aiensrool',

(flrst-naE6' ia- .
escript^ '
%it :r 4" ' ,x ^
^ - s t s m x s r , r
Sresult = rnysqli^que2.y(?abc< squsry)

-formulrio
cr d-ef2rror querying dstabase.)

HTML dKama-
um sdripfc PHP
e pede a ele 0 sdript PHP dria uma instruao
<\ue adidione INSERT <\ue insere os dados do
os dados do reporLphp
-formulrio n bando -- nao e yrediso
formulrio ao nenhuma intervendao de OvcrJ
bando.

v o c est aqui 73
como o aplicativo do Owen pode usar php e m ysqi

0 PHP permite usar os dados do formulrio


web de Owen
O PHP melhora o fo rm u lrio web de Owen ao permitir que um script envie os dados
diretamente para um banco, em vez de envi-los para o endereo de email de Owen, que
teria ento de inseri-los manualmente. Vamos dar uma olhada com mais detalhes no modo
exato como a aplicao funciona, agora que o PHP est em ao.

O
Sally preenche o formulrio e clica
no boto Relatar Abduo, para
submet-lo. As informaes so
enviadas para o script repor t .php
no servidor web.

Sally, ainda
'TtU\r\ien>enhc
bdbzjdd po<r
olicns

0 ovmttlvi d

o
s iv ift refcrt-fh? do
Vrias pessoas continuam a scvvido'*" web, qwe t
submeter o formulrio. subwcttdo yo* <*m usuv-io.
conectando-se ao My SQL

O script r e p o r t . php de Owen conecta-se a um banco de


e dados MySQL e insere as informaes de cada formulrio
submetido usando instrues SQL INSERT.
0 sd rtp t report-php
domunida*-SC dom o servidor
M yS Q L para ihSiriV' dados
a tabela atins_abdudtion
do bando d e dados.
report. php

$ tabela al'ens_abdudtion
rmxjtn os re la to s na o rm a
de mhas r e ^ s tr o s ) de ddos.

Owen precisa no somente de um script para colocar os dados no


banco, como tambm de outro script para procurar e visualizar os
dados. Na verdade, isso poderia servir como a pgina principal do seu
site. O script in d e x . php conecta-se ao banco, obtm dados sobre as
abdues e os mostra a Owen.

Um servidor de
bando de dados
e afenas um
p ro ym sendo index.php
ex edutado em uma
mquina servidora* 0 s d rip t in dexpbp obtem dados d a ta b e la
geralm ente ju n to !iens_abdudtion f a r que eles possam se r
ao servidor web- -form atados e m ostrados a Owen-

Owen podem
e escolher acessar
^ ta b e ia aliens_abdudton os dados de
serve domo o n t e de dados muitas novas
p ara o s d rip t index.php. formas, o que lhe
permite focar-se
em encontrar seu
co Fang.
voc est aqui 75
fazendo uma conexo mysq!

Conecte-se ao seu banco de dados a partir do PHP


Antes que um script PHP possa inserir ou obter dados de um Seu provedor de hospedagem de
banco MySQL, ele precisa se conectar a esse banco. Conectar-se sites, ou seu w ebm aster, pode
a um banco MySQL a partir do PHP semelhante, de muitas lhe fo rn e c e r e sta informao.
maneiras, a acessar o banco atravs de uma ferramenta MySQL e Ov. en tao , se o seu servidor
as mesmas informaes so requeridas. Lembra-se das trs caixas web e o seu servidor de bando
de verificao que voc preencheu anteriormente, neste captulo? de dados estiverem
Aqui vo elas novamente, junto a mais uma, que indica nome do ro d an d o na mesma maquina, vode
banco de dados escreva todas as informaes, mais uma vez. pode usar a palavra "lodal host".

^ Localizao do meu servidor MySQL (endereo IP ou nome do host): ^

O Nome de usurio para o meu banco de dados:.....................


^ Senha para o meu banco de dados: 0 nome do bando
d e dados y*e vode
Nome do meu banco de dados:...... driou a n te rio rm e n te e
aliendatabase- Se, por al^um

As informaes de localizao do host, nome do usurio, senha e m<rtivo, vode -tiver atrib u d o

nome do banco de dados so todas requeridas para se estabelecei; alburn o u tro nome ao seu

uma conexo ao banco MySQL a partir de um script PHP. Uma bando, ou iiv e r o p ta d o por
usar um bando j 3 e*isten-te,
vez feita a conexo, o script pode executar comandos SQL da
mesma forma como se voc os estivesse digitando manualmente' use o nome apropriado-

em uma ferramenta MySQL. 0 nome do bando de


dados, inform ao
suas prprias nedessria p ara
informa^oes se r ao ^ue o s d rip t se
d ife re n te s destas. domuni^ue dom ele,
aliendatabase-

report, php
$ual<^uer sdrip-t
P H P <^ue a r m a z e n e
o btenha dados
de um bando
iduction
/WyS$L- predisa,
prim eiram ente,
estabeleder uma B ste s sao o
dofiC?^o dom o
bando, usndo as
bando de dados
0 nome da tabela^e a!iens__
e a ta b e la ^ue
abdudtion, e ele nao en-tr em
Quatro inform^oes ddabamos de driar.
dampo a t <\ue vode domede a
mendionads.
em itir domandos $L ~
conectando-se ao My SQL

Insira dados com um script PHP


Executar uma consulta MySQL a partir de cdigo PHP requer que voc, primeiramente
estabelea uma conexo com o banco de dados. Em seguida, voc constri a instruo
(query) na forma de uma string PHP. A instruo (query) no executada at que repasse a
string para o servidor do banco de dados. Finalmente, uma vez terminado o acesso ao banco
de dados, voc encerra a conexo. Todas essas tarefas so executadas atravs de cdigo em
um script PHP. Eis um exemplo que insere uma nova linha de dados de abdues:

sis deve ser os SEUS


Coned-ta-se bando de valores, e ho os de Owen-
dados MySQl
<?php

$dbc = niysqli_connsct

or die(Error connecting to MySQL server.' Vote talvez- fossa i*sar lodalhost para a
lodaiizado do seu banio, em vex. de w* owe
de dowmio.
$qaery = "INSERT INTO aliens_abductian t-first^nme', -last_name, when_it_happened, how_lang, "

"how many, alien description, what_they__did, fang_spotted, other, email) " .

"VALUES (Sally, 'Jones', '3 dias atrs', '1 dia', 'quatro', 'verde com seis tentculos',

"Ms s conversamos e brincamos com um cachorro', 'sim', 'Acho que posso ter visto seu co. entre em contatoj

sally@gregs-list.net) K - CohstruS 3 i n i t i o (<^ery)


IMSBRT do**o uma strina em
dodifto pfjP.
$result = mysqli_query($dbc, $query) / ;____ 3
_ ^ TenHa ww-to dwdado
or querying database., , j ^ ^ ^ ^ ^

bando de dados AlySQL. duplas a^w c tawbe


mysqli_clcse ($dbc) ; do os espa$<* antes e
depois das aspas.
fcstas lunoes venerem \ue o
sevt servidor web tenba PH*
verso * .l ou adim-

Q > E R > 0

O que voc acha que cada uma destas funes PHP est fazendo
noi script? j* /
mysqli_connect (W) ^--^__ oo 17 &
mysqli_query() ^'vsAAa X !2Ua
mysqli_close () fj )
'* <?v

voc es ago/ 77
trs funes php para conexo mysql Ur* donjwfc atvfc^o t
-wkocs Pi+P <y*e m-tera^m
dom o M y$$L dow c^r
Usefwipes PHPpara faiar cowobawo dedados
Existem trs funes PHP principais, usadas para que se realize a (ttafrimorad<A t ho\e e dia
comunicao com bancos de dados MySQL: m y sq li_ co n n ect (), ^re-evesc wsav as -Vw^ocs
m y sq li_ q u ery {) e m y sq li_ c lo se (). Caso tenha percebido um
padro a, no coincidncia - todas as funes modernas do PHP
que interagem com o MySQL comeam com m ysq li_
mysqli_connect () my sqli_query{) mysqli__close ()
Conecta-se a um banco de Emite uma instruo (query) a Encerra uma conexo
dados MySQL usando as um banco de dados MySQL, o a um banco de dados
quatro informaes que voc que, frequentemente, envolve MySQL.
j viu anteriormente. armazenar ou obter dadosde
uma
O uso destas trs funes geralmente envolve uma sequncia previsvel de etapas.
C onecte-se a um banco de dados com a funo mysqli_connect ().
Fornea a localizao, o nome do usurio e a senha, para obter permisso para
interagir com o servidor do banco de dados MySQL. Especifique tambm o nome do
banco, uma vez que esta uma conexo a um banco especfico.

Connectado!
Crie um a query SQL e a arm azen e com o um a string em um a
O varivel PHP.
Para se comunicar com o servidor do banco de dados, voc tem de usar comandos
SQL. Por exemplo, necessrio uma instruo INSERT para que dados sejam
adicionados tabela a lie n s _ a b d u c tio n . No h nada de especial a ser citado sobre
o nome da varivel que escolhermos, e um nome simples como $ query funciona
perfeitamente bem.
Eu tenho uma
grande instruo INSERT
para enviar e ela est armazenada
em uma varivel PHP.
conectando-se ao My SQL

Em ita a instruo (query) com a funo m ysq li_q u ery().


Use a varivel $query com a funo m ysqli_query () para falar com o servidor
do banco MySQL e adicionar dados tabela alie n s._ ab d u ctio n . Voc tem que
informar m ysqli_query () tanto o nome da conexo que criou no Passo 1 quanto
o nome da varivel que armazena a sua consulta, do Passo 2.
e*edua a sua \uery,
Ei, adicione *\ue e insiru^o IWSfcRT para ~
estes dados com adidionar dados a -tabela- i
INSERT naquela
mysqli_query()
tabela que voc tem
armazenada a.

0 E ncerre a conexo ao banco com a funo mysql_close ( ).


Finalmente, m y sq li_ c lo se {) diz ao servidor do banco MySQL que voc j terminou a
sua comunicao com ele.
my sql i_c lo se ()

Conexo fechada.

Este o v\one da su Sc aly> der errado, isto ^ 't u a ^ |^ s e r t


varivel da doe*ao. vis u mnssjcm < f i ^ o ^ ^
vode e para xudo.
<?php
J .
Sdbc - l l l l i i l l l l 'data.aliensabductedme.com ensrooi'
or die ('Error connecting to MySQL server. 1)

o = "INSERT INTO a!iens_abduction (first_name, last_name, when_it_happened, how_long,


how_many, alien_description, what_they_did, fang_spotted, other, email) .
"VALUES ('Sally1, Jones', '3 days ago', '1 day, four, green with six tentacles', "
'We just talked and played with a dog', JU-l f
'yes', -i- Jliuy
'I V^ seen your dog. Contact 1U
may have m e.,
'sally@gregs-list.net')"; ivs^li <\ueryO a -fundo usada pel PttP para
^ -- sc do.unidar tom o serx/idor MyS6?L 0 dodi$o
Sresult = llilP llii S {$dbc' $query) armazenado a varivel ?<\uery SQL, e ao PHP-
or die('Error querying database.');

a^ui, hs ^edha
i I I ($dbc) ? adonexao-
Vamos dar uma olhada com mais ateno em cada uma dessas funes
PHP para bancos de dados, comeando por m ysqli connect ()...
voc est aqui 79
usando mysq!i__connect()

Conecte-se com wysqli cowiect)


Para o nosso script PHP poder criar uma conexo Monte a string da query,
com o banco de dados usando a funo m y sq li_ Execute a query com mysqli_queryO.
connect {), voc precisar de algumas informaes, Q Feche a conexo com mysqli_closeO-
com as quais j est comeando a se familiarizar.
Sim, so as mesmas informaes que usou
anteriormente, quando trabalhou com o terminal
MySQL, mais o nome do banco de dados.
Seu nom e de usurio e senha
Voc precisar ter seu prprio nome de usurio e senha para o seu prprio
CtUGWl? servidor do banco de dados. Essas informaes ou sero definidas por voc
ou lhe sero entregues pela sua empresa de hospedagem de sites, quando
o MySQL for instalado. Se voc configurar seu prprio MySQL, siga as
instrues para criar um nome e uma senha seguros.
O nom e do banco de dados
0 qu?
No nosso exemplo, demos ao banco o nome a lie n d a ta b a s e . O seu ter
qualquer nome que voc decida lhe dar, ou ento ter o nome dado pela sua
empresa de hospedagem de sites, caso ela tenha criado o banco para voc.
A localizao do banco (um nom e de dom nio, um endereo
IP ou localhost)
Onde? No nosso exemplo, estamos usando a localizao do banco (fictcio) de
Owen. Voc precisa usar a localizao do seu prprio servidor MySQL.
Frequentemente, voc usar lo c a lh o s t, caso o servidor do banco esteja na
mesma mquina que o seu servidor web. A sua empresa de web hosting poder
informar-lhe a respeito disso. A localizao poder ser tambm um endereo IP
ou um nome de domnio, como por exemplo, seu s e rv i d o r. s e u is p . com.
A localizao, o nome do usurio, a senha e o nome do banco MySQL
na funo m y sq li_ co n n ect {) precisam estar, todos, entre aspas.
variarei para realizar A u n ? H l/
^f

$dbc
ou-hras &oes ho bando de dados.

= mysqli_connect(
connectO Jida
A T
a
'data .aliensabduetedme .c o m ', IPcauzaaP, P
Kowe do
usurio- o we n ' ' ^odaiizada Jp a S e n ta e
aliensrool , do bando de , j
i 1a l ie n d a t a b a s e 1); dados. TlPIUc u P bailCP d'
^ o k*i0 dc dados' d a d o s c o m o sftin g s,
O resultado ao se chamar a funo, uma conexo ao ptfcanp, V p c e te m
banco de dados e uma varivel PHP que voc pode usar j i
para interagir com o banco. A varivel recebeu o nome CQlQCat ^SSclS
$dbc no exemplo, mas voc pode atribuir qualquer nome i n r i l l T r f C aSPaS-
que quiser.
conectando-se ao My SQL

r %Apowte sc lpis----------------------------------------------
Eis alguns exemplos de strings PHP para conexo a
bancos de dados. Observe cada uma delas e escreva
se a string vai funcionar ou no, e como consert-la,
neste caso. Adicionalmente, circule qualquer parte
de cdigo que voc considere problemtica.

$dbc = mysqli_connect ('data .aliensabductedme .com', 'owen 1, 'aliertsrool1,


alendatabase');

$dh3^^vc\Ysqlj^s&i^nect. ('data.aliensabductedme.com, 'owen', 'aliensrool'


"aliendatabase'*^

j\
111 M H-i,,..!, ..

. .Q:. . .v.Y.V1.C./. h ................................................................................................

l^fangisgone^ mysqli_connect(1data.aliensabductedme.com, 'owen', 'aliensrool',


'alendatabase1);

$dbc = mysqli connect (^sagalhogte-^ owen', 'aliensrool',


'aliendatabase');

. . . . M .................. ......................................................................................

$dbc = mysqli_connect{'data.aliensabductedme.com1, 'owen


aliendatabase'); 'O
0 ..... ..........

............................ ...........................................................................................................

$dbc.^jii^gjrr^eqMTiyLTt^a^a'.<^ieIIoabduefc^dme.com', 1owen', 1aliensrool') ;


(roysqli_select_db ($dbc, 'aliendatabase

voc est aqui 81


soluo do aponte

ponte seu lpis Eis alguns exemplos de strings PHP para conexo a
Solupo bancos de dados. Observe cada uma delas e escreva
se a string vai funcionar ou no, e como consert-la
neste caso. Adicionalmente, circule qualquer parte
de cdigo que voc considere problemtica.

$dbc = mysqli_connect{'data.aliensabductedme.com', 'owen', 'aliensrool',


1aliendatabase1);

Esta. string. de done*ao undiona. sem ,problemas-.


f
E pvdso m pnt c vrcjul' a^i............... jtfeste livrj stmos snd' sps' simptes pr' sttfngs'
p ara -term inar a instrudao PHP. ptfp e reservando as aspas duplas p a ra donsultas SQL.
$dbc = mysqli_conn,ect/'data.aliensabductedme.com', 'owen', 'aliensrool',
"aliendatabasenj^ J

|s to n u n tio n a, .porque. e s t -fa la n d o um po n to e yrgula; /\s aspas duplas u^im arn do


mesmo j e i t o <\ue as simples.

Kao e um nome muito d esdritivo p ara


uma done*ao a bando de dados.
^fangisgone^ mysqli_connect('data.aliensabductedme.com', 'owen', 'aliensrool',
Aliendatabase') ;
js to undiona, mbora ^angisgone (''an g estd esap ared id o ) no seja um bom nome p ara uma
done%ao a bando de dados.

e sta n tid o assumindo <^ue o servidor do bando de


dados se lodaliza no mesmo dompvitador <^ue o servidor web.
$dbc = mysqli_connect (^^ c a l hostT^^owen', 'aliensrool', 'aliendatabase');

Jstp. ^ n d io n a . desde. \ue o. serv id o r web e. o sryidor, do bando estejam na mesma mquina-..............

Uma senha vazia p a ra o bando


de dados nao e uma boa ideia-'

$dbc = mysqli_connect{'data.aliensabductedme.com', 1owen', 'aliendatabase');

|st so -fundi onara se vode d e fin ir uma senha em brando p a ra o bando de dados. No e uma
boa ideia, mas -fundiona/ Vode sempv-e deve t e r uma senha p ara dada bando de dados.

D ei* ar de -fora o q u a rto argum ento


req u er <^ue dhame m ys^|i_seledt_dbO
p a ra seledionar o bando de dados. \
$dbc = mysqli_connect('data.aliensabductedme.com', 'owen', aliensrool')
mysqli_select_db($dbc, 'aliendatabase');

M e desdulpe, mas isto uma I pe^adinha .. Em .m y s^ li^ d ^ n e d tP /. o q u a rto item , o nome do, bando
de dados, e opdional Vode pode d ei*lo d e o r a d a -fundo e usar m ^s^li^seledt^dbO p ara
espedi-Pidar o nome do bando. Assim, e ste ddigo t o mesmo ^ue se vode tivesse passado to d o s os
q u a tro argum entos p r mys^li__donnedtO.
conectando-se ao My SQL

Parece que poderia ser fcil


estragar uma das partes da informao
usada para conectar-se ao banco de dados.
Porm, como eu poderei ter certeza se a
conexo funcionou?

//

aqui que,arcfftco P H P d ie () til.


A funo PH PdieQ^fnaliza o script PHP e fornece conhecimento
sobre algum ccigo que tenha falhado. Embora no revele
precisamente o que houve de errado, d ie () nos informa que algo
aconteceu e precisa ser consertado. Se houver algo de errado com
uma das quatro variveis para conexo de m ysqli__connect (),
ou se o servidor do banco no puder ser localizado, a funo d ie ()
impede que o restante do script PHP seja executado e mostra a
mensagem de erro entre parnteses.

A -funo dieO t soiidtada, Se uitt das nc&sds ^v^rbrc strings n un3


daso a Conexo nao tenHa sido wys^ii_dnnedt no esiiver dorreta, redeberewos
estabeedida- ^ u m resposta sobre isso-

$dbc V mysqli_connect('data.aliensabductedme.com', 'owen1,. 1aliensrool1, aliendatabase')


or die(Erro ao conectar o banco de dados.');

Esta mensage t enviada para a


pagina web, das a done*a -PalHe.

No t prediso dolodar ponto


e vrgula a<\ui, u*a vez. <^*e
or die -)Mtorres ponde a,
tednida**ente, dontinuaao de
uma mesnta insfaruao.

voc est aqui 83


construindo consultas no php

Sim! Uma vez fe ita a conexo ao banco com


m ysqii_connect() , voc pode e m itir consultas
SQL d ireta m e n te do PHP.
Praticamente, tudo que pode fazer em um terminal MySQL
pode tambm ser feito em cdigo PHP, com a conexo ao
banco que acabou de ser estabelecido. E essa conexo que
disponibiliza um canal de comunicao entre um script
PHP e um banco de dados MySQL. Por exemplo, agora que
Owen tem uma conexo ao seu banco, ele pode comear a
inserir dados na tabela a lie n s ab d u c tio n com a funo
m ysqli_query () e algum cdigo de consulta SQL.

L-Cftibvescj nosso
objetivo c autom atizar
esta ^uery (HSBRj
usnclotc\op PffP.

A \uery SQL passada


para swys^ii^ueryO domo A funo m y sq li_ q u ery () precisa ter uma
um a s trm $ P H P 1 query SQL armazenada em uma string PHP
\ ($query) para executar a insero dos dados,
\ abdues aliengenas. ^ _______
conectando-se ao My SQL

Construa a query INSERT no PHP Correct yg com wysqli_jconnaetQ.


Monte a string da query.
As query SQL, em PHP, so representadas como
strings e costuma-se armazenar a query em uma o
D
Execute a consulta com mysqii_queryO.
string antes de pass-la para a funo m y s q li_
q u e ry (). Uma vez que as consultas SQL podem
o Feche a conexo com mysqlLcloseO-
ser razoavelmente grandes, frequentem ente
necessrio constru-las a partir de strings menores,
que se estendem por vrias linhas de cdigo. A query
IN SE R T de Owen um bom exemplo disso:
0 ponto iihai diz. a PHP para

^ s ta e umd varilvel string


do PHP ,^ue agora jw ta r esta siring do* a >\ue vier
n linHa seguinte- ^
armazjend a ^uevy INSERT.
= "INSERT INTO aliens abduction (first name, last name,
"when_it_happened, how__long, how_many, alien_description, " .
"what_they_did, fang_spotted, other, email) " .
"VALUES {'Sally1, 'Jones', '3 dias atrs', 1 dia', 'quatro', " .
"verde com seis tentculos', 'Ns s conversamos e brincamos com um cachorro', " .
"'sim1, 'Acho que posso ter visto seu co. Entre em contato.',
"1sally@gregs-list.net') "||
^ strin g de donsulta se divide e vrias linhas, p ara
Uma vez. <Y*e tudo
isto ddigo PHP, e to m a - l a ais legvel os pontos inis instvu* PHP o
prediso -Tinliziio tom 3 tra n so rw ia r tu d o isto em u a unida string-
ponto e vrgula. Com a query insert armazenada em uma string, a mesma estar
pronta para ser transferida via funo m y s q li q u e ry ().
existem
Fer^untas idiotas
1 * Por que um INSERT feito em 7 * Por que a instruo INSERT ^ * realmente necessrio listar
um banco chamado de query? no criada como uma nica os nomes das colunas ao se fazer
0 termo query no significa string gigante? um INSERT?^
que ns estamos pedindo alguma
coisa ao banco de dados? Tenha em mente que a pode omitir os
instruo INSERT armazenada nomes das colunas na instruo
Sim, query significa que como uma nica string gigante, INSERT. Nesse caso, ter de
algo est sendo requisitando... mesmo que tenha sido criada a fornecer valores para todas as
voc est pedindo ao banco que partir de vrias strings menores, j colunas da tabela, na mesma ordeiji
faa alguma coisa. Nas aplicaes ideal seria que a instruo INSEl em que aparecem na estrutura
de bancos de dados MySQL, fosse programada como uma nr da tabela. Tendo isso em mente
o termo query genrico, string. Mas, assim como vrias em geral mais seguro e mais
referindo-se a qualquer comando instrues SQL, INSERT bastar conveniente especificar os nomes
SQL que seja executado, incluindo longa e no cabe em uma linha das colunas.
tanto o armazenamento quano a normal de cdigo. Assim, ela
obteno de dados. mais fcil de ler se programada
como strings menores, conectadas
por pontos finais.

voc est aqui > 85


a funo mysqli_queryO

Consulte o banco de dados MySQL -Conecteve com mysqlr^connegtQ.


-Monte Q-sjyRg-a-^Bcry.
com PHP Execute a crvsulta"com mysqIi__query()T^
A funo m y s q li_ q u e r y () precisa de duas ^ Feche a conexo com mysqli_closeO.
informaes para executar uma query: uma
conexo ao banco e uma string de query SQL.

!>h
'S ' conexo__ao_jDanco, co n su lta ) E sta i a <\uery
SQL ser
realizada- aquela
E si e uma do*exao <\ue j oi esa b eled id a,^ arw>32XPimoS Cm
araves da -fundo mys*^!i_donnctfc) uma sirwty
Lembre-se, estas
A conexo requerida pela funo m y s q li_ q u e r y () foi
variveis sero
retom ada para voc por m y s q li_ c o n n e c t (). Caso isso
di-fereivies o seu
tudo esteja um pouco difcil de visualizar, eis o cdigo que
propv-i bando de dados.
estabeleceu a conexo:

j|j^Gij= mysqli_connect (1data. aliensabductedme .con 'owen', 'aliensrool', 'aliendatabase')

or die(rErro ao conectar ao servidor mysql.T);


A tont^o do bo dc
dados ja o i armazenada, na Uma ^lieiy SQL
varivel f dbd-
Assim, voc tem um a conexo ao banco ($dbc) e um a query
corresponde a unia
SQL ($q u e ry ). S o que falta repass-los para a funo r e q u is i o e s c r ita
m y s q li_ q u e r y ().
ix '" ' A <Htery
e fll C P cR go
SQL,
P f f i B S l | ( $ d b c f $query) ; <jue enVIada a<?
or die('Error querying database.')j w
tenf^o 3o setVidpr d9 banco
bato de dados.
0 resul-fcado da <^*ery d e d ados.
Este cdigo mostra que ou solicitar a funo m y s q li_ q u e r y {) no
corresponde a, apenas, uma comunicao de uma s via. A funo responde a
voc, retom ando um a informao que armazenada na varivel $ r e s u l t . Mas
nenhum dado realmente retornado a partir da consulta IN SERT - a varivel
Sresult apenas registra a informao referente ao sucesso - ou no - da query
emitida por m ysqli.

A unp in>;sc[l?_cjiieryO requer uma cpnexQ


ap banco de dadps e uma sttlng de <juery para
e x e c u t a r u m a c o n s u lta . S Q L .
conectando-se ao My SQL

Encerre sua conexo com


-Mcnta q string da query.
mysqlLcloseO -gxeeute a consulta eetyi my^U_qwpyQ.
e-
Uma vez que s estamos interessados em executar a Feche a conexo com mysql i_closeQ^
instruo IN SER T simples, a interao com o banco
est terminada, pelo menos no que concerne ao
nosso script. E, ao term inar de usar uma conexo u m U ?m t b r t9
ao banco, feche-a. As conexes se fecham sozinhas
quando o usurio fecha a pgina, porm, assim como eciat a C0 Tiex a
fechar uma porta no m undo real, um bom hbito um banco de dadps
tomar a iniciativa de fechar as conexes quando tiver
terminado de us-las. A funo PHP m y s q li_ M y S Q jL a p o s
d o s e () realiza essa tarefa.
terminar de usa-lp.
conexo_ao_banco) ;
vode i U a a frivel
s done%o, utilizada para
interagir tom obrtdo de
d ad es.

No caso do script de Owen, precisamos executar


a m y s q li_ c lo s e () e informar qual a conexo
a ser fechada, informao essa que se encontra
armazenada na varivel $dbc. Esta varivel rmar,a uma wev&dia
^ a -foi firiada por yssli_
|f($dbc) ; totonttiO ! atrs, guando a donexo
+oi aberta pela primeira vez.

Mas se as conexes aos bancos


se fecham automaticamente, por que
se dar ao trabalho de fech-las de
forma manuaJ?

Os servidores de bancos de dados s dispem


de um c e rto nm ero de conexes disponveis
por vez, portanto, elas precisam ser preservadas
ta n to quanto for possvel.
E quando voc fecha uma conexo, isso libera o recurso
para que uma nova conexo possa ser criada. Se estiver em
um banco de dados compartilhado, apenas cinco conexes
podero ser alocadas para voc, por exemplo. E, medida que
voc for criando novas aplicaes que usem bancos de dados,
tenha certeza que querer m anter o maior estoque possvel de
conexes disponveis.
voc bs t aqui 87
no existem perguntas idiotas e pontos de bala

np existem
P e rg u n ta s id io ta s
deveria estar fazendo algo com o resultado?
1 - Voc no poderia, simplesmente, colocar todo
o cdigo SQL diretamente na funo mysqli_
Talvez sim. At aqui, estivemos usando die()
query (), em vez de na varivel $query?
para finalizar um script e enviar uma mensagem ao
navegador caso algo de errado acontecesse. Chegar
P^_: Seria possvel, mas ficaria muito bagunado. um momento em que voc poder querer fornecer
mais fcil gerenciar o seu cdigo quando voc armazena mais informaes ao usurio quando a query no tiver
suas queries em variveis, e depois usa essas variveis sucesso, nesse caso, voc pode usar o resultado da
na funo mysqli_query (). query para determinar o sucesso desta.

? : 0 cdigo que referencia a consulta IN SER T

PONTOS DE BALA

As conexes a bancos de dados precisam de uma


localizao, um nome de usurio, uma senha e um nome
do banco.

Afuno mysqli_connect () cria uma conexo entre


o seu script PHP e o servidor do banco de dados MySQL.

Afuno die () finaliza o script e retoma uma mensagem


caso a sua conexo falhe.

Para se executar uma query SQL a partir de cdigo PHP,


voc constri a query em uma string e depois a executa
com uma chamada a mysqli_query {).

Chame a funo mysqli_close {) para fechar uma


conexo ao banco MySQL, a partir do PHP, quando tiver
terminado de us-la.

RQ
conectando-se ao My SQL

0 P e js t O r iv e

Modifique o cdigo do script report.php de form a que, em vez de enviar


os dados por em ail para O wen, eles sejam inseridos no banco de dados
MySQL. Depois, te s te as m odificaes que voc fez.
Remova a parte do cdigo do script report .php que envia os dados para Owen. No
lugar, coloque o cdigo que inicia a conexo ao seu banco de dados MySQL, construa uma
query SQL como uma string PHP, execute a query no banco de dados e depois encerre a
conexo. _____

?a o -die('EC-C-r connecting MyS2_. ,OMen''


Eis o KOVO ddi^o PHP em * - tn=ER- IN-0 alier.5 abduction (first_nair.e, "
V* vimos -b-abalhando. Mac howior.i, .ho._m.wy, .
"Kh,t>ey>d, i- V Pa-te-3dfar;-^" 'I ^ <*-. "
tolo^uc as "tags <?pHp ?> cm
veport-php, *ma vez. <^ue esta 111&aily@grsgs-liSt ,r.et ) /
adidionad este toiop a ^result. = mysqli.quervtSdbC, iquery)_
um pcm-to no sri|H; ^ c j se or die1'Error querying dstaD&=e. J,
endonira den-tvo das -ta^s- fflysqii_ciosel-Sdbc);

Envie o novo report.php para o seu servidor web e depois abra a pgina report.
html em um navegador para acessar o formulrio Relatar uma Abduo. Preencha
o formulrio e clique no boto Relatar Abduo para armazenar os dados no banco.
Agora, inicie a sua ferram enta MySQL e realize um a query SELEC T para visualizar as
modificaes feitas no banco.

Isto est correto? Escreva abaixo se voc acha que isto que o
script deveria estar f^zeido, e por qu.
. a J< . 'J J ^J j . a 7 .-. . j v M X . ..................................

voc est aqui 89


use $__POST na query INSERT

Espere um minuto. Esse trabalho todo que


estamos fazendo no com o objetivo de pegar dados
diretam ente do formulrio e armazen-los no banco? Parece que a
consulta est inserindo os mesmos dados, no importa o que tenha
sido digitado no formulrio. No estou vendo nenhuma automao
com este script PHP.

Isto um grande problem a. A consulta INSERT


precisa inserir os dados do form ulrio, e no
strings e s ttic as.
A query que construmos consiste de strings definidas
diretam ente no cdigo, e no de strings resultantes do texto
que foi digitado no formulrio. Para que o script funcione com
o formulrio, precisamos fazer com que os dados digitados
sejam colocados dentro da string de query.

m ysqli_query()

fcstes dados do oTmulvio


prctisan iv pra trfcco dS

0 -forwulavio e a -Ponte dos dados


-e-Wenies aos relatos de abdues

Q ual cdigo P H P poderia nos aju d ar a en viar


os valores do form ulrio de O w en para
dentro da query i n s e r t ?
conectando-se ao My SQL

*~POST fornece os dados do formulrio


A b oa n otcia que o script r e p o r t .p h p j tM n o 's c ia cctsh
fo rm u lrio arm azen ados em variveis, graas a ^ r p e r g lo b a l $_P O ST .
V oc lem b ra deste c d igo PHP?

$name = $_POST['firstname'] . ' ' . $_POST['lastnameT


$when_it_happened = $_POST['whenithappened' A superglobal ?__P0T j es
$how__long = $_POST [1howlong1]; sendo usada pava e sva ir
os dados de dada dampo do
$how_many = $_POST ['howxnany1]; -rormulari de t para
inseri|s em variveis.
L1UI ]
$alien_description = $_POST['aliendescription'
$what_they_did = $_POST['whattheydid'
1 Lebrs-sC) o nome <\ue vode usar
$fang_spotted = $_POST[fangspotted1] para f JPST predisa ser o mesmo
do dampo dorrespondente, *o
$email = $_POST[1email'];
formulrio ttTM l
$other = $ POST [other '];

Assim, voc j tem os dados do formulrio e s precisa incorpor-los


na instruo IN SER T . Mas preciso fazer um a pequena modificao,
primeiro. Agora que voc no est mais enviando os dados por email, no
precisa da varivel $nam e. Voc ainda precisa do nom e e do sobrenome do
usurio, para que o relato possa ser adicionado ao banco de dados - mas
precisa t-los em variveis separadas.
0 nome e o sobrenome do wuario
$first name = $ POST['firstname'];
agora sao armazenados em variveis
$last name = $ POST ['lastname'] ; . separadas, |>ar ^ue possam ser
inseridos em dolunas di-Perentes da
tabela aliens__abdudion.

Escreva o cdigo PHP para criar a string de query i n s e r t armazenada na


varivel $query, certificando-se de que ela esteja armazenando os dados
do formulrio na tabela a l i e n s a b d u c t i o n , ao ser executada.

..... .......

. a j. s . t . ^ y > ? ; L.r .^ r ^ r - .e .f . .....


w
*y.V.L. y..E. S. C. .. 1} &.-t.*>>v5...
. f.

voc est aqui > 91


aspas simples e duplas no php

Escreva o cdigo PHP para criar a string de query i n s e r t armazenada na


varivel $query, certificando-se de que ela esteja armazenando os dados
do formulrio na tabela aliens^abduction, ao ser executada.
SoL uo
Os nomes das dolun3s
aparedem a instruo
exatamente domo antes

fquery INS&RT IKT0 aliehs^abdudtion (-firstjriam e, last^name, wKen^it^bappened, Kowjon^ w


"Kow^many, alien^desdription, what^they^did, -Canc^spotted, other, email) w .

w\//lLUES (lf-first_nan*e,, Vlast_name\ t*v/hen_it_bappened,) 'fhov/_Joh^, 'fh^TSnfP^"


w?alien_desdription > 'fv;Viat__they_jiid', l?-Pan^_spotted,) '/o th e r, 'femailOw;
m vez. de dados estitidos sobre a ^ ^
abduo de Sally Jones, ajora *cs_y A ordem das variveis predisa ser a mesma dos
inserimos os dados que o usurio nomes das dolunas, f ara que os dados seja
distou no -formulrio- armazenados nas dolunas dorretas da tabela-

na existem

tomo das variveis. 0 motivo que o PHP trata as strings


Eu tenho mesmo que criar todas essas variveis de forma diferente, dependendo da fornia como elas
para armazenar os dados de $_POST? No posso, aparecem: dentro de aspas simples ou duplas. A diferena
simplesmente, referenciar os dados de $_POST que as aspas simples representam exatamente o texto
contido nelas, enquanto, ao se fazer uso das aspas duplas,
diretamentejao^ntro da string $query? significa que h algum processamento adicional no texto
quando se usam aspas duplas. Esse prcessamento
Pode. No hfladTque lhe impea de ?car resulta no fato,de que os valores das variveis colocadas
$__P O S T diretamente em uma query. Porm, dentro de aspas duplas so mostradas em strings, no lugar
um bom hbito de programao isolar os dados do \ do nome da varivel. Isso bastante til, e por isso que
formulrio antes de fazer qualquer coisa com eies. Is s \ as aspas duplas geralmente so preferidas para-se criar
acontece devido ao fato de ser relativamente comum a \ strings de query SQL.
necessidade de processar os dados de alguma forma,
antes de inseri-los no bansoJ&texemplo, existem
No seria possvel criar strings de query
tcnicas inteligentes qufhackers^>odem usar para
sequestrar suas query, dignando aados perigosos simplesmente concatenando-se as variveis com o
no formulrio. Voc ver como evitar tais ataques no cdigo S Q L ?
Captulo 6. Para manter a simplicidade, neste captulo
no fazemos nenhum processamento nos dados, mas
^ I Sim, e se voc decidir usar esse mtodo,
isso no significa que no deva adquirir o hbito de
certamente poder usar aspas simples em vez das
^armazenar os dados do formulrio nas suas prprias /
duplas. Mas as strings de query j tendem a ser
varveis antes de coloc-los em uma query. /
bagunadas por natureza, de modo que tudo o que
T \ . puder fazer para torn-las mais legveis bom - inserir
1 - Faz alguma-difgrena usar aspas-sfmples ou variveis diretamente em uma string dentro de aspas
dupias? Posso usar aspas simples em torno de toda a duplas, em vez de as concaten-las com aspas simples,
definitivamente torna as strings mais fceis de serem
consulta, e aspas duplas em torno de cada varivel?
entendidas.

Sim, faz diferena. E no, voc no pode usar aspas


simples em torno da query inteira, com aspas duplas em
conectando-se ao t>.

Vamos usar tudo o que j aprendemos para terminar o script PHP de Owen,
para que ele possa armazenar com sucesso os dados sobre as abdues em
um banco de dados. Escreva abaixo o cdigo PHP necessrio para completar
O script report.php.

<?php

$when_it_happened = $_PQST ['whenithappened' ];


$how_long = $ POST ['howlor.'];
$how^many '== $_POST['howmany1];
$alien_description = $_POST[raliendescription];
$wht_they_did = $_POST[1.whattheydid1;
$fang_spotted = $_POST['fanspotted']
$email = $_POST['email'];
$other = $_PGST['other'];

$dbc =

$query = "INSERT INTO aiens_abduction (first_n-ame, last_name, 'when_i.t_happened, how__lcng, " .


how_aany, alien_description, what_they_di,.- fang__spotted, other, email) " -
"VALUES ('$first_name1, '$last_nam.e 1 '$when_it_happene.d', '$how_iong', '$how__many', " .
'$alien_description 1, 1?.what_they_did' , '$rang_spotted1,''$other1, '$emaii')";

$result =

echo .1Thanks for submitting the fom.cbr />';


echo You were abducted ' . $when_it_happened;
echo and were gone, for ' . $how_long . '<br />';
echo 'Number 'of aliens: ' . $how_m.any . '<br />;
echo 'Describe them: 1 $alien_description . '<br />';
echo 'The aliens did this: ' . $what_they_did . '<br />';
echo 'Was Fang'there? ' . Sfang_spotted . '<br />'; .
echo 'Other comments: 1 . $othsr . 1<br />';
echo 'Your email.address is ' . $eii>ail;\
?>

voc est aqui 93


4 cicio

oCO
~ L x e R c ic io Vamos usar tudo o que j aprendemos para terminar o script PHP de Owen,
O rti . c o Para c'ue e 'e Pssa armazenar com sucesso os dados sobre as abdues em
unr| [jarico jg dados Escreva abaixo o cdigo PHP necessrio para completar
O script report . php.

As novas variveis armazm* o nome


c o sobrenome do usurio, do jei-fco
ele digitou no formulrio.
<3:
f-^rst^name fmP0STrClfirstn3me>J;
Vode predisa se donedtr ao bando
flast_nae f^P OSTC lastra mel', de dados e fomeder as informaes
$when_it_happened = $_?OST['whenithappened']; nedessrias antes de realizar
$how_long = $_POST[howlong'] ;
quaisquer donsultas $ L a p a rtir
$how_many = 5_P0ST['howmany'];
$alien_description = $_POST['aliendescription'] do PHP.
$what_they_did = $_POST[1whattheydid 1 ] ;
$fang_spotted = $__POST [1fangspotted']; A query e donstruda domo uma string
$email = $__POST ['email1]; PHP- Certifique se de usar os dados
$other = $_POST[1other 1]; extrados dos dampos do formulrio-
$dbc =
m y s q |i_ d o n n ed t^ d a ^ S\iensabdud^dm e d o m V w e n , 'aiiew rool', 'alienda^UbaseO

o r d ie C E rro r donnedting t o MySfiJL server/)^


Squery = "INSERT INTO a!iens_abdu.ction (first_name, last_name, when_it_happened, how long,
"how_many, alien_descriptionr what_they_did, fang_spotted, other, email) .
"VALUES ($first_name', '$last_name', '$when_it_happened', '$how_long1, '$how many', " .
$alien_description, '$what_they_did', '5fang spotted', '$other', '$email')";

txedute a query ao bando


de dados - isto e o que
insere os dadosf
or dieC&rror querying database-0;
riysIit_it1osf db^^i
i--\...... 1 .....'....... -...... FedHe a dcmexao a bando.
echo Thanks for submitting the form.cbr />';
echo 'You were abducted ' . $when_it happened;
echo ' and were gone for ' . $how long . <br />';
echo 'Number of aliens; ' . $how_many . <br />';
echo 'Describe them: 1 . $alien_description . '<br />';
echo 'The aliens did this: ' . $what they did . '<br />';
echo 'Was Fang there? ' . $fang_spotted . 1<br />';
echo 'Other comments: ' . $other . '<br />';
echo 'Your email address is ' . $email;
Confirme se o formulrio foi
submetido dom sudesso, da mes*a
forma torno fazia no sdript antigo-
conectando-se ao My SQL

T fe S T O R fv e

M odifique o script de Owen de form a a usar os dados do form ulrio


para fazer um INSERT.
Remova a varivel $name do script r e p o r t .php, adicione as variveis $first_name
e $ l a s t name e modifique $query para usar as variveis do formulrio, em vez de
texto esttico na instruo IN SE R T . Envie a nova verso d script para o servidor e teste-o,
submetendo o formulrio da pgina r e p o r t . html algumas vezes, digitando dados
diferentes a cada vez.

WtaHdklitfeppeo?
First n&tre
U your e tt i g d d ltg ?
^Abducted M e . j hm LAstaame: Nader
*8AbdtIC:WtuuisywiFCfttSfivfalKSS? ;alftvSteeyTaUgr<
How long were you
fln yvany ywSBfc? When dkl it happen?
Describe tbem:
vk***dliketentedI4'^a
-LsstWiait: Hawtagreyigone?
; "Vlialdthey dotoyou? H*nf aBydMyousee?
Bave you sten my dog
Yes No 0
s r . Describe them:
WJkfltdMtfeeydotoyoa?
Hftre jo u x a m y dog Fng?
;Jdcfedm
taboutUfOr$<jSaeer*
Yes Q No 0
Warday0Bsee,
Wtattan:

Anything <3s&yoo warn to add?


feUpO^AMtfCPOTV^

Agora, use sua ferram enta MySQL para executar um SELECT e visualizar o
contedo da tabela aliens abduetion.

Os novos reUtS
de bdudoes
aparedem
na tabela,
exatamente domo
vod espera

H i uma linha extra de dados para Sally Jones, que lo i dolodada antes de ode donsertar a donsuH
KSRT. No se preodupe, vode aprendera domo remover dados indesejados no proximo dapitulo.
voc est aqui 95
adicionando WHERE no seu SELECT

Owen precisa de ajuda para peneirar seus dados


O novo e aprim orado script r e p o r t .p h p est fazendo o seu trabalho, automatizando
o processo de adicionar relatos de abdues ao banco de dados. Owen pode relaxar e
esperar que os relatrios cheguem... exceto pelo fato de que h um novo problema.
Receber mais dados no est, exatamente, tornando mais fcil selecionar os relatos que
representem um potencial avistamento de Fang.

Eu realmente estou fe liz , agora que tenho um


banco de dados sendo automaticamente preenchido
com os relatos de abdues submetidos pelos
usurios. Mas isso nao est ajudando a isolar os
relatos que poderiam me ajudar a encontrar Fang.

Owen precisa de uma form a para localizar dados especficos,


como por exemplo, as abdues nas quais Fang foi avistado.
Voc sabe qual coluna do banco contm as informaes em questo:
f ang s p o tte d . Esta coluna contm y es (sim) ou no (no), dependendo
do fato de o abduzido ter relatado se viu Fang - ou no. Assim, o que precisa
de uma forma de selecionar apenas os relatos da tabela a l i e n s a b d u c tio n
que tenham um valor y e s na coluna f a n g _ s p o tte d .
Voc sabe que a seguinte query SQL retorna todos os dados da tabela:

SELECT * FROM aliens_abduction


A instruo SQL SELE C T lhe permite incluir uma clusula para
controlar os dados retornados pela query. Trata-se de WHERE, e com
ela voc diz exatamente como quer filtrar os resultados da consulta.
No caso de Owen, isso significa selecionar apenas os relatos de
abdues onde a coluna f a n g _ s p o tte d seja igual a y e s.
0 valor da dolwa
fredisa ser demido,
L-ebre-sc> se* a dausula WHERE* f>ara \ue os
s isto -r do <\ue "todos os dados 0 home da dados fossam ser -v
JL da -tabela seja selediohados. doluna seledtonados.

SELECT * FROM aliens__abduction WHERE fang_spotted = 1yes1


---- ---------------- - . ------------------
Esta fa rte da donsulla
Esta eiiusula reduz, o volume de dados
SELECT permanede a mes>a
rfborados feia ^uevy, indlumdo afenas
a clausula WHERE duida dc
os dados e <\e a dolu^a sfo^ttcd
Pil-trar os resudos.
esteja de-fmida dowo yes-
conectando-se ao My SQL

T fe S T O r o v e

T este a consulta s e l e c t com um a clusula w h e re para


encontrar ciados especficos.
Use am a consulta SELECT com uma clusula WHERE na sua ferram enta
MySQL para procurar por dados de abdues que envolvam, especificamente,
avistamentos de Fang.

Todos estes (rcejistv-os te


doluna fa n ^ s fo tte d
def mida to yes.

voc est aqui 97


banco de dados m ysql do owen est funcionando

Owen sai em busca de Fang


Graas ao PHP e s suas funes que fazem interface com o MySQL, o
servidor de banco de dados MySQL de Owen est recebendo os dados
das abdues a p a r tir de um formulrio HTML e os est armazenando
em uma tabela do banco. Os dados ficam guardados de forma segura na
tabela, at que Owen tenha a oportunidade de peneir-los. E, quando
est pronto para faz-lo, basta uma simples query SELECT para isolar os
relatos de abdues que, potencialmente, envolvam Fang.
conectando-se ao My SQL

--------EH k : v i u i w fly V
Mesmo que voc ainda no tenha organizado tudo, ligue cada
componente HTML, PHP e MySQL ao que voc acha que ele faz.

alfendatabase _ Este o cdigo SQL que o script PHP


informa ao servidor MySQL.
Isto executa os scripts PHP e retorna
tabela clliens__at*uctioTi pginas HTML para os navegadores,
/ ' frequentem ente se comunicando com um
/ banco de dados no processo.

O nome do banco de dados que contm a


tabela aliens_abduction.
O formulrio HTML usa este mtodo
de requisio para enviar os dados do
formulrio para um script PHP.

E aqui que os dados do formulrio


se-WclPt \Veb report .html acabam sendo armazenados.
E aqui que Owen coleta os dados do usurio.
serVicI de kmco de dad^S My-SQj Esta funo PHP encerra a conexo ao
servidor MySQL.

kpto Sutnilt (sutmeter) Este o nome do script PHP de Owen que


processa os dados que os usurios digitam no
formulrio report.html.
iw ^ ___ Esta funo PHP envia uma query para o
"servidor MySQL.
mys^lLcpnnectO Este elemento HTML usado pelos
visitantes do site quando eles terminam de
preencher o formulrio.
mys^lLcloseO Este outro nome para o software que roda
o MySQL e todos os bancos de dados e
tabelas que ele contm.
Kiys^lijjueryO
Esta funo PHP opcional diz ao servidor
qual banco de dados usar.
mys^l!_select_dt>() Isto abre uma conexo entre o script PHP e
o servidor MySQL, para que eles possam se
comunicar.

voc est aqui 99


quem faz o que soluo

Mesmo que voc ainda no tenha organizado tudo, ligue cada


componente HTML, PHP e MySQL ao que voc acha que ele faz.

Este o cdigo SQL que o script PHP


informa ao servidor MySQL.
Isto executa os scripts PHP e retom a
pginas HTML para os navegadores,
frequentem ente se comunicando com um
banco de dados no processo.

O nome do banco de dados que contm a


tabela a li e n s _ a b d u c t io n .
O formulrio HTML usa este mtodo
de requisio para enviar os dados do
formulrio para um script PHP

E aqui que os dados do formulrio


report. h tm l acabam sendo armazenados.
E aqui que Owen coleta os dados do usurio.
Esta funo PHP encerra a conexo ao
servidor MySQL.

Este o nome do script PHP de Owen que


processa os dados que os usurios digitam no
formulrio report.html.
Esta funo PHP envia uma query para o
servidor MySQL.
Este elemento HTML usado pelos
visitantes do site quando eles terminam de
preencher o formulrio.
Este outro nome para o software que roda
o MySQL e todos os bancos de dados e
tabelas que ele contm.
Esta funo PHP opcional diz ao servidor
qual banco de dados usar.
Isto abre um a conexo entre o script PHP e
o servidor MySQL, para que eles possam se
comunicar.
crie e preencha um banco de dados

3 Cre e Preencha um Bhuic de Dados


Criando os Seus Prprios Dados

Nem sempre voc tem os dados de que precisa. s vezes, voc mesmo
tem que cria r o s d a d o s que pretende usar. E, outras vezes, voc precisa c r ia r a s ta b e la s que
iro armazenar esses dados. E, ainda, voc precisa cria r o b an co que armazenar os dados que

voc precisa criar. Confuso? Voc no ficar. Prepare-se para aprender como criar seus prprios

bancos de dados e tabelas. E se isso no for o suficiente, voc ainda criar, no processo, a sua

primeira aplicao combinando PHP e MySQL.

voc est aqui 103


precisa- se do aplicativo lista de email

EUev ja doletou VU esdere^os


de emil ate o wowe^to) e 3 tada
A loja Elvis est aberta /"
dia the^a* **ais-
Elmer Priestley abriu uma loja especializada em
produtos Elvis, QueroSerElvis.com (makemeelvis.
com). A demanda tem sido enorme. Ele j vendeu
Joffe
um monte de temos de polister, muitas costeletas ^evvsome
Garcia ^..G^simuduck-con-i P'ZZa com
falsas e centenas de pares de culos. Amanda aman21uv@breakneckpizza.
Roundtree EdJo-Anne d 9 9joioroi
@ b 0 tt0 m s u p .c o m
com
Cada vez que algum compra algo, Elmer coleta Briggs Chris cbrig __ v*
um novo endereo de email. Ele os utiliza para hovei^<art@breakneckpiz2a.comCom
Toth
Harte Lloyd
Anne AnneToth@ieapinlimos.com
enviar avisos sobre promoes na sua loja. Da Wiley
R yan Andrew
Palumbo T'"r~
Tom andrewwiley@objectvilie.net
palofinine@rnightygumball.net
forma como est agora, Elmer tem que copiar, McKjnney Aianna
manualmente, cada endereo da sua lista Meeker Ann
Clay
angrypirate@breakneckpizza.com
ctay@siarbuzzcoffee.com
Powers Brian
e depois colar um por um nos seus emails Manson Anne annmeeker@chocohoiic-inc.com
bp@fioney-doit.com
Mandei Debra am86@objeciviiie.net
promocionais. Funciona, mas demanda muito Tedesco Janis
Taiwar Vikram debmonster@breakneckpizza.com
tempo e esforo. Szwed Joe janistedesco@starbuzzcoffee.com
vikt@starbuzzcoffee.com
lev> o
Sheridan Diana
Snow Edward
szwedjoe@objectvilie.net
sheridi@mightygumball.net
ihyuestio*ave Isto est demorando Otto Gienn
Hardy Anne snowman@tikibeanlounge.com
giennOO9S@objectviile.net
Rei da muito. Eu preferiria passar Deal
Jagel
Mary
Ann com
anneh@bOttOmsup.
nobigdea!@star-
KiSme de o meu tempo imitando Melfi James irpa ' '
Elvis Elvis, e no enviando emails Oliver Lee eckpiz2:acom
Parker Anne l,ver@M/e;9.r,suPco^
manualmente. Ricci Peter
fV c s l Y- Reno Grace r>cZep@Sta^ S o T a'COm
Aicss Zelda l !tr!anm ikib e^eeco^
Day g t* * 2 ^
So/ger Clifford
e<urji Anne Joyce C W @ S^com
el/ing
l0yce@ cho^ck^ .c o m
Gares Lindy anneb/uni@far 'c'0ccom
Elrev esdreve Fred
Jacobs Anne
cste entail e
fiofia e cola
Te99@^SZZ e-nef

ada endeve^o
no mpo 7*.

fcsias fessoas estao


*a lista d eails de
Uev e ^ueirenr a sua
";St*fecfc-''fGrande promoo ajuda fava \tarr **
Caros Elvismanacos, ^ouio mis ^iriida^
fconx lvis-
Grande promoo esta semana em
Makemeelvis.com'. Costeletas de plo de
cavalo genuno com 20% de desconto!

E no se esqueam da promoo "compre um


e leve outro de graa" para os ternos d e >
polister - s dura irais trs dias!

Elmer est passando tempo demais copiando e colando emails no


campo To do seu programa de email. Ele deseja simplificar a tarefa
de adicionar novos endereos e de enviar emails em massa.
crie e preencha um banco de dados

Uma aplicao Web


lwer precisa de uma aplicaco um site dinmico
Uma aplicao um software elaborado para atender a um elaborado pata atender
determinado propsito dos seus usurios. Elmer precisa
de uma aplicao que m antenha o registro da sua lista de a um determinado
endereos de email e que lhe permita enviar emails para a5 proposfto dog seus
pessoas da lista clicando apenas em um boto. Eis a forma
como ele quer que funcione: usuri9s.
Ir at uma pgina web e digitar uma mensagem de email.
Esta frte de ewaiU
E f Clicar em um boto Submit na pgina, e a mensagem
ser automaticamente enviada para toda a lista de sc ^arete bastante dow
a apl'tdatao Abduo
"QueroSerEI vis.com".
Aliengena de 0*>en as
Jyy Fazer com que a lista de emails cresa sozinha.^ ' a di-ferena a<\w a
permitindo que novos clientes se cadastrem atravs lista de emails de El^ev
de um formulrio web. ivi cresder sozjnVt) e^
as suas wensa^ews se>rao
enviadas para a lista
Com essa lista de necessidades que a aplicao precisa atender, inteira 0 ob\etWo da
Elmer pode visualiz-la em detalhes... ;lmcv t

> Q

A aplicao web QueroSerElvis.com {MakeMeElvis.com) consiste de dois


componentes principais: um formulrio para enviar mensagem de email
para as pessoas na lista de Elmer e um formulrio para permitir que novos
clientes se inscrevam na lista. Com esses dois formulrios em mente, faa
um esboo de projeto para a aplicao de Elmer.

voc est aqui 105


design do nosso aplicativo lista de email

Visualize o projeto da aplicapo de Elmer


Sempre til visualizar o projeto de uma aplicao antes de mergulhar Estas pessoas esta a
nos detalhes do desenvolvimento. Isso implica descobrir quais pginas lista de emails de Elmer
e scripts estaro envolvidos, co m o eles se c o n e c ta m e, talvez o mais e redebem o* eails que
importante, como voc ir armazenar os dados no banco MySQL. ele envia ?ara a lista-

Esta tow>bina^a de
iW J a r io /s d ri^ Este sdvipt pffp
we os usviaris se insdrevam ChV,a a #ensa^eft,
l. I _ J - V .) t> de etnil

Este e o
orm ulirio
web que Elmer
preervdKe para
driar e enviar * ..... ....
um email para A lista de enderedos
MH13 l i f t S l ionathan@wishiwaseivis.com
Jon Matthews
a lista- de email de Elmer Weriitz
wwer@starbuzzcoffee.com
Wendy
-fida armazenada em Franklin 2ksdgi@gre9s-|istnet
Joe Bob
uma tabela de um
bando de dados que
roda em um servidor
de bandos M y$L.
crie e preencha um banco de dados

Ento, por onde comeamos a criar uma


aplicao com PHP e MySQL? Ser que ns
escrevemos o script PHP primeiro e depois criamos a
tabela para armazenar os dados? Ou ser que devemos
criar a tabela primeiro e depois o script?

Joe: No entendo que diferena faz. Ns vamos precisar da


tabela e do script para a aplicao funcionar.
Frank: Isso verdade, mas acho que ns devemos escrever o
script primeiro, para podermos testar o cdigo PHP antes de
conect-lo ao banco de dados.
Jill: Mas o script PHP completamente dependente do banco
de dados. Ser difcil testar o script se no tivermos um banco
ao qual ele possa se conectar.
Frank: Ser que no poderamos criar o script e omitir apenas
a parte especfica do cdigo que faz a conexo com o banco?
Poderamos fazer tudo exceto interagir realmente com o banco
de dados. Isso ainda seria til, certo?
Joe: No necessariamente. Lembre-se, o nico trabalho do
script selecionar os dados digitados em um formulrio HTML
e coloc-los em um banco. Ou, se a funo for enviar emails
para uma lista, o script l os dados do banco e gera uma mensagem de email para cada
usurio. De uma forma ou de outra, o banco essencial para o script.
Jill: E verdade, mas ainda nem comeamos a pensar no formulrio HTML. Onde ele se
encaixa nisto tudo? Estou achando que precisamos criar o banco de dados antes de sequer
pensarmos em escrever o script.
Frank: E isso! Primeiro criamos o formulrio HTML, depois analisamos que tipos de dados
vo ser colocados no banco e, feito isso, ns finalizamos tudo com o script.
Joe: No sei se isso realmente faz sentido. Como podemos criar um formulrio HTML se
no temos 100% de certeza de que tipo de dados precisamos obter do usurio?
Jill: Joe est certo. O formulrio HTML ainda^aps leva de volta ao problema de precisarmos
saber quais sero os tipos de dados usados fl^a aplicao. Os dados comandam tudo,
A C anto n s p ro v a v e lm e n te d ev eiyagjos c ria jfo b a n c o d e d a d o s e a ta b e la p rim e iro , d e p o is o
fo rm u l rio HTML e, finalm engp, o sc rip t qerearge a^uBmisso d lormulrlTY1
Frank: Gostei. Vamos fazer isso!
Joe: Eu ainda acho que ns, provavelmente, precisaramos elaborar os passos especficos de
como esta aplicao ser montada...

Escreva abaixo os passos especficos que voc acha que sero necessrios
para ir do projeto at a implementao de QueroSerElvis.com.
planejando a aplicao

PLANEJE ANTES
Ns realmente precisamos de um plano para m ontar a aplicao de
Elmer. Passo-a-passo, ns podemos nos concentrar em uma coisa de
cada vez, sem que fiquemos sobrecarregados.

elvis store
C riar um banco de dados e um a ta b ela
para a lista de em ails.
Esta tabela ir armazenar os nomes, sobrenomes
e endereos de email de todos os inscritos na lista
de Elmer.

O C riar um form ulrio w eb e um script PHP


A dicionar Em ail para inserir novos clientes
lista.
Aqui, ns criaremos um formulrio e um script que
permitiro ao cliente digitar seu nome, sobrenome e
endereo de email, e ento adicion-los lista. addemail.html

O Criar um form ulrio w eb e um script


PHP Enviar Em ail para enviar em ails
para a lista.
Finalmente, iremos criar um formulrio web
que permitir a Elmer compor uma mensagem 'sendemail.php
de email e, o que mais importante, um script sendemail.html
que enviar esta mensagem para todos os nomes
inscritos na tabela da lista de emails.
crie e preencha um banco de dados

Tudo comepa com uwa tabela Um banco de dados


Na verdade, tudo comea com um banco de dados, que
4 um container usado
basicamente um Container para o armazenamento de dados. J para armazenar
vimos, no captulo anterior, o modo como os bancos de dados so
divididos internamente em mais containers, chamados tabelas. dados, de prma
Assim como os dias e semanas em um calendrio, a tabela se
compe de colunase linhas de dados. As colunas consistem bastante estruturada.
de um tipo especfico de dados, como por exemplo nome,
sobrenome e email. As linhas
so conjuntos de colunas
em que uma linha consiste de um elemento de cada uma das
colunas. Um exemplo de linha seria Wendy, Werlitz, wwer@ (AfoS tolwWi
starbuzzcofee.com.
c a le n d r io

fllllilll illlilmm M
7
..
2 3 6
1 14
9 10 11 12 13
3 21
16 17 18 19 20
15
------- ------_l
j Ambas estas -y iXma li^a
estvuWas
dados sa tabelas. As tabelas
Em geral, todas as tabelas de um banco de dados tem alguma armazenam
relao umas com as outras, mesmo que essa associao s vezes seja
superficial. E comum uma aplicao web consistir de vrias tabelas
conectadas umas s outras por meio dos seus dados. Mas todas as
dados segu!nd9
tabelas ainda so feitas de colunas e linhas. um padro de
Uw bando de
dados, \we c clunas e linhas.
^>ov scvvidosr no existem
Terguntas idiotas
T * * Onde os dados do banco
uaiKts so realmente armazenados?

r n J^nse no
possvel ver os arquivos?
Esias sao as AoJunas. bando de
dados 1 ^ * Os dados de um banco
geralmente so armazenados em
domo um
um disco rgido. E, embora voc
doniainer certamente possa v-los, eles no
\ue lhe diriam muita coisa. Os arquivos
armazena de bancos de dados so binrios, e
m-forw>a^oes. no podem simplesmente ser abertos
e ter suas informaes visualizadas.
por isso que temos SQL - para
permitir que ns olhemos o contedo
do banco e interajamos com os dados
Ou-tv-a tabeia
Ainda ou-tsra -tabela armazenados dentro dele.

voc est aqui 109


CRIE seu banco de dados

Faa contato com o servidor MySQL


O projeto da aplicao de Elmer exige um banco de dados e
uma tabela. A maior parte do trabalho cotidiano com um banco
de dados envolve a interao com tabelas, mas voc no pode
simplesmente sair criando tabelas sem criar, primeiro, um banco
onde elas fiquem armazenadas.
CREATE DATABASE o comando SQL usado para se criar um
banco de dados. Uma vez feito isso, voc pode ento criar uma
tabela com o comando CREATE TABLE. Mas antes de usar
qualquer um desses comandos, voc tem de se conectar ao seu
servidor de bancos de dados MySQL. Voc fez isso no captulo
anterior e precisou de algumas informaes importantes.

Uma erramehia /HySCJ1


Como o terminal
permite qttC voie se fcmedte
um servidor A
ornedehdo uma
de usurio e uma
senha vlidos.

Alm de permitirem que um script PHP se conecte


ao banco de dados e realize aes nele, a localizao,
o nome de usurio e a senha do banco so a chave
VoC* esti aqui.
para que o terminal MySQL ou o phpMyAdmin sejam
utilizados. E essas ferramentas so bastante teis para que
realizemos os primeiros passos da aplicao: a criao do
Crie um banco de dados euma
banco e da tabela. tabelo para a lista de emails,
J que a criao de um banco de dados e de uma Crie um formulrio web e um
tabela para a aplicao de Elmer uma tabela que s script PHP "Adicionar Email" para
s precisa ser realizada uma vez, faz sentido usar uma
adicionar novos clientes list.
consulta SQL para cri-los manualmente. Portanto, Crie um formulrio web e um
script PHP "Enviar Email" para
inicie sua ferramenta MySQL preferida e prepare- enviar um email para a Iista.
se para realizar o primeiro passo na elaborao da
aplicao de Elmer, criando um banco de dados e uma
tabela para a lista de emails.
crie e preencha um banco de dados

Crie uw banco de dados para os emails de Elmer


Para criar uma nova tabela e um novo banco para a lista de emails de
Elmer, primeiro ns temos de criar o banco de dados elvis store, o
qual ir armazenar a tabela email list. Ns usaremos comandos SQL
para criar ambos. O comando SQL usado para criar um banco de dados
CREATE DATABASE, que voc usou, rapidamente, no captulo anterior.
Vamos dar uma olhada mais detalhada no seu funcionamento.

0 nowe do ftovo
nome do banco ba*to de dados CheA tb
sev* eviado d a t a b a s e
preciso especificar o nome do novo banco de dados aps o o o n jE u iJo S q L
o comando CREATE DATABASE. Eis a instruo SQL para
criar o banco de dados de Elmer: u sa Jo p g ra se

CREATE DATABASE elvis store ctci um ipVp


kcUlco J e c lic k 's .

Quando voc executar esta instruo em um servidor


MySQL, o banco ser criado.
Ao e*eduar C o a d o s SQ L *0
ev-minai, vote sempre adiona
W po*to-e-viVg^ia ao -Pinai...
I File Edit Window Help DontBeCruel mas no t\udo -pi^cr donsui-bs
mysql> CREATE DATABASE elvis_s t o r e ; ^ S Q L tw s da -funo PHP
Query OK, 1 row affected (0.01 sec) ys^i^ucv-yO.
elvis store

Criar o banco de dados elvis store com o comando CREATE


DATABASE resulta em um banco de dados novinho em folha, mas
ainda no h uma tabela para armazenar os dados...
N
0 ban de dados oi triado,
mas ele ao pode a r^ a ^ a r
dados se ho Houver ua -tabela.

As instrues SQL s term in am em ponto*


e-vrgula quando voc usa o term in al.

V e j tW n ! No seu cdigo PHP, as suas instrues SQL no


precisam terminar em ponto-e-vrgula. O terminal
MySQL diferente, porm, e requer o ponto-e-
vrgula ao final de cada instruo SQL. Isso ocorre porque o
terminal capaz de rodar mltiplas instrues SQL, enquanto
que, no PHP, voc s pode submeter uma instruo por vez.

voc est aqui 111


agora CRIE sua tabela

Crie uma tabela dentro do banco de dados


Voc precisa saber qual tipo de ciados deseja armazenar na tabela,
antes de cri-la. Elmer deseja usar o nome e o sobrenome das
pessoas da sua lista de email, para tom ar um pouco mais pessoais eirna'l_J'st C
as mensagens que ir enviar. Adicionando a essas informaes das uitas tabelas
o endereo de email, a tabela e m a i l _ l i s t de Elmer ter de <^ue pode** ser
armazenar trs informaes para cada entrada. armazenadas no
bando de dados
Cada informao de uma tabela fica em uma coluna, que precisa elvis store-
ter um nome que descreva os dados. Vamos usar f ir s t_ n a m e
(primeiro nom e), la s t_ n a m e (sobrenom e) e e m a il como
o nome das nossas colunas. Cada linha da tabela consiste de uma
store
nica informao para cada uma dessas colunas, e constitui uma
nica entrada na lista de emails de Elmer.
0 veiho arquivo de te *to de
imer> dontendo os enderedos
^ Cwil, ho se doiwpara ,om S
estrutura e a segurana de wa
_____ bela de bando de dados
Jon M tttews _________

Wendy _ ______
vjw er^starbyz^oW ^^_-*_ rs fr " ! last name7! l i i i i i l l i i l i l i i i i i i

Joe obJFraWklm_______ _ ionathan@wishiwaselvis.com


Jon Matthews
2 J ^ ^ ^ r ^ " - J is t net__- Werlitz
wwer@starbuzzcoffee.com
Wendy
1
Franklin
2ksdaiiaiflregs-list.net
1 Joe Bob

fc&s sao linKas. Cada


<*> iont ^
tstas sao dolunds- ^
sobrenome e un, enderedo
Kossa tabela tem trs. de e*aif de
pessoa.
mailinglist.txt
Ento, agora ns sabemos que o primeiro nome, o sobrenome
e o endereo de email do cliente precisam ser criados como
colunas na tabela e m a i l _ l i s t . O problema que as tabelas do
MySQL so altamente estruturadas e esperam que voc fornea
As HnLas Ja tabela mais do que apenas o nom e da coluna. Voc precisa informar
s9 W iz ^ rtta S s
ao banco de dados um pouco mais sobre que tipo de dados
voc
pretende armazenar na coluna.
e as colunas s Colwrvs de dados na nova
tabela erraiM ist de U er.
V e rtic a is .
crie e preencha um banco de d

Precisamos definir os nossos dados


Quando voc cria uma tabela, precisa informar ao servidor MySQL qual o
tipo de dados que cada coluna ter. A definio do po de dados exigida
para todas as colunas MySQL, e cada coluna de uma tabela armazena um
tipo particular de dados. Isso significa que algumas colunas podero conter
texto, algumas podero conter valores numricos, algumas podero conter
horas ou datas, e assim por diante. O MySQL possui uma srie de tipos de
dados, e voc precisa saber qual tipo corresponde aos seus dados especficos.
Vamos supor que Elmer tenha uma tabela chamada p r o d u c t s (produtos),
que registra os itens venda na sua loja: ^ i '' M)
E s ta doluna lo n-tidesi-idScs te x tu a is Ar ^ mrcr o
da prcAM d a loja de

p r o d u c ts f d la d a f*-odufc V.3 > W '-


i
I'.IfiTvMI
.. product . . ... in v e r t , - H I Ntfaiero I n t e i r o
24 59.00
1 Blue Suede Shoes
16 23.50
2 Polvester Pants with Sequins
Blue Suede Shoes
93 1.99
3 Stick-On Sideburns -------------- Polyester Pants with Sequins
7 48.00
4 Elvis wig
Stick-On Sideburns
Elvis wig

A , i TN ,A * A yvite CyreO J
ft doluna IP tortm valeves de iden-b+itaeao twbe valors Texto 24
midos pava da pvodu\p da loja. 16
93
Repare que p r o d u e t a nica coluna de texto na tabela p r o d u c ts .
H tambm nmeros decimais para p r i c e , e nmeros inteiros para
i n v e n to r y e id . O MySQL tem os seus prprios nomes para cada um Numero Inteiro
desses tipos de dados, bem como alguns outros, como por exemplo
para datas e horas.
E importante usar os tipos de dados apropriados ao se criar colunas,
para que as suas tabelas sejam precisas e eficientes. Por exemplo,
dados do tipo texto ocupam mais espao do que nmeros inteiros;
assim, se uma coluna s precisa armazenar nmeros inteiros, uma
prtica inteligente usar o tipo de dados inteiro para ela. Alm disso,
se o servidor web souber qual tipo de dados um a determinada coluna
armazena, ele no permitir que voc, acidentalmente, insira o tipo
de dado errado. Assim, em uma coluna definida para armazenar datas,
voc receber um erro se tentar inserir qualquer coisa que no seja
uma data, nessa coluna.
W E R
Pata Vpo pteosa
sabe IF hJ set Por que voc acha que usar

atmScz&nad<>>W-cUla*eoui)a Ja tabela. diferentes tipos de dados melhor


do que usar apenas texto, para
armazenar tudo?

voc est aqui 113


s m ysql frequentemente usados
&
<A

alguns tipos de dados MySQL


Estes so alguns dos tipos de dados mais teis do MySQL. Lembre-se, voc
pode usar qualquer um deles para descrever os dados armazenados dentro
de uma determ inada coluna da tabela. A funo desses tipos armazenar os
seus dados sem criar, cpnfuses.
\JNT^ IKTSBR asKa nue
ff olTnumeros devem sev hvteros,
Vcttm CHARACTER. Ela r^da t mas na "tem medo de nmeros
ne$aivs. Eje e dapaz-, tambm,
prere ^ue os seus dados enbam w*
de vmrenr nmeros mteivos
amanh deinido. Ela pode sev aliamen'te
, e^enos^dwjo daso dhamado de
eidienie se voe ^ivet- al^um ix%bo <^e TfX/\ /(X/-T\
iehh sempre a mesma exensao.

Ele se fib a m a ^ i3 -
Ele $osta * ^andes
p E C ,> e v 'a ^ ^ c quantidades de dados
lKe binrios-
Wctcv- W s
tasas defr** T e
vote prediz ?*0
Uma boa am)0<
BLOB, esid^TB^Kl
cia exdelen-te
"
armazienar grandes
<\wa-tidades de
jde ian-to fo r
"texto murt mais
p. eu
ID A T T M V 3nto
do <^e O iM ou
man'tem o registro da VMOMR-
daa e da hora-

(PATEVan-tm registro
dTsas datas. Ela no
se interessa pilas boras,
/
porem- ESa it j t
MRCHM j abreviao de . ? A
nrma jemea,
^ R i b le ^ ^ fl^ a tie r (Varadter
3o dontrario te(> 3o
variavel"). Efe^armjyina dados em
se importa dom as datas
modo texto- E -flexvel e dapaz.
de se adaftv a extensa dos seus
dadosj arma^na^do apenas o *^*e
vote predis; sem preendKer ladunas
dom espaos em brando-

Dependendo da sua verso do M y$L, a


extensa pode ser de Z55 darad-teres anies
da verso 5.0.3, e a-te darad-teres n
versa 5 e adima.
crie e preencha um banco de dados
nq.9 existem
perguntas Idiptas
1 - Por que eu usaria CHAR, se V A R C H A R faz a
mesma coisa, com mais flexibilidade? 1 - Por que eu preciso desses tipos numricos,
como I N T e D E C ?
A resposta est na preciso e na eficincia. Do
ponto de vista do projeto, voc deve sempre projetar Trata-se do armazenamento e eficincia do
suas tabelas de forma a modelar os seus dados o mais banco de dados. Escolher o melhor tipo de dados para
rigidamente possvel. Se voc souber, sem sombra cada coluna da sua tabela reduz o tamanho desta, e
de dvida, que uma coluna para armazenar a sigla torna mais rpidas as operaes feitas nos seus dados.
dos estados ir sempre armazenar exatamente uma Armazenar um nmero como nmero propriamente
abreviatura composta de duas letras, ento faz sentido (INT, DEC, etc.), em vez de caracteres de texto, em
permitir apenas dois caracteres de espao para ela, com geral mais eficiente.
CHAR { 2 ). Entretartto, se por exemplo uma coluna
para senhas puder conter at 10 caracteres, ento f s isso ? Esses so todos os tipos?
VARCHAR (10) faz mais sentido. Esse o ponto No, mas estes so os mais comumente usados.
de vista do projeto. Assim, CHAR um pouco mais Ns praticaremos com estes por agora, em vez de
eficiente do que VARCHAR, porque ele no precisa se complicar as coisas incluindo tipos de dados que, talvez,
preocupar com a variao de tamanho dos dados. Assim, voc nunca v precisar.
mais desejvel usar quando voc sabe, com certeza,
que uma coluna de texto ter uma extenso fixa.

U P R 9 P Q 5 T Q

Ligue cada tipo de dados MySQL descrio dos dados que voc
poderia armazenar em uma tabela.

D esctip

,,-Seu nome completo.


ma abreviatura de estado, com duas letras,
reo de uma peruca do Elvis: 48.99
J^uanto dinheiro rendeu o disco mais vendido de Elvis.
ata da abduo aliengena: 2/12/2004
Nmero de costeletas do Elvis em estoque: 93
Voc viu o cachorro de Owen? S ou N
VARCHAR(60)
S eu e n d e r e o d e e m a il
CHAR(2)
que horas voc janta
DATETIME Quantos aliens voc viu quando foi abduzido
DEC (10,2) uando foi que Elvis nasceu

voc est aqui 115


qual o meu propsito? soluo

U PR 9 P9 SfTQ
Ligue cada tipo de dados MySQL descrio dos dados que voc
poderia armazenar em uma tabela.

guando o tamanho de um valer de texto


puder variar, l/ARCHAR c uma boa opo.
Faa-o iom^o o suidiente para armazenar
Kao nedessrio. Embora undione *\ual<\uer valor <^ue algum predise armazenar.
para a abreviatura de estado,
CHAR(2J t uma opao melhor, porque
^undo vde souber
geralmente um poudo mais eidiente. exatamente quantos
d e D ados daradteres esperar em
D escrio uma doluna, use CHAR-

Seu nome completo.


Uma abreviatura de estado, com duas letras.
\ DATE Preo de um a peruca do Elvis: 48.99
\TIME Quanto dinheiro rendeu o disco mais vendido de Elvis.

VReHAfi-{- Data da abduo aliengena: 2/12/2004

DEC (4,2 Nmero de costeletas do Elvis em estoque: 93


Voc viu o cachorro de Owen? S ou N
VARCHAR(60
Seu endereo de email
CHAR(2)
A que horas voc janta
DATETIME

(t
Quantos aliens voc viu quando foi abduzido

Vote
DEC (10,2)
Quando foi que Elvis nasceu
/K

no
/ Podem Haver outras
DEC Estes dois pode -ter Potendialmente melhores)
3eralmente numeroS mostvam respondido DATE a*\ui, 4-ormas de se representar
usado para ^untos dytos o mas os Elvismandos um valor sim/ao /VlySJL
armazenar ba*o dc dados verdadeiros sabem a do <^ue usando CHARO),
preos, alm de deve esperar data e a hora exatas. mas esta -forma simples e,
outros valoves nd frente razoavelmente, eidiente
dedimis. do d e -i*^ t
quantos depois.
crie e preencha um banco de dados

Si, a'mda estamos a^ui. as


Crie sua tabela com uma consulta estamos \uase prontos fa^a
vLf seguir adiante-
J temos todos os pedaos de que precisamos para criar
nossa tabela, inclusive um bom nome (email_list). Q Crie um banco de dados e uma
Tambm temos nomes para as colunas de dados: V tabela para a lista de emails.
first_name, last_name e email. S o que falta so Q Crie uni formulrio web e um
os tipos de dados para cada coluna, bem como uma script PHP "Adicionar Email" para
instruo SQL para ju n ta r tudo isso e criar a tabela. O adicionar novos clientes lista.
comando SQL para criar sua tabela CREATE TABLE. 0 Crie um;formulrio web e um
script PHP "Enviar Email" para,
Ele comea com CREATE TABLE seguido do nome da enviar um email para a lista.
sua tabela. Os nomes de todas as colunas vem entre
parnteses, separados por vrgula e seguidos, cada um,
de um tipo de dados. Eis como seria o comando:

kT 0 nomt da tabela
m J A nom e_da_tat,ela 0 com ando S Q L
0 nome da dolu^a
CREATE TABLE
nom e_da_colunal t po_da_colunal,
u s a d p p a t a < ju e
nome_da_coluna2 tpo_da_coluna2,
K y 0 tipo de dados seja cilada uma
da Coluna
nWa tabela era
)
\
Mais doiuns,
\/o wao predisa nomear suas tabelas e
doluwas do um undersdore separando
um banco de
se edessario as palavras, mas c uma boa ideia se dados.
rnater dohsistente em relaao a \ual\uer
donver^o de nomearo <\ue dedidir usar-

Aponte seu lpis


Escreva uma query SQL para criar a tabela email_
list de Elmer com as trs colunas de dados requeridas:
first naitie, last name e email.

C flu.e..
.....V A R c M f t f e -J-/......

h .s :L ^ ... V A Q m p 1 .

& r.si.

voc est aqui 117


test-drive suas queries CREATE

- t^p o n te seu lpis--------------------------------------


Q n llip n Escreva uma query SQL para criar a tabela e m a i l _
^ l i s t de Elmer com as trs colunas de dados requeridas:
f i r s t _ n a m e , l a s t _ n a m e e e m a i l.

ste c o to*nndo SdJL. pav-a criar a


tabela - repare ns letras aiusduias. r
) ___ o *ome da sua tabela deve t o r em
L eaiita ba*a e deve te r um wvderscore
CREAT6 TABLE .a il list lu3a'r a' ts?a^ s'
0 parentese ............................................... ...............................................
de abertura *--------- (
abre a lista de ............................................... .................................................
dolunas a serem -Pirst_na*e \/ARCttAR(2^))> r~ ~ ^ vrgula separa as tolunas
tradas- / sero tria das-
last_wame VARCHAR(2 ), z:

email V b K C m t tO )
............... V " ................................ isto diz. ao /V|y^L nuC a to U a
/) a i ^ ^ ' V c. o iifo de dados
t e t ................... \ = : < u * u a ............... l o * * 1
a lista das V* 05 rattw w . ^ ^ 40
toiunas. endereos de email

O R fV e

Crie o banco de dados e a ta b e la de Elmer.


Execute as queries CREATE DATABASE e CREATE TABLE usando um a ferram enta MySQL
para criar o banco de dados e l v i s _ s t o r e e a tabela e m a i l _ l i s t dentro dele.

CREATE DATABASE elvis_3tore

CREATE TABLE email_list (first_name VARCHAR(2 0) , last_name VARCHAR(20) , email VARCHAR(60) )

Ambas as queries foram executadas sem problemas? Caso contrrio,


escreva aqui o que- voc acha que podje ter dado errado. .
....... . p^fr' ^
crie e preencha um banco de dados

Espere a, tem algo de


errado aqui. Eu digitei o cdigo
para criar a tabela exatam ente da
form a como estava escrito... e agora A vvs-bruo CREATE TABLE
estou recebendo uma mensagem de e s t a OK m a s o -fccvW iha} M y $ L
erro esquisita. o sabe em bando de dados
a iabcla csta sendo triada-. isso
c
nSc bom v
File Edit Window Help Oops

mysql> CREATE TABLE email_list ^ = 5^


(
fxrst_name VARCHAR(20),
last_name VARCHAR(20),
email VARCHAR(60)
);
ERROR 1046 (3D000): No database selected

^ al^um motivo, a insfaru^ao CREATE


TABLE albou w> terminal MyS$L.

a tabela do *,aMC0 de dados


Colocando o oarro na frente do9 bois
Elmer tem um problem a que tem a ver com o fato de que o terminal
mySOL no sabe, automaticamente, a qual banco voc est se
referindo ao emitir comandos. claro que ele sabe que voc acabou
de criar o banco de dados e l v i s s t o r e , mas poderia haver diversos
outros bancos de dados armazenados no mesmo servidor - ele no
Elmer csta fvcodupado
pode simplesmente assumir que voc est se referindo quele que
acabou de criar.
por^uc a sua inytvuiao
CREATE TABLE M Felizmente, existe uma soluo simples, que envolve informar ao
fcr-fcita e, WCSnnOassim, terminal MySQL qual banco de dados voc quer que seja o alvo de
ievmina! M y$L todas as instrues subsequentes...
& vclaahdo um trro-
n a existem
p e r g u n ta s Id io ta s

Qual a desse prompt esquisito -> que eu s vezes vejo no terminal MySQL?
0 prompt -> indica que voc est digitando uma mesma instruo ao longo de vrias linhas - o MySQL
est basicamente lhe dizendo que sabe que voc ainda est digitando a mesma instruo, mesmo que voc
tenha pressionado Enter para separ-la em mais de uma linha. Uma vez que voc termine a instruo e coloque o
ponto-e-vrgula no final, o MySQL ir execut-la.

voc est aqui 119


no e sq u e a do com an d o U S E !

SELECIONE o banco de dados antes de us-lo


Para que a instruo CREATE TABLE funcione, Elmer precisa
selecionar o banco de dados no terminal MySQL, para que
este saiba a qual banco de dados pertence a nova tabela.
O comando U S E escolhe um banco de dados como sendo o 0 comando USE
padro no terminal, o que significa que todos os comandos
subsequentes iro se aplicar a esse banco de dados. selecfona um banco
Funciona desta maneira: d e dadps com o

o p a d r o p a ta
0 tomando USE m-forma ao
M yS$L <\i*a! bane de dados vote
instuoes SQL
pretende usar. s u ts e c p e tite s .
r
I nome do banco .

Elmer deve especificar o nom e do seu banco de

dseja
d
e
de
dados (elvis_store) em um a instruo USE para 0 doma*d USE esdolhe o
selecion-lo e acessar a sua nova tabela. baho dados do, o ^ai
vodc trabalhar.

Home do bando
dados v o tt *\**r
USE elvis store setedicnar do USE-

e1vis_jsightings elvis_fans

elvis_lyrics

Wma vez. vode tenha esdolhido


un> bando de dados para usar, os
demais bandos dc dados do servidor
sao ignorados - i t ^ue vod esdolha
seiedionar um outro bndo de dados.
crie e preencha um banco de dados

;.v

T fe S T O R fV G ------------------------------

Execute USE prim eiro para depois cria r a tab ela.


Execute a consulta USE em um a ferram enta MySQL, para
selecionar o banco de dados elvis_store de Elmer e depois
execute a query CREATE TABLE para criar a tabela email_
l i s t dentro do banco.
USE elvis_store

CREATE TABLE email list (first name VARCHAR(20) , last_name VARCHAR (20) ,email VARCHAR(60) )

A instrvo USE *ao efiessaria daso vod


esteja usando uma -ferramenta S ^L 9 -da,
fcomo o fbfMyAdm'm - nesse daso, vote ira
selecionar o bando ^raiitamehte, antes de
em itir os tomwiw

I File Edit W ind o vj/^e lp LisaMarie

mysql> USE elvis_store;


Database changed
mysql> CREATE TABLE email list
(
first__name VARCHAR(20) ,
last_name VARCHAR(20),
email VARCHAR(60)

Your SQL query has been executed successfully (Query took 0.4481 sec)
A

Com o bando de dados seledionado


0 cdigo para a atrves do dom3ndo USE, a
triaa da tabela triaiac da tabela, a^ora, edorre
e o mesmo de antes sew. problemas-
s era prefiiso
seletionr o bando
para que -fuhdionasse.

voc est aqui 121


o comando DESCRIBE

Opa! A minha instruo CREATE


TABLE tinha um erro de digitao,
mas fo i executada mesmo assim. O
SQL tem uma opo "desfazer"?

No h e x a ta m e n te um a opo d e s fa z e r
no SQL, m as c e rta m e n te possvel
c o n s e rta r e rro s .
Entretanto, voc precisa, prim eiram ente, descobrir
exatamente que tipo de erro foi cometido, para
consert-lo. Suponha que a tabela ema i 1 1 i s t e se
parea com o seguinte:

e m a il l i s t
fcrst_nam e last name

Circule o que voc acha que h de errado com esta tabela.


Alguma ideia sobre como consert-la? ''V
/ } I
( J ? cr/e e preencha um banco de dados
0 O' c

PESCRI0E revela a estrutura das tabelas


Para consertar um erro em um a tabela, preciso, prim eiro, achar o erro.
Mesmo que voc no suspeite que haja um, nunca um a m ideia verificar o
seu trabalhp^0~ co n tag io SQL DESCRI BE analisa a estrutura de uma tabela,
exibjudSuma lista^a.nom es de colunas, tipos de dados e outras informaes.

ome_da_ ta b ela
Usando na tabela de Elmer, teremos a seguinte instruo SQL:

Est e o on* d
DESCRIBE email list tbefa Cuja desdriao
Queremos ver.

1 File Edil Window Help Graceland

mysql> DESCRIBE email_list;


+--- -------------I---------:---------+--------+------ +------------ +--------- +
| Field I Type i Null I Key | Default t Extra |
+___________+----------------- +--------+------ +------------+--------- +
Em field" | first_naem | varchar(30) jYES I INULL 1 I

(Campo'*) voe t last_name | varchar{30) |YES ! INULL I I


Cfttonira OS nomes | email i varchar^60) iYES | jNULL 1 I

de dada tolun- 3 rows in s e t ^ O .02 sec^Sv


Pm J ype
v,
(" T ifo ) vote
ve os iipos
de dados ^ue 0 nao -faz. distino entre
defihimos maiusdulas e mihusdulas no <^ue se venere
f ara tad s palavras reservadas, tomo os tipos de
Coluna. dados; por isso, vode poder, s v e s,
ve-!os esdriios em minsdulas.
n09 existem
p e r g u n ta s Id io ta s

0 que so aquelas outras


colunas: Null (Nulo), Key (Chave),
r Se eu j tivesse dados
armazenados na minha tabela,
P Eu posso visualizar a mesma
estrutura usando o phpMyAdmin?
Default (Padro) e Extra? eles teriam aparecido aqui?
Sim. Ferramentas grficas
0 MySQL lhe permite definir ^ : No. DESCRIBE s lhe como o phpMyAdmin lhe permitem
uma srie de opes para cada coluna mostra a estrutura da tabela, e no visualizar a estrutura das tabelas
da sua tabela. Essas opes controlam os dados armazenados nela. Mas atravs de uma instruo
opes como, por exemplo, se uma no se preocupe, voc logo ver os DESCRIBE ou clicando em uma
coluna pode ser deixada em branco dados da sua tabela... mas primeiro representao visual da tabela.
ou se ela ter um valor padro. Ns temos de aprender como inserir Voc livre para escolher que tipo
vamos explorar isso um pouco mais esses dados nela. de ferramenta deseja usar para
adiante, quando essas opes se analisar suas tabelas.
tomarem mais vitais para a aplicao.

voc est aqui 123


APAGUE sua tabela

Eu consertei o erro de digitao e tentei


rodar a consulta CREATE TABLE novamente.
No funcionou. E claro que eu no preciso apagar
primeiro a tabela que contm o erro... ou preciso?

o we da cota*
dWtado f"">
- ?s-
rTi^EdM/Tindow Hep Typo?

mysql> DESCRIBE email_list;


+------------ I------- -----
Field I Null 1 Key | Default | Extra |

f^first naem))l varchar{30) | YES | | NULL |


[ last__riam? | varchar(30) | YES | j NULL |
I email | varchar(60) j YES | | NULL |

3 rows in set (0.02 sec)

Na verdade, precisa sim . No possvel re c riar um a ta b ela


com CREATE TABLE um a vez que ela j ten h a sido criada.
U m a vez q u e v o c t e n h a c r ia d o u m a ta b e la , e la n o p o d e s e r s o b r e s c rita
a tra v s d e u m a n o v a c o n s u lta CREATE TABLE. Se q u is e r r e c r ia r a ta b e la d o
z e ro , v o c te r d e a p a g a r p r im e ir o a e x is te n te , e c o m e a r tu d o d e n o v o .

N o S Q L , o c o m a n d o DROP TABLE u s a d o p a r a q u e se p o s s a a p a g a r
u m a ta b e la d e u m b a n c o d e d a d o s . E le a p a g a a ta b e la e tu d o q u e v o c
tiv e r a r m a z e n a d o n e la . U m a vez q u e n o e x is te m d a d o s e m u m a ta b e la
re c m - c r ia d a , n o ir e m o s p e r d e r n a d a a o a p a g - la e c r ia r u m a n o v a , c o m
f i r s t n a m e e s c r ito c o r r e ta m e n te .

h W da -tabela e
gostaria de apagar
e m a il l i s t ba*do de dados-

0 d o m a n d o PRO? T A B U E
faga a 'tabela c bodos os
dados doivfcicics nela.
crie e preencha um banco de dados

Hwer est pronto para armazenar dados Legal. Com o banco de


dados e a tabela criados,
Os comandos SQL CREATE DATABASE, USE e CREATE estou pronto para comear
TABLE foram usados com sucesso para criar o banco de a armazenar alguns dados da
dados e a tabela de Elmer. Ele no poderia estar mais minha lista de emails.
satisfeito, a no ser que a tabela j viesse preenchida com
os dados dos clientes. Esse um trabalho para o PHP... O
e lv is s to r e o
0 ka*to e dados c)vs_storc ion-tem
ma nta iabels, !ss.

firs tn a m e M im e li ll tfIfIIIjfijl?fjlllfj fiitflllllliililflitlifflffj?

A
A Uela o r tiljs t otet de t - to j * d ^
ad* <*e dad da Wa de j* * *rad-

existem
p e rg u n ta s id io ta s

__ Ei, eu tenho uma cpia de Use a Cabea! SQL ? Se a minha tabela tiver dados e eu a apagar,
(timo livro, a propsito). Naquele livro, toda vez todos os dados sero apagados, tambm?
que voc mostrava o cdigo de uma instruo SQL,
colocava um ponto-e-vrgula ao final dela. Por que Sim, verdade. Portanto, cuidado ao apagar tabelas!
aqui diferente?

Ento, semm ecisar modificar uma tabela que


Ficamos felizes de voc ter gostado de Use a
j teriba^ldos, estou ferrado?
Cabea! SQL. A diferena que, quando voc fala
diretamente ao MySQL, preciso colocar o ponto-e-
vrgula para que ele saiba onde a instruo termina. /x Y i Ei, ningum perfeito. Todo mundo comete erros, \
Isso porque possvel emitir mltiplas instrues ao o SQL oferece a instruo ALTER para nos ajudar a )
MySQL, diretamente. No PHP, quando usada funo Ddficar tabelas existentes. Falaremos desse comando /
mysqli_query(), voc s executa um comando SQL por maSsdiante, neste livro. /
vez, de modo que no preciso usar o ponto-e-vrgula. y
Mas no se esquea de que voc ainda precisa colocar
o ponto-e-vrgula ao final de cada instruo PHP!
o script addemail.php

Crie o script "Adicionar Email" VbdC 3$<ara est a\ui.

Elmer precisa de um formulrio HTML para coletar


- Crie um banca rfe-Juuj t. uniu ;
nomes e endereos de email dos clientes. Uma vez tribale poro a lista de emuils.
que ele tenha essas informaes, precisa filtr-las com
Crie m formulrio web e um
um script PHP e armazen-las na tabela e m a i l _ l i s t .
\ script ^HP "Adicionar Email'1 para
SC
O formulrio web ( a d d e m a il. h tm l) requer trs V ^ aadicionar
d novos clientes lista
campos de input (entrada) e um boto. A ao a
Q Crie um formufrio web e um
parte mais im portante do cdigo do form ulrio, um a script PHP Enviar Email" para
vez que o seu trabalho repassar os dados para o script enviar um email para a lista.

Aa$o Hfc&M&EltfS.COM
a d d e m a il .p h p , que estamos prestes a criar.

o elemen-to
ConeC-X O -rormuiino Erteryourflrstflame ta-
HT/V1L ao sdvipt PttP
adde^l.pHp)
prodessara os dados, "''Xe**;:' sdvipt addemil
pKp e^eduiado
||uando o -orwvulano
|c submetido, e o seu
<ormmethod^ post sctio n = "
action _ a d d e rn a il ,p h p ">
I tvabalKo e prodessar
/>
Cinput type- text u , i> ! os dados e adidonav-
<input type- text m ^
e s l . / * * O dlien-te lista de
<label fr="email''>Email:</^ /><br /> emails na tabela do
bando de dados).
</form>
</body>

addemail.html

r
Os novos diienies podem se
dadasivav *a lista de email
de lw*ev (ou sJa, serem
adidionados ao bando de
dados) simplesmente usando o
-rovwwlav-io web.
elvis store email list
crie e preencha um banco de dados

0 script addemail.php processa os dados do formulrio Add Email


("Adicionar Email"). 0 script precisa filtrar os dados do formulrio, conectar-se
ao banco de dados elvis_store e inserir (insert) os dados na tabela
email_l'ist. Ajude Elmer a escrever um exemplo de query SQL para inserir
um novo cliente, e depois use essa query para finalizar o cdigo do script PHP.

EsfCV \ui um exemplo


de Consulta para ihserir
dados *a tabela de EUer.

<?php
$dbc = a

.... Q ................................................

^$first
t i r s t _ n aname
iu t =
- S_POST['firstname
l * 1

... j...... i.. ^..v tr~ ? h 7 . *


...........

$query - '' i j /l f c A T u V . T . Q ....

i_query (
mysqii_< C /

echo clients adicionado. f

?>

addemail.php

voc est aqui 127


soluo do exerccio

0 script addremaii.php processa os dados do formulrio "Adicionar Email".


0 script precisa filtrar os dados do formulrio, conectar-se ao banco de dados
CICIO elvis_store e inserir (insert) os dados na tabela email_list.
Ajude Elmer a escrever um exemplo de query SQL para inserir um novo cliente, e
OLuck>
depois use essa query para finalizar o cdigo do script PHP.

INSERT. INTO emailJ is t JrtmC, last^name, email)

l/A-WS ('Julian, 'Oates', julian^breaknedkpizia.tom')

A ^ i esta os valores do A ^uevy INSERT de e*mplo e


avray f J P O S T ^ue t<mktr*
reesdrita tomo uma string PHP <^ue
s in+ormaoes submetidas. depende dos dados do -formulrio para
a insero-

<?php ^li_donnedt('data.makemeelvis.dom,( 'elmer*, tb e kin j, elvis_jstoreJ)


$dbc - ""Vs

or diei'& rro ao to n e tia r tom o servidor AflyS^L server.');

$firstj r t a m e = $_POST [firstname ];


fl s t^ m e f^POSTClastname'3]

f email. .=. .................

5query =
= fKSERT IfrTFO emaiMist -first__name, last__nme> email) 11

'V A r^? lf^irst_l>ameJJ '/la^^hm j )ferntl>)Uj|..........................


mysqli^query( fdbdj f^wery )

or die(*rr do adessar o bando de dados*)j

echo 1clicrite adicionado -

wys^li_diose( fdbt);

addemail.php
Se ^uisessemos nos exibir a^ui,
poderamos dolodr um !mk de
volta para o nosso -formulrio,
dom uma ta$ HTM L <a>.
cr/e e preencha um banco de dados

T te S T O R tv e
Teste o form ulrio de A dicionar Em ail. Nao se esc^ue<p
de {rodar as
Baixe o cdigo da pgina web Adicionar Email no site da Alta Books, variveis de
em w w w .a lta b o o k s . c o m .b r. O cdigo est na pasta c a p it u lo 0 3 . Ele donexo ao
consiste do form ulrio web a d d e m a il .h tm l, um a folha de estilo ( s t y l e . ba*do de dados
c s s ) e duas imagens ( e l v i s l o g o . g i f e b l a n k f a c e . jp g ) . pelas suas
Em seguida, crie um arquivo de texto chamado a d d e m a il. p h p e digite prprias.
nele todo o cdigo da pgina anterior. Este o script que ir processar
os dados do formulrio web de Elmer e adicionar novos clientes tabela
email_list.
Envie todos esses arquivos ao seu servidor web e abra a pgina addemail.
html em um navegador. Digite os dados de um novo cliente no formulrio
e clique em Submit (Subm eter).

$ iyisevo do novo
eliivte a lista de emdil
c tovirmada pelo
stvip i addemail-php-

Verifique se o cliente foi adicionado ao banco de dados em itindo um a


consulta SELECT em alguma ferram enta MySQL.

voc est aqui 129


lpis soluo

p^sgjxm te seu lpis


O f\|||A 4 A Com a lista de Elmer comeando a ser preenchida, ajude-o
V V IU yC A ll a escrever algumas consultas SQL que ele possa usar para
encontrar dados especficos dos clientes.

Selecionar todos os dados de clientes que tenham o primeiro nome Martin:


SLECT FR0M eaiM ist 1VHBRE -first_name 'Alartm

A e stre la seleciona W a s as st j f 31* W * 6


colunas da tabela-
Clientes dujo primeiro nome se\a
M artin.

Selecionar apenas o sobrenome de clientes qe tenham o primeiro nome Bubba:


SELECT last_name FR0M emaiMist IVHERE rst__name 'Bubba;

................ t _ .....................................................................................................
Somente a doluna last_ame e
retorndd nos resultados d donsulta-

Selecionar o nome e o sobrenome do cliente que tenha o


endereo de email ls@objectville.net:
SLCT ir s t name, last ame FR0M email lis t WttERE email IsSobjedtvillenet'

........ .. v " .......... ................ ...*........


Para espedi-fidar mltiplas dolunas de resultadosj vote
separa os nomes das colunas dom vtrguls-

Selecionar todas as colunas dos clientes que tenhama s


\
\\
primeiro nome Amber e o sobrenome McCarthy: / \
/
SLECT # FR0M emaiMist WttERE first^name 'A*ber AND I s s h j n d m e 'AldCarthy
1
A dlawula IVHERE pode ser realizada, mas\
depende de varias ihorm^oes, neste daso a
odorrendia tanto de u primeiro nome quanto
de um sobrenome-

/N
Ls
crie e preencha um banco de dados

0 outro lado da aplicapo de Elmer


Enviar mensagens de email para as pessoas na lista de Elmer
um a tarefa semelhante de adicionar as pessoas lista,
porque ambas envolvem um formulrio HTML e um script 0 -formulrio Yeb Enviar
PHP. A grande diferena que, para enviar uma mensagem Email permite a Elmer

^
de email para a lista, preciso lidar com o contedo inteiro d e ita r o assunto e o dorpo
da tabela e ra a il list, enquanto que o script a d d e m a il. de uma mensagem de email, e
php lida apenas com um a linha de dados. depois envia-los para toda
a lista-
^ Crie um bnnes de dados c uwo
tabela paro o lista do cmoHs-, :
Crie um foi iwului iu web e um
seript PHP "AdiUimui' /Snoi!1para
adicionar novos1elientea liste.
^ Crie um formulrio web e um
script PHP "Enviar Email" para
enviar um email lista
U-fa, -finalmente
checamos ao
ltimo Passo-

itKTLiK method="post ac^on="sendema 1 ,php">


<label fox=subject">Subject of email :</labelXbr />
<input type="text" id=subject" nam.e="subject" si2s="60" /X b r />
<label for=elvismail''>3ody of email:</labelxbr /> . 0 sdript
Ctextarea id="elvismail" nanie="elvismail" rows="8" cols="6Dn></textarea><br />
<input type="submit" name="submit" value="Submit" /> sendcmalphp lc
</form> as \*formaoes
</body>
</html>
dos dliewtes nS
tabela, e eva o
eail de 1er
/ / ^ p a r a tada w

Jf\ ao -form dispara o


s d rip t sedeail*pbp.

elvis store
T i i t p r iillillllilillllilliS ii
julian@breackneckpizza.com
Julian Oates
jones@simuduck.com
Kevin Jones
sunshine@breakneckpizza.com
Amanda Sanchez

voc est aqui 133


o script sendemail.php

0 funcionamento interno do script "Enviar Entail"


O script sendemail.php precisa combinar dados de duas fontes diferentes para gerar e
enviar mensagens de email. Por um lado, o script precisa retirar os nomes e endereos de
email da tabela s e n d e m a i l _ l i s t do banco de dados e l v i s _ s t o r e . Porm, ele precisa,
tambm, obter o assunto e o corpo da mensagem digitados por Elmer no formulrio web
Enviar Email (sendemail.html). Vamos detalhar os passos da operao.

A Use o array $_ p o s t para obter o assunto e o corpo da mensagem de email


do formulrio.
Nada de novo aqui. Clicar no boto Submit do formulrio sendemail.html para
enviar os dados para sendemail .php, onde ns os capturamos em variveis com
um a pequena ajuda do array $_PO ST.
Execute uma consulta s e l e c t na tabela email_list.
O A funo PHP m ysqli__query () roda uma consulta SELECT para obter os dados da lista
de emails. Uma vez que queremos todos os dados da tabela, podemos usar SELECT * .

Acesse os dados do email no resultado da consulta.


Apenas executar um a consulta no fornece acesso aos dados. Ns precisamos
acessar cada linha de dados do resultado da consulta, para termos acesso ao nome,
sobrenom e e endereo de email de cada cliente.

Recorra funo m aii() para enviar um email a cada cliente.


Para enviar os emails, preciso fazer um loop atravs de cada cliente
na lista de emails, o que corresponde a cada linha de dados nos
resultados da consulta. O loop que criamos aqui comea na primeira
linha de dados, depois passa para a segunda linha, e assim por diante
atravs de todas as linhas de dados obdos pela consulta SELECT.
Ns paramos ao atingirmos o final dos dados.

0 sdsrip-fc
ptredisa
de dados
da tabela
eai iisfc.
cr/e e preencha um banco de o<

Em primeiro lugar, obtenha os dados


Ns j estamos bem experientes em extrair dados de formulrios no 0 enderedo de email de
PHP, portanto, o primeiro passo no traz nada de novo; basta usar a
EUer e arma^nado
superglobal $_POST para armazenar o assunto e o corpo da mensagem " "7*?
do email em variveis. E vamos aproveitar tambm para armazenar o em un,a ^lvei,
endereo de email de Elmer em uma varivel, uma vez que iremos pa*ra saibamos
precisar dele posteriormente, quando enviarmos os emails. exaiamen-te onde ele
esta, easo predisemos
$from = 1elmer@makemeelvis.com1 odiid-lo.
$subject = $_POST['subject1]; Os dados do ormuirio pava^a

$text = $ POST[1elvismail'];
ensaiem de email tawbem sao
armazenados em varivel-
Os demais dados requeridos pelo script s e n d e m a il . php so extrados
do banco de dados MySQL de Elmer. Para obter dados dos clientes a partir
da tabela e m a i l _ l i s t e coloc-los no script, precisamos de uma consulta
SELECT. Ao contrrio do que fizemos anteriormente, quando usamos o
terminal MySQL para emitir um SELECT e olhar os dados da tabela, desta
vez iremos faz-lo no script s e n d e m a il. php, e iremos emitir a consulta com
m y s q li_ q u e r y ().
A varivel f^uery armzen a
Eis a nossa donsul-fca, ^e
donsul-ta S $L na orm de uma
r strift^ de ieitfeo-
seiedioha -todas as dolunas
da -tabela email list-

$query = "SELECT * FROM email list";


$result = mysqli_query ($dbc, $query);

predso Kaver uma done*ao


enetoia a donsulia usando uma
domo o bando de dados para <\ue
vanave! de donexao (fdbd) e uma s rina de
donsulta (?iuery). ___ _______ a donsulta possa ser sutaeda
- OS de-talhes da donexao sao
Entao, tudo o que temos de armazenados na varivel fdbd-
fa z e r usar os resultados da consulta,
presentes na varivel $ resu lt( certo?

No, a varivel $result, na verdade, no contm quaisquer dados.


Se voc tentar ecoar a varivel $ r e s u l t diretamente, ver algo como:
Resource id #3

A varivel $ r e s u l t armazena um nm ero de identificao de um recurso


MySQL, e no os dados, propriamente ditos, que so retornados pela consulta. O
que acontece que o servidor MySQL armazena, temporariamente, os resultados
da sua consulta e fornece a eles um nmero de recurso para identificao. Voc
ento usa essa ID do recurso com a funo PHP m y s q li_ f e tc h a r r a y () para
obter os dados, uma linha de cada vez.
voc est aqui 135
d) lchjarrayO para obter os resultados da consulta

CO
g-

etch_array() obtm os resultados da consulta


Uma vez executada a nossa consulta, podemos obter os resultados com a varivel $ r e s u l t .
Essa varivel usada com a funo m y s q li f e tc h a r r a y () para se obter os dados da
tabela, uma linha por vez. Cada linha de dados retornada como um array, que podemos
armazenar em um a nova varivel chamada $row.
^ -------------- sa funo obtm uma ImKa dt
dados p a rtir dos resultados da
Consuita, e a arm azena em um a rray .
$row = mysqli_fetch__array ($result)
Cada consulta <$L tem o seu prprio
A variavel fvow um a r r a y ^ue, numero de IP, ^ue usado para se tenha
inicialmente, armazcna a primeira acesso aos dados, associados aos seus
linha de dados dos nossos resultados. resultados.

Cada vez que este cdigo executado pelo servidor web,


uma linha de dados dos resultados da consulta armazenada
A unp m/s^lL
no array $row. Repetidamente, voc solicita que a funo etcfc_arrayO
m y s q li_ f e tc h a r r a y {) seja transmitida atravs de cada
linha dos resultados. Assim, as trs primeiras chamadas E trm a z e n a u m a l n t a
funo m y s q l i _ f e t c h _ a r r a y {) obtm as trs primeiras de- d a d e s e m U H ] n i T i 'K .
linhas de dados da tabela, armazenando cada coluna da
linha como um item no array Srow.
$ ro w = mysqli_fetch_array($result);
em ail_ JL -s t
$row mysqli_fetch_array($result);
$row = mysqli_fetch_array ($result) ;

Cada Coluna de dados t armazenada


Como um item no rray frovi.

A variavel fvow t
d e in id a Como um
a rr a y C ontendo t r e s
elementos, um p a ra
cada uma das tr e s
colunas de dados.
crie e preencha um banco de c

^A p on te seu ipis

Com o um teste para nos certificarmos de que realmente conseguim os


obter os dados dos clientes, termine este cdigo PHP para exibir o
primeiro nome, sobrenom e e endereo de email de cada cliente
presente na tabela email list, uma linha de cada vez.

$query = "SELECT * FROM email_list";

$result = mysqli_query($dbc, $query);

$row = mysqli fetch array($result);

i _ r 1 " v'\
c

......

voc e s t aqui 137


so lu o
0)
&
to
nte seu lpis
K* Com o um teste para nos certificarmos de que realmente
Soluo
Solupo conseguim os obter os dados dos clientes, termine o
cdigo PHP para exibir o primeiro nome, sobrenom e e
endereo de email de cada cliente presente na tabela
e m a il l i s t , uma linha de cada vez.

$query = "SELECT * FROM email_list";


$result = mysqli_query($dbc, $query);
$row = mysqli_fetch_array($result);

J v o w C f . 1* . ' : * . fvov/C'cimairj . '<bv />';


l fr. fv-csui^j
tt\\o jVovjt'-Pirst^ttme'3 1 ' fv-oY/Clart^piwc J ' : - fv-ovCemailJ <bv- /> ',
fr ow mys^li^c-t-h^vrayfresul-;

cdKofirrt^name'J . 11 . frowClast^nme^ . ' : 1 . fy-oyC'cwail 3 '<br /> ';

fro>/ mys^l etdb_^array( ?v-esulO ;

efibo fyowr-Pirst^naiwe1^ . ' ' . y Voc deve estar brincando.


i y* Repetir as mesmas duas linhas de cdigo sem
?.???. rr. parar , provavelmente, a coisa mais estpida que
eho /r o w f iw t nne3 ' L _ eu v- claro que tem de haver uma maneira
............................. .............melhor de fa z e r isso.
f\rov/
edbo f
flrov; m ^BM p^^B tnryCfreShl^j

cdho . fvow C last . 1: *. frotiC cw ^il^ '<bv- />*;


.............. ................................................."""*..........................................................
froY/ =

' - frowriasi nime'3 . frowFemaiH - l<br / >'j

Existe uma m aneira m elhor - ns


precisam os de um loop.
Um loop
um mecanismo da linguagem PHP que
repete um pedao de cdigo at que uma certa
condio seja atendida, por exemplo, at se esgotarem
os dados. Dessa forma, o loop capaz de analisar,
ciclicamente, cada linha de dados de um resultado de
consulta, executando qualquer ao que quisermos,
em qualquer linha.
crie e preencha um banco de dados

Loop com um WHILE


loop usando o w h ile umlofip^specificamente voltado Uni loop wfcle
tarpfaHy-^ep^rir o rdigrrpfyamo uma, determinada condio fe p e te o c o jig o

enquantp uma
esteja sendo atendida. Por exemplo, voc pode ter uma varivel
em uma aplicao de servio ao cliente chamada $ g o t_
cu s tome r s ( $ te m _ c lie n te _ e s p e r a n d o ) , que serve para
registrar a informao sobre o tempo de espera para a realizao condio estVet
dos servios, por pate do cliente. Se $ te m _ c lie n te _
s e n d p a te n d id a .
e s p e r a n d o estiver definida como t r u e (verdadeiro), voc
sabe que ainda h clientes para atender, ento voc poderia,
consequentemente, chamar a funo n e x t c u s tu m e r ()
(prxim o c l i e n t e ) para ajudar o prximo cliente da fila. Eis
como poderamos programar isso usando um loop w h ile :

Enquanto tivermos Clientes -n


Continue o loop- ^
while ($ g o t c u s to m e r s ) {

n e x t custom er () ; Este e o Codijo ^ue


e e*eCutado a cada
iteral do loop.

* Colocar o cd'150 do U p dentro


de chaves IKe permite executar
quantas linhas de Cod*5 *luiser'
Quando verificamos se h mais clientes a atender, estamos testando
uma condio. A condio o cdigo entre parnteses, e ela sempre
Um loop while nos
apresenta uma questo que resulta em uma resposta sim /no. Se sim,
ou true (verdadeiro), ento a ao realizada. Se no, ou false
permite fazer loop
atra ves dos clientes ate
(falso), ento terminamos o loop.
<y*e no sobre nenhum
Quando chamamos n e x t_ c u s to m e r () e passamos a atend-lo, para atender.
estamos realizando uma ao. A ao o cdigo dentro das chaves, e
repetida enquanto a condio perm anecer t r u e . Se a condio
se tornar f a l s e , o loop termina e a ao no mais repetida. Eis o
formato geral de um loop usando o w h ile :

A Condio de teste sempre


resulta em verdadeiro ou falso
continuar olhando (verdadeiro) CRSRO
ou parar o loop (falso)-
Como voc acha que um
while (c o n d i o d e _ te s te ) { loop while poderia ser
usado na tabela e m a il_
ao l i s t de Elmer?
A aao do loop Corre uma
vez. a cada passada do loop.
voc est aqui 139
como whileQ funciona

Loop atravs dos dados com while


Aplicando um loop com w h ile para os dados do email de A to*diao do loof
Elmer, acessarmos os dados, uma linha de cada vez, sem duplicar to vVile e o valor ^
nenhum cdigo. Ns sabemos que m y s q li_ f e t c h _ a r r a y {) retornado pela -funa
capaz de tomar uma linha da tabela e colocar os valores v>ys^!i_-fettb_arrayO; \ue
das respectivas colunas no array $row, mas a funo, sozinha,
t interpretado domo trve,
no passa atravs de todos os nossos dados ela armazena a
primeira linha e ento para. Um loop w h ile pode chamar se houver dados disponveis,
m y s q li_ f e t c h _ a r r a y {) para atravessar todas as linhas ou -faUe, se os dados
dados do resultado, uma de cada vez, at chegar ao final. tiverem acabado-

while (p

primeira
passada do loop,
A ado A aa do loopj^onsiste
o array fro*/
do loop C de uma instrutao etbo
armazenara a
executada ey*e junta os dados da $row
primeira linka da
wn vez. linha, doUano uma tabela e m a iljis t
a cada quebra de tmba ao Vmal
Gerao.

eioail
list

/oPs. Na .'seaunda passada do loop, o array


frow armazenara a segunda linh da
tabela em aiM ist- esta vendo o padrao?
cr/e e preencha um banco de dados

Uma <\ueWa
TML- dolota
tada Whs de
A instruo edbo dentro o dados em urr>a
loop while e*trai os dados do VmKa prepria
array frow e cx.*b o dontcwdo p^ft results*-
formatado tomo HTML.

<
4r^
' <br
v "y
+ ' 1 +

$row[1first_name']
Q
$row ['last__name1] $rowt'email[]

t
A dhave usada para acssar o
elemento do array deve te r o
mesmo home <\ue uma dolun- Julian Oates ; julian@breakneckpizza.com
Kevin Jones : jones@sirauduck.com
Amanda Sanchez : sunshine@breakneckpiz2 a.cam
Bo Wallace : bo@bOttOmsup.com

0 loop wfcile Amber McCarthy : amber@breakneckpizza.com


Comae Hurst : churst@boards-r-us.com
Joyce Harper : jcyceharper@breakneckpizza.com
p e rp a s s a 9 s d a d o s Stephen Meyer : meyers@leapinlimos.com
Martin Wilson : roartybaby@objectville.net
datakela, lfnta Walt Perala : walt@mightyguraball.net
Shannon Munyon : craftsmanSbreakneekpiaza.com
Joe Milano : joe_m@starbuzzcoffee.eom
por linta. Quandp
nap iPuVe mais
llnfcas de dadps,
ele lnallza a
Ka secunda passada do loop, as
c o n s u lta . instrudoes edho e*ibem uma
outra se\uendia de te *te , mas
dcsta vez. sac usados os dados da
secunda lnKa da tabeia

$row['last_name1] $row[email'3
$row[first_name']
A dada passada do loop, os valores armazenados
Na verdade, nao se usa o smal de mais no array frow se modi-fidam para refletir a linHa
para ju n ta r duas strings usase o atual. Os nomes das doiu*as sao usdos para se
operador ponto- adessar os valores do array-
voc est aqui 141
no existem perguntas idiotas sobre whieQ

nqo existem
fe rg u n ta s id io ta s

I Como exatamente o loop while sabe que deve PONTOS DE BALA


continuar olhando? Quer dizer, o loop while controlado
por uma condio verdadeiro/falso, e
mysqli_fetch_array () retoma algum tipo Um banco de dados um Container
de ID do recurso, que armazenado em $row...Isso
para armazenar dados de uma forma
certamente no se parece com uma condio de teste
verdadeiro/falso. altamente estruturada.

As tabelas armazenam dados em um


K : Bem observado. Ocorre que o PHP bem liberal no padro de colunas e linhas dentro de um
que diz respeito ao modo como ele interpreta a condio
banco de dados.
verdadeira. Resumindo, qualquer valor que no seja zero
( O ) o u fa ls o considerado como verdadeiro, em uma O comando SQL create DATABASE
condio de teste. Assim, quando a funo m y s q l i _
f e t c h _ a r r a y () retoma uma linha de dados, o usado para que seja criado um novo
array $ ro w interpretado como verdadeiro, uma vez banco de dados.
que no est definido como 0 nem f a l s o . E, uma vez
que a condio verdadeira, o loop segue em frente. O O comando SQL c r e a t e t a b l e cria
interessante o que acontece quando no h mais dados uma tabela dentro de um banco de dados
disponveis - a funo m y s q l i _ f e t c h _ _ a r r a y () e requisita informaes detalhadas sobre
retoma f a l s o , o que encerra o loop. as colunas de dados dentro da tabela.

Ento eu posso controlar um loop while com Voc pode apagar uma tabela de um
qualquer tipo de dados, e no apenas valores banco de dados com o comando SQL
verdadeiro ou falso? DROP TABLE.

K : Correto. Mas tenha em mente que, no fim das AfunO mysqli_fetch_array ()


contas, o loop while est interpretando os dados como obtm uma linha de dados a partir dos
verdadeiro ou falso. Assim, a coisa mais resultados de uma consulta ao banco de
importante a se entender o que constitui verdadeiro
dados.
ou fa1so no que diz respeito interpretao de outros
tipos de dados. E a resposta simples que qualquer coisa Um loop while repete um pedao de
diferente de Ooufalso sempre interpretada como
cdigo PHP enquanto uma condio de
verdadeiro.
teste continua sendo atendida.
" P i O que acontece com o loop while se nenhum dado for
retomado pela funo my sqli_fetch_array ( ) ?

Q Crie uro b<meo de dodos e uma


Se a consulta no resultar em quaisquer dados, ento
a funo mysqli_fetch_array () retoma
t abela papa a Ifata de emails.
falso. E issofazoloop while nunca chegar ao cdigo Q Cwc um formularia web e um
da ao, nem mesmo uma vez. -script PI IP "Adfdwim..Dnuil" para
adicionor-novos clientes fl
? Ento possvel ter um loop que nunca ^ Crie um formulrio web e um
faz repeties? script PHP Enviar Email" para
enviar um email para a lista.
H : , sim. Tambm possvel ter um loop que nunca
termina. Considere este loop while:
? No sc esquea? ainda
while (true) { temes este ittmo Passo
Isto conhecido como loop infinito, porque a condio de
para terrnnv.
teste nunca faz o loop terminar. Loops infinitos representam
algo muito ruim.
crie e preencha um banco de dados

ms de Geladeira FHF & MySoL


Use os ms abaixo para completar o cdigo do script "Enviar Email" de m odo que Elmer
possa comear a enviar emails para a sua lista de clientes. Para refrescar sua memria,
eis aqui o m odo com o m a i l () funciona:

m a il (to, s u b je c t, m sg , 'F rom :' . fro m ) ;

<?php
$from = 'elmer@makemeelvis.com';

$subject = * A sxcw.to
*

$text =(/** _ J. _

$dbc = mysqli connect('data.makemeelvis.com', 'elmer', theking', 'elvis_store'


or d i e ('Erro ao se conectar com o servidor MySQL.');

$query = ''SELECT * FROM email_list" ;


$result = mysqli_query ($di>c, $query)
or d i e ('Erro ao consultar o banco de dados.);

while($row = mysqli_fetch_arrayf$result)) {
$first_name = $row['first_name];
$last_name = $row['last_name'];

$msg = "Dear $first_name $last_name, \n j[

$to =4 f P 1
. .a . .w.*...............
'From:
mail{ ^ r t: ' -i $c$
echo 'Email sent to: ' . j f . 1<br />';

}
mysqli_close($dbc);
?>

sendemail.php
script sendemaiLphp finalizado

m s cie- GaKJeira FB F & M /SQ L - Soluo


Use os ms abaixo para completar o cdigo do script "Enviar Email" de m odo que Elmer
possa comear a enviar emails para a sua lista de clientes. Para refrescar sua memria,
eis aqui o m odo com o mail () funciona:

mail(to,
s u b je c t , m sg, 'From:! . fro m );
C ertifi^ue-se de trodr
isto a*\ui pelo seu proprio
enderedo de email-

<?php w 0 dampo referente ao assunto


from = 'elmergmakemeelvis .com';
dhama~se ttsubjedtw, <\ue t o mesmo
nome usado para adess-lo no arrav
JC Z T

$dbc = mysqli_connect(' data.makemeelvis.comr, 'elmer1, theking', 'elvis__store')


or die ('Erro ao se conectar ao servidor MySQL.') Q de email t
Squery - "SELECT * FROM ewil.list"; M f " ? 0 (<*r"">lr'K
$result = mysqli_query($dbc, $query) denominado elvismail
or die('Erro ao consultar o banco de dados.); ^
6 , d .ait 0 ^ t #
while ($row = mysqli fetch array (Sresult) ) { s J "''CttSae* Sl?n .
$first name = $row [ firs tname' ] ; f d fundo milO, iun-fvi / ^
$last name = $row ['last name]; 'Y Kfrom de **

$msg = "Dear $first_name $last_namer\n

^$to =
1From:1

echo 'Email sent to il'cbr

0 email desti*tario, assunto da mensagem e


mysqli_close($dbc); dorpo da mensagem, s^ passado n fund3o
?> mailOj dom o endereo t tim er.

i nA doluna email do bando de sendemail.php


\jla d o s armazena os enderedos
Uma mettle de m gerab no e uma boa
dos dlientes, aos ^uais a donfirmajo enviada
mensagem deve ser enviada. ideia, em termos de segurana,
para a pagma, dom o
informar o <^ue o usurio digitou
endereo de dada dliente
diretamente para a funo
c^uem fo i enviada a
mailO sem faz<r, antes uma
mensagem- verifidaao primeiro- 0 C apelo
y mostrar algumas tdnidas
para resolver este problema-
crie e preencha um banco de dados

TfeST ORfve
Envie um em ail para a lista usando o form ulrio Enviar Em ail Tenba em m ente
Baixe o cdigo para a pgina Enviar Em airno site da Alta Books, www. <Y*e o scw
altabooks .com.br. Est na pasta capitulo03. Da mesma forma que a enderedo de
pgina Adicionar Email que voc viu anteriormente, este cdigo consiste email p re isa ra
de um formulrio web em sendmail.html, uma folha de estilo (style.css) estar a
e algumas imagens (elvislogo.gif e blankface.jpg). lista, p ara <\<*e
voe re te b a 3
Crie um arquivo de texto chamado sendmail .php e digite nele todo o mensagem.
cdigo da pgina anterior. Envie todos os arquivos para o seu servidor web e
abra a pgina s e n d m a il .h tm l em um navegador. Digite uma mensagem de,
email no formulrio e clique em Submit.

Voc tem email... de Elmer!


Finalmente, Elmer pode enviar os seus emails anunciando promoes de QueroSerElvis.
com (MakeMeElvis.com)para todos os inscritos na sua lista de email, usando o seu novo
formulrio e script PHP de Enviar Email. Ele pode, tambm, usar o output do script para
confirmar que cada mensagem foi enviada com sucesso. Cada vez que o cdigo no loop
w h ile do script executada, ele v Email enviado para alguem@algumlugar.com, com
os endereos das pessoas no seu banco de dados. O resultado final mais exposio para
os seus produtos e, para o bem ou para o mal, mais ssias de Elvis Presley por a!
0 s d rip t J end U a i l
realm ente envia mensagens
p a ra os endereos
Vendi todo
p resen tes no b a n to de
o meu estoque de
dados, p o rta n to duidado
sapatos de camura
ao a z ^ r a lte ra e s *ele!
azuis... estou rico!

ImaSingtist rosfefs. Email sent to: julian@breakneckpizza.com


Email sent to: jones@simuduck.com
Subject ofemai1' Email sent to: sunshine@breakneckpizza.com
;;Bis Sa*?......-- --- ------ -vEmail sent --
sent to: bo@bOttOmsup.com
findy of small: _ _ _ _ _ ---- - tmajlEmail sent to:
to: amber@brealwerkpizza.r.
amber@brealweckpizza.com
"B le this week Genuine. hors Email sent to: chum@boards-r-us.com
Email sent to: jv;^**aiyti^uitraKnecKpizza.coi
joyceharper@breakneckpj
oriSy -days Email
Ema sent to: rnevers@leaninTinn^ir
meyers@leapinlimos.com
Email sent to: martybaby@olgectville.net
Email sent to: walt@mightygumball.net
Email sent to: craftsman@breakneckpizza.com
Email sent to: joe_m@starbuzzcoffee.com
Email sent to: bnjce@chocoholic-inc.com
Email sent to: pr@honev-doit.cam
Email sent to: bertieh@objectville.net
Email sent to: gregeck@breakneckpizza.com
Email sent to: wilmawu@starbuzzcoffee.com
t ? I Email sent to: samjaffe@starbuzzcoffee.com
Email sent to: ls@objectville.net
EmaUsent to :J>sliakesmightygumball.net

voc est aqui 145


nosso aplicativo precisa da funcionalidade delete

s vezes, as pessoas querem sair


Como acontece com qualquer nova empresa, existem obstculos no
caminho. Parece que alguns fs de Elvis pularam do navio do Rei e
querem sair da lista de Elmer. Ele quer atender a esses pedidos, mas
para isso necessrio remover os clientes do seu banco de dados.

Caro Coiegg Ra Caro Elmer,


Eu no desejo receber mais
^nbora eu a' brador'
emails sobre promooes da sua
Passos c/e dan da aprec'e os loja. Ainda sou f de Elvis mas
estou 7?n?a cfo e/w_ s_
no tenho mais tempo para
Por favor, me retire da
im it - lo .
lista. Meu email e cbriggs
habHidades 3n !ncr>veis boards-r-us.com.

f me^ n a e Z ^ n-A^ v a i Obrigado,


Um Ex-lmitador

Prezado Senhor,

Aps vrias reaes alrqicas


as costeletas de g e n u n o S , parece que nem todo mundo
de cavalo, decidi que tentar me tem o talento para imitar o Rei.
SpraraeE^ad E'VSn0amin^ Preciso retirar estas pessoas da minha
.Eu adoro capas bonitas, lista, para que possa me concentrar
mas as costeletas so um pouco nos verdadeiros fs.
de exagero. Por favor, me rete
da sua lista de emails.
Um Abrao,

Brian Powers

bp@honey-doit.com

W e r o est V e l iz . e*
pevder dlie*ies, mas atender
aos pedtdos de vewoao da sua nsta
de emails.

E um fato na vida do MySQL - s vezes voc precisa remover


dados do seu banco. Elmer precisa atualizar a sua aplicao para
poder apagar usurios da tabela e m a i l _ l i s t .

Escreva aqui os novos componentes da aplicao que voc acha que


Elmer ir precisar para implementar o recurso de Remover Email:
, ......... ......'S. r. 2*.
crie e preencha um banco de dados

Removendo dados com PEIETE -grtc tim -bonco de dodi e uma


tabela para a lista de emails.
Para apagar dados de uma tabela, precisamos de um novo
comando SQL, DELETE. Usaremos DELETE em um novo
script Remover Email, o qual apagar dados dos usurios
da lista de emails de Elmer. Na verdade, precisamos de um
novo script e de um novo formulrio web para ativ-lo...
mas antes de tudo precisamos da funo DELETE. eitviop om-ewil-parq-qHtstq.
O comando SQL DELETE remove linhas de dados de Crie um formulrio web e um
uma tabela. Isto o tom a um comando que voc deve usar script PHP "Remover Email," parc
com muito cuidado, uma vez que ele capaz de eliminar remover clientes da lista.
uma tabela inteira, e todos os seus dados, num piscar de
olhos. Sabendo disso, eis aqui a forma mais perigosa de
DELETE, que apaga todas as linhas de uma tabela. Parede \ue predisai*o$
de um wovo Passo...
o no*e d s vezes os projetos
nome da tabela tsbcl da <^ual v<?d<r prdisant se modf*dar/
deseja apagar linhas.

Se nenKum outro ^ualifidador, __ S


o domindo esvazia i ~ ^
t o p le w t e a tabela, Entoo nao podemos nunca
vCn,ovdo S 5SS i e ! ( apagar algo de uma tabela
^ sem apagar tudo?

No, de je ito nenhum. DELETE pode ser usado


especificando-se um a d eterm in ada linha, ou linhas, para
serem apagadas.
Para especificar precisamente a linha - ou as linhas - que se deseja apagar
com DELETE, voc precisa adicionar uma clusula WHERE. Se voc se
lembra de como a usamos com o comando SELECT, WHERE tem a mesma
funo aqui: permitir que voc isole linhas especficas em uma consulta.

[~ ^ A p o n te seu lpis
Suponha que Elmer tenha 23 clientes cujo prim eiro nome
seja Anne, 11 clientes cujo sobrenome seja Parker, e uma
cliente com o nome Anne Parker. Escreva abaixo quantas
linhas de dados seriam apagadas por cada uma destas
consultas.

DELETE'FROM email list WHERE first name - Anne;


11
.....

DELETE FROM email_list WHERE first_name = 'Anne' OR last_name = 'Parker';

DELETE FROM email list WHERE last namS = Parker; j /S / ii


P

voc est aqui 147


DELETE com WHERE

ponte seu lpis


Soluo 5uP nha que Elmer tenha 23 clientes cujo prim eiro nome
seja Anne, 11 clientes cujo sobrenome seja Parker, e uma
cliente com o nome Anne Parker. Escreva abaixo quantas
linhas de dados seriam apagadas por cada uma destas
consultas.

DELETE FROM' email_list WHERE first_name = 'Anne1;

DELETE FROM email_list WHERE first_name = 'Anne' OR last_name = 'Parker1;^

DELETE FROM email list WHERE last name = Parker;


o
'ft 0 soWe*or*e *ao esta
entre aspas, portanto, nenbuwa taba
e apagada - todos s valores de
tento preisam estar entre aspas-

Use WHERE e PEIETE para apagar dados especficos


Usando uma clusula WHERE com o comando DELETE, ns especificamos algumas linhas
para serem apagadas, em vez de tudo que houver na tabela inteira. A clusula WHERE
permite que nos concentremos apenas nas linhas que desejamos remover, neste caso um
dos clientes de Elmer que pediu para ser retirado da lista.

valor ser prourado.


DELETE FROM email_list
WHERE |bif i = >pr@hon
A clusula
0 honte de Esta parte da dliwsula WHERE W H E R E lilf llt c t
w*a oluna (f realiza um teste e todas as
tabela lihKas, para ver \uais atende ao ct CPTl SU t t 7 cl&
I - t * ) p r o d u to . o c o

O teste propriam ente dito, dentro da clusula WHERE, realiza uma , * lo 1


comparao que executada em cada linha da tabela. Neste exemplo, ctS II p h S
o sinal de igual (=) testa cada valor da coluna e m a il para ver quais e c l Cc^S dei
linhas so iguais a p r @ h o n e y -d o it. com". Se o valor da coluna *
e m a il bater com o que est sendo procurado, ento a linha em ^ p o lc U
questo apagada.

Escreva aqui por que voc acha que a coluna email usada na
clusula WHERE, e no first name oulast name:
. j.O... :> . v . .. J L
. . . ....... ri. ..4....s/y^tS... A
crie e preencha um banco de dados

Minimize o risco de apagamentos


acidentais Uma clausula
E importante entender que, embora qualquer coluna possa
ser usada em uma clusula WHERE para selecionar linhas, h
W H EflE em uma
um motivo muito especial para termos escolhido a coluna
email para a consulta DELETE de Elmer. Considere que,
insfruo D ELETE
se mais de uma linha atender clusula WHERE, todas as
linhas que tambm atenderem, sero apagadas. Assim, lfce p e tm ite - in d ic a r
importante que a clusula WHERE de Elmer indique
exatamente, a linha que deve ser apagada. a lnha cjue V^ce
Estamos nos referindo, aqui unicidade. razoavelmente cj u e r v e m 9 V e r .
seguro assumir que, entre os endereos de email da tabela
email list, no haver dois emails idnticos, enquanto
nomes e sobrenomes no forem detectados como nicos.
Voc no vai querer criar uma clusula WHERE que procure
por Pat na coluna first__name para apagar um nico
cliente - voc acabar apagando todos os clientes chamados
Pat! E por isso que a clusula WHERE de Elmer tem de
ser cuidadosamente elaborada, de forma a procurar algo
bastante especfico, na coluna email.
A eoMvlta ) S u E T
re*>ov esta |mH do
bndo de ddos... p jrj
DELETE FROM email list nunda mais ser vista^
WHERE email = pr@honey-doit.com'
email

Usar d doluna email n


elusula WHERE ajuda a
estabeleder a unididade
e 3 reduzir o risdo de
se apagar uma linba
adidentalmente-

Se -tivssemos usado fir s t


nme na dlusuia WHERE, em
vez. de email, este usurio
teria sido, adidentaimente,
deetado. V.

mysql> DELETE FROM email_list WHERE email = pr@honey-doit.com ;


1 row deleted (0.005 sec)
test-drve o comando DELETE

O R t v e _______________________

Teste o com ando DELETE no banco de dados de Elmer.


Inicie uma ferram enta MySQL e emita alguns comandos DELETE para
apagar linhas individuais da tabela e m a i l _ l i s t , com base nos endereos
de email dos clientes. Certifique-se de incluir uma clusula WHERE em
todas as instrues DELETE, para no acabar, acidentalmente, deletando a
tabela inteira!

O comando d e l e TE bem til, mas o ideal


seria apagarmos linhas de dados usando um
formulrio web e um script PHP, certo?

Correto. A p agar usurios m anualm ente,


com consultas individuais, no a form a
ideal de se g eren ciar um a lista de em ails.
J que Elmer, inevitavelmente, ir se deparar com
usurios que desejaro ser removidos da sua lista,
faz todo o sentido futuramente, desenvolver uma
interface web para a remoo de usurios da lista. Um
formulrio web HTML e um script PHP resolvem o
problema, juntam ente com um a consulta DELETE
FROM auxiliada por uma clusula WHERE...
crie e preencha um banco de dados

Elmer criou um formulrio web (removeemail.htmi) para apagar clientes


da sua lista. S o que o formulrio est aceitando apenas um endereo de
email, o qual digitado em um campo chamado email. Complete o cdigo
do script removeemail .php que chamado pelo formulrio para executar
cada remoo de usurio.

tfham-se email" Enternemail address remove.


V Email address:

Clir no boiao
Cftvia o -formularioj r>5
- N
+cra de uw>a vc<\ws'tdao
POST, ao s t f i PttP.

removeemail.html
<?php

$dbc = mysqli_connect(1data.makemeelvis.c o m ' , 'elmer', 'theking', 'elvis_store')

or die(Erro ao se conectar com o servidor MySQL.}

& * A . ~ % $ $ L L \ r . s \ . 2 l ............ ........................................................

$. .....W .E !? . ................
I ^
I...../

*Ii f r~
/ ' T
C -C .Ti Q. . k 1 ........ f __ . - r ? . i .!......... : ............. o .5 _j

mysqli_close($dbc)

?> removeemail. php

voc est aqui 151


o script removeemaii.php finalizado

Elmer criou um formulrio web (removeemail.htmi) para apagar clientes


da sua lista. S o que o formulrio est aceitando apenas um endereo de
e email, o qual digitado em um campo chamado email. Complete o cdigo do
)OLuO script removeemail .php que chamado pelo formulrio para executar cada
remoo de usurio.

dhama-se email".

Clidar n botao MRemovew


envia o formulrio, a forma
de uma requisio POST, 3o
sdript PHP-

Os dados do formulrio
presentes em f__P0ST s3o
armazenados em uma variavel,
e depois usados na donsulta
pelbte.

, , t \ j Cuidado tom esta* aspas


?email f POSTremail 3, y[^simples e dujlas a|w!
aspas duplas fitam cm
, .................. 7'* v f torno "dif tda 3r donsulta
f^ e ry - ^ i l - lfe r^ il'w; / as simples fidm

mys|i query/dbd, f\uery) ew k *""0^


...........t............................................................................................... d i ^ail armay^do- e**
or dief'Erro ao donsultar o bando de dados'); few?jl

................................................................. demais ,doifi:ttar -o-..................................


edho Client? removido: 1 . [email; ^ ** "& ** **> prindipaimente
te
................................. ................................. ^ ^ ^ tr a t - d V e m 0do'-
de dados do bando. *
Ko se esquea de fedhar a ; ............ 0
done*o dom o bando de ddos rem oveem ail.php
crie e preencha um banco de dados

Crie um bonco de dados e uwo----


tobcln piara a lista de emails.
0 Oie um formutriu web e um
ript PMP "Adic iurrtul" [xuxi
adisipnar n cvgs -cliGrrtes o lista.
^ Grie um formularia wcb-e um -
aeript FHP &wai* Email" para
U-(W PmWntc onviar um email ligta.-----
tcrminmosl
-Q Cpo um-formuir io web e um

scmpt PMP Romovan Emcit ppo
pomoven cliontas do lista .

TfeST RIVE

Remova um clie n te da lista de em ails usando o form ulrio


Remover Em ail.
Isto est comeando a lhe parecer familiar, no? Baixe o
cdigo para a pgina Remover Email no site da Alta Books,
www.altabooks.com.br. Est na pasta capitulo03. O cdigo
consiste de um formulrio web em removeemail.html, uma folha
de estilo (style.css) e algumas imagens (elvislogo.gif e
blankface.jpg).
Crie um arquivo de texto chamado removeemail.php e digite nele
todo o cdigo da pgina anterior. Envie todos estes arquivos para o seu
servidor web e abra a pgina removeemail.html em um navegador.
Digite o endereo de email de um cliente no formulrio e clique em
Remove para apag-lo do banco de dados.

voc est aqui 153


o aplicativo lista de email esta cmpieto!

"QueroSerElvis.cout" uma
aplicapo web
oficial. Com a yuda do PHP e do MySQL, o site
QueroSerElvis.com de Elmer agora digno de ser
chamado de aplicao web. Elmer agora capaz de
armazenar dados, perm anentem ente, em um banco de
dados MySQL e tambm de interagir com esses dados
atravs de formulrios web. Uma combinao de pginas
HTML scripts PHP e consultas SQL inseridas permite a
Elmer adicionar e remover clientes da sua lista de email
(os clientes tambm podem se inscrever sozinhos), bem
como enviar mensagens de email para a lista inteira.

A pgina Adicionar
Email adiciona
novos clientes
lista de email de
Elmer.

A pgina Remover Email exclui


um usurio da lista de emails.
crie 0 preencha um banco de dados

C ru z a d a s p H P & M y S o L

Depois que voc tiver treinado, os passos de dana de


Elmer, veja se consegue cantar junto e completar estas
palavras cruzadas.

Horizontais Verticais
3. Um banco de dados MySQL divide-se nelas. 1. Um tipo de dados do MySQL que armazena
5. Uma estrutura de dados persistente, nmeros sem casas decimais.
altamente organizada, que geralmente 2. Use este comando SQL para olhar a
armazenada em um arquivo, no disco rgido. estrutura de uma tabela.
6. Esta clusula condicional pode ser 4. Quando funcionalidades dinmicas so
adicionada a instrues SQL para controlar adicionadas a um web site usando-se PHP e
quais linhas so especificadas. MySQL, o site torna-se uma.........
8. Este comando SQL remove uma tabela 5. Use este comando SQL para destruir
inteira do banco de dados. linhas de uma tabela.
9. Use este comando SQL para selecionar 7. Aps ter criado um novo banco de dados
linhas de uma tabela. em um terminal MySQL, voc deve exexutar
10. Use este tipo de dados do MySQL para este comando antes de fazer qualquer coisa
armazenar uma quantidade varivel de texto. com o banco.
12. Dentro de uma tabela MySQL, isto 11. Termo em ingls que representa um
armazena um tipo especf ico de dados. conjunto singular de dados de uma tabela,
13. Continua fazendo algo, enquanto uma consistindo de um elemento de cada coluna.
determinada condio de teste permanecer
verdadeira.
voc est aqui 155
palavras cruzadas php & m ysql - soluo

Cruzadas T H ? & M / S Q L - Soluo


crie e preencha um banco de dados

Sua caixa de ferramentas PHP MySQL


Vo c no s ajudou Elm er a m ontar sua ap licao w eb, com o

c a p tu lo
tam bm desenvolveu valiosas habilidades com PHP e MySQL
n este captulo. Por exem plo...

157
4 Aplfca^es Realistas e prtcas

Sua Aplicao
* na Web

s vezes voc precisa ser realista e repensar seus planos. Ou


ento planejar com mais cuidado logo no comeo. Uma vez lanada a sua aplicao na Web,
voc poder descobrir que no planejou suficientemente bem. Coisas que voc pensou que
funcionariam podem no ser boas o suficiente no mundo real. Este captulo d uma olhada em
alguns problemas do mundo real que podem ocorrer quando voc transfere sua aplicao do
ambiente de testes para um site reai. E enquanto isso, ns mostraremos exemplos de cdigos
PHP e SQL importantes.

este um novo captulo 159


elmer precisa de um aplicativo de lista de email melhor

Elmer tem alguns clientes irritados


A lista com os emails dos clientes de Elmer cresceu exponencialmente, mas
os seus emails tm gerado algumas reclamaes. Elas so variadas, mas todas
parecem ter algo a ver com os usurios recebendo mensagens em branco, ou
mltiplas mensagens, o que no bom em nenhum dos casos. Elmer precisa
descobrir o que deu errado e consert-lo. O seu negcio depende disso.

sabe *\ue te u**


problema, s ele pireti*
de ajuda para e s ttb n *
e * ata erv te o <\ue Wa-

:' ':?} 1: ; Vif.;


B : ."v W n l ' r'"'
aplicaes realistas e prticas

SINTAXE como Ekner, e administrador da


lista de etnails

3 uaiaea Interpretai' p papel de Elmer e


desoot-rijr C9H}9 egses einails em bt^nc esta.9
sendo enviados. Ele suspeita <jue
tem algo a Ver com o formulrio
sendemail.kml-

strcv a<\wi o <\ue Uev


atha uc pode sev- o ^roble^a
sinta-se como elmer soiuo

Si^TArSE como Elmer, o administrada da lista de


e m a ils - S e lu o

Sua tarefe. - fnt&ptetcir 9 pape-l de


Elmer e descobrir como esses erri^ls
em Wanco esto sendo
enViad^s. Ele suspeita,
^ue tem algo a Vet Esireva a\ui o <\ue EUer adha
jue pode ser o problema.
cem p Qrmularf
sendemqjl.kmL

e o bota Submit c r pressionado


no formulrio sem haver nada no
ampo Body (iorpo da mensagem);
enviado um email em brando
a^ora ^ue estamos pensando no
assunto, um tampo Subject ssuni)
vazio tambm problemtico.
aplicaes realistas e prticas

Protegendo Elwer de... Elmer


Portanto, o problem a aqui est naquela pea
que fica entre o teclado e a cadeira - Elmer est
clicando acidentalmente em Submit (Submeter)
sem digitar um a mensagem, e com isso emails em
branco so enviados para a lista inteira. Nunca
seguro presumir que um formulrio web ser usado
exatamente da forma que foi planejada. E por
isso que voc, um program ador PHP atento, tem
a responsabilidade de tentar evitar esses tipos de
problemas, antevendo que alguns usurios iro usar
os seus formulrios de forma errada.
Vamos dar uma olhada no cdigo do nosso
script s e n d e m a il ,-php atual, para ver como as
mensagens vazias de Elmer esto sendo criadas.

Kosso Bhvim Email usa o fceitfco do


-rormuHo S <ri3ir um email, mesmo c^ue
o usurio n3o enha dijado nada.
0 -te*t do ovmulavio e
obiido d t fJ> S T f* b jr t e
f POSlTelvismaiD, e e salvo cm
fib je fit e fte*fei resfefrtivameK-te-

$dbc = mysqli_connect(data.makemeelvis.com, elmer' theking1, 'elvis store'


or die('Erro ao se conectar ao banco de dados.');

$query= "SELECT * FROM email_list";


$result = mysqli_query($dbc, $query)
or die('Erro ao consultar o banco de dados.')
0 problem c <^ue mos usamos
while ($row = mysqli_fetch_array($result)){
$to = $row['email'];
f'texi *a nossa mensagem,
$first_name = $row['first_name']; ^dpehdcM-temcnie de a varivel
$last_name = $row['last_name']; toY{,<X algum ou ao
$msg = "Dear $first_name $last_name
mail{$to, $subject, $msg, 'From:' .
echo 'Email $to 1<br />' ...e inos -tambm usados
} fsubjei i*d e ? e *d e *W *t
mysqli_close($dbc); de bavev kjc fi *ela n'
?>

Escreva aqui o que voc acha que deveria ser modificado no


cdigo do script s e n d e m a il .p h p para consertar o problema dos
emajls em branco: , /
*. . **' . .. _V. .*.. . -is. c. "T .. .. ^

voc es aqui 163


sendemail.php precisa de validao

Exija bons dados do formulrio Validar slgnica


O formulrio de Enviar Email de Elmer precisa de alguma validao, que cert iC cfr-se d e
o processo de se verificar se os dados do formulrio esto OK antes de fazer
qualquer coisa com eles. Elmer j est usando validao, embora no a <jue 9S dadPS
esteja cham ando por esse nom e. Sem pre que ele recebe um pedido atravs
do site, ele no envia o produto imediatamente... ele valida o pedido antes. cj[ue Voce est
No caso de um pedido, Elmer primeiramente verifica se o carto de reeekendp s9
crdito do cliente vlido. Caso afirmativo, ele prepara o produto para
envio. Mas para isso, ele precisa verificar se o endereo do cliente est 9s espetadas.
completo. Se estiver tudo certo, ento Elmer faz o envio. Para que um
pedido seja processado com sucesso na loja de Elmer, necessrio validar
vrios dados referentes a esse pedido.
0 peddo s
EWev te 0 endereo pav-a ^
enviado se
que validav -s. envio predisa
o dartao de
odarfcao de A estar do^pleto-
dredito e o
drdito de endereo de envio
dada dliente, ore vlidos.
antes de
atender ao
pedido.

Para resolver o problema dos emails em branco, precisamos validar


os dados do formulrio entregues ao script sendemail -php. Isso
significa que os dados devem ser submetidos da pgina do cliente
(sendemail.html) para o servidor e o servidor (sendemail.
php) deve checar se todos os dados esto presentes. Podemos
adicionar algum cdigo a sendemail.php para examinar os
valores das caixas de texto, e verificar se elas no foram deixadas em
branco. Se tudo estiver OK, o script envia os emails.

Os dados do
H Elmer preenche e
submete o formulrio
O formulrio so
Enviar Email. enviados para o
script de Enviar
Email, no servidor. O script PHP
valida os dados.
Se estiverem
OK, ele envia os
emails - caso
contrrio, ele
retorna um erro
para o cliente.

H O servidor envia uma resposta HTML para o navegai


v dizendo ou que o email foi enviado ou que os dados do
formulrio eram invlidos.
aplicaes realistas e prticas

A lgica por irs da validao de Enviar Email


Elmer precisa validar os dados que obtm do form ulrio s e n d e m a i l .
h tm l, para poder enviar os emails. Na verdade, a situao ideal que
o envio dos emails dependa totalm ente da validao dos dados. O que
realm ente precisamos que o PHP faa tom ar um a deciso com base na
validade dos dados recebidos pelo script s e n d e m a i l . php. Precisamos
de algum cdigo que diga se os dados forem vlidos, v em frente e
envie os emails.
Estas duas eoftdioes predisa ser verdadeiras
par o dado ser donsderdo valido

i
SE Subject contiver texto E Body contiver texto

ENTO enviar email

\ Se abas as tonditoez
-Pore atendidas, e sinsl de
<\ue esis tudo derto e <\ue
podeos enviar os eails.

Esta vamos andando eail se h$


preoduparos se aUo losse digitado
nestes dapos do -rormulario.

Co a ajuda da validado,
podeos nos dertii-ar de <\*e os
eaiis s seja enviados se abo*
os tapos dontwere dados.
ia<? eXistem sendemail.html
Perguntas id iotas
Eu j ouvi falar em validar os dados no cliente, Ento por que usar a validao no lado do
em vez de no servidor. Como isso funciona? servidor, em vez de no lado do cliente?

0 navegador web considerado como o cliente, Se validarmos no cliente, apenas parte


de modo que a validao no lado do cliente seria do problema resolvida. Elmer poderia navegar
qualquer verificao que ocorra antes de os dados diretamente at sendemail.php e enviar um email em
serem enviados para o script PHP. Linguagens como branco. Porm, se validarmos no servidor, isso resolve
JavaScript so capazes de fazer validao no iado ambos os problemas. Dados em branco no formulrio
do cliente. Se estiver interessado em aprender mais, sero detectados, bem como dados em branco sendo
d uma olhada em Use a Cabea! JavaScript, o qual carregados diretamente no script PHP. Isso no equivale
aborda em detalhes a validao no lado do cliente. a dizer que errado validar no cliente. Na verdade,
uma ideia muito boa. Mas o servidor a ltima linha
de defesa para se capturar dados ruins, portanto a
validao no lado do servidor no pode ser ignorada.

voc est aqui 165


tirar a declarao

Seu cdigo pode tomar decises com IF


A declarao PHP if perm ite ao seu cdigo tomar decises com base em se algo
verdadeiro ou no. Considere novamente os pedidos da loja de Elmer. Antes de
atender um pedido, Elmer precisa receber o pagamento, o que significa cobrar no
carto de crdito do cliente. Se o cliente fornecer a Elmer um nm ero errado de
carto de crdito, ele no pode atender ao pedido. Assim, Elmer realiza um a espcie
de validao-no-mundo-real em cada pedido, que acontece mais ou menos assim:
Se o carto de crdito do cliente for vlido, v em frente e atenda ao pedido
Ns podemos traduzir este cenrio para cdigo PHP usando a declarao if, que serve
para lidar exatamente com este tipo de tomada de decises.

A Instruo i f bsica tem trs partes:

A palavra-chave i f
Ela inicia a declarao

O A condio de teste
A condio de teste ou expresso condicional, localiza-se entre
parnteses logo aps a palavra-chave i f . E aqui que voc coloca a
declarao cuja validade ou veracidade, voc deseja determinar.

A ao
A ao de uma declarao i f vem logo aps a condio de teste, e
fica dentro de chaves. E aqui que voccoloca o cdigo PHP que
deseja executar quando a condio for verdadeira.

Esta e 3 t<n\\to Ela esta


dedlaradao ^"'S nd uma w ^ao para veH-Pidar
eomca dom i f - v f est a r ^ n a d o e* ^ tKav<;
) fw art_ard I ( alido. ^ . . .
sP s ' -------- _ I > -------------- --------> ^ iw f c .a a r * r te
if (is V a lid ($cred it_ card _ n u m ) ) { a aao

O fillO rd e r 0 ;
^ ( also ^dependendo da validade
s r ] do darto de dredito.

Mo ir t liu a i o ' fc ta a * 9 ' ?^ ' r


3 i t t larao if..' t t b J t taso a o n to
^ -dadwa. V o ?oa<
ImKas de t ^ o aqui quanto
quiser-

Jk. n n
aplicaes realistas e p i.

Testando em busca da verdade


O cerne da declarao if a sua condio de teste, que sempre interpretada
como verdadeira ou falsa. A condio de teste pode ser uma varivel, uma
chamada a funo ou uma comparao de um a coisa com outra, por exemplo. A
validao de carto de crdito feita por Elmer usa uma chamada a funo como
a condio de teste, o que significa que o valor retornado pela funo ser ou
true (verdadeiro) ou false (falso)..
A dondio de
/ -teste e.v erd ad e ira
V' ou alsa-
S E (o jcarto for v NdoJ 'I lf f

ENTO atender ao pedido f illOrder () ;


\ ^ 5 dondio de teste
----- to r verdadeira, a aa
e*edutada. 3
bastante comum usar uma comparao como condio de teste, o
que normalmente significa comparar uma varivel com algum outro
valor. Por exemplo, talvez Elmer queira oferecer um desconto para
clientes que morem em Nevada. Ele poderia criar um a declarao isto e verdadeiro se a
if para executar uma comparao em parte do endereo de envio, varivel fs>iffi5__state
desta forma: dotiver o texto
levada"
if ($shipping state == 'Nevada') {
SE o cliente mora em Nevada

ENTO aplicar desconto $total = Um desdohto de


10% e aplidado
} *a ao, daso
a dondiao
Esta condio de teste realiza uma comparao de igualdade, a qual de teste seja
envolve dois sinais de igual (==). As comparaes de igualdade no verdadeira-
so apenas para variveis e strings. Voc pode comparar variveis
com nmeros, variveis com variveis e at mesmo realizar clculos.
Mo dolo^ue valores
Vode pode veriidar se ($num items == 10) fcumeridos entre aspas.
o <\ueesiS armazenado
em uma varivel ijual ($shipping addr.ess === $billing address)
ao ^ue est armazenado
em outra.
(2 + 2 = 4:
Vode pode e*edutar operaes
matemtds em um dondi3o
de teste-

voc est aqui 167


i/ores no php

a mais do que apenas igualdade


Uma declarao if pode verificar mais do que apenas igualdade.
Kao te problema
A condio de teste da sua declarao if pode tambm verificar se
escrever wma declaraao
um valor maior do que outro, por exemplo. Se for, o resultado
l' m W*3 SO linbj
da condio true e o cdigo da ao executado. Eis aqui
desde que a aao seja
alguns outros testes que voc pode usar para controlar a deciso
relativamente simples.
de uma declarao if.
$small number = 2;
ComeCe ton> estas
$big_number - 980 65 ; ^ a s estas Cohdioes so
duas variveis. verdadeiras.
Existem duas formas de se verificar
se as coisas no so iguais: <> e !=,
if ($small_number <> $big_number) { echo 'True'; }
Isto lhe d o resultados oposto de
if ($small_number != $big_number) { echo 'True'; }
um teste de igualdade com = .

O sinal maior que (>) verifica se Esta c*dia e aUa-


o valor da esquerda maior do
que o valor da direita. Se for, a if ($small_nuinber > $big number) { echo 'True'; }
condio true; caso contrrio,
false.
O sinal menor que (<) compara
^ $ ta Co^dia e verdadeira.
o valor da esquerda com o valor
da direita. Se o da esquerda for if ($small number < $big number) { echo 'True'; }
menor do que o da direita, a
condio true.
Maior ou igual a (>=) funciona ' Esta condio e falsa-
como maior que (>), exceto pelo
if ($small number >= $big_number) { echo 'True';
fato de que ele tambm resulta em
true se os dois valores forem iguais.

Menor ou igual a (<=) E*ta Condio e verdadeira.


semelhante a menor que, exceto
if ($small__nuniber <= $big_number) { echo 'True'; }
pelo fato de que tambm resulta
em true se os valores forem iguais.

E quanto as strings? Ser


que ("cachorro" >"gato")
funcionaria?

Sim , voc pode com parar strings em condies de


te s te
A comparao funciona com base no alfabeto, com a letra a
sendo considerada como m enor do que a letra z. Usar os sinais
de maior que ou m enor que pode lhe ajudar quando voc tem
que apresentar informaes em ordem alfabtica

a r>e\
aplicaes realistas e prticas

m T A S V com o uma condio de teste- da


declctt-a-sb l i

3 u a ta re fe 4 Interpretar o papel da condfap deteste- 5? e


decidir s& Voce Verdadeiro 9u als9 , dadas as seguintes
VatiVels.

$my_name = 'Buster ';

$a_number = 3;

$a_decimal = 4.6;

$favorite_song = 'Trouble';

$another_number =0;

$your__name = $my_name;

($favorite_song == "Trouble")

($my_name = 1$your_name')

($my_name == "$your_name") >

($your_name == $my_name)

($favorite_song == 'Trouble')

($a_number > 9) verdadeiro ou(Talso>


r\
<$favorite_food = amburger) verdadeiro ou falso
sinta-se como uma condio de teste soluo

S J sT A -S E coniP um a con dio d e te ste d a


declcU-a I - Solu?
Sua tareia Interpretar O papel da condio de te-Ste- e decdlr se Vce
verdadeiro ou {qjso, dadas as seguintes VaraVes.

$my__name = 'Buster;

$a_number = 3;

$a_decimal -4.6;

$favorite_song = 'Trouble';
$another_number = 0;

$your_n ame = $my_n ame;

^ T . .s , . ^0 ce umd
uma strihfl
strmg vazia
($ a _ n u m b e r = 3) <% d a d e i r^ o u falso & Cor>d^
os domo
iguais.
($ a n o th e r_ n u m b e r = "") (yerd ad e ir^ o u falso
Pcvidio s aspas simples,
($ fa v o r i te _ s o n g = = " T r o u b le " ) $ e r d a d e ir o )o u fa ls o ^ a dondiao na verdade
est perguntando se a
($ m y_ n a in e = ' $ y o u r_ n a m e ' ) v e r d a d e iro o u ( fa ls o ) string Buster igual
. string ufyour_nme I e
( N>my_name = " $ y o u r_ n a m e ") v e rd a d e ir o o u fa ls o o ao v^jor dontido na
,a . ----- v. varivel fyour name-
($ yo u r_ _ n a m e = = $m y_nam e) ( ^ e rd a d e ir ^ o u fa ls o l

( $ f a v o r it e _ s o n g = = 'T r o u b le ') (y e r tla d e ir j^ o u fa ls o e maior q^e ef. ^

($ a _ n u m b e r > 9) v e r d a d e ir o o u ( p s ^ )

( $ f a v o r it e _ f o o d (= ^ ), h a m b u rg e r ) ($ fe rd a d e ira )o u fa ls o
Deveria te r 0 , esta aqui e di-feil Uma vez.
sido , se a N. que esta sendo usado apenas
intentao aqui ^ um sinal de igual aqui, isto e na
era -fazer uma n i? verdade uma atribuidao (), e
tompavaao F c V /crU t l l 3 .S I d lO f a s nao uma domparado =^- la
-, - lAix ataba sendo verdadeira, porque
? - Ento a condio de teste a mesma coisa que usamos para controlar qualquer doisa que nao seja O,
os loops while no Captulo 3?? NULL- ou -false t interpretada
domo true pelo PttP
v J . exatamente a mesma coisa. No captulo 3, a usamos para saber se
ainda tnhamos linhas de dados resultantes da consulta, mas podemos pensar em
condies de teste mais interessantes para loops while, usando diferentes tipos
de comparaes. Voc ver isso mais adiante no livro..
aplicaes realistas e prtica

A lgica por irs da validapo de nviar Ewail


Elmer precisa validar os dados que obtem do formulrio sendemail.html, para poder
enviar os emails. Na verdade, a situao ideal que o envio dos emails dependa totalmente
da validao dos dados. O que realmente precisamos que o PHP faa tomar uma deciso
com base na validade dos dados recebidos pelo script sendemail.php. Precisamos de algum
cdigo que diga se os dados forem vlidos, v em frente e envie os emails."
Mas primeiro ns precisamos obter os dados do formulrio e os armazenar em
algumas variveis:
$subject = $_POST[1subject1];

$text = $_POST[1elvsmail'];

Isto tudo de que precisamos para verificar se existem


dados em cada um dos campos do formulrio. A lgica su
algo como o seguinte:

SE S u b je c t contiver texto E Body contiver texto

ENTO enviar email


Ou ento poderamos adotar a abordagem oposta e
verificar se os campos do formulrio esto ambos vazios,
em cujo caso poderamos exibir um aviso para o usurio:

SE Subject estiver vazio E Body estiver vazio sendemail.html


ENTO exibir mensagem de erro

Ambos os exemplos tm um problema, porque a lgica deles


requer que ns faamos duas comparaes em uma mesma
declarao if. Uma soluo possvel usar duas declaraes if..

Aponte seu lpis


Escreva duas declaraes if para verificar se tanto o assunto
quanto o corpo da mensagem do form ulrio Enviar Email esto
vazios. Emita um aviso caso estejam.

. . . .? .9 : d y .... . t f c r . .. M u J L .Lr?. .) ......... k

voc est aqui 171


ssetQ e empty()

Mte seu lpis


Solupo Escreva duas declarao i f para verificar se tanto o
assunto quanto o corpo da m ensagem do formulrio
Enviar Email esto vazios. Emita um aviso caso estejam..

fc" |sto qui sao dus dSpS Simples, O


i f (/lubjeet ) 1 r t f r a e n i * *b>5 'a t *~

Colocando a = = "H ............................................


i^stvuto i dcnbro ;ko vode se esw*eieu de tyksr o asswbo fi o tewbo de evmail <br />';
da pvinxeir, o
dodi$o esta dizendo
que ambas prcdism
ser verdadeiras pra
A indentaa ajuda a mostrar onde
que a instruo tt\sQ
a dedlarada i+ interna termina e
seja exedutada-
onde domea a dedlarad i externa.

Fimpes PHP para verificar variveis


Usar == para checar se uma string est razia funciona, mas existe uma forma
melhor de fazer isso, atravs de funes internas do PHP. A funo isset()
verifica se uma determinada varivel existe, o que significa dizer que ela tem
um valor atribudo a si. A funo empty() d um passo alm e determina se
a varivel contm um valor vazio, que o PHP define^eeuq^o um 0, uma string
vazia (' ' ou "") ou os valores false ou NULL. Assin^sset()bytetorna true se
um valor tiver sido atribudo varivel, enquanto qite.^mpty{/ s retom a true
se a varivel tiver sida definida como (j^umjstring vazia, feilsejju
Vejamos como essas funes trabalham:
fvl dontem Tanto fvl quanto fv 2- sao
um valor*. donsideradas domo tendo sido Somente o ddi^o
$vl = 'aloha def inidas, mesmo que somente sombreado e
fvZ c uma $v2 = " - -} fvl tenha um valor- exedutadof!
string vazia..
if (isset($vl)) { fvl no est

fvZ esta vazia, ela dontem


definida?
if (empty($vl)) { echo '$vl est vazia<br />'; } texto. Assim, esta
mesmo que dondidao i f falsa..
if (isset($v2)) {
dontenha
jvZ est vazia
um string if (empty($v2)) { porque a string ^
vazia
o^ue ela dontem e
if (isset ($v3) ) { echo '$v3 est definida<br />'; }
v32ia
if (empty($v3)) {
I V5 nac ?v3 e donsiderada
existe- vazia, mesmo que
nem exista..
aplicaes realistas e prtic^

Entendi. Ns podemos usar isset() e emptyO


para validar os dados de $subject e $text.

Quase isso. Na verdade, ns s estamos verificando se os


dados no esto vazios, por isso empty() o que precisamos.
As variveis de texto $ su b j e c t e $ t e x t recebem valores das
superglobais $_POST [ ' su b j e c t ' ] e $_POST [ 1e l v i s m a i l ]. Se
voc testar essas variveis com i s s e t (), o teste sempre retom ar true,
independentem ente de elas realmente conterem ou no algum texto.
Em outras palavras, i s s e t () no lhe mostra a diferena entre um
campo em branco e um preenchido. A funo em pty () verifica se a
varivel est realmente vazia, que o que precisamos para a validao
do formulrio.

n a existem
iSSetO Veffoct se a VatfaVel id ptas
existe e se est deltuda. * Ento qual o propsito de usar issetQ?

A funo is set 0 extremamente til quando voc


e U l p t/ 0 V e tfc a s e precisa saber se um determinado dado existe. Por exemplo,

a VorfaVe1tem algum voc pode verificar se um formulrio foi submetido atravs


de uma requisio POST repassando $_p o s t funo
isset ( ) . Isso acaba sendo uma tcnica bastante til, como
c o n te d o . voc descobrir um pouco mais adiante neste captulo.

Apowte seu lpis ------------------- ----------- ------


Reescreva as duas instrues if que criamos para verificar
se tanto o assunto quanto o corpo da mensagem do
form ulrio Enviar Email esto vazios, porm, desta vez, use
a funo empty () em vez de == nas condies de teste.
4)
C0

nte seu lpis


Solupo Reescreva as duas declaraes if que criamos para verificar
se tanto o assunto quanto o corpo da mensagem do
form ulrio Enviar Email esto vazios, porm, desta vez, use
a funo emptyO vez de - - nas condies de teste.. '

''UlZ
J/
U*a thaada a fwr^o
ewvpiyO substrU o operador
de igualdade - ~ ) em tada . jk h o jy & e sc.cs. V '^ : l.l.3i.^.'r .. ass^ 1>J,c. k *fc o ;do
uma das do^dioes dc teste-
0 s b n te do cdi9o_ . ^ j ? 5 v f W '
o mesmo que antes- J j X ^ . . J T ? . . L AW /
^ y"''"

' ^
/ '

E se ns precisarmos executar
uma determinada aSo apenas
se o campo do formulrio nao
estiver vazio? Existe uma funo
notemptyO?

No, mas h um a m aneira fcil de in verter a lgica de


qualquer condio de te s te ... o operador de negao.
Ns sabemos que a condio de teste que controla um a declarao
if sempre resulta em um valor true ou false. Mas e se a nossa lgica
determ inar que precisamos verificar o inverso do que uma condio
nos apresenta? Por exemplo, seria til saber se os campos do
formulrio de Elmer no esto vazios, antes de enviar um m onte
de emails. O problema que no existe uma funo notempty(). A
soluo o operador de negao (!), que transforma true em false ou
false em true. Assim,!empty () literalmente chama a funo empty() e
inverte o seu resultado, desta forma:

0 operadov UOT (/)


tvans-Wm true ei N\
fase ou -false e tvue-
if (1 3m.pty ($subject) ) {

sta ondio esta


' perO)uta*do u0 dawpo do
Assunto esta naovzjo ;
ou seja, ele dontem dados?
aplicaes realistas e prticas

Preencha as lacunas no cdigo sendemail.php de Elmer, de modo que o


email s seja enviado quando tanto $subject e $text no estiverem vazias.
Use declarao if e a funo emptyQ.

O o Private: For B m e fs use ONLY


Write and send an email to rnaffin Ftstnnem

<?php
$from = 'elmer@makemeelvis.com';
$subject = $__POST [' sub ject'];
$text = $ POST['elvismail']; sendemail.html

i . i . e . w i Y . L M . 4 j f i j ) . e ^ 0 =: Jy n , /*

i . i . . C i lux-.~J X>.e>3: - "f-i j


f f s' K y ~ ^ J
^^ $dbc= mysqli_connect('data.makemeelvis.com', 'elmer', 'theking',
'elvis_store1)
or die{'Erro ao se conectar com o servidor MySQL.');

$query = "SELECT * FROM email_list";


$result = mysqli_query($dbc, $query)
or die('Erro ao consultar o banco de dados.');

while ($row = mysqli_fetch_array($result)) {


$to = $row['email'];
$first_name = $row ['first_name '];
$last_name = $row['last_name'];
$msg = "Caro(a) $first_name $last_name, \n$text",
mail{$to, $subject, $msg, 'From:' . $from);
echo 'Email enviado para ' . $to . '<br />';
}
mysqli close ($clbc);

?>

voc est aqui 175


sendemail.phpagora com validao!

Preencha as lacunas no cdigo sendemail.php de Elmer, de modo que o


email s seja enviado quando tanto $subj ect e$text no estiverem vazias.
RCCIO Use declarao if e a funo empty {),

0 ponto de exdlamao
inverte a lgida da
funo emptyO.

A (x-imeM ondiao _ sendemail.html


<?php veri<ida se fsttbjctt 3^.
$from = 'elmer@makemeelvis .com'
esta vazia...
$subject = $_POST[1subject'
$text = $_POST['elvismail ...se no estivev> timo/ Agora
vevi-ficmos se fte% t no esta vazia-
j_f " (Jemptyifsubjedt)) {
Ms tivemos de dolodar uma dedlaraao
i dentro da outra, para que o ddigo
-undionsse. |sso se dha**>a aninhar.
$dbc = mysqli connect(1data.makemeelvis.com1, elmer, 'theking',
elvis__store')
or die('Erro ao se conectar com o servidor MySQL.');

query = "SELECT * FROM email_list";


result = mysqli_query($dbc, $query) Se qualquer uma das
or die('Erro ao consultar o banco de dados') variveis estiver vazia,
uma das dedlara^es i
ser alsa, e nada deste
while (?row = mysqli_fetch_array($result))
$to = $row['email']; ddigo ser e*edutado, o
$first_name - $row [' first_name ']; que signlfida que nenKum
$last_name = $row['last_name1]; email em brando ser
$msg = "Caro(a) $first_name $last_name, \n$text' enviado exatamente o
mail($to, $subject, $msg, 'From:' . $from); que queramos
echo 'Email enviado para: ' . $to . '<br />';
}
mysqli_close($dbc)
NS temos de -finalizar a parte relativa
ao de ambas as dedlaraes i^ A
primeira dhave -finaliza a dedlaradao i
interna, enquanto que a segunda -finaliza
?> a dedlarao i-f c*terna-
aplicaes realistas e prticas

O R tv e

V erifique se a validao dos cam pos do form ulrio funciona.


Modifique o cdigo de sendemail.php para usar declaraes if que verifique
os dados do formulrio antes de enviar as mensagens de email. Envie a nova
verso do script para o seu servidor web e abra a pgina sendemail.html
em um navegador. Certifique-se de deixar pelo menos um dos campos do
formulrio em branco, e clique em Submit.

M a te M e E L v ts .e o M
0 dorpo da nen$39evn
Prfrato: For Snrts use ONLY
esta vazio, o \uc WHte and send m ema to maiiing ijst members
-(az- os dados do Sujeetofemail:
formulrio (lVlrem BlueSiaede Ce^rance!
Bodyof email:
na validaao.

A ausendia dc donirmaoes
dc cmiU revela <\ue nada
Poi enviado, <^ue o ^e ns ___
queramos. Mas algum iipo de
aviso a<\ui seria mais u-fcii do <^ue
uma p^ina em brando.

voc est aqui 177


conversa a trs

Aliens Abducted Me - Report an Abduction


E se ns tivssemos um Share your story of alien abductsoo:

monte de campos no formulrio? LatfBsme


Teramos de aninhar um monte de Wba is JTMTejnal sd4re7
When did it happen?
instrues if para validar tudo?? How loswtrtyooeooe?
Howm i dW>*oosee?
Detofbe ai!
What <JSdthey do to you?
rotnwulivio de 0weh, visto Have yon stm my iKFane'

an-fccricmrKCnie nesie livy, e m


cxemplo de to*no o -fsip de fcev-mos
mSis tdmfos !r>0 fov-nnuldvio results
Cn> i&rmos tdtoben* un* cuonte de
Anytfetogfc j '* to adi?
detUratozs i-P a*i*Hadas.

if (!empty($first_name)) { Tnto anmhaiweivfc


if (!empty($last_name)) { -fcov-na di-ffal maivtev o
if (!empty{$when_it_ ^ " otttvolc e quantas
happened)) { haves pvetisa* sev
if (!empty ($how__long) ) { usds e que leaves.
if (!empty ($how__many) ) {

Joe: Acho que voc tem razo. Se quisermos nos certificar de que
todos os campos estejam preenchidos, precisaremos colocar uma
FW J M declarao if para cada campo.
Frank: Mas desde que faamos a indentao da linha de cada declarao,
estar tudo bem, certo?
Jill: Tecnicamente, sim. Quer dizer, o cdigo certamente vai funcionar, no importa quantos ifs ns
colocarmos. Mas eu me preocupo se ele no vai ficar difcil de entender, com tanto aninhamento.
Colocar as chaves corretamente poderia se tomar um problema.
Frank: Isso verdade. E eu acho que tambm seria trabalhoso ter de indentar o cdigo de ao que
temos at aqui... vejamos, so dez campos no formulrio, o que nos d dez ifs aninhados, com dez
nveis de indentao. Mesmo se cada if for indentado com apenas dois espaos, isso d 20 espaos
antes de cada linha do cdigo. Nada bom.
Joe: Mas se indentarmos com tabs, isso diminui pela metade - 10 tabs em vez de 20 espaos no to ruim
assim
Jill: Pessoal, a questo no o modo como ns indentamos os ifs aninhados. E que simplesmente
no uma boa prtica de programao colocar tantos ifs uns dentro dos outros. Pensem desta
forma - o que estamos realmente falando de uma condio de teste lgica, todos os campos do
nosso formulrio esto no-vazios? O problema que essa condio de teste envolve dez dados
diferentes, fazendo com que ns tenhamos de dividi-la em dez declaraes if separadas.
Frank: Ah, entendi. Ento o que precisamos de uma forma de verificar todos os dez dados em uma
s condio de teste, certo?
Jill: Isso.
Joe: Ento ns poderamos escrever uma s condio de teste gigante, para verificar todos os
campos do formulrio de uma s vez. Seria timo
Jill: Sim, mas ainda no temos o pedao do quebra-cabea que nos permitir combinar diversas
comparaes em uma mesma condio de teste...
aplicaes realistas e prticas

teste mltiplas condipes com ANP e OR A 16gici do


possvel construir uma condio de teste para uma declarao TH? t o m
if com diversas verificaes conectando-as atravs de um operador pogsVel
lgico. Vamos ver como isso funciona com duas condies familiares,
!empty ($subj ect) e !empty($text). Este primeiro exemplo envolve duas elaborat
expresses conectadas atravs do operador lgico AND (e), que
codificado usando-se && . Os fa t ie s e*tras ajudai a dei*ar d e c la r a e s !

0 operador
dlaro ^ue o c fc rs c * de ne^ado s se
apsda a -funo emptyO..
ma!s elegantes-
ISjito AND- % ^
o A r ^ l g ic o e
if {(lempty ($subject) ) |!||| (lempty ($text) )) {
dondidao de iesie s e verdadeira se tanto c p d iic a d o c o m o
fsubjedt \v>a*to fte * t ao estwere** vazias.
encjuant9
O operador AND toma dois valores true/false e lhe retorna true
somente se ambos forem verdadeiros; caso contrrio, o resultado c(ue 9 O R l gfco
false. Assim, neste caso, ambos os campos precisam estar no-vazios
para que a condio de teste seja verdadeira e o cdigo de ao da codificado
declarao if possa rodar. c o m o ||.
O operador lgico OR (ou), codificado como ] |, semelhante a
AND, exceto pelo fato de que ele resulta em true se pelo menos um
dos dois valores true/false for verdadeiro. Eis um exemplo:
if ((!empty($subject)} !| (!empty ($text) ))
Es-fca dondida t teste ^U hO O yiUlVi^O
verdadeira se fsvbjedt OU fte x t dus birfs
estiver no-vazia. ida na parte de dima da
Assim, o cdigo de ao para esta declarao if executado se ^ ^ b r r a mvertida (\), no
um dos campos do formulrio estiver no-vazio. As coisas ficam
ainda mais interessantes se voc quiser isolar um campo como
estando vazio, mas com o outro tendo dados, desta forma: fswbjedt^vtdisa estar
vazia e fte * t predisa
if (empty($subject) (!empty($text) )) estar nac-vzja para
Uma vez que esta condio de teste usa AND, ambas as esta dondido de teste
expresses dentro dela precisam ser true para que o cdigo ser verdadeira-
da ao possa se executar. Isso significa que o campo Subject
(assunto) do formulrio precisa estar vazio, mas o campo
Body (corpo da mensagem) precisa ter dados nele. Voc pode
inverter essa verificao passando o operador de negao (!)
para a outra funo emptyO: M* s
if ( ( ! empty ($subject)) jfjiil empty ($text)) { h^o estiver vazio e /te *to
^ ^ estiver.
Os operadores lgicos AND (ScSc) e OR (||)tornam possvel elaborar
condies de teste muito mais poderosas que, de outra forma, necessitariam
de muitas, e frequentem ente bagunadas declaraes if.

voc est aqui 179


eliminando o aninhamento da declarao i f

Reescreva as sees salientadas do scrip sendemail.php para que ele


use operadores lgicos em uma nica condio de teste, em vez de declaraes
if aninhadas.

<?php
$from = 'elmer@makemeelvis.com';
$subject = $_POST['subject'];
$text = $ POST['elvismail']; aa
- cstao nossas dediavaes
i aninhadas. Re-esdveva usando
uma unida dedlaradao i e tom
..m,...^ o&eradores lgido . v e

$dbc = mysqli_connect('data.makemeelvis.com', 'elmer', 'theking',


'elvis_store')
or die('Erro ao se conectar com o servidor MySQL.');

$query = "SELECT * FROM email_list";


$result = mysqli_query($dbc, $query)
or die('Erro ao consultar o banco de dados.');

while ($row = mysqli__fetch_array ($result) ) {


$to = $row['email'];
$first_name = $row['first_name'];
$last__name = $row ['last_name'];
$msg = "Caro(a) $first_name $last_name, \n$text";
mail($to, $subject, $msg, From:' . $from);
echo 'Email enviado para: ' . $to . '<br />';

mysqli_close($dbc);
P l f fe ta s th a v e fe th a -
P i ------- " as duas d r t l M ^ e . *

?>
aplicaes realistas e prticas

TfeST O R tve________________

C ertifique-se de que os operadores lgicos no script "


"Enviar Em ail estejam fazendo o m esm o trabalho que as
d eclaraes if aninhadas.
M odifique o cdigo de s e n d e m a il -php para usar um a nica
declarao if que tire proveito dos operadores lgicos para verificar os
dados do form ulrio, antes de enviar as m ensagens de email. Consulte
a soluo do exerccio na prxim a pgina, caso no tenha certeza sobre
como fazer as modificaes.
Envie a nova verso do script para o seu servidor web e abra a pgina
sendemail.html em um navegador. Certifique-se de deixar pelo menos
um dos campos em branco e clique em Submit. O script ainda impede as
mensagens de serem enviadas quando um campo deixado em branco?

m existem
perguntas id!tas
I - Faz diferena a ordem em que voc coloca * vi cdigos PHP que usam and e or em vez de
as duas conexes ligadas por && ou [j em uma && e ||. Como isso funciona?
declarao if?
Eles so praticamente a mesma coisa que &&
Sim. 0 motivo que o funcionamento desses e 1|. H uma ligeira diferena no modo como eles so
dois operadores pegam atalhos sempre que possvel. avaliados em relao a outros operadores, mas, se
0 que isso significa que, se o primeiro operando for voc tiver o cuidado de usar parnteses para tornar
suficiente para determinar o resultado da expresso, as suas condies de teste claras, ento no haver
o segundo ignorado. Por exemplo, se o primeiro nenhuma diferena essencial.
operando de uma expresso AND for false, isto
suficiente para fazer a expresso inteira ser false,
independentemente do segundo operando, de modo
que este ignorado. A mesma regra se apfica quando
o primeiro operando de uma expresso OR true.

voc est aqui 181


sendemail.phpagora sem declaraes i f aninhadas

Reescreva as sees salientadas do script sendemail.php para que ele use


CO operadores lgicos em uma nica condio de teste, em vez de declaraes if
aninhadas.
SoLuo

<?php
$from = 'elmer@makemeelvis.com';
$subject = $_POST[subject]
$text = $ POST['elvismail']; h . opevad MOT 0), <** ?>
thttzc se Ka dam?os no-vazios no Wmulano.
( 1o m p ty ( $oub joo-t )) { Ns Podemos usar AHT> m m
---- ^ r f ' ? " mbas as fiondiocs, Cm uma
ii-"'(!ompty ($tcxt) ) i .. r.. '

. ,'.((!e.^pty(??ubjedt)) s dediaraao A
^ Lembre-se, ff o modo domo vode
........................................................................ espedi&da o ofevador lgido AND-
$dbc - mysqli_connect('data.makemeelvis.com', 'elmer', 'theking',
1elvis_store')
or die('Erro ao se conectar com o servidor MySQL.');

$query = "SELECT * FROM emailJList";


$result = mysqli_query($dbc, $query)
or die('Erro ao consultar o banco de dados.');

while ($row = mysqli_fetch array ($result) ) { -rj r.


$to
H O = $row
yJ- O w L [-Semail'
I 3 .1 - L ]
j /; ^ jT lj w 'ff* dtnhro
$first_name = $row[ ' first_name ' ] ; edro t+ deve ser
^ 1 u ^
$last_name ___ ____
= (*<_____
$row[' r T 1^ i_ ________ I 1
last_name '3; reduado iiMu h f i Mnvel
I J .
de em um
$msg = "Caro (a) $first_name $last_name, Xntex^d^taao, uma vez. que
mail ($to, $subject, $msg, 'From:' . $from) ; agora ele reside dentro
echo 'Email enviado para: ' . $to . '<br />'; uma unida dedlraao i

mysqli_close($dbc);
Tendo apenas uma dediaraao i, ns s
rdismos de uma dKave de fedKamen-fco.

?>
aplicaes realistas e prticas

Os usurios do formulrio precisam


de uma resposta
O cdigo do nosso script s e n d e m a il .p h p faz um bom trabalho ao

fnfhorideia
validar os dados do formulrio, com o objetivo de im pedir que emails
!er ve esta pa$iwa
sejam enviados caso o campo Subject (Assunto) ou o Body (Texto) luftdo subm ete o
sejam deixados em branco. Mas quando a validao falha, e no so +ormu!ivio... e n3o
enviados emails, o script no informa a Elmer o que aconteceu. EU
te a do
apenas uma pgina web em branco. porque!

que aconteceu? Eu
tentei usar o novo formulrio e
tudo o que recebi foi uma pgina em
branco.

O problema que o nosso cdigo s reage a uma validao com


sucesso, em cujo caso ele envia as mensagens de email. Mas se a
declarao if acabar sendo false (dados do formulrio invlidos),
o cdigo no faz nada, deixando Elmer sem saber se foram
enviados emails ou no, ou ento o que deu errado. Eis aqui o
cdigo abreviado, que revela o problem a da pgina em branco:
<?php
$from = 'elmer@makemeelvis.com';
$subject = $_PO ST ['subject'];
$text = $ POST ['elvismail'];

if ((!empty($subject)} && (!empty($text))) {


$dbc = mysqli_connect {'data .makeimeelvis .com', 1elmer1, 1theking'
'elvis_store1)
Nao aontede *ada se a dedaraa vf -falhar ao
mysqli_close($dbc);
e*eutar o d'y> de ato, eef&r isso <\ue e
?> ^ ___________ "" gerada uma ^a^ma e bvato <\<*ado al^u tamfo
do -ormulvio teriKa -fitado e b^a^o.
Precisamos avisar a Elmer que houve um problema, de preferncia
dizendo a ele quais campos do formulrio ficaram em branco, para
que ele possa tentar digitar novamente a mensagem.
voc est aqui 183
a clusula else

Sem problemas. Basta colocar


uma declarao echo depois da
chave que fecha a declarao if .

Isso no vai funcionar, porque o cdigo depois


da declarao if sem pre ser executado.
W "
Colocar a declarao echo depois da declarao if s significa
que a primeira vai rodar depois da segunda, mas ela sempre
roda - independentem ente do resultado de if. No disso
1rlfl que precisamos. Precisamos que a declarao echo mostre
uma mensagem de erro apenas se a condio de teste da
declara if for false. Voc pode expressar esta lgica da
seguinte forma:
I
SE Subject contiver texto E Body contiver texto

ENTO enviar email

X CASO CONTRRIO exibir mensagem de erro

A declarao if oferece uma clusula opcional, else, que


executa algum cdigo no caso de a condio de teste ser
false. Assim, a nossa mensagem de erro colocado dentro de
uma clusula else, e portanto, s executado quando um dos
campos do formulrio for deixado em branco. Basta colocar
a palavra else depois da declarao if, e depois colocar o
respectivo cdigo de ao dentro de chaves

?subj ect)) && (!e m p t y ($text))) {

insere o Co'^ 0
envia as mensa^e*
de ewii-

e s q u e c e u do a s s u n t o e /o u do c o rp o da
aplicaes realistas e prticas

Segue abaixo o novo cdigo para o script sendemail.php de Elmer, usando


declaraes if e clusulas else para fornecer feedback, mas partes do cdigo se
perderam. Coloque os ms corretamente no lugar do cdigo que est faltando.

// Ns sabemos que tanto $subject e $text esto


'faltando
// $subject est vazia
<?php est certo, enviar emails
$from = 'elmer@makemeelvis.com';
$subject = $_POST [.'subjectT]; // $text est vazia
$text = $ POST['elvismail'];
...r.. .Q. .e .3 .v .k )^ . .

&
}
else {

.......
// Ns sabemos que um dos dois, $subject ou $ text, est faltando -
vamos descobrir qual deles

/ e-\"\
< 2 r-
echo 'Voc esqueceu do assunto.<br />';

else (

echo 'Voc esqueceu do corpo da mensagem.<br />';

}
else {

m . .

while ($row = mysqli_fetch_array($result)) {


"$to = $row['email1];
$first_name = $row['first_name'];
$last_name = $row['last_name'];
$msg = "Caro{a) $first_name $last_name, \n$text";__________
mail($to, $subject, $msg, 'From:' . $from); I empty($text) |
echo 'Email enviado para: ' . $to . 1<br />
>

mysqli close($dbc);

?>

voc est aqui 185


soiuo exerccio

Segue abaixo o novo cdigo para o script sendmail.php de Elmer, usando


declaraes if e clusulas else para fornecer feedback, mas partes do cdigo se
RC C 0 perderam. Coloque os ms corretamente no lugar do cdigo que est faltando.

SoLuo O i externo thet se o assu*-k> c 0


<?php texfco esfcSo vtos. e nao H apenas
$f rom = 'elmer@makemeelvis.com'; ^ 3 opoes a*bas esto preewthidos o
$subj ect = $_POST [-subj ect']; / ***tc esU altado, ou o texto do
$text - $_POS.T ['elvismail ]; f rpo do er*>ail est alkndo

if jmpty{$subj ect) empty($text)


m
ii Ns sabemos que tanto $sub:ject e $text esto faltando

else {
if |( pempty ($subj ect) I li "] empty($text)
F m
// Ns sabemos que um dos dois, $subject ou $ text, est faltando - vamos
descobrir qual deles
if [( empty ($subj ect) J )

// $subject est vazia


*rnimmwlfmmn*'
echo 'Voce esqueceu ao assunto,.<br />';
,/.

}
else {
// $text est vazia

echo Voc esqueceu do corpo da mensagem..<br />';

}
else {
// Tudo est certo, enviar emails
~WWtwW??WT''
Heste yor>to passages pov
while {$row = mysqli__fetch__array {$result)) { \^_ iodos 3s possibilidades,
$to $row [email ]; ^tao, sabemos *\we a*bos
$first_name = $row ['first_name 1]; d.3pos do Tormwlavio
$last_name = $row ['last_name ']; towt* valores-
$msg = "Caro(a) $first_name $last_name, \n$text";
mail($to, $subject, $msg, 'From:' . $from);
echo 'Email enviado para: ' . $to . '<br />';
}

mysqli close($dbc);

?>

A O i? ___ . f - &
aplicaes realistas e prticas

Todos esses ifs e elses aninhados


esto tornando o script difcil de ler. Eu
detestaria ter que trabalhar nesse script!
Ele precisa ser simplificado, antes que
algum se machuque..

sem pre um a boa ideia sim plificar


cdigo sem pre que possvel,
esp ecialm ente, cdigo com m uitos
nveis de aninham ento.
Uma quantidade muito grande de clusulas e l s e
com declaraes i f aninhadas pode tom ar o
seu cdigo difcil de ler. Talvez isso no fizesse
diferena caso ns nunca mais tivssemos que
olhar esse cdigo, mas isso bem improvvel. Se
algum dia precisarmos modificar o formulrio
para adicionar um novo campo, valid-lo seria
mais difcil do que precisa ser, porque seria
muito difcil ler o cdigo e entender onde as
modificaes precisam ser colocadas.

voc est aqui 187


o c d ig o t f lim p o

d n e fo 0 ^

$ H T A -~ S E c o m ^ c o jig p i p S p ] u l a 9

S ua ta re ia 4 interpretar o papel do cdigo ip e limpar


o cdigo dos lF s e EL'SEs aninhados. ReescreVa
o odg de modo a se livrar do anin^am ent^, mas
ceiti6 c]ue-se- de <jue- ela ainda unciynar
corretamente.

if (empty($subject) && empty($text)) {


echo 'Voc esqueceu do assunto e do corpo da mensagem.<br
/> ;
} else {
if (empty($subject) || empty($text)) {
if (empty($subject) {
echo 'Voc esqueceu do assunto.<br />';
} else {
echo 'Voc esqueceu do corpo da mensagem.<br />';
Aquij estamos }
testando $e } else {
tanto 3 varivel //
Tudo est certo, enviar emails
fsob'vett <\uaK 1
a ffte
f c *- t estso
*
vazias
f (emptyf/subjedO && em pty(fte*t)) {
edbo Vode esquedeu do assunto e do dorpo da mewagem..<br />*;

Aqui, estamos \ ........................................................................dodgo verifida se fsubjedt


st j- (IfifbjfM )' { ^ ^ * t o-

e jsu b jt i est . >!?. V o es>ewu do assto. <W / > ) .............. & ^ estivssemos a * * AND
hao-vazia. } ------ 77!------------( ff) para isolar o te xto ao-vazio de

edKo Vode se esquedeu do dorpo da mensagem .cbr desnedessaria- 0 mesmo 3do*tede para
j ------ "** ---------- ^ fsubjedt e fte * t ovazias.

^ ^ it; \vijh..jr.v/:/...Tyfcvv..
^/epty(fsubjedt)) . && 9 perdor
....Tv.ryN)T j(0 ver-fida
. f /1se t*t n 1^0
E y i , U Tudo fsii ^ , yjJr ^ a,|s ................. fsbj * ie%i t s & *>-**
-testando se
nem fsubjedt } ...............................................................................................................................
nem fte * t
esto vazias.
aplicaes realistas e prticas

Estou chocado. Quando me esqueci ^


de digitar o assunto no formulrio,
recebi esta pgina. Mas quando cliquei no
boto Back (voltar), tive de redigitar a
mensagem inteira.

A validao no script Enviar Em ail de Elm er est


funcionando, mas ela poderia ser um pouco m ais til.
Quando o script s e n d e m a il . php detecta que esto faltando
dados no formulrio, ele exibe uma mensagem dizendo que
alguma informao est faltando, mas s isso. No h um link para
voltar ao formulrio original, por exemplo. E, pior ainda, quando
Elmer navega de volta para o formulrio original, as informaes
que digitou no esto mais l. Ele tem de redigitar o assunto e o
corpo da sua mensagem.

CXfcRESRO
O que voc faria para melhorar o tratamento de
erros do script Enviar Email, de modo a torn-lo
mais til?

voc est aqui > 191


regenerando o cdigo HTML do formulrio

Seria legal exibir o formulrio junto


( com a mensagem de erro. Ser que no j
V poderamos simplesmente exibir o formulrio J
J ( com echo, no caso de o assunto e o corpo do y
^ ---- - t exto estarem vazios?

Exibir o form ulrio d efinitivam ente seria til, um a vez


que assim Elm er no precisaria navegar de volta
pgina original.
Assim, alm de apresentar uma mensagem de erro quando um dos
campos do formulrio deixado em branco, ns precisamos tambm
ressuscitar o cdigo HTML a partir do PHP, usando echo para envi-
lo ao navegador. Este cdigo mostra que o PHP capaz de gerar
cdigo HTML razoavelmente complexo:

echo ' <label for="subject">Subject of email:</label><br />';

echo ' cinput id-"subject" name="subject" type-"text" ' .

'size="30 " / x b r />T;

echo ' <label for="elvismaii">Body of email:</iabelxbr />';

echo ' <textarea id="elvismail" name^'elvismail" rows="8"

1cols="40"></textarea><br />';

:ype="submit" name="submit" value="Submit" />';

ajvtdd a visualiza*-
a cstvuWa do par-te, e mais -fdil usar aspas
tdigo HTML.
simples para esdrever strings de
dd.50 HTML cm pf}p.

Se voc estiver achando este cdigo um pouco catico, porque ele


mesmo. S porque voc pode fazer algo em PHP, no quer dizer que voc
deva faz-lo. Neste caso, a complexidade adicional de se enviar todo esse
cdigo HTML atravs de echo um problema. O cdigo to grande que
ger-lo atravs do PHP, com a declarao echo, realmente no uma boa
opo...
aplicaes realistas e prticas

Facilite a entrada e a sada do PHP Vbce pode ecfecU'


As vezes fcil esquecer que um script PHP na verdade apenas
uma pgina HTML capaz de armazenar cdigo PHP. Qualquer
e abtf tjocpg de
cdigo, em um script PHP, que no esteja dentro das tags <?php e c d i g o p j j p p q j ^
?> presumido como sendo HTML. Isso significa que voc pode
fechar um bloco de cdigo PHP e reverter ao HTML conforme enVicD: pedct^S de
necessrio, e depois comear de novo com um novo bloco
de cdigo PHP. Esta uma tcnica extremamente til para se cdigo HTML de
transmitir um pedao de cdigo HTML que seja grande demais
para ser gerado atravs de declaraes echo do PHP... como por denfto do script ?HF-
exemplo, o cdigo do nosso formulrio Enviar Email..
<?php 0 -formulrio
Esta ta$ $from = 'elmer@makemeelvis.com'; dodi-fidado Como
$subject = $_POST['subject'] HTML noTml,
?> -Iredha o
$text = $ POST[1elvismal];
blodo PHP, vez. <^ue este cdigo
nos levando if (empty($subject) && empty($text)) { +iCd ora das tags
de volta 30/ j sakem0s que tanto $subject e $text esto faltando PHP.
HTML- ^ echo 'Voc esqueceu do assunto e do corpo da mensagem

A tag inidia um novo blodo de ddigo Uma vez. <^e ainda


vez- *V*e ainda estamos dentro da estmos dentro
<?php- adao de i, temos de edhar a dedlarado da ao de , o
} antes de dontinuarmos- ddigo HTML s
if (empty(subject) && (!empty($text))) { exibido se ambos os
echo 'Voc esqueceu do assunto.<br />'; dmpos do -formulrio
estiverem vazios.
.f ((!empty($subject)) && empty{$text)) {
echo 'Voc esqueceu do corpo da mensagem.<br />';

if ((!empty($subj ect)) && (!empty{$text))) {


// Cdigo para enviar o email

?> Escreva abaixo qualquer coisa que voc considere que esteja
limitando este cdigo. Como voc o consertaria?
.v. 'k : v :..

voc est aqui 193


evitando code duplicado com uma flag

Use um flag para evitar cdigo dDplksto duplicado


O problema com o cdigo anterior que ele precisa sair do PHP e repetir o
cdigo do formulrio em trs lugares diferentes (um para cada validao).
Ns podemos usar uma varivel true/false, conhecida como flag, para nos
mantermos a par sobre a necessidade ou no de enviar o formulrio. Vamos
cham-la de $output_form. Ento, poderemos verificar a varivel mais adiante no
cdigo, e exibir o formulrio caso ela seja true.
Assim, ns comeamos o script com $output_form definida como false, e s a
modificamos para true se algum campo estiver vazio e precisarmos exibir o formulrio:
*frf*niv ?^tput_jform inicialmente
inicialize $output form como false ^ ^ue -f<**mulario
nao sgr exibido a no ser que haja
um problema de validado que -faa o
valor se modi-fitar.
SE Subject est vazio E Body est vazio

Estas meKsagefts ENTO exibir mensagem de erro, definir $output_form como true
de erro so ^ *7 K ^ p
------ --------- \. Se um tampo -ror
li^eirameht
deixado em brando,
di-ferentes,
para mdifiar SE Subject estiver vazio E Body NO estiver vazio
a variave! ?output_
form e de-f mida
oU) tampo(s)
espedrfidofs)
y E N T O exibir mensagem de erro, definir $output__form tru, mas o tomo
^ \c o m o t r u e j^ -formulrio nao e
que esteja(m)
exibido-- ainda!
vaso(s).

ENTO
/
exibir mensagem de erro, definir $output_form como true

Se ambos SE Subject NO estiver vazio E Body NO estiver vazio


os tampos .
contiverem y ENTO enviar emails
dados, v em_________
rente e envie
os emails.
SE $output form for true

ENTO exibir formulrio Finalmente, veri-fidmos a varivel


?output_-form para ver se o -formulrio
predisa ser exibido. De uma -forma ou de
outra, s pretisamos que o dodi^o HT/VjL.
aparea uma vez. .
aplicaes realistas e prticas

Codifique o formulrio HTML apenas uma vez


Transformar o novo cdigo de validao em cdigo PHP envolve a Ap tPVnat 9 c6dgo
criao e a inicializao da varivel $output_form, e depois garantir
que ela v ser definida ao longo de todo o cdigo de validao. Mais H7KL dependente
importante a nova declarao if ao final do cdigo, a qual s exibe de uma declarao
o formulrio se $output_form for definida como true.
F, ns eVItamos
<?php duplicao de
codgo
$from = 'elmer@raakemeelvis.coin'
$subj ect = $_POST [.sub ject ']; Mos. d riamos nossa n9 npssp
$text = $_POST['elvismal'];
$.output forrr.^ ifaI&e;",.
hova variavei a^i, e a
de-fi*imos
^ script.
tem o -false-.
if (empty{$subject) && empty($text)) {
// Ns sabemos que tanto $subject e $text esto faltando
echo 'Voc esqueceu do assunto e do corpo da mensagem.<br />';
Sou tpu t_ o rrc = true; ' Peme a varivel true se tanto tomo
} fsu b je d t yd**50 ? t e * t estiverem
Yr *\ue o ormuirio seja exibido-
if (empty($subject) && (!empty($text))) {
echo 'Voc esqueceu do assunto.<br />';
i S i l i l l B i S l l l c u e ;. ^ _ Tmbem deine a varivel 0mo
} true se fsubjedt estiver vazia-
if ((!empty($subject)) && empty($text)) {
echo 'Voc esqueceu do corpo da mensagem.<br />';
llllllI llllB il ll ----- t deme a varivel domo true
} se fte x t estiver vazia-

if ((!empty($subject)) && (!empty($text))) A<\m, ja samos do ddi^o PHP,


// Cdigo para enviar o email mas tudo <^ue estiver antes
da } de edharwe^to ainda
Esta dedaraao i ve rtid a a
dosiderado domo parte da
variavel f w tp v t.o r * * ' e exibe o ao de i-P - neste daso, o
formulrio daso el seja tru e -
^ ddigo HTML do ormulario.

Kao se esquea de v o lta r ^ 0 digo ttT/VjL so afrede uma


ao dd'150 PH P e -fedbar vez. desde <\ue resolvemos dolodar
a dedlaraao i. toda a io^ida da sua exibidao em
uma SO vaviavei; ?outfut_fcrm .

voc est aqui 195


os dados do formulrio continuam desaparecidos

O novo formulrio melhor, mas


eu ainda tenho de refazer o que eu j
havia digitado corretamente, o que
muito irritante.

O HTML sozinho no capaz de p reservar dados de


form ulrios.
Quando Elmer submete o formulrio Enviar Email com um campo
vazio, o script s e n d e m a i l . php captura o erro e gera um novo
formulrio. Mas o novo formulrio puro cdigo HTML, o qual
no tem como saber nada sobre quaisquer dados que Elmer possa
ter digitado anteriormente. Assim, estamos gerando um formulrio
totalmente novo, como parte da validao, o que apaga quaisquer
dados que Elmer possa ter digitado

Pados \ue Elier adidentalmente


Elmer diyfcou o dci*ou este dampo em
omulTto- brando-

Iodos OS dm pos
Esta mehsa^e* de sendemail.html a$ra est< sendemail.php
erro sivfovma Elmer vazios, porque
*|ue ele dei*ou um este e um
dampo em brando. orrrulav-io fcOVO 0 -formulrio t submeti
em olWa ao sdript sendemail.pbp
^undo Elmer dlida no
botao Submit Submete

Pssimo. No conseguimos contornar o fato de que um novo


formulrio ter de ser gerado no script PHP. Nos precisamos
de uma forma de preservar quaisquer dados que Elmer j tiver
digitando, colocando-os no novo formulrio para que ele possa
se concentrar em preencher apenas o campo que acidentalmente
deixou vazio...
aplicaes realistas e prticas

Aponte seu lpis------------------------------------------


Esboce aqui como voc gostaria que fosse o com portam ento do
form ulrio de Elmer depois que ele o submete com apenas o prim eiro
campo preenchido. Em seguida, escreva como voc acha que cada um
dos arquivos (HTML e PHP) deve ser alterado para executar esta nova
funcionalidade.

mm

sendemail.php

' j) ............. / ..... ..............

. .jy-ry.r^r?.
..

voc est aqui 197


faa o formulrio permanente"

- scolpis--------------------------------- -----

Esboce aqui como voc gostaria que fosse o com portam ento do form ulrio
de Elmer depois que ele o submete com apenas o prim eiro campo
preenchido. Em seguida, escreva como voc acha que cada um dos arquivos
(HTML e PHP) deve ser alterado para executar esta nova funcionalidade.

A dc
erro iftd t ->
CCibid--- mas o Sdript amd se
lembra dos dados <^ue
ler digitou e os insere
m hevo formulrio.
E s te dampo permnede vazi
porque Elm er rto digitou
hds nele n primeira vez-.

B
sendemail.php sendemail.html

.C f. sdript PHP assume, a.ta.r-fa,d..... e exibirmos p.f^mulario..............


. c.^lbtr o ^m ulario, .antes. e depois .V^ii^f^te .atravs do sdript. PHP,
da submisso. E uma vez. <^ue o podemos eliminar a pagina HTML-,
sdript tem adesso a. ^uais^uer .dados uma. ,yez ,^ue,o .sdript. PHP .ira. coibir.
\ue thbam sido dijitados^ ele e prodessar o formulrio. Ao fazer
p<^e ihseriv- esses dados no novo isso, o sdript PHP, pode, adessar e.....
oy-mulrio, \uahdo este fo r gerado, usar ^uais^uer dados digitados no
jsto resolve o problema de. Elmer te r formulrio,. o ,^ue.e. impossvel, dom.....
f^ue rdi^itar dados ^ue j tenha..... dodigo .HTML .puro..........................
preendhid-
aplicaes realistas e prticas

Um formulrio que referencia a si mesmo


Como possvel ter o formulrio Enviar Email sem o arquivo Um formulrio
se n d e m a 1 . htm l? A resposta que ns no estamos na verdade
eliminando o cdigo HTML, estamos apenas transferindo-o para HTML c[iie aa
o script PHP. Isso possvel devido ao fato de que um script PHP parte de um
pode conter cdigo HTML, como uma pgina web normal. Assim,
ns podemos estruturar nosso script de modo que ele no somente sctlpt YHF <jue
processe o formulrio aps a submisso, mas tambm o apresente o ptPCesse e
desde o incio, que o que s e n d e m a il . h tm l estava fazendo.
A chave para o script sendemail.php ser capaz de desem penhar o
contecido como
papel de s e n d e m a il . h tm l a ao do formulrio. Uma vez que a u tP - r e e r e n te .
o prprio script agora contm o formulrio HTML, a ao nos leva
de volta ao script... um formulrio que referencia a si mesmo.

fsfo 'Vs
de sendem3sl-WW ~
os usurios *ve$3v5o
direiament 3^* 0 sdript midialyr\ente
sdript PHP f>ars usar Subftie^v-/ ostra c -formulrio e
o -formulrio. depois o prodessa, guando
ele t submetido- 0
Os dados do -formulrio so
prodcssament resulta ou
$ubme-idos do mesmo sdrip*t, o envio de emaiis ou na
Swbmater re-exibio do -formulrio
o <\ul prodessa e exibe
dom uma mensagem de erro-
ftovame>vte o -formulrio, ms
desta vez. cie preserva os
dados j digiiados.
sendemail.php
Para entender o que est acontecendo aqui, pense na primeira vez que Elmer
visita a pgina (script). Um formulrio vazio gerado como cdigo HTML, e
exibido. Elmer preenche um campo do formulrio e clica em Submit. O
script processa o seu prprio formulrio e exibe uma mensagem de erro se
quaisquer dados estiverem faltando. Mais importante, o script exibe o formulrio
novamente, mas desta vez inclui quaisquer dados que Elmer j tenha digitado.
Quando um formulrio inteligente o suficiente para se lembrar de dados
inseridos em submisses anteriores, ele conhecido como permanente... os
dados permanecem nele!

Os {pOTultlPS
permanentes se CfcEWO
lembram <k>s dadps Como voc acha que podemos modificar a
c[ue o usurfp ja tlVer aplicao de Elmer para tornar os campos do
formulrio permanentes?
d ig ita d p c o rr e ta m e n te .

voc est aqui 199


faa a ao do formulrio auto-referente

Aponte a apo do formulrio para o script


Como j vimos algumas vezes, o atributo action da tag <form> o que
conecta um formulrio a um script PHP que o processa. Para permitir
que o fo rm u l rio de E lm e r processe a si m esm o, o q u e o p rim eiro
passo para tom-lo perm anente, voc direciona a ao do formulrio
para sendemail.php. Na verdade, o formulrio j tem o seu atributo
action direcionado para o script:

0 atributo adtion da tag <&**> toneeta 0 -formulrio


a o prodessa - neste tssc o mesmo sdript
sendemail.php que armzna o -formulrio

<form action = nHlftlHSil|i" method="post">


L-y_J f f i l l I i l l l f f l ! l (_______ _J
A fcsta e um tag <-form> padro, que As
V ^ usa P0ST para submeter os dados __ /
do -formulrio ao sdript-

Este cdigo funciona, presumindo-se que voc nunca renomeie o script e se esquea de
atualizar o cdigo. Mas h uma forma melhor, que funciona em qualquer caso, porque
ela no depende de um script especfico. Trata-se da varivel superglobal interna do PHP
$_SERVER[PHP_SELF], que armazena o nome do script atual. Voc pode substituir a
URL do script, na ao do formulrio, por $_SRVER['PHP_SELF'], e ento jamais ter
de se preocupar em atualizar nada, se algum dia tiver de m udar o nome do script.
O nico seno que $_SERVER[PHP_SELF'] cdigo PHP, o que
significa que voc tem de enviar o seu valor atravs do comando echo, para
que ele seja exibido como parte do cdigo HTML, desta forma::

\\ vez- d< estrever o nome do sdript


permanentemente no di$o, podemos
instrulo a re-ferentiar a st mesmo, usando
superglobal 1-

<form methott="post">

claro que usar $_SERVER ['PHP_SELF'} em vez do m m e


do script no um aprimoramento espetacular, mas uma T 3 e h v b ^ i t h t _
das pequenas coisas que voc pode fazer para facilitar a __
manuteno posterior dos seus script. v t/L /T J f f c l Z & f l c t 9
r iP U le J p s c r i p t a t u a l .
aplicaes realistas e prticas

TfeST Or iv e

T e s te o novo s c rip t a u to rre fe re n te , com a l g ic a de


v a lid a o ap rim o rad a. 0
Modifique o cdigo de sendemail.php de modo que ele use a varivel $output_
form para exibir o formulrio seletivamente, como mostrado algumas pginas
atrs. Modifique tambm o a trib u to ^ c t io n da tag <form > de modo a tornar
o formulrio autorreferente.
Voc no precisa mais da pgina s e n d e m a i l . h tm l no seu servidor web,
portanto, esteja vontade para apag-lo. Em seguida, envie a nova verso
do script sendm ail.php para o seu servidor e abra-o em um navegador. Est
tudo funcionando?

Por lgum motivo, O


script esta mostrando
uma me*sa4em de erro,
embora o formulrio Mak^MisELVfs.eoM
fio tinha nem sido Private:For Hlinefs use ONLY
WHte arri sand an email to mailing Sistmembers,
submetido... nada bom.
(^You forgot the email subject and body S&xt)
SSUjtwltrfewiaii. ... . .

t r .
fc: *3o t so isso*
amda ao esta
f o r m u l r io
preservando os dados
distados. P(\v\d&temos
trabalb a fa r!

iffPlW??? Wff?

Mas vamos domedr pelo domeo-


Logo passaremos para a parte \
da preservado dos dados. )

Escreva aqui o motivo pelo qual voc acha que o script est mostrando uma
mensagem de erro na primeira vez que o formulrio mostrado.
.. . j u d p . * .... . .p.->.. ...-/k.. ..
....................................... ...............
' ' / ? *

voc est aqui 201


verifique o $_POS T[submit]

Verifique se o formulrio foi submetido


O problema que o script no capaz de distinguir entre o formulrio estar sendo exibido pela
primeira vez e estar sendo submetido com dados incompletos. Assim, o script relata o problema
de dados faltando na primeira vez que o formulrio exibido, o que confuso. A questo :
como podemos verificar se o formulrio est sendo submetido? Se tivermos essa informao,
podemos nos certificar de s validar os dados quando houver uma submisso.
Voc se lembra de como os dados so armazenados no array $_POST, quando um
formulrio submetido usando-se o mtodo POST? Se o formulrio ainda no tiver sido
submetido, ento o array $_POST ainda no ter sido preenchido com quaisquer dados.
Ou, colocando de outra forma, o array $_POST ainda no ter sido definido. Alguma
sugesto de qual funo poderamos chamar para ver se o array $_POST est definido?
)o issrtO ver-fid se uma
-unac
varivel o i de-mtd- Bstfi deve ser o mesmo nome da bg
<ipu> usada dom o seu boiao Submit
2 A supejrglokal
if ( li l l li l l iillilliiil ) {

$ualruer dodi^o 3<\ui so sera e^edu'tado $_POSTnes


se o formulrio tiver sido submetido-
permite Verilcci
Uma vez que todo formulrio tem um boto Submit, uma forma
fcil de se verificar se o formulrio foi submetido ver se existem se um formulrio
dados em $_POST para o boto Submit. Os dados so apenas
o rtulo do boto, o que no importante. O importante foi submetclo.
simplesmente a existncia de $_POST [' submit ' ], o que nos
diz que o formulrio j foi submetido. Apenas certifique-se de
que o texto 'submit' seja o mesmo do atributo id do boto Submit,
no cdigo do formulrio.

Hclo existem
petgimtas idfotas
? Como o conhecimento de se o formulrio foi
submetido ou no nos impede de exibir mensagens
r: Ento por que no verificamos se existem
dados diretamente nos campos do formulrio, em
de erro de validao acidentais? vez de no boto Submit

K : 0 motivo pelo qual as mensagens de erro esto Seria perfeitamente aceitvel verificar
sendo mostradas incorretamente que o script no $_POST[ ' s u b j e c t ' ] ou $_
consegue distinguir entre o formulrio ser submetido e p o s t [ ' e l v i s m i l ' ], mas apenas para este
ser exibido pela primeira vez. Assim, precisamos de uma formulrio em particular. Uma vez que todo formulrio
maneira de saber se esta a primeira vez que o formulrio tem um boto Submit que pode ser consistentemente
est sendo mostrado, em cujo caso perfeitamente OK ter chamado de submit, verificar $_ p o s t
campos vazios - no se trata de um erro. Ns s devemos [ 1s u b m i t ' ] lhe fornece um modo confivel de checar
validar os campos se o formulrio tiver sido submetido; a submisso do formulrio em todos os seus scripts.
portanto, a capacidade de detectar a submisso do
formulrio muito importante.
aplicaes realistas e prticas

.0 script E n V icir Email em detalhes


Attc

$text = $_P0ST [.'elvismail'];


$output__form = false;.

if (empty($subject) && empty<$text)) {


// Ns sabemos que tanto $subject e $text esto faltando'
echo 'Voc esqueceu do-assunto e do corpo da mensagem.<br />'.;
$output_form - true;

if (empty($subject) && (!empty($text))) {


echo 'Voc esqueceu do assunto.<br />';
$output_form = true;
}

if ((!empty($subject)) && empty($text)) {


echo 'Voc esqueceu do corpo da mensagem.<br />';
$output_form = true;
}

if ((!empty ($subject)) && (!empty($text))) {


// Cdigo para enviar o email
i-have -PetHa a primeira

ls y.
$oucput_fci-n

pv-edisamos
if ($output_form) { mosbr-leJ
?>

<form method="post" action="<?php echo $_SERVER['PHP_SELF1]; ?>">


<label for="sub]ect">Assunto do email:</label><br />
<input id="subject" name="subject" type="text" size="30" / x b r />
<label for="el vismail">Corpo da mensagem:</labelxbr />
<textarea id="elvismail" name="elvismail" rows="8" cols="40"x/
textareaxbr />
<input type="submit" name="submt" value="Submit" />
</form>

<?php

?>

voc est aqui 203


faa os campos dos formulrios permanentes

Legal. Ento agora


ns podemos detectar a submisso do
formulrio e mostrar as mensagens de erro
corretamente. Mas ainda no tornamos os
campos do formulrio permanentes, certo?

verdade. D e te c ta r a submisso do form ulrio


im p ortan te, mas ainda precisam os de um a form a para
, m an ter os dados perm anentes.
I Saber se o formulrio foi submetido uma parte importante de torn-
I lo perm anente, mas no a nica. A parte que est faltando a que
' toma quaisquer dados que tenham sido submetidos e os coloca de
volta no formulrio, quando este re-exibido. Voc pode definir um
campo de input do formulrio usando o atributo value da tag HTML
< in p u t> . Por exemplo, o seguinte cdigo pr-define o valor de um
campo de input usando o atributo value:
VloV" tstd CSirto 0 ele f.
scmpve o mesmo, a t vez. <^ue o -Formulrio z mostrado.. ^
l>
Mas no queremos escrever um valor especfico de forma perm anente no
cdigo. O que queremos inserir a informao retirada de uma varivel PHP.
Como fazer isso? Lembre-se de que usamos echo para gerar cdigo HTML
dinamicamente a partir de PHP, em outras situaes. Neste caso, podemos
usar echo para gerar um valor para o atributo value a partir de uma varivel
PHP, desta forma:: A . /-, /
n vrive! z enviaaa usando-se

< in p u t n a m e - s u b j e c t t y p e = " t e x t "

L<i*tpinv v MfiUW
permWfttes <^*e Ento, o formulrio de Elmer pode ser modificado de forma semelhante,
se ewioh-ram para tirar proveito dos dados permanentes:

cinput type^subnnit" name^'submit" value="Submit" />


</form>
aplicaes realistas e prticas

T te S T O R fv e

V erifique se os dados de Elm er realm en te esto perm anecendo.


M o d ifiq u e o c d ig o d e s e n d e m a il.p h p d e m o d o q u e ele v e rifiq u e e m $_P O S T se o
fo rm u l r io foi s u b m e tid o , e a d ic io n e ta m b m o c d ig o e c h o p a r a t o r n a r os c a m p o s
p e r m a n e n te s . E n v ie a n o v a v e rs o s c rip t p a r a o se u s e rv id o r w eb e a b ra -o e m u m
n a v e g a d o r. E x p e r im e n te d if e r e n te s v a lo re s p a r a os c a m p o s d o fo rm u l r io , d e ix a n d o
u m o u a m b o s e m b r a n c o , e su b m e ta -o a lg u m a s vezes.

0 sdv"ipt dc tnviv*
agora mosfar um menSge*
de erro ^ando Wer dei^i
um tanpo do forwulario
ew> brando, s ele
mantem os dados digitados
anteriormente-

voc est aqui 205


quando bons DELETES viram maus

Alguns usurios ainda esto insatisfeitos


A v a lid a o d o fo rm u l r io n o s a ju d o u b a s ta n te a lid a r c o m os c lie n te s
in sa tisfe ito s d e E lm e r, p a r tic u la r m e n te a q u e le s q u e estav a m r e c e b e n d o em ails
e m b ra n c o . M as n e m to d o s e s t o felizes. P a re c e q u e a lg u m a s p esso as e st o
r e c e b e n d o e m a ils d u p lic a d o s ... le m b ra -se d e s te c a ra , d o in c io d o c a p tu lo ?

From: Sbert Kresee < et0ert@Krssleesptocket5.biz>


Subject: Spam?
Dais: October 24k008 12:20:33 PMCOT
To; Eimer Pnesey <e3m&f@fralmee3vis.om>
Elmer, r
Por favor wMecomo spam Eu gosto de ruceter os eimaila tfe ofertes, mas j: Bsie filiete esta
mando um s. No precisc rcefeertrs mensagens tote vz que tsm ursa oferta. , fvustvado por^ue est
refiebendo miltiplas
Sau teat s incomodado citent, Copias dos emails de
Ebert
mer.

E lm e r sa b e q u e n o d ig ito u a m e s m a m e n s a g e m m a is d e u m a vez, o q u e o lev a a


su s p e ita r q u e talvez a lg u n s u su rio s a c id e n ta lm e n te te n h a m se in s c rito n a su a lista
m a is d e u m a vez. S em p ro b le m a s , b a s ta u s a r a p g i n a /s c r ip t d e R e m o v e r E m a il d o
c a p tu lo a n te r io r p a r a re m o v e r o u s u rio , ce fto ?

In fe liz m e n te , n o t o sim p les assim . R e m o v e r E lb e rt u s a n d o o e n d e r e o d e e m a il


d e le fa r co m q u e e le seja c o m p le ta m e n te a p a g a d o d a ta b e la em ail_ list, e c o m isso
e le n u n c a m a is r e c e b e r n e n h u m e m a il d e E lm e r. P re c isa m o s d e u m a m a n e ir a d e
a p a g a r a p e n a s as lin h a s d u p lic a d a s d e E lb e rt n a ta b e la , d e ix a n d o u m a .

Usar a p%m de Remover mail


do taftui anterior removeria
inteiramente o dlienic do bando
de dados de Uer, e fco e isso o
<^ue Queremos.

_ W E R ' > 0 _______ ___________________


DCCRESRQ

C om o E lm er poderia a p a g a r todas as linhas da sua tab ela


que tiverem en dereos d e em ail idnticos, exceto um a?
aplicaes realistas e prticas

Hmm. O problema que h linhas repetidas na


tabela, mas no temos nenhuma form a de distingui-las
umas das outras. Sem uma forma de isol-las, qualquer
D EIETE que tentarmos usar ir apag-las todas.

Joe: Talvez o nosso form ulrio A dicionar Email devesse verificar


os endereos de em ail antes de adicionar novos usurios. Isso
consertaria o problem a, certo?
Frank: Excelente ideia.
Jill: Sim, isso resolveria o p ro b lem a p ara o futuro, mas n ao nos ajuda
a lidar com endereos de em ail duplicados que j estejam no banco
de dados.
Frank: Certo. E se tentssem os usar u m a co lu n a d iferen te d a tabela
p ara apagar as linhas extras, com o p o r exem plo, Iast_name?
.Jill: T am bm pensei nisso, mas usar u m so brenom e p o d e acabar
sendo pior do que u m en d ereo de email. E se quisssemos apagar
algum cham ado J o h n Sm ith da nossa lista, u san d o o seguinte
cdigo SQL:
D ELETE FROM e m a i l _ l i s t ' WHERE l a s t _ n a m e = 'S m it h 1
Joe: Isso n o apagaria apenas J o h n Sm ith d a tabela; estaram os
apagando tam bm Will Smith, Maggie Smith, E m m itt Smith...
Frank: E, isso n o seria bom . A probabilidade de sobrenom es se rep etirem em vrias linhas m aior
do que a dos endereos de email, e prim eiros nom es seriam ain d a piores. P oderam os p erd e r
dezenas de linhas com u m a simples consulta.
Jill: E xatam ente. N o p o d em o s nos arriscar a usar u m a clusula W H ERE q u e ap ag u e linhas
q u e q u erem o s m anter. Precisam os te r certeza d e q u e p o d em o s especificar ap en as aquelas q u e
q u ere m o s rem over.
Joe: E nto o que fazer? N o podem os usar e m a il, l.a s t_ n a m e n em f i r s t _ n a m e em nossa
clusula WHERE.
Frank: E n o tem os outras colunas p ara usar, n a nossa tabela. Parece q ue estamos sem sorte.
Jill: N o necessariam ente. O que realm ente precisam os de algo p ara to m a r cada lin h a da tabela
identificvel individualm ente - assim poderam os especificar linhas sem n e n h u m problem a. E s
p o rq u e n o tem os atualm ente u m a coluna com u m valor nico p ara cada linha, n o significa q ue
n o podem os adicionar um a.
Joe: U m a nova coluna? M asj tem os u m a estrutura p ara a nossa tabela.
Frank: Sim, m as o que tem os no est aten d e n d o s nossas necessidades. Voc tem razo, teria sido
m e lh o r se tivssemos previsto esta situao antes, p ara q ue pudssem os te r elaborado nossa tabela de
m o d o a evitar este tipo de problem as, m as no tard e dem ais para consertar o q u e temos.
Joe: OK, m as que nom e darem os nossa nova coluna? E q ue dados colocarem os nela?
Jill: Bem, u m a vez que o propsito seria identificai" individualm ente cada lin h a d a tabela, poderam os
cham -la de i d e n t i f i c a d o r , ou apenas id, p ara abreviar.
Frank: tim o, e podem os p ree n ch er a coluna id com u m n m e ro de identificao p ara cada linha,
de m odo que q u an d o executarm os nosso DELETE, p o derem os rem over linhas com base em u m
n m e ro individual, em vez de em u m en d ereo de em ail o u sobrenom e.
Joe: E xatam ente. E u m a tim a ideia, no? Fico feliz de te r pensado nela.

voc est aqui 207


adicionando uma couna com chave primria para uma tabela

As linhas da tabela precisam ser identificveis individualmente


P a rte d e to d o o p ro c e sso d e se a r m a z e n a r alg o e m u m b a n c o d e d a d o s q u e ,
p o s te rio rm e n te , v oc ir q u e r e r p r o c u r a r esses d a d o s e faz er alg o c o m eles. S a b e n d o disso,
in c riv e lm e n te im p o r ta n te q u e c a d a lin h a d e u m a ta b e la seja id e n tific v el in d iv id u a lm e n te ,
o q u e significa q u e v oc p o d e acessar c a d a lin h a e s p e c ific a m e n te (e s o m e n te a lin h a e m
q u e s t o ! ) . A ta b e la em ail_ list d e E lm e r faz u m a p e rig o s a a ssu n o d e q u e os e n d e re o s d e
em ail se r o n ic o s. Isso fu n c io n a , d e s d e q u e n in g u m a c id e n ta lm e n te se in screv a n a lista
d u a s vezes, m a s q u a n d o a lg u m o fiz e r (e a lg u m o far, p o d e te r c e rte z a !), o s e u e n d e r e o
d e em ail se r a rm a z e n a d o n a ta b e la d u a s vezes... e ac ab o u -se a u n ic id a d e !

Nada na estrutura
0 que a tabela de Elmer contm agora: desta -tabela garante
identidade para as linhas-
ttst name : lastM in -
Denny Bubbleton denny@mightygumball.net embora os
Irma Werlitz iwer@aliensabductedme.com endereos de
Elbert Kreslee elbert@kresleesprockets.biz
email sejam <y*ase
sempre unidos, no
Irma Kreslee \ elbert@kresleesprockets.biz
podemos doniar
Mais de ua pessoa pode te r o sera
mesmo primeiro nome, portanto, \0 mesmo a^ui, ao podemos sempre o daso.
esta no e uma boa opo para
dontar tom sobrenomes
doluna identiidadora. para dentifidao.

Se v o c n o te m u m a c o lu n a d e v a lo re s r e a lm e n te n ic o s e m u m a ta b e la , e n t o d ev e c r ia r
u m a . O M ySQ L lh e o fe re c e u m a f o rm a d e a d ic io n a r u m a c o lu n a d e n m e r o s in te iro s
in d iv id u a is, o q u e ta m b m se c h a m a d e c h a v e p r im ria , p a r a c a d a lin h a d a su a ta b ela .

0 que a tabela de Elmer deveria conter:


---------nretisamos At una neva Coluna <\ue dontnha
V valr unido para dada linha da tabela.

H A first.name lastjiani email


1 y Denny Bubbleton denny@mightygumbal.net
2 Irma Weriitz iwer@aliensabductedme.com
3 j Elbert Kreslee elbert@kresieesprockets.biz

\ 4 / irma Kreslee elbert@kresleesprockets.biz

Agora \ue esta doluna dontm um 0& dados duplidados nas


valor unido, podemos te r t,f Y
de outras dolunas no a-fetam
c^ue dada linha da nossa tabela sera mais a unididade das linhas,
realmente unida- porque a nova doluna id
duida disso-
aplicaes realistas e prticas

Ei, gnio, voc sabe que, se quisermos fa z e r


uma modificao na estrutura de uma tabela,
temos de usar um DROP TABL6 e recri-la do
zero. Os dados de Elmer sero perdidos!

verdade que DROP TABLE d estruiria os dados de Elmer.


Mas o SQL tem outro com ando que lhe p erm ite fazer
m odificaes em um a ta b e la e xisten te, sem perda de dados.
T rata-se d e A L T E R TA BLE, e p o d e m o s u s-lo p a r a c ria r u m a n o v a c o lu n a se m
te r d e e x c lu ir a ta b e la e d e s tr u ir os se u s d a d o s . Eis o f o rm a to g e ra l d e u m a
in s tru o A L TE R TA BLE p a r a se a d ic io n a r u m a n o v a c o lu n a ta b e la :

0 nome da tabela 3

r
0 nome da doluna a
ser alterada- ser adidionada.

[nom e_da_tabela ADD nome_da_coluna tip o _


da coluna 0 -tipo de dados
da nova doluna-

N s p o d e m o s u sa r o c o m a n d o A LTER TABLE p a r a a d ic io n a r u m a n o v a c o lu n a
lista e m a i l l i s t , a q u al c h a m a re m o s d e i d . N s d a re m o s c o lu n a id o tip o INT,
u m a vez q u e n m e ro s in te iro s so ideais p a ra esta b e le c e r a u n ic id a d e . A lgum as
o u tra s in fo rm a es so ta m b m necessrias, c o m o rev ela este cdigo:
Queremos adidionar M diz- ao servidor A1y#L para
h0"c da tabela \ue ( p p ) uma nova doluna, adidionar I ao valor armazenado nesta
geremos alterar. ^ tramaremos de id- para dada nova linha inserida.

ALTER TABLE e m a il_ lis t ADD id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (id) /
0 tipo de dados
e r
FRST instrui o MySQL a +azetr dom \ue a
da doluna, INT. nova doluna se\a a primeira da tabela. Isto
opdionali mas e uma boa pratida dolodar a sua
doluna de identifiddo em primeiro lugar .

ste pequeno pedalo E sta in s tru o A L T E R TA BLE te m u m m o n te d e coisas a c o n te c e n d o , e


de dodigo diz. ao isso p o r q u e as chav es p rim ria s p re c is a m s e r c ria d a s c o m c a ra c te rs tic a s
<\ue a nova b a s ta n te esp ec fica s. P o r e x e m p lo , N O T N U L L d iz a o M ySQ L q u e
doluna sd a dhave p re c is o h a v e r u m v a lo r n a c o lu n a id n o se p o d e n u n c a d eix -la e m
primria da tabela. b ra n c o . A U T O _ IN C R E M E N T d e s c re v e a in d a m a is as c a ra c te rstic a s
Falaremos mais sobre d a c o lu n a id , fa z e n d o c o m q u e e la r e c e b a a u to m a tic a m e n te u m v a lo r
isso mais adiante! n u m r ic o n ic o a c a d a vez q u e u m a n o v a lin h a in s e rid a . C o m o o n o m e
su g e re , A U T O _ IN C R E M E N T a u to m a tic a m e n te a d ic io n a 1 a o ltim o v a lo r
id u s a d o e m u m a lin h a , e c o lo c a o re s u lta d o n a c o lu n a id d a s u a n o v a
lin h a . F in a lm e n te , PRIM A R Y KEY d iz a o M ySQ L q u e c a d a v a lo r d a c o lu n a
id n ic o , m a s e x iste m m a is co isas a d o q u e a p e n a s a u n ic id a d e ....
voc est aqui 209
tudo sobre chaves primrias

As chaves primrias possibilitam a


identificapo individual
U m a chave p rim ria u m a c o lu n a q u e d istingue, e m u m a tab ela, ca d a
lin h a co m o se n d o nica. A o c o n tr rio das co lu n as n o rm ais, q u e ta m b m Uma ctaVe
p o d e m ser elab o rad a s d e fo rm a a se re m nicas, a p e n a s u m a c o lu n a
p o d e ser d e sig n a d a c o m o a chave p rim ria. Isto cria a p o ssib ilid ad e d e se p r i m r i a u m a
faz erem co nsultas q u e p rec isem a p o n ta r u m a o u m ais lin h as especficas.
P a ra g a r a n tir a u n ic id a d e d as chav es p rim ria s , o M ySQ L im p e u m a oeluna da sua
s rie d e re s tri e s s o b re a c o lu n a d e c la ra d a c o m o PRIM ARY KEY.
t a b e l a < ju e t e r n a
V oc p o d e p e n s a r n essas re s tri e s c o m o re g ra s a s e re m se g u id as, n o
se u tr a b a lh o c o m as chav es p rim ria s:
cada linha nica.
As cinco regras das chaves primrias:
Os dados de um a chave prim ria no podem ser repetidos.
lBkA' N u n c a d u a s lin h a s p o d e m te r os m e sm o s d a d o s n as su as ch av es p rim ria s.
S em e x c e e s ~ u m a c h a v e p r im r ia d ev e s e m p re te r v alo re s n ic o s d e n t r o
V d e u m a d a d a ta b e la .
Um a chave prim ria deve sem pre te r um a valor.
Se u m a c h a v e p r im ria fosse d e ix a d a vazia (N U L L ), e la p o d e r ia n o se r
n ic a , p o r q u e o u tr a s lin h a s p o d e r ia m ta m b m s r N U L L . S e m p re d e f in a as
^ suas chav es p rim ria s c o m v a lo re s n ic o s!
^ A chave prim ria deve se r definida sem pre que uma nova
dffigfcjp linha fo r inserida.
_ jjfW K r Se h o u v e r a p o s s ib ilid a d e d e v o c in s e rir u m a lin h a se m u m a ch a v e
XJ p rim ria , v oc c o r r e r ia o risc o d e te r ch av es N U L L e lin h a s d u p lic a d a s n a
su a ta b e la , o q u e a c a b a ria c o m to d o o p ro p s ito .
A chave primria deve ser o mais eficiente possvel. U m a chave
p rim ria deve c o n te r a p e n a s as in fo rm a es d e q u e p re c isa p a r a ser n ic a, e
n a d a m ais. E p o r isso q u e n m e ro s in te iro s re n d e m b o as chaves p rim ria s - eles
^ p e rm ite m a u n ic id a d e sem ex ig ir m u ito esp a o d e a rm a z e n a m e n to .
jfdQPjp O valor de um a chave prim ria no pode ser m odificado.
JSKREm Se h o u v e r a p o s s ib ilid a d e d e v oc m o d if ic a r o v a lo r d a su a ch av e, v o c
CT c o r r e r ia o risc o d e a c id e n ta lm e n te d efin i-la c o m o u m v a lo r j u sa d o .
L e m b re -se , a c h a v e p re c is a se m a n te r n ic a , a q u a lq u e r cu sto .

A doluna id na tabela de
lmer no tem dados
repetidos, tem um valor
s i i n i l I S I l l i B i l l i i i i l l i i htliiil lililj ;i
jfJ^
dioresvte para cada linha, t denny@mightygumball.net
1 Denny Bubbleton
automaticamente definida
Werlitz iwer@aliensabductedme.com
guando uma hova linH c 2 Irma
inserida, e dompadta e no
se modii- Pereita^
aplicaes realistas e prticas

J hm m m ,
.^ * * m 3 ^ ^ m m

~ T fe s T O R tv e
A ltere a tab ela de Elm er e te n te inserir um a nova
linha de dados com uma chave prim ria.
U s a n d o u m a f e r r a m e n ta M ySQ L, c o m o o te rm in a l M ySQ L o u a
g u ia S Q L d e p h p M y A d m in , d ig ite a in s tru o A L T E R TA BLE p a r a
a d ic io n a r u m a c o lu n a d e c h a v e p r im r ia c h a m a d a id :

ALTER TABLE email_list ADD id INT NOT NULL AUTO_lNCREMENT FIRST,

ADD PRIMARY KEY (id)

A g o ra in s ira u m n o v o c lie n te n o b a n c o d e d a d o s , p a r a v e r se a c o lu n a i d
a u to m a tic a m e n te d e f in id a n a n o v a lin h a . Eis u m e x e m p lo d e in s tru o INSERT p a r a
se r u s a d a ( re p a r e q u e a c h a v e p r im r ia n o m e n c io n a d a ) :

IN S E R T IN T O e m a il_ lis t ( fir s t_ n a m e , la s t_ _ n a m e , e m a il)

VALUES ('Don', Draper', 'draper0sterling-cooper.com')

F in a lm e n te , e m ita u m a in s tru o S E L E C T p a r a v isu alizar o


c o n te d o d a ta b e la e v e r a n o v a c h a v e p r im ria e m to d a a su a
glria! C aso te n h a se e s q u e c id o , eis a q u i a in s tru o S E L E C T :

SELECT * FROM email_list


A nova iolwn id c au-fco-
ihdircmch-fcada, de modo a
femanedev mtt tom a adio
da nova Jinha de dados-

I File E dit W ind ow H elp Em ail


, . ;i
nysqi> SELECT' * FROI I email list;;

+----- ---- --- 4..,-------- ---


; id I iirstjname i last name ; | ema x 1 / .1 ;i
+ +
| I ; Denny' I
: Bubbleton i dennySrrightygumball.net [ :!
; 2 IIrma i Werlitz |'iwer@aliensabductedir.e .com 1
! 3 I Elbert :i Rreslee j elbert@kresleesprockets.biz j
| 4 i Irma I Kreslee ! elbert@kreslee3prockets.biz ' J
'jNvS !
. Don | Draper ! drapergsterling-cooper.com !

5 rows in set (0.00 C5 sec)

voc est aqui 211


conversa trs

OK, agora cada linha da tabela


te m uma chave p rim ria nica. Como isso ajuda?
Elm er ainda e s t deletando os usurios com base nos
endereo de email.

Joe: O p ro b le m a q u e o u su rio p rec isa esp ecificar as lin h as


u sa n d o a chave p rim ria , em vez d o e n d e re o d e em ail.
Frank: E isso! E n t o s p rec isam o s m o d ific a r o fo rm u l rio p a ra
q u e o u su rio d ig ite a ID d o clien te, e m vez d o e n d e re o d e
em ail. S em p ro b lem as!
Jill: N a v erd a d e, h u m p ro b le m a sim . O u su rio n o tem co m o
sa b e r q u a l a ID d o c lien te sem te r alg u m a fo rm a d e p ro c u ra r
essa in fo rm a o n o b an c o . N a v e rd a d e , o u su rio n o sabe n a d a
so b re a e s tru tu ra d o b an c o . Talvez o q u e p rec isam o s aq u i d e
m o d ific a r o fo rm u l rio , d e fo rm a q u e ele m o stre to d o s os n o m e s
e e n d e re o s d e em ail e m u m a lista, co m caixas d e verificao ao
la d o d e cad a n o m e . S eria m ais o u m e n o s assim:

Frank: B o n ito d e s e n h o , m as c o m o isso aju d a E lm e r a iso lar u m c lien te p a r a rem o o ,


u sa n d o a ID?
Joe: H m m . E se arm a ze n sse m o s a ID d o c lien te n o v alo r d a caix a d e verificao? A ID n o
ficaria visvel a o u su rio , m as o sc rip t te ria acesso a ela.
Jili: tim a id eia. P o d e ra m o s e n t o g e ra r o fo rm u l rio a u to m a tic a m e n te , em u m lo o p ,
fa z e n d o u m SELEC T p a r a o b te r os d a d o s e d ep o is c ria n d o c a d a caixa d e verificao a p a rtir
d e u m a lin h a d os d a d o s d a consulta.
Joe: tim o . Mas o q u e a c o n te c e q u a n d o o b o t o S u b m it p ressio n ad o ? Q u al se r o
c o n te d o d e $_PO ST?
Frank: U m m in u to J o e , c h e g a re m o s l em u m in sta n te . M as vam os c o m e a r c ria n d o esta
p a rte d o scrip t, a p a rte q u e ex ib e to d o s os d a d o s d a ta b e la e g e ra as caixas d e verificao...
aplicaes realistas e prticas

ims de Geladeira PH? & My-SoL

<img src=blankface.jpg" width="16l" height="350" alt=" style="float:right" />


<img name="elvislogo" src=''elv-islogo.gif" width="229" height="32" border="0"
alt=Make Me Elvis" />
<p> Por favor selecione os endereos de email a serem apagados e clique em
Remove.</p>

<form method= "post" action=" echo $_SERVER[ ' PHP__SELF']; >

<?php
$dbc = mysqli connect('data.makemeelvis.com'r 1elmer', 'theking, 'elvis__store')
or die('Erro ao conectar servidor MySQLr.);

// Exibe as linhas com os clientes e as caixas de verificao para apag-los


$query = "SELECT * FROM email_list";
$result = mysqli_query($dbc, Squery);

while ( = mysqli_fetch_array($result)) {

echo <inputtype="checkbox" value="1 .


name="todelete[] />; ..............................

echo '
echo .
echo ' .

echo '<br />';

mysqli_close($dbc) ;
?>

<input type="1submit" name=" " value="Remove" />

</form>

im
ms php & m ysql - soluo

ims de Geladeira TH? & M/SQL - $oj u


Use os ms abaixo para com pletar o cdigo do script Remover Email, o qual dever
apresentar uma caixa de verificao para cada cliente presente no banco de dados de
Elmer. Repare que este cdigo apenas cria o form ulrio; por enquanto, no se preocupe
com o cdigo que realiza o DELETE.

<img src="blankface.jpg" width="161" height="350 alt="' style="float:right" />


<img name="elvislogo" src="elvslogo.gif" width="22 9n height="32" border="0" ^

alt="Make Me Elvis" /> dod^c


<p>Por favor, selecione os endereos de email a serem apagados e clique em de
Uirt
mds
Remove.</p>
?> ik ser dol<
<?php
<form rnethod="post" action=" cho $_SERVER ['PHPJ3ELF '];
dentro dJ
Bste ddigo c autorre-Pevente/ % <??4
<?php e ^
$dbc = mysqli_connect(1data.makemeelvis.com' , 'elmer', 'theking', elvis_store)
or die('Erro ao conectar ao servio MySQL.');

// Exibe as linhas com os clientes e as caixas de verificao para apag los


$query = "SELECT * FROM emailJList"; a<\w o\ut -Kave primavial
$result = m y s q l i_query($dbc, $query);
e usada nas daixas de
d veriida^ac podemos sar
while (
sto a^ui mais adiante, para
echo '<input type='checkbox" value=" ' . remover ^uais^uer usurios
name= " t o d e l e t e []" / > ;
seledionados
f i r s t name
Cada dai*a de veri-Pidadao
t donstvvfda a prtir de
uma iinKa de dados dos
diientes.

}
mysqli_close($dbc);
?>

<input type="submit" name=r


submit. value="Remove" />

</form>

l/ode pode dar ^ua^uer nome removeemail.php


0 sdript a'mda no esta nuisc'r 3o seu bot
apagando nada- Por Submit m<3s predisar
enquanto, ete apenas lembrar-se do nome
apresenta uma lista de posteriormente, daso dedida
daxas de veri-hddao. usar f_POT para verilidar
se o lormulirio oi submetido.
aplicaes realistas e prticas

Pas caixas de verificao at as IPs dos clientes


O c d ig o p a r a as caixas d e v erificao g e ra d a s p e lo sc rip t R e m o v e r E m ail sim p les H T M L ,
co m a n o ssa chave p rim ria (id) c o lo c a d a n o a trib u to v a lo r d a ta g <input>. N o e n ta n to ,
h u m a p e q u e n a , p o r m , m u ito im p o r ta n te m o d ific a o e m re la o a o c d ig o H T M L
c o m u m . V oc p o d e te r re p a ra d o q u e h c o lc h e te s ([ ]) n o fin a l d o n o m e d a caix a d e
v erificao - eles se rv e m a u m p ro p s ito vital.

echo 'cinput type="checkbox" value="' . $row['id!] \ name="tlS|i#|i|si,l>';

O s c o lc h e te s re su lta m n a cria o d e u m array d e n tr o d e S _P O S T q u e ^ toltH etes ao


a rm a z e n a o c o n te d o d o a trib u to (valor) d e c a d a ca ix a d e v erificao
-inl do da
m a rc a d a n o fo rm u l rio . U m a vez q u e o a trib u to v alu e d e c a d a caix a
cada valor no array to d elete a ID de
c o n t m u m a ch av e p rim ria ,
d t veri&da

uma Unha da nossa tabela que precisa ser apagada. Isso n o s p o ssib ilita
aiA-fcomaii-ametvte eolodsm
os valores da e**
fa z e r u m lo o p atravs d o a rray to d e le te e e m itir u m a c o n s u lta SQ L
w v-vay a demos o
p a r a a p a g a r c a d a c lie n te m a rc a d o n o fo rm u l rio .
ome "Wele-beC3-

c x M a te tfe E L v fs x o M
Cada tai*a de te
a ID do dien-te armazenada, tfs.
,ue ia aessfvel atvav da
suferjlobal f J W .
drapewgstsilinanaeape,..O
T(T.

Entendi. Podemos
simplesmente usar um loop com while para
fa z e r um ciclo atravs do array todelete e
apagar cada um dos clientes usando as suas
lbs.

Ns poderamos usar um loop while, mas h uma


soluo mais elegan te que usa um tipo diferente de loop.
O lo o p f o re a c h u m tip o e s p e c ia l d e lo o p e la b o r a d o e s p e c ific a m e n te
p a r a se fa z e r u m ciclo atra v s d e v a lo re s a r m a z e n a d o s e m u m array.
T u d o o q u e v oc p re c is a fa z e r e s p e c ific a r o a rra y atra v s d o q u a l
q u e r fa z e r o lo o p , a l m d e u m a v ariv el o n d e a r m a z e n a r os v alo re s,
e o P H P c u id a r d e fa z e r as ite ra e s n e le s, u m p o r u m ... n o
n e c e s s ria n e n h u m a c o n d i o d e teste!

Escreva aqui como voc acha que um loop foreach poderia fazer
iteraes atravs de um array contendo as IDs dos clientes de Elmer:

voc est aqui 215


anatomia de um loop foreach

Fapa loop atravs de um array com foreach


O lo o p f o re a c h to m a u m a rra y e faz lo o p atra v s d e c a d a e le m e n to d o a rra y se m a
n e c e s s id a d e d e u m a c o n d i o d e te ste n e m u m c o n ta d o r d e lo o p s. A m e d id a q u e
p assa atra v s d e c a d a e le m e n to d o array, e le a r m a z e n a o v a lo r d esse e le m e n to e m
u m a v arivel te m p o r a r ia m e n te . A ssu m in d o -se q u e o a rra y e st a rm a z e n a d o e m u m a
varivel c h a m a d a $ c u s to m e rs, e ste c d ig o faz o lo o p :
0 array atravs do <\uai vede deseja med.da o loop passa atravs de
a r o loop aparede primeiro elemento do array, ele os armazena
temporariamente em uma varivel dom este nome.
lUtill (^ c u s to m e rs as C u s to m e r) {

acho $ c u s to m e r;
Dentro do loop, vode pode adessar dada
elemento, usando o nome da variavel-

A ssim , se q u is sse m o s fa z e r u m lo o p atra v s d a s ID s d o s c lie n te s a rm a z e n a d a s n o a rra y


$ _ P O S T d o s c rip t R e m o v e r E m ail, p o d e r a m o s u s a r o s e g u in te c d ig o c o m fo re a c h :

o array t armazenado
dentro da superglobal f^POST, e Cada elemento do array ida
adessfvel atravs da variavel
t identi-fidado por "todelete.
fdeiete id-
fo re a c h as
k*sillflffllimliiiil 11 1 <
/ / Apaga um a lin h a da ta b e la

}; Podemos usar ?delete_jd para


remover dada um dos dlientes
do bando de dados. Podemos usar es-i
variavel para ade
A v arivel $ d e l e t e _ i d a r m a z e n a o v a lo r d e c a d a e le m e n to d o a ID de dada dlit
a rra y m e d id a q u e o lo o p p a ssa p o r eles, u m d e c a d a vez. entao apa-l
tabelay

$delete_id ^

Please select me email addresses to delete irom the emaS


listsna dick Remove,
jg Denny Bubliletcn d e n n y @ m i g h ty g u m ti a ii net
^ Ima Wurfitt iwera ItensEtKJjctsiime oom
BberttreeeelbertetoBsleesprictetsJli - "
g Irma Kre&iae elbert@resieesprorate.biz
|g Don Draper arapergsfeflwg-oo^er com J'/os donstrumos o rry
de orma tal <\ue ele so
armazene os dlientes <^e
C o m o lo o p f o r e a c h a g o ra p a s s a n d o atra v s d a c a d a c a ix a tiverem sido mardados
m a rc a d a n o fo rm u l r io R e m o v e r E m ail, s p re c is a m o s a d ic io n a r no ormulario Remover
a lg u m c d ig o d e n t r o d o lo o p p a r a e m itir u m a c o n s u lta D E L E T E , Email.
a q u a l fa r a r e m o o p r o p r ia m e n te d ita d e c a d a lin h a m a rc a d a .
aplicaes realistas e prticas

Complete o cdigo do novo e melhorado script r e m o v e e m a i l . p h p de


Elmer, para faz-lo excluir os clientes que tiverem sido marcados no formulrio,
quando este for submetido.

$dbc = mysqli_connect(1data.makemeelvis.com', 'elmer', 'theking', 'elvis_store')


or die{'Erro ao conectar no servidor MySQL.');

// Exclui as linhas dos clientes (somente se o formulrio tiver sido submetido)

if { )

foreach ($_PST['todelete'j as $delete_id) {

echo 'Cliente(s) removido(s).<br />';

// Exibe as linhas dos clientes com caixas de verificao

$query = "SELECT * FROM email_list";

$result = mysqli_query($dbc, $query);

while ($row = mysqli_fetch_array($result)) {

echo 'cinput type="checkbox" value="' . $row['id] . '" name=todelete[]" />';


echo $row[first_name'];
echo 1 ' . $row[last_name'];
echo ' . $row['email'];
echo 1<br />';
}

mysqli_close($dbc);
?>

cinput type="submit" name="submit" value="Remove" />

</form> removeemail. php

voc est aqui > 217


the revised removeemaii.php script

Complete o cdigo do novo e melhorado script r e m o v e e m a i l . p h p


de Elmer, para faz-lo excluir os clientes que tiverem sido marcados no
formulrio, quando este for submetido.

dbc = mysqli connect(1data.makemeelvis.com', 'elmer', 'theking1, 'elvis


store') ~~
or d i e ('Erro ao conectar no servidor MySQL.');
So exdluir os dlientes se o
-Pormulario tiver sido submetido^
ientes (somente se o formulrio tiver sido submetido)

esdolHer o dlientc
foreach ($ POST['todelete'] as $delete_id) {
a ser e%dludo-
flVTY- PRO/yj. eaiMist INHERE id ^ fdelete^d;

or d'e(lforro Consultando o bndo de ddos/)j

echo 'Cliente (s) removido(s) .<br />';

// Exibe as linhas dos clientes com caixas de verificao

$query = "SELECT * FROM email_list";

$result = mysqli_query($dbc, $query);

while ($row = mysqli_fetch_array(result)) {

echo 'Cinput type="checkbox" value="' . $row['id'] . '" name=Mtodelete[]"


/>';

echo ' 1 . $row['last name'];

echo 1 . $row[1email1];

echo '<br />';


0 dodi$o fra ^erar as daixas
de dada dlientc e o mesmo de
antes.
mysqli_close($dbc);

?>

<input type="submit" name="submit" value="Remove" /> rem oveemsil.php

</form>

OHQ a
aplicaes realistas e prticas

----- T f e S T D r v _______ _________

T este o novo e aprim orado script de Remover Em ail de Elmer.


M o d ifiq u e o c d ig o d o s c rip t r e m o v e e m a i l . p h p d e m o d o q u e e le g e re
caixas d e v e rific a o p a r a os c lie n te s, e m vez d e u s a r o v e lh o c a m p o d e te x to
c o m os em ails. E m se g u id a , a d ic io n e o c d ig o p a r a e x c lu ir os c lie n te s s e m p re
q u e o fo rm u l r io f o r s u b m e tid o . A l m disso, m o d ifiq u e o a tr ib u to a c d o n d a
ta g < fo rm > p a r a to r n a r o fo rm u l r io a u to r r e f e r e n te .

A g o ra q u e r e m o v e e m a i l . p h p u sa u m fo rm u l r io a u to r r e f e r e n te , v oc
n o p re c isa m a is d a p g in a r e m o v e e m a i l . h t m l n o se u s e rv id o r w eb,
p o r ta n to , e s te ja v o n ta d e p a r a ap ag -la. E m se g u id a , en v ie a n o v a v e rs o
d e r e m o v e e m a i l . p h p p a r a o se u se rv id o r e a b ra -o e m u m n a v e g ad o r.
M a rq u e as caixas d e a lg u n s c lie n te s e c liq u e e m S u b m it. O f o rm u l r io
a u to m a tic a m e n te se m o d ific a p a r a in f o r m a r a r e m o o d o s c lie n te s..

Pleasselectthe email addresses todelete from10email


listandclickRemove
0 Denny Bubbtetonctennyentightygufflballnat
0 limaWurlilziwergaitensabductedrne.coffl
0 ElbertKresleeeJbengkresteesprockets.'Diz
g tmal^esle H ^ M e E L v ? s .c o f
Q Don Draper drapef@sterl)ng-coopr.oom
^Remove3 S S S S 1 * " ' ''* .!
removed^ ---
Quando vote u
dieh-fce e dlida em Subwrb ,Wer@8J,er^
Qaben ^ eeJbsrt@ft^ Mucted^
MMi8t&iz
le e ve*ovido do bando de O^l^perdraps^tefing-coQper.cDm
dados-

0 sdvift dowiiVrtiS 5 rcmnodao


do dlttvU e tnnb atualiz-a
a lista - o dliewte e*t\ wido


no apavede ais.

voc est aqui 219


aplicaes realistas e prticas

Sua caixa de ferramentas PHP M ySQ l


Voc em bolsou um a boa

CAFiTLO 4
quantidade de tiovas habilidades
em PHP e MySQL ao tra b a lh a r para
fa ze r a ap licao de Elm er subir de
nvel.

voc est aqui


aplicaes realistas e prticas

5 T m ta U ia n d o co m D a d o s A n ic tz e n a d o s

em A r^ufV og

Quando um Banco de ,
>
Dados No o Suficiente *

No acredite no hype... pelo menos no naquele sobre os bancos


de dados. Certamente os bancos de dados so maravilhosos para se armazenar todo tipo
de dados que envolvam texto, mas e quanto aos dados binrios? Coisas como imagens
JPEG e documentos PDF? Faz sentido armazenar todas essas figuras da sua coleo de
palhetas raras de guitarra em uma tabela de banco de dados? Geralmente no. Esses tipos de

dados normalmente so armazenados em arquivos, e ns os deixaremos nos arquivos. Mas


inteiramente possvel ter o melhor de dois mundos - este captulo revela que voc pode usar

arquivos e bancos de dados juntos para criar aplicaes PHP cheias de dados binrios.

este um novo captulo 223


guitar wars precisa de captura de tela

Guitarristas virtuais gostam de competir


A p a r e n te m e n te , o c o n c e ito d e a r te p e la a r te n o m a is o su fic ie n te ,
p o r q u e os jo g a d o r e s d o n o v o G u ita r W ars e s t o fa sc in a d o s c o m a
p o s s ib ilid a d e d e to c a r g u ita r r a v irtu a l c o m p e titiv a x n e n te . T a n to q u e
eles r e g u la r m e n te p u b lic a m as su a s m a io re s p o n tu a e s n o site d o
A aplidaao guitar Wars
G u ita r W ars, c u ja m a n u te n o v o c a g o ra e st e n c a r r e g a d o d e fazer.
permite os usurios
O p r o b le m a q u e , a tu a lm e n te , n o h u m b o m sis te m a p a r a se
ddidionem s suas
v e rific a r as p o n tu a e s .
pontuaes lisia.

Sem ljuma -forma


de veri-Pitaao, no
temos domo saber c^uais
pontuaes sao legtimas e
<\wais *a so.

No d para confiar no texto


D o je ito c o m o f u n c io n a a g o ra , os jo g a d o r e s e s t o p u b lic a n d o as
su as p o n tu a e s s im p le s m e n te c o m o te x to , e te m h a v id o m u ita s
d isc u ss e s s o b re q u a is p o n tu a e s so re a is e q u a is n o so. S
ex iste u m a f o rm a d e p r u m fim a to d o esse b a te -b o c a e c o r o a r o
v e r d a d e ir o c a m p e o d o G u ita r W ars...
trabalhando com dados armazenados em arquivos

0 roek imagem a prova


O q u e p re c is a m o s p a r a d e te r m in a r q u e m e st fa la n d o a v e r d a d e o u n o d e
a lg u m tip o d e v e rific a o visual. A ssim , a a p lic a o G u ita r W ars te r d e p e r m itir
q u e os u su rio s s u b m e ta m u m a c a p tu r a d e te la c o n te n d o a s u a p o n tu a o ,
q u a n d o fo re m in c lu ir e sta ltim a . Isso sig n ific a q u e a lista d o s r e c o rd e s n o
c o n te r a p e n a s p o n tu a e s , n o m e s e d a d a s, m a s s e r ta m b m u m a lista d e
im a g e n s (telas c a p tu r a d a s ) . a vev>\'t^o

C^uc Udxc ^ awd-

A d t B e lft
t vcvdadeiv-a, tomo
^roV
ei enviow.

S 9
t s t ' td tx ,
^scudortro^uciro
e taUiiddor do
jwiav VVavs.

voc est aqui 225


o design da aplicao guitar wars

A aplicapo precisa armazenar imagem


D o j e ito c o m o est, a a p lic a o d e r e c o rd e s d o G u ita r W ars re g is tra tr s tip o s d e
in fo rm a e s: a d a ta e h o r a d e u m a n o v a p o n tu a o , o n o m e d a p e s s o a q u e a est
s u b m e te n d o e a p o n tu a o p r o p r ia m e n te d ita . Essas in fo rm a e s so d ig ita d a s atra v s
d e u m f o rm u l r io q u e faz p a r te d a in te r fa c e d e u s u rio d a ap lic a o , e d e p o is disso, so
a rm a z e n a d a s e m u m a ta b e la c h a m a d a g u i t a r w a r s , e m u m b a n c o d e d a d o s M ySQL..

Guitar W ars - High Scores


y r i y m y . O tiim r w aTPOT An yop k* w h e t it ta la ciadc ih e hig h score list? Tf so ju st a d d v o m ow n sco re.

127650
N am e: P a c o Jaflctii
2008-W -2Z 14:37:34
^ tak adidione a sa
Vatng; NcVfiJofraDisOU
98430
D ate: 200S'0+-22 2 1:27:M
pontuada" na pagsna
345900 prmdipal^de djuitar tYars,
jia a i e : E d d ie V aaiffi
D l t t s 2 0 0 8 0 4 -2 3 0 9 * 6 55 v * P|9ih Adidionar
i 282470
! N an K i Bciii Chevy
PontuadJo.
i D tK 2008-04-23 09:12:53

j 368420
! N ym e: Asfeaon Simp**
! D i t e 200S-04-23 09:13:34

A pgina Addioftr PontwdO Z


apresenta um Pormulario para se
distar o nome e a pontuada (3
data e a bora sao awtomiidament
obtidas a partir da data e bora do
omento da insero)-

Guitar Wars - Add Your High Score


Thacks for addicg your nsw high scare!
0 novo registro e
doft-fivmdo; para <^uey
o usurio saiba <^ue
cie o i ad id io nad o dom
SudSS.
IZ Z 4 m b e e is o ooa

ocm Ez-to-sooz
zjjab^ :3
bi9\
06t9 ;
KOT60K-WWCK:wa I ^ *r*> ?
TO$xfaq$ acU^Y 53CWX !
ozmz I guiW e ayo-ejeip*'-
ot'60 5z*Kr8oor;*a ' ' opeWPe
Xa J*=*X!
OLfZSZI iut^-A OJCpfo* 0
SS 3 0-60 C -t ^00 : a Q
HPTC^PP3-*3*N f
006f j
FCZ-UWtOUOGi:awaf
uossnruof :re\
oets
noOBBf ax :annN I
Q9LZI j

ojiii^aoosqqwp^oca^BiiAvaAfiiiiiOAop'icipjB^jieitn^'scioapjftj
I
Moagq3ga - sxsfajei|nf> |

sopep ap
o^ue^ op sJierM^w^ ep<^
e opeuo^ipe 3
-epeu^ua epe? e-A<i aVjqsta* AO o ^e^o^lpV
e 3 3*OM w A?H? 3 o e k ^ w i
o wyzwjie vuc|*e^ \ sM* fjttc fl ty

s^e^ oe^?ij<Je e
epi^-Svui^ns iO opjert^MOtl
opue*\> ap e ^ s (e->s
e 3) q-p e ?

*e^j epe?
jii 3^3*ue?i^e*oc).e
epe-fisS sopep sp
O^UC| o p MmwA 3 a6 ^ ?
e <jj ewp?

so ainbje tua sopeuazeuue sopep tuoo opueqieqej)


comente o cdigo

A aplicao dos recordes do Guitar Wars ter de ser modificada para

Rccio acomodar a nova necessidade de se enviar arquivos grficos. Circule


e escreva comentrios nas partes da aplicao que tero de se
modificar para atender ao novo requisito.

<html xmlns=http://www.w3 .org/1999/xhtml" xntl:iang="en" lang="en>


<head>
<title>Guitar Wars - Maiores Pontuaes</title>
clink rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<h2>Guitar Wars - Maiores Pontuaes</h2> 7 T\ ____
<p>Bem-Vindo, intrpido guitarrista! Voc bom o suficiente para entrar
na lista de recordes do Guitar Wars? Se for, clique aqui para adicionar a ( style, css
sua pontuao.</a>.</p> Hsfce *r^uiv<>
<hr />
pmedisa
<?php se odi-Pida*-,
// Conecta-se ao banco de dados
$dbc = mysqli__connect (www.guitarwars.net , 'admin', 'rockit, 'gwdb'); P<*"bivfco vde
*2 fredisa sc
// Obtm os dados das pontuaes a partir do MySQL
query * "SELECT * FROM guitarwars"; p'reodupav dor*
$data = mysqli__query ($da c , $<iuery) ; ele-
/ / Faz um loop atravs do array contendo os dados das pontuaes,
formatando-os como HTML 1<table>';
while ($row = mysqli_fetch_array($data)] {
// Exibe os dados das pontuaes
echo '<tr><td class='scoreinfo">';
echo '<span class="score">' . $row['score1] . '</spanXbr />';
echo '<strong>Name:</strong> ' . $row['name'] . '<br />';
echo 1<strong>Date:</strong> 1 . $iow[date'] . '</td></tr>'; .
)
echo </table>';

mysqli_close($dbc) ;

</body>
</html>

index.php

Tui ta rw a rs

O c d ig o -fo n te c o m p le to d a a p lic a o G u ita r


W ars e s t d isp o n v e l p a r a d o w n lo a d n o site d a
Al ta Books: w w w .altabooks.c om.br
trabalhando com dados armazenados em arquivos

" - - - , 1
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" iang=en">
<head>
<title>Guitar Wars - Adicione o seu Recorde</title>
<link rel="stylesheeT:" type="text/css" href="style.css" />
</head>
<body>
<h2>Guitar Wars - Add Your High Score</h2>

<?php
if (isset($_POST[1submit'])) {
// Pega os dados em POST
$name = $_POST[rname];
$score = $_POST['score'] ;

if (!empty($name) && !empty($score)) {


// Conecta-se ao banco de dados
Sdbc = mysqli_connectCwww.guitarwars.net', admin1, rockit', 'gwdb');

// Escreve os dados no banco


$query = "INSERT INTO guitarwars VALUES {0, NOW(), $name, '$score')";
mysqli_query{$dbc, $query);

// Confirma xito com o usurio


echo '<p>Obrigado por adicionar o seu recorde!</p>;
echo 1<p><strong>Nome:</strong> 1 , $name . '<br />';
echo <strong>Pontuao:</strong> ' . score . '</p>r;
echo '<p><a href=index.php">S11;S11; Voltar para a lista dos recordes.</a></p>';

// Limpa os dados da pontuao para limpar o formulrio


SNome = ";
$Pontuao =

mysqli_close($dbc);
}
else {
echo '<p class="error">Por favor, insira todas as informaes para
adicionar seu recorde.</p>

1
)
?>
<hr />
<form method="post action="<?php echo $__SERVER['PHP_SELF']; ?>">
<label for="name">Name:</labelxinput type="text" id="name" name="narae"
value="<?php if (!empty (name) ) echo $name; ?>" /Xbr />
<label for- score"i>Score;</labelXinput type=text" id "score name=,rscore"
value="<?php if (!empty($score)) echo $score; ?>" />
<hr />
<input type="submit" value="Add" name="submit />
</form>

addscore.php

voc est aqui 229


cdigo guitar wars comentado

A aplicao dos recordes do Guitar Wars ter de ser modificada para acomodar a
nova necessidade de se enviar arquivos grficos. Circule e escreva comentrios nas
IC IC lO partes da aplicao que tero de se modificar para atender ao novo requisito.
SoLuo ______________________________
C n tm l x i r i l , n 5 s=,Th t t p : / / w w w . v r 3 . o r g / 1 3 9 9 / x - t m l x r n l : i a n g - Me n M l a n g = ,Te n ,T>

<head>
< title > G u ita r Wars - M aiores F o n tu a e s< /i.tIe >
< iin k r e l ^ s ty le s h e ^ t" t v p = Mt @ x t / c s s h r e f = Ms t y l e . c s s " />

< /b e d >
0 arquivo da image,*
<bodv>
< h 2 > G u i t a r W a r s - M a i o r e s P o r . t t a e s < / h 2 ?' pisa ser obtido a Vce* deve ** validao
< p > W e lc a r e , B e m - V in d o , i n t r p i d o g u i t a r r i s t a . !
s u iic ie n t p a ra e n tr a r na lis ta de re c o rd e s do
Voc
G u it a r
bom
W a rs ?
o
Se fo x ,
partir d dados de ierti-fiiar-se dc
c liq u e qui p a ra a d ic io n a r a s x ia p o n t u a o . < / & > < / p > POST. *lue Mmfo do nome da
<hr />
imagem no esteja vazJa
<?php
,/,/ C o n e c t a - s e ao banco de dados
- a r s . n e t 1, <htmi xnns="htqp:// w3.olg/aS99/xhtml" xml:Iang=
$dbc iT iy s q li c o r . r . e c t [ * www , g u i t a r v
<heaS>
1vrdcT) ; <title>Guitar Wars - Add YcVr High Score</tiile>
// O b t rr. o s dados d a s p o n tu a e s a p a r t i r <link rel="stylesheet" typeAr-ext/css" href="style
FR OM u i t a r w a r s " ;
</head>
S q u a ry = "S E L E C T
$dbc, 5cfiiery); <body> v
data = mysqli_query(
< h 2 > G u ita r W a rs - A d ic io n e o s e i^ R e c o r d e < /h 2> /\ tonsulta $L-. agora
// Faz um loop atravs do array c c n t e n d o
preisa inserir *a
o
<?php
HTML
m - T<ta.ble>'
-tabela g u ita r^ o
fo r m a ta n d o - o s ^om o m m ^ w /
j f is ^ p n S T fs iM if ; n i
w hile <$row - n y s q li_ f e tc h _ a r r a v ( S d a ta ) )
// Pega os dados em POST
/ / Exibe os dados das pontuaes
i Hii I m -1 -!laRA=Ms c o re in fo T,> '; name = $_POST['name 1i ; nome do ar^uWo <\ue
echo cspan cl5SSTrs c o r e M>' , ?x.6\nTf Sscore = $__POST.['scora*] tontm a imagem-
echo '< strong> N arre;< /strong> . $ro
echo < strong> D ate: < /$trong> 1 (rfl^Tmpty lllUlIt) K'i empty isroisrK1
Conecta-se ac banco de dados J

'gwab+);
Sdc - ir iy s q li_ c o n n e c t (
:ho T</table>'; g u i t a r w a r s . . i e t ' , 'a d m in '

irvsqli_ciose ($bc) ;

?> /\ imagem tomprovando Sscore )


"INSERT INTO guitarwars VALQES (0, NOK(), 'Sname',^
---
</body> pow-UaSo ^retis ser roVBgii query ($dbc, j q u e r v ) ____ _
</hrira> cabida ** // Confirma xito com o -jsuri \
eebo '<p>Obtigado por adicionar o se'J. recorde ! < / p > 1
echo T<p><strong>Nom.e:</srona> 1 . Snaue . '<br /J/
imagem precisa ser index.ph
para o usurio, para se
echo '<p><;a href="index.php">6clt;&it; Voltar para a lista dos
recordes.</a></p>';

totuirmar o exrto.
;s dados da pontuaSo para limpar o formulrio

) r H avendo sutesso, ie r ti- f i^ u e - s e de

mysli^close ($dbc) <me o dampo d a imagem no -formulrio,


. ( <yue perm anerrte, se ja limpo.
e c h e < p c l a s s = r e r r > r T'> P o r fa v o r , in s ir a , to d a s as in fo r m a e s
a d ic io n a r s e u r e c o r d e . < / p > '; r

sta Consulta i*sa wa espetit


d e ataiKo, ao n o e s p e t ii ta r

OS hO W C S d s t c l u h 3 s-

< la b e l f o r - ^ n a n v e '^ N o iu e K / ia b e lx in p - a t ^ y p e ^ te x t i d = " n a m e ,,


n a n je = ,rn a m e "

value=rT<?php if {!empty (Sname)) echo $name; ?>Tf /><br /-


xiabel for=,,sccret,>Pontuao;</Isbel><input type*"text"'
n a r o = ^ * ^ j^ e

v a 1 u e = " < Vpnp :r ( ] e m p ty ( s c o r e )) ecno S s c o re ; ?>"


ebr />
/\ -tabela pretisa de uma^ <input type=submit" Talue="Add" namg="Eubmit" />
</fonr>
ova tolua para arm a*r 0 -formulrio precisa Lj </ody>
** < /h tm l>
o arquivo ojrkto de tada uma -tag <input> pav-j^i
pon-tua^ao-______________ a seleo da imagem.
a t ir t g f t n r p p h p
trabalhando com dados armazenados em arquivos

Planejando os uploads de arquivos grficos no Guitar W ars


E m b o ra p o ssa p a r e c e r q u e n o n a d a m u ito c o m p lic a d o a d ic io n a r s u p o rte a o u p lo a d
(envio) d e arq u iv o s grfico s a o G u ita r W ars, a ap lic a o p re c isa s e r m o d ific a d a d e vrias
m a n eiras. P o r isso, u m a b o a id e ia te r u m p la n o a n te s d e m e r g u lh a r n o c d ig o . V am os
e s q u e m a tiz a r os passos n ec essrio s p a r a a tu a liz a r o G u ita r W ars e a d ic io n a r a f u n c io n a lid a d e
q u e q u e re m o s.

a l t e r para adicionar tabela a coluna


o Use
screenshot.
Em primeiro lugar vem o banco de dados, que precisa
de uma nova coluna para armazenarmos o nome
de cada arquivo grfico contendo a pontuao do
usurio. Uma vez que estamos planejando colocar
todos os arquivos grficos na mesma pasta, tudo o que
precisamos armazenar no banco o nome do arquivo
(no preciso incluir o caminho).
0 M odifique o form ulrio de Adicionar
Pontuao de m odo que ele p a sse a u sar
um cam po de input de arquivos para
perm itir o upload d as im agens.
A pgina Adicionar Pontuaoj tem um formulrio
para se adicionarem as pontuaes, de modo que
precisamos modificar esse Formulrio, incluindo
nele um campo de input de arquivos. Esse campo
Escreva uma consulta in s e rt para inserir funcionar conjuntamente com o navegador para
o nome do arquivo grfico na coluna apresentar ao usurio uma interface onde ele
selecionar um arquivo a ser enviado.
screenshot da tabela.
O script Adicionar Pontuao que processa o
formulrio para a adio dos recordes tambm Screen shot: ( Choose fite]) *R phizsscQre-gif
deve levar em considerao o novo campo de input
de arquivos, e deve lidar com a insero do nome
do arquivo grfico na coluna screenshot, quando
inserir uma nova linha de dados de pontuao
tabela guitarw ars.

Modifique a pgina principal de


Guitar W ars de modo que ela
pa sse a mostrar a s im agens
com provantes dos reco rd es.
O ltimo item da nossa lista de
modificaes envolve a pgina principal do
Guitar Wars, in d ex . php, que precisa ser
modificada para exibir a imagem junto a
cada pontuao exibida.

voc est aqui 231


ALTERE sua tabela

0 banco de dados das powtuapes mximas


precisa ser AlTERado A instruo
A lm d e u m a srie d e ajustes n o sc rip t PHP, a no v a aplicao G u ita r W ars A l t e r e u s a d a
p recisa d e u m a no v a co lu n a, n a ta b e la g u i t a r w a r s , p a r a a rm a z e n a r
os n o m e s do s arquivos grficos. E a q u e e n tra o SQL, q u e o ferec e u m a
paia mudar a
in stru o c h a m a d a ALTER, capaz d e m o d ific ar tabelas d e tu d o q u a n to estrutura
je ito , inclusive a d ic io n a n d o novas colunas d e dado s. V oc u so u a
in stru o ALTER, n o c a p tu lo an terio r, p a r a aju star a ta b e la e m a i l _ l i s t b a n c o d e d a d p s
d e Elm er, m as vam os re c a p itu la r a q u i c o m o esse c o m a n d o fu n cio n a.

g u ita rw a rs sco re
A instruo A L T E R
A instruo DROP COLUm dimirt frequentemente t seguida
uma doiuna mtera da tabela. yor T A B L & yara mdidar
<^*e vote estara modi-Pidando
O K , talvez esse seja u m e x e m p lo p e rig o s o , u m a vez q u e e le rev e la uma tabela, E possvel
c o m o e lim in a r u m a c o lu n a in te ir a d a ta b e la , c o m os d a d o s e tu d o . tambew alterar a estruWa
M as q u e c e r ta m e n te p o d e r h a v e r u m a situ a o e m q u e v o c de todo o bando de dados,
p re c ise re m o v e r u m a c o lu n a in te ir a . E m a is p ro v v el, p o r m , q u e dom ALTER DATABASE,
v o c p re c is e a d ic io n a r u m a c o lu n a , c o m o o caso a q u i c o m o mas isso outra Vistoria*
G u ita r W ars. Isso p o s s ib ilita d o p o r ADD COLUMN, q u e u m a d as
div ersas a lte ra e s q u e v oc p o d e e x e c u ta r n a ta b e la c o m ALTER.

ADD COLUMN DROP COLUMN


A d ic io n a u m a c o lu n a ta b e la - b a sta E xclui u m a c o lu n a (e q u a isq u e r d ad o s
arm a ze n ad o s n ela) d e u m a ta b ela - b asta
e s p e c ific a r o n o m e d a c o lu n a e o se u
esp ecificar o n o m e d a co lu n a apos DROf
tip o , a p s ADD COLUMN.
COLUMN.
g g g g g ^ u ita ry a rs ^ ALTER TABLE guitarwars

MODIFY COLUMN
CHANGE COLUMN M odifica o tipo de dados o u a posio
M uda o n o m e e o tip o d e dad o s de u m a d e u m a co lu n a d en tro d a tabela - basta
c o lu n a - b asta especificar o n o m e atu al especificar o n o m e da coluna o seu novo
d a co lu n a, o novo n o m e e o novo tip o de tipo de dados aps MODIFY COLUMN. Para
d ados, aps CHANGE COLUMN. m u d a r a posio de u m a coluna, especifique
o n o m e dela e a sua posio exata (FIRST
a n ica opo aqui) o u u m a posio
relativa (AFTER p ara coloc-la aps u m a
d eterm in ad a coluna, sendo esta especificada
p elo n o m e).
ALTER TABLE g u i t a r w a r s
trabalhando com dados armazenados em arquivos

Aponte seu lpis_____________ ___________________


Escreva uma instruo SQL para adicionar uma coluna chamada
s c r e e n s h o t tabela g u i t a r w a r s . Certifique-se de fornecer nova
coluna um tip o de dados adequado. Depois, escreva outra consulta SQL,
desta vez para verificar a estrutura da tabela e certificar-se de que a
coluna foi adicionada com sucesso.

Esdreva a^ui a instruo


para driar a doluna.

Esdreva a outra
instruo

voc est aqui 233


aponte seu lpis soluo

- f^ ApoHte seu lpis---------------------------------------------


Solupo

screenshot tabelaguitarwars. Certifique-sedefornecer


Escreva uma instruo SQL para adicionar uma cotuna chamada

nova coluna um tip o de dados adequado. Depois, escreva outra

certificar-sedequeacolunafoi adicionadacomsucesso.
consulta SQL, desta vez para verificar a estrutura da tabela e
^ instruaAiTBR ditiona
A jl ~

a Coluna screenshot a tabela


guitarwars.

Uma vez. c^ue a


Coluna c ova,
ela Comea
sua existncia
vazia (NULL)
de \uais<^uer
dados nas
linhas.

A instruo AiTBR nao


afeta ^uais^uer outros
dados da tabela- 0 nome da tabela a ser alterada
vem depois de AtXER TABL-E-

ALTER TABLE guitarwars

A W COLUMN screenshot varchar^^O


r*
ADD COLUMN indica <\ue
0 nome e o tipo de dados da nova Coluna so
especificados por ultimo na Consulta SQL b^
queremos alterar a tabela,

caracteres sao o suficiente para stot^odair a


adicionando a ela uma nova coluna-

maioria dos nomes de arquivos, mas voCe pode Criar


a Coluna ainda maior do <\ue isso se quiser-

r
DESCRIBE guitarwars
Terminamos o ____
primeiro passoj A
Esta instruo exibe
a estrutura da tabela,
incluindo os nomes das Coluns
e os seus tipos de dados. Use AL"
ta b e la a coluna s c re e n s t


trabalhando com dados armazenados em arquivos

T te S T O R iv e
Adicione a coluna screenshot ta b e la guitarwars.
l/ode pode donstruiv- &
U s a n d o u m a f e r r a m e n ta M ySQ L, e x e c u te a in s tru o A L T E R p a r a
iabela juitarvrrs midial
a d ic io n a r a c o lu n a s c re e n s h o t ta b e la g u ita rw a rs . E m se g u id a ,
bai*ando o dd^o de
e m ita a in s tru o D E SC R IB E p a r a d a r u m a o lh a d a n a e s tr u tu r a d a
e*emplo pava jui-Uv iVa
ta b e la e certifica r-se d e q u e a c o lu n a fo i a d ic io n a d a .
e depois exedu-fcando a
dofssulta S$L <^ue se
endOftiira ro av^uvo
5uiiarwavs.s|i.

A 'mstrvi^ao PSCRlBE
mostva a nova dolun
sdreensbot-

existem
TWgiintas Idiotas
^ As colunas criadas com ALTER TABLE guitarwars Os nomes dos arquivos grficos
ALTER precisam ser adicionadas ao ADD COLUMN age TINYINT ainda podero ser adicionados s
final da tabela? AFTER name linhas pr-existentes?

No, elas podem ser adicionadas


em qualquer lugar. Mas tenha em mente
Se voc no especificar um lugar para a
nova coluna ser adicionada, o padro
no final da tabela.
{: Sim, sem dvida, e voc usa a
instruo u p d a t e do SQL para faz-lo.
que a ordem das colunas dentro de No h nada que lhe impea de enviar
uma tabela no tem tanta importncia arquivos de imagens manualmente
assim. Em outras palavras, voc pode ? O que acontece com as linhas
para o servidor, e depois usar u p d a t e
de dados existentes no banco de
estruturar os resultados das suas para vincular os nomes dos arquivos s
dados aps a adio da nova coluna
consultas, de modo a organizar os dados pontuaes existentes. Mas lembre-se
screenshot?
de qualquer forma que quiser. Mas talvez de que a ideia aqui permitir que o
goste da sensao de ordem estrutural prprio usurio envie o arquivo grfico,
criada pelo ordenamento especfico R : Uma vez que a instruo ALTER s e portanto, faz sentido im plem entar a
das coiunas, em cujo caso voc poder afeta a estrutura do banco, a nova coluna funcionalidade de upload das imagens.
querer adicionar a coluna em um local criada vazia de dados nas linhas pre E os usurios podero faz-lo usando o
exato. possvel fazer isso incluindo- existentes. Embora seja possvel preencher script Adicionar Pontuao aprimorado
se a palavra-chave FIRST a esta a coluna screenshot de futuras linhas, as que voc est prestes a criar...
consulta ALTER. Ou ento use AFTER linhas pr-existentes todas tero uma coluna
coluna para posicionar a nova coluna screenshot vazia.
relativamente a uma j existente:

voc est aqui 235


adicione imagens com o formulrio adicione pontuao

Como fazer para o usurio enviar a imagem?


C o m a n o v a c o lu n a a d ic io n a d a a o b a n c o d e d a d o s , e sta m o s p r o n to s p a r a n o s
c o n c e n tra rm o s n a f u n c io n a lid a d e q u e p e r m itir a o u s u rio e n v ia r u m a rq u iv o g rfico .
M as c o m o e x a ta m e n te isso possvel? FTP? T e le p a tia ? Isto n a v e r d a d e n o s leva d e v o lta ao
fo rm u l r io A d ic io n a r P o n tu a o , n o q u a l p o d e r e m o s u s a r u m c a m p o p a r a p e r m itir q u e o
u s u rio se le c io n e u m a rq u iv o g r fic o a s e r e n v ia d o . N
0 torwuiri AdiCionar Pontuaao
t O permitir 3os usurios
^ ----- adicionarum novo registro lista
G u lta r W ars - Add Y o u r H ig h Score B d t terd es de$ w ta *->

j Nane: 1
Score: I86S80 :
Screen siioc Choosf: ^ *-.cf

j > f

/ \ Apos submeter-se o
0s detalbes sob o 1 -formulrio, o arquivo
funcionamento deste boto so I SrfiCo binrio enviado
Controlados pelo navegador e J do servidor,
pelo sistema operacional nativo- )
m geral, ele aciona uma cai*a
de dialogo do navegador, na f r ffiiiffi
^\ o usurio pode navegar pra
encontrar o arquivo desejado no ^S0 f
seu prpr^ rgido- phizsscore.gif

A ssim , u m c a m p o d e in p u t a ju d a o u s u rio a
e n c o n tr a r o a rq u iv o a se r e n v ia d o . E d e p o is? O Servidor w eb
c a m p o ta m b m c u id a d a o p e r a o d e fa z e r a
im a g e m s e le c io n a d a c h e g a r a t u m a p a s ta d o
se rv id o r, a p a r tir d e o n d e p o d e e n t o se r e x ib id a Uma pasta no servidor
c o m o p a r te d a lista d e r e c o rd e s d o G u ita r W ars. recebe o arquivo
i f iCo e o armazena-
r
Esse c a m p o d e u p lo a d d e a rq u iv o s d o f o rm u l r io
a lg u m tip o d e e x te n s o e s q u isita d o H T M L ?
D e f o rm a a lg u m a . A ta g < in p u t> d o H T M L te m
s u p o r te aos c a m p o s r e f e r e n te s a arq u iv o s, e
tr a b a lh a e m c o n ju n to c o m o P H P p a r a p e r m itir
o u p lo a d d o s arq u iv o s. M as a n te s d e e n tra rm o s
n o s d e ta lh e s d o f u n c io n a m e n to d o PH P, v am o s
d a r u m a o lh a d a c o m m a is a te n o n o p r p r io
c a m p o d o fo rm u l rio ...
trabalhando com dados armazenados em arquivos

0 F er a m l tfo A dicionai: p o n tu a o em D f a i t e s

$te atributo instrui o


formulrio d usar um tipo
especial de codificaeao, Estabelece um tamanho
requerido para o upload de mximo para os arquivos
arquivos ele afeta o modo enviados, este caso 3ZKB
como os dad^s POST sao 3Z.7&0 bytes).
tombinados e enviados apos a Este formulrio e
submisso do formulrio. \ autorreferente-

<form Imethod="post'' action="<?phb echo $ SERVER ['PHP


SELF]; ?>>

aMawBBwafWUNiriininHini ai iii._s. ...


mmam m m
<label for="name">Nome:</label>

<input type="text" id="name" name="name" value="<?php if (!empty($name)) echo


$name; ?>" />

<br />

clabel for="score">Pontuao:</label>

<input type="text" id=score" name="score'' value="<?php if (!empty($score)) echo


$score; ?>" />

<br />

<label for="screenshot">Captura da Tela:</label>'

<hr /> Este e o campo de input


propriamente dito, <\ue em
<input type="submit" value="Add" name="submit" />
ultima instncia, utilizase
</form> de uma caixa de dilogo do
sistema operacional nativo
para o usurio navegar ate o
arquivo e seleCiona-lo.

ulrio
Adicionar Pontuao de
modo que ele passe a
usar um campo de input
de arquivos para permitir
o upload das imagens.

voc est aqui 237


armazenar arquivos de imagem no banco de dados

Os nomes <fcs
Insira o (nome do) arquivo grfico no
banco de dados ssp a t m o z e t i c i d p s

S im p lesm en te enviar u ra arquivo grfico p a ra o serv id o r atravs de n t>ctnco de dctdPS


u m fo rm u lrio n o suficiente. T em os de a rm a z e n a r o n o m e d o
arquivo n a n o v a c o lu n a sc re e n sh o t d o b a n c o d e d ad o s, p a ra q u e cotio pqrte de uma
a im a g em possa ser acessada e exibida. D o je ito q u e est o scrip t
A d icio n ar P o n tu a o , j est in se rin d o novas p o n tu a e s n a ta b ela Insfrufe HSElTT
guitarw ars, u sa n d o a in stru o SQL INSERT, m as esta n o est
lev ando em co n sid era o a nova c o lu n a s c r e e n s h o t :

A -funo Mov/O do MyS#L usada


* r pava se nseviv a data e Kora atuais.
INSERT INTO guitarwars VALUES (0 , NOW() , ^narne', '$score')
A doiuna id e deinida automatidamente atravs de \
AMT0__IMCRMKT O C^evo) t i^novadoj embora a
donsulta realmente regueira um vaior a\ui. fassav o nome do arquivo
U m a vez q u e esta in stru o SQ L est in se rin d o valores sem id en tificar ojviito na instruo
co lu n as p a ra eles, ela p rec isa in c lu ir u m valor p a ra c a d a co lu n a. Mas StL-fcCT -faz- tom <\ue
ns acabam os d e ad ic io n a r u m a nova, o q u e significa q u e a co n su lta ele seja ad^ionado ao
n o fu n c io n a m ais - est fa lta n d o u m valor p a ra a n ova c o lu n a
s c r e e n s h o t . Assim, p a ra a d ic io n a r u m n o m e de arquivo grfico ao bando de dados.
b an c o co m o p a rte d e u m a nova lin h a de d ados, p recisam o s a d ic io n a r
u m novo valor in stru o INSERT:

INSERT INTO guitarwars VALUES (0 , NOW() , T$name $score',


M linhas de dados inseridas antes^
da triaao d doiuna sdreensHot *ao^
possuem um nome de arquivo ya-fido- A ordem destes valores
az. di-ferenda, uma vez.
c \ue a instruo IKSERT
esta assumindo \ue eles se
endontrm na mesma ordem
\ue as dolunas da tabela-

E 3cii>'u -------
IN S E R T p a ra In se rir
o n o m e d o a rq u iv o
g r fic o n a c o lu n a
A nova instruo K^ERT resulta no nome do arquivo s c r e e n s h o t d a ta b e la .
da imagem a sev inserida na do!una sdreenshot-
trabalhando com dados armazenados em arquivos

Pescubra o nome do arquivo enviado


P arece estar tu d o c e rto com a consulta, m as n s a in d a n o sabem os
q u al o n o m e d o arquivo grfico. E lgico assum ir q u e o ca m p o d e
in p u t d e arquivos d o fo rm u l rio o ferece, d e alg u m a fo rm a, acesso
ao n o m e d o arquivo, m as com o? A resp o sta resid e em u m a varivel
su p e rg lo b a l in te rn a do P H P c h a m a d a $_FILES, q u e s e m e lh a n te
su p e rg lo b a l $_JPOST q u e j usam os p a ra acessar d ad o s d o fo rm u lrio . <input type="file"
name="screenshot" / >
C om o $_POST, $_FILES u m array, e d e n tro d ele en c o n tra-se n o
ap e n as o n o m e d o arquivo enviado, m as ta m b m o u tras in fo rm a es
q u e p o d e r o ser teis.

0 Wmulvio envia alg^as ILES['screenshot 1]['name']


utess sobre Nome do
o av^uW o para o scrip-b arquivo
PftP, atravs dia variarei enviado-
superglobal f_jF |L -
$_FILES['screenshot ' ] [ 1type']

MMH ^ __ 0tipo MIM do


arquivo enviado,
neste caso jlJ'*.

$ FILES['screenshot 1] [ 1size']
phizsscore.gif 1 1 1 ! *-- oWh. <**byte)
c do v^uivo enviado.
ste e o v^uivo gvf iCo
sendo enviado atravs
do capo de input de $_FILES [ 1screenshot 1] [ 1tmp__name'] ,
arquivos do formulrio. *l l l i B l l i P ^ localizao de

te*poravia
do ar^uivo no
servidor.
A SUpelrglokal $ FILES['screenshot'] E'error']
~ mm 0 cdigo de erro para
interna 4 L F L E S i ^ 0 up}oad do av<\uivoj 0
indica suCesso, ovtros
p tn e ce acessp a valores indiCm fracasso-

n fe n ia p e s sp b te As o u tra s in fo rm a e s d isp o n ib iliz a d a s n a varivel $_FIL E S


c e r ta m e n te so teis, m as n e s te m o m e n to s p re c isa m o s d o
a r ^ u V p s e n V la d p s . n o m e d a im a g e m , q u e p o d e se r a rm a z e n a d o e m u m a varivel
lo cal ($ sc re e n sh o t) e u s a d o n a in stru o S Q L INSERT.

voc est aqui 239


manter os dados de arquivo externo em arquivos externos

Dados armazenados em arquivos externos geralmente


so deixados nesses arquivos externos, mesmo em
aplicaes de bancos de dados.
N este caso, os dados so u m c o n ju n to d e pixels q u e co m p em u m a
im agem , a qual a rm a ze n ad a em u m arquivo e x te rn o - u m arquivo GIF,
JP E G o u PNG. Os bancos d e d ad o s so excelen tes p a ra arm a ze n ar dados
de texto, e n o dados b inrio s p u ro s com o so as im agens, e p o r isso,
referncia
m e lh o r arm a ze n ar n o b an c o ap en as u m a im agem . Essa
refern c ia o n o m e d o arquivo.

O u tro m otivo pelo q u al as im agens n o so a n n a ze n ad a s em b ancos de


dados, nas aplicaes web, q u e seria m u ito m ais difcil exib-las usando*
se cdigo HTM L. Lem bre-se de q u e o cdigo H TM L referen cia im agens
a p a rtir d e arquivos ex tern o s u sa n d o os nom es dos arquivos. Assim, p ara
g e ra r u m a tag d e im agem em H TM L usa-se o n o m e d o arquivo, e n o os
d ad o s p u ro s d a im agem .

Telia se colpoci < im g s rc = ' a l t = " S c o re im a g e " />

u rn a im a g e m
em uma pgina
Wet>7 SP 0 nome A - t a $ H T M L - < im $ >
do arquivo usa o nome para
precsp uma $ r f y 0. referenciar o arquivo
^ r f ito armazenado Phizsscore.gif
r e fe r e n c ia a ^ ~ no servidor web.

a r ^ u V p .
trabalhando com dados armazenados em arquivos

Aponte seu lpis


A pgina principal do Guitar Wars (index.php) ainda no est exibindo as
imagens de captura de tela que comprovam as pontuaes. Complete o
cdigo para que ele passe a exibi-las.

<?php

// Conecta-se ao banco de dados


$dbc= mysqli_connect{'www.guitarwars.net', 'admin', 1rockit', 'gwdb');

// Obtm os dados das pontuaes a partir do MySQL


$query= ;

$data= mysqli_query($dbc, $query);

// Faz um loop atravs do array contendo os dados das pontuaes, formatando-os


como HTML

echo '<table>';

while ($row = mysqli_fetch_array($data)) {


// Exibe os dados das pontuaes
echo 1c t r x t d class=" scoreinfo"> ';

echo 1<span class="score">' * $ row ['score'] .'c/spanXbr />' ;


echo '<strong>Name:</strong> 1. $row['name'] . '<br/>';
echo '<strong>Date :</strong> '. $row ['date'].. '</td>';
if {is_file(................. ) &&filesize{..................) >0) {

echo 'Ctdximg src=" ' . ............... alt="Score image" /></tdX/tr>';

}
else {
echo 'ctdximg src="unverified.gif" alt="Unverified score" / x / t d x / t r > ';

echo 'c/table>';

mysqli__close ($dbc) ;
?>

voc est aqui 241


aponte seu lpis soluo

ponte seu lpis-----------------------------------------------


Solupo
A pgina principal do Guitar Wars (index.php) ainda no est exibindo as
imagens de captura de tela que comprovam as pontuaes. Complete o
cdigo para que ele passe a exibi-las. N
uma tentativa de ajudar a simplvfidar o td^o, ao
iremos usar "or d'seO para produzir mensagens de erro
e interromper o sdript guando uma uno mys^ii -falhar-
<?php tyod poder dontinuar utilizando esse redurso as suas
prprias apiidadoesj s pararemos de usa-lo da^ui em
// Conecta-se ao banco de dados v ,
diante, apenas para
_
manter o dodtjo o^ mais breve possvel-
$ d b c = mysqli_connect(1www.guitarwars.net', 'admin1, 'rockit', 'gwdb');

// Obtm os dados das pontuaes a partir do MySQL

$query = S t U C T * F R O M guitarwars" ^ ^ instruo S Q L <\ue pede as


pcm-tuadoes nao se modvfida em
data = mysqli__query ($dbc, $query) ; 1 j1

// Faz um loop atravs do array contendo os dados das pontuaes, formatando-os


como HTML

echo '<table>';

while ($row= mysqli_fetch_array<$data)) {

// Exibe os dados das pontuaes

echo ' < t r x t d class="scoreinfo">'; M *


sta undao vereda
echo 1<span cl-ass=" score"> ' . $row [score 1] . '</span><br />' ; ^ q arquivo gr-fi-o

e c h o < s tro n g > N a m e : < / s t r o n g > ' . $ ro w [ nam e ] . '< b r / ^ l - ^ ^ ^ r>o esta vazio-

echo '<strong>Date:</strong> ' . $ r o w ['dat^>f^T'</td>'; ___

if (is_file( && filesize ( > 0) {

echo '< t d x i m g src=" ' . frovC sdreenshot 3 . '" alt=" Score image" / > < / t d x / t r > ^
Esta -Puna veriida se o aruivo douna sdreensbot do bando de dados ^
e i l e { Y ca U tit cxise' a r m a ^ uma imagem para dada pontuadao-

echo 1< t d x i m g src="unverif ied.gif" alt="Unverified score" /></td></tr>1;

} A M o d ifi

echo 1</table>';
m odo
q u e e la p a s s e a
m o s t r a r a s im a g e n s
mysqli_close($dbc)
c o m p r o v a n te s d o s
?> I re c o rd e s.
trabalhando com dados armazenados em arquivos

T fe S T O R fv e

A dicione um novo recorde ao G uitar W ars, incluindo a cap tu ra de te la .


C aso a in d a n o o te n h a fe ito , b a ix e o c d ig o d e e x e m p lo d o G u ita r W ars n o site d a A lta
B ooks, w w w .altabook 5 .c o m .b r. E st n a p a s ta c a p itu lo 05 ( c h a p te r 0 5 ). O c d ig o c o n s is te
(index.php),
d a p g in a p r in c ip a l d o s c rip t A d ic io n a r P o n tu a o (addscore.php) e de
u m a fo lh a d e e stilo (style.css).
P rim e iro , v o c p re c isa m o d if ic a r o s c rip t a d d s c o r e . p h p d e m o d o q u e o se u
fo rm u l r io A d ic io n a r P o n tu a o p a sse a te r s u p o r te a o u p lo a d d e arq u iv o s. Isso in c lu i
a d ic io n a r n o v o s c a m p o s a o fo rm u l r io , a ju s ta r a ta g < fo rm > e v e rific a r se a v ariv el
S s c re e n s h o t n o e st vazia. D ep o is, in c o r p o r e a o sc rip t a n o v a c o n s u lta IN S E R T q u e
in s e re p o n tu a e s .
A g o ra , v a o s c rip t in d e x .p h p e in s ira n e le o c d ig o d a p g in a a n te r io r , p a r a q u e ele
p o ssa e x ib ir a c a p tu r a d e te la r e f e r e n te a c a d a p o n tu a o .
E nvie to d o s esses a rq u iv o s p a r a o se u s e n a d o r w eb e a b r a a p g in a a d d s c o r e . p h p
e m u m n a v e g a d o r. D ig ite u m a n o v a p o n tu a o n o fo rm u l r io e c liq u e e m S u b m it. E m
se g u id a , n a v e g u e a t a p g in a i n d e x . p h p e d u m a o lh a d a n a n o v a p o n tu a o .

AI50 ao esta devtc


if*agem no est ap.
junto do a ova pontuaa.

P or que voc acha que a im agem com a


captura da teia no est ap arecen do junto com
a nova pontuao? E quanto s pontuaes
que j estavam no banco d e dados?

voc est aqui 243


arquivos enviados so armazenados em uma pasta temporria

Para onde foi o arquivo enviado?


O p r o b le m a c o m a im a g e m e n v ia d a n o a p a r e c e r q u e n s assu m im o s q u e o a rq u iv o se ria
e n v ia d o p a r a a m e s m a p a sta , n o se rv id o r, q u e a d o s n o sso s sc rip ts PH P. O c o r re q u e isso
e s t s im p le s m e n t e i n c o r r e t o . O f o r m u l r io d e A d ic io n a r P o n t u a o p e r m ite q u e o u s u r io
se le c io n e u m a rq u iv o d o se u p r p r io c o m p u ta d o r , m a s o a rq u iv o e n v ia d o p a r a u m a p a s ta
te m p o r r ia d o se rv id o r, n a v e rd a d e . E ssa p a s ta te m p o r r ia c ria d a a u to m a tic a m e n te n o
se rv id o r, e e m g e ra l p o ssu i a lg u m n o m e e s tra n h o , c h e io d e le tra s e n m e ro s a le a t rio s.

Isso a p r e s e n ta u m p r o b le m a p a r a o n o sso c d ig o < im g > e m i n d e x . p lrp , p o r q u e e le


a s su m e q u e a im a g e m e s t lo c a liz a d a n a p a s ta p r in c ip a l d o site:

c im g s r c = " | l li| & S r ^ l| ! i | | ^ '' a l t = " S c o re im a g e " />


Servidor
w eb

Este tdi5 assume


ejue imSj.w
armzenda n3
mesm pasta ft os
scripts PHf*.. mas 0 nome e 3
ela nao esta! jotaiiz^ao deste
pasta tem porria
vaviam conforme a
Navegador
instalaao do PHP-
eb do clien te

0 ar^uivo Corn
a ima^em da
captura de CSS
teia se localiza *acorG .php
origiyvlmente index.php
aljMma pasta do
Computador do
MSUV-io. Este formulrio
se ortna de
addsCorephp-

phizsscore.gif

script de Adicionar
Pontuao cuida
de enviar o arquivo
graf ico para uma pasta
temporria no servidor.
trabalhando com dados armazenados em arquivos

A rm azenar imagens em uma


c rp tic a pasta te m p o r ria parece se r uma
complicao desnecessria. No possvel
d e fin irm o s onde os arquivos enviados devem
se r armazenados?

Sim! O PHP lhe permite controlar onde os arquivos enviados


sero armazenados.
Porm , n o possvel controlar, atravs do PHP, o local de arm azenam ento inicial
dos arquivos enviados, motivo pelo qual essa localizao considerada com o
tem porria. Mas voc p o d e m over o arquivo para o u tro lugar, depois de ele ter
sido enviado. A funo PHP m ove_jiploaded_file() aceita com o parm etros a
localizao-fonte e de destino do arquivo, e ento realiza a transferncia:

move_uploaded_file (;||t |f ^ ta rg e t);

c a iotljiiao-WU
do arquivo grafito, indluindo Esta a
OtmmKo C O nome do lodalizaao de
dr<\i*Wo temporrio. destino do arquivo
Servidor Web grafido, indluindo
o daminho e o
nome do arquivo
permanente.

0 arquivo
movido de uma
pasta temporaria
para uma
permanente-

fscore.php
index.php
move uploaded__f e 0
Esta pode ser ^uatauer pasta
do servidor <^ue vode quiser
usar, apenas dertifi^uese de
ter permisso para esdrever phizsscore.gif phizsscore.gif
arquivos nela.

voc est aqui > 245


no existem perguntas idiotas

mQ existem
p e r g u n ta s id io ta s

I No possvel modificar o lugar de armazenamento


inicial dos arquivos enviados editando-se o arquivo php.ini?

Sim. 0 arquivo de inicializao do PHP (php.ini) pode ser


usado para se modificar o lugar de armazenamento inicial dos
arquivos enviados, atravs da opo uploadJmp_dir. Porm, se
a sua aplicao estiver hospedada em um servidor virtual, voc
poder no ter acesso a esse arquivo de inicializao, o que
significa que, se quiser mover o arquivo enviado para uma outra
pasta, ter de faz-lo atravs de cdigo PHP.

7 * Por que a pasta de armazenamento inicial chamada


de temporria ? Ela desaparece depois que o arquivo
retirado dela?

K : No. A pasta temporria no sentido de que no foi criada


para servir como o lugar de armazenamento definitivo para os
arquivos enviados. Voc pode pensar nela como uma espcie de
antessala, onde os arquivos enviados so armazenados at serem
movidos para os seus lugares de armazenamento finais.

* Por que eu no posso simplesmente deixar um arquivo


na pasta temporria?

J ^ _ t Voc pode, em cujo caso ter de adicionar $_


FILES['screenshot'] ['tmp_name'] ao caminho da imagem, para se
certificar de que ela possa ser encontrada na pasta temporria.
Mas tenha em mente que voc no pode controlar o nome ou
a localizao da pasta, em geral. Mais importante ainda, as
pastas temporrias podem ser automaticamente esvaziadas,
periodicamente, em alguns sistemas. Outro potencial problema
que a pasta temporria poder no estar acessvel ao pblico,
e com isso, voc no poder referenciar os arquivos enviados a
partir do seu cdigo HTML, o que atrapalharia o funcionamento
do Guitar Wars e da maioria das aplicaes PHP. Movendo os
arquivos enviados para outra pasta que no a de armazenamento
temporrio, voc pode controlar cuidadosamente onde os arquivos
ficaro, e como sero acessados.
trabalhando com dados armazenados em arquivos

OK, ento agora eu sei como


mover os arquivos enviados de
um lugar para outro. Isso
realmente til. Mas ainda no
tenho a menor ideia de para
onde eles devem s e r enviados.

Toda a p lic a o p re c is a de um a p a s ta im a g es
(im a g e n s ).
O K , talvez d iz e r q u e p re c is a , p o ssa se r u m e x a g e ro , m a s
im p o r ta n te q u e os p e d a o s das a p lic a e s P H P fiq u e m o m ais
o rg a n iz a d o s possvel, e u m a m a n e ir a d e faz-lo c r ia n d o p astas
p a r a os d if e r e n te s c o m p o n e n te s . U m a vez q u e as im a g e n s so
e n v ia d a s p e lo s u su rio s, elas n o s o alg o s o b re o q u e voc
n o r m a lm e n te te r c o n tro le d ire to , p e lo m e n o s e m te rm o s
d e n o m e s d e a rq u iv o s e q u a n tid a d e s . A ssim , u m a b o a id e ia
a rm a z e n -la s s e p a r a d a m e n te d o s o u tr o s a rq u iv o s d a a p lica o .

D ito isto , p re c is a m o s d e u m a p a s ta im a g es, o n d e os arq u iv o s


g rfico s en v ia d o s p a r a a a p lic a o G u ita r W ars p o ssa m se r
a rm a z e n a d o s . E sta p a s ta p o d e se rv ir ta m b m c o m o lu g a r d e
a r m a z e n a m e n to p a r a q u a is q u e r o u tr a s im a g e n s q u e a a p lic a o
u se, caso su rja a n e c e s sid a d e .

A pasta 'majes a verdade *ao


t muito ais importante *\uC
oyul\uer outr pstj ms ela
ajuda a organizar os arquivos
grf (tos em um so lu^r.

voc est aqui 247


faa uma pasta para imagens enviadas

Crie um lar para os arquivos grficos enviados


A p a s ta im a g e s id n tic a a q u a lq u e r o u tr a d o se rv id o r, e x c e to p e lo fa to d e q u e e la te m d e
s e r c o lo c a d a e m a lg u m lu g a r a b a ix o d a p a s ta p r in c ip a l d a a p lic a o . N a m a io ria d o s casos,
b a s ta c o lo c -la d ir e ta m e n te c o m o u m a s u b p a s ta d a p r in c ip a l, m a s v o c p o d e c r ia r u m a
h ie r a r q u ia d e p a sta s m a is c o m p le x a , se q u iser.
C ria d a a p a s ta i m a g e s d ir e ta m e n te d e n tr o d a p a s ta p r in c ip a l d o se rv id o r, to rn a -se
p o ssv el r e f e r e n c ia r a rq u iv o s d e im a g e n s d e d e n t r o d e sc rip ts PH P , assim :
0 no**e do r^uivo e
Starget = Condatenado o dmmfoo

sta c a fasta web da aflitaao,


(jlmage zssc re. onde os sevifb PHP, induindo inde*-
fiy , idaw arm a^nados.
O c a m in h o $ ta rg e t c ria d o a p a r tir d e u m a n o v a
c o n s ta n te q u e ire m o s a d ic io n a r a o sc rip t, c h a m a d a
GW_UPLOADPATH, q u e a r m a z e n a o c a m in h o a t a
Servidor
n o ssa p a s ta im a g es. A ssim c o m o as variveis, u m a w eb
c o n s ta n te se rv e p a r a a r m a z e n a r a lg u m d a d o . M as o
v a lo r d a c o n s ta n te n o p o d e s e r m o d ific a d o , u m a
vez d e fin id o . O n o m e d o a rq u iv o g r fic o , c o n f o r m e
d ig ita d o n o fo rm u l r io A d ic io n a r P o n tu a o e n t o
c o n c a te n a d o a o c a m in h o a t i m a g e s .

0S r^uVvos g rafito s enviados


so movidos f a r a a fa sta
images, cmde fodem ser
exibidos atravs de tags
HT/V1L <ig>.
phizsscore.gif

S e a su a a p lic a o P H P estiver
h o sp e d ad a em qualquer outro
lu gar que no o se u com putador
local, voc precisar u sar FTP
V e ja W n ! para criar a p a sta im ages.

U se u m p ro g ra m a de F T P p a ra acessar o sistema
de arquivos do seu site, e crie a p asta im a g e s
diretam ente d entro da p asta web d a aplicao.
trabalhando com dados armazenados em arquivos

S n IT A -S E co m o um a w u V o g r c o e n v ia d o

Suaatefa e intepi-et^t o papel de UH1 ai^UlVo


grffco envlad?, traando o seu camnjip Servidor
atraVs do apllcatVo Guitar Wars. Desenhe seu w eb
caminto atraVs de cada parte da
aplicao, sem se esquecer do
banco de dados, pense como
um stFjvfa/Q enViade!

Navegador
w eb do c lie n te

Com tu av*i
p h iz s s c o re .g if
phizsscore.gif
phizsscore.gif

g u ita rw a rs

voc est aqui 249


sinta-se como um arquivo grfico enviado-soiuo

S ir r A -S E com o um qj^ u W q g r S ic o e n v ia d o - S o lu a

Sua tareia Interpretar 9 papel de um arquivo


graic enViade, traando 9 geu camnlio atraVs Servidor w eb
d aplioatVp Guitar Wars. Desenlie seu camfnlio
atraV-s de cada parte da aplicao,, sem se
esquecei do banco de dados. ense
come um arquive enVado!

N avegador w eb
do clien te

Vot i deve ser


ti/tdidoso tom o riomt
c a lotaSitato desta
ya^ia, porque ela
6 viss Cm toda a
apita^ w-tav tva
para ar*azwar e j
reerendiar os ar^utoos^^/^
Esta pasta ^r-fitos e^ados-
-(ida no 7t
Computador Pviwcir 0
do usurio arquivo e ewtd
A (Asando-^ wfi
vote ao phizsscore.gif
tem dontrole AmPo de mPut do
phizsscore.gir, ' , m se%hdo lu^at-, ar<^iv movido
nenhum sobre +or(*vwir0- pasta temporria para a pas-fca
o nome dela, imanes permnen-te-
ne onde ela
e armazenada,
mas tambm Apos o arquivo
nada disso lhe ser ewviado ao
importa- Sscreenshot = $ _ F IL E S [screenshot][1n am e ]; servidor e ser
rrovide para O
seu ta^ar de
am azena^e^t
vo passo ^ue -final seu *"
wo havamos fianejado - o seu s adicionado ao
Caramba! proje-o precisa ser -Pie%vel/
g u ita rw a rs ban&o de dados-

the Mova o ai
grfico da pasta
temporria para
uma pasta
permanente criada
para a s imagens.

addscore.php
trabalhando com dados armazenados em arquivos

TfeST O R f v e __________________
D aos arquivos grficos enviados um lar perm anente, com um a pasta
prpria para eles.
M o d ifiq u e o sc rip t a d d s c o r e . p h p p a r a q u e e le u se a c o n s ta n te G W J J P L O A D P A T H e
a rm a z e n e os arq u iv o s grficos n o c a m in h o p a r a o n d e ela e st a p o n ta n d o . Eis o p e d a o d o
c d ig o q u e p re c isa se r m o d ific ad o :

<?php
as ccin.qtpir.tss dc caminho e do -amanho mximo dos arquivos
define(1GW UPLOADFATE', 'images/

if (isset(S_POST[1submit']) ) {
// Pega os dados em POST
Sname - _?OST['nane']?
Sscore = $_POST[1score'];
$screenshct - $ FILES[screenshot][1name'];

: ('empty($name) 5S !empty($score) & !empty(Sscreenshot)) {


// Move o aranivQ.. para a pasta-alvc
Starget = (S_UP LOAD PATH . jfscreenshot;
if (jnove_upKkJfca_i.ilbi (i_Tfll.ES ['screenshot1] [' tmp_name], $target) ) {
// Ccnecta-se ao banco de dados
$dbc = mysqli connect{1h w w .guitarwars *net1, admin, 1rockit', 1g^'db1);

// Escreve os dados no banco


$query = "INSERT IHTO guitarwars VALUES (0, NOW().
mysqli_query(5dbc, $query);

// Confirma xito com o usurio


echo '<p>0brigado por adicionar o seu recordei</p>';
echo '<p><stron>Nome:</strong> ' . Sname . '<br
echo 1 |,g|trr'",,> 1 $sccre . 1<br. />';
echo '<img src=" ./g w _UPLOADPATH 7\screenshot . alt="Score image" /></p>';
echo 1< o X a h.ref="in38";{Sll!i{i"^iiL; S T t V o l t a r para a lista dos recordes. </a></p> ';

addscore.php
O sc rip t i n d e x . p h p ta m b m a fe ta d o p e la c o n s ta n te G W _ U P L O A D P A T H . N o se
e s q u e a d e m o d ific -lo ta m b m . A p s fa z e r essas m o d ific a e s, en v ie os sc rip ts p a r a o
se u se rv id o r e te n te a d ic io n a r u m a n o v a p o n tu a o n o v a m e n te . a . .r
r n tr^age* unvevi-hed

exibida f3r fon-twaocs


an-tigas, <\uc no em
w^a dap^twra de beis
domfvobatra.

A tap-tava dc tela
enviada agora -Pita visvel
na pagina printipa!.

voc est aqui 251


n a ? eX JStem
perguntas idiotas
P ' Se o arquivo p h p . i n i pode usurios de uma aplicao to competitiva O resultado desse cdigo um nome

ser usado para se controlar o lugar de estaro sempre procurando por um jeito 1221634560phizsscore.gif para o
armazenamento dos arquivos enviados, de fraud-la, portanto, voc deve eliminar arquivo, em vez de phizsscore.gif, onde
por que necessrio mover os arquivos? todas as possibilidades de fraude que 1221634560 a hora atual do servidor,
puder encontrar! expressa em segundos.
K : Porque nem sempre possvel
modificar php.ini. Por exemplo, se voc Vale a pena ressaltar que a funo P ' Ns poderamos ter armazenado,
now () usa a hora do servidor, que no banco de dados do Guitar Wars, os
estiver criando a aplicao PHP em um
poder no ser a mesma que a hora dados propriamente ditos da imagem
servidor web virtual, bastante provvel
que voc no ter acesso para modificar local do cliente. Isso no dever ser um enviada?

as configuraes de php.ini. E mesmo problema, porm, uma vez que todos


H : Sim. Os bancos de dados so
que possa modificar esse arquivo, voc os usurios estaro obrigados mesma
bastante flexveis, e lhe permitem
corre o risco de danificar sua aplicao hora do servidor.
armazenar dados binrios dentro deles.
caso precise mov-la para outro servidor. T * * No possvel que as pessoas Porm, o grande problema neste caso
Em outras palavras, a aplicao ficaria escrevam em cima das imagens umas que o Guitar Wars usa as imagens enviadas
dependente de um caminho controlado das outras, enviando arquivos grficos no odigo HTML, para que elas possam
por php.ini, em vez de um caminho com os mesmos nomes? ser exibidas na pgina principal index.
controlado pelo seu prprio cdigo PHP. php. Atag HTML <img> foi criada para
Sim. O problema tem a ver com o
referenciar um arquivo grfico armazenado
7 Por que os usurios no podem fato de que as imagens armazenadas
no servidor, e no um conjunto de dados
digitar uma data, na aplicao no servidor usam exatamente o nome
binrios armazenados em um banco.
Guitar Wars? de arquivo fornecido pelo usurio no
Assim, mesmo que voc alterasse a tabela
campo de upload do formulrio. Assim,
A data uma parte importante do guitarwars para armazenar dados binrios,
se dois usurios enviarem arquivos com
registro da pontuao, no sentido de ainda se depararia com um desafio absurdo,
o mesmo nome, a imagem do segundo
que ela estabelece quando o recorde foi ao tentar colocar os dados de volta em um
usurio ser escrita em cima da imagem
oficialmente publicado no site. Como ocorre formato que pudesse ser exibido usando-se
do primeiro. Isso no bom. Uma
com qualquer registro, a primeira pessoa cdigo HTML
soluo adicionar alguma unicidade aos
a conseguir uma determinada pontuao
recebe toda a glria. Em vez de confiar que
nomes dos arquivos no servidor. Uma Kao hi nada de <^a! sob a W a
o usurio nos dir realmente quando foi
forma simples de faz-lo adicionar a v-eW*ada pela -funao timeO, e+ux#
hora atual do servidor, em segundos, ao pelo -fato de y t ela ^era Uer*s
que ele conseguiu a pontuao, podemos
simplesmente usar a data e a hora do post nome do arquivo, desta forma: hios... e o nimcro retocado esta
$target = GW UPLOADPATH . sempre wwetawdo|
como o registro oficial da pontuao. Isso
t i m e ()
elimina falsificaes e empresta maior
$screenshot;
credibilidade lista dos recordes. Os
PONTOS DE BALA
A instruo A LTER usada para se modificar a estrutura de
uma tabela de banco de dadoa MySQL, por exemplo para se
adicionar uma nova coluna de dados.

Os bancos de da<fcs sp Com uma pequena ajuda do PHP e do MySQL, uma tag HTML
< i n p u t > pode ser usada para se enviarem arquivos grficos.
9tunps para se armazenar A varivel superglobal $ _ f i l e s onde o PHP armazena

dadPS detexfcp, Pias em informaes sobre um arquivo enviado.

Afuno padro do PHPmove_uploaded_ file () lhe


geral e melhor cjue eles permite mover arquivos de um lugar para outro no servidor, e
essencial para o processamento dos arquivos enviados.
referenciem dadbs blnliPS de A maioria das aplicaes web beneficia-se de ter uma
pasta images para armazenar as imagens usadas
affiufV ps e x te rn p s . pela aplicao, especialmente aqueias enviadas
pelos usurios.
trabalhando com dados armazenados em arquivos

Legal que o caminho


seja armazenado em uma constante, A nstante
mas por que ele criado em dois lugares, #v_UPU>AZ>PATft
index.php e addscore.php? O que acontece armaz-ena tami*ho
se o caminho se modificar? *fcc o arquivo yrito
enviado.

define('GW_UPLOADPATH 'images/ ') ;

0 valo*" da tonstante, o <\*\


aemeO sado J o da
nuntd fode sev modi&tado-
*e e n * w
ele uma Aonstante!
tonstantes-

S e o c a m in h o s e m od ificar, v o c te r d e m o d ific a r o c d ig o
em d o is lu gare s... c d ig o d u p lic a d o n o u m a b o a c o isa !
Assim, d entro de cada um dos scripts, in d e x .p h p e a d d s c o r e . p h p , a
constante GW_UPLOADPATH funciona sem problem as. Mas ela criada duas
vezes, o que significa que qualquer modificao no cam inho ter de ser feita
em cada um dos scripts. Esse tipo de duplicao de cdigo consequncia
de um m au projeto, e deve ser elim inado sem pre que possvel.

The donstant is stored tv/ide, meaning it has


to be maintained in two di-ffevent fldtes.

W R > 9
CREBRO

Para resolver o problema do


cdigo duplicado, precisamos
arm azenar a constante g w _
u p l o a d p a t h em apenas um
lugar. Voc a arm azenaria em
index.php ou em addscore.
php? Por qu?

voc est aqui 253


dados em scripts compartilhados com arquivos include

Pados compartilhados precisam ser compartilhados


Q u a n d o t m d a d o s q u e d e v a m s e r c o m p a r tilh a d o s p o r d if e r e n te s sc rip ts e m u m a a p lic a o ,
v o c p re c is a d e u m a f o rm a d e a rm a z e n -lo s e m u m s lu g a r, d e o n d e c a d a s c rip t p o ssa
o b t -lo s p a r a u so . M as isso a in d a n o r e s p o n d e a q u e s t o d e o n d e e x a t a m e n t e os d a d o s
d e v e m s e r p o sto s,..?
Os dads a serem
Voc poderia arm azen ar os dados apenas
c p r a p a ttilta d p s p p t
em index.php...
scripts precisam icat
// Defina a. constante do carrinho da upload
define{1G
WUPLOA.DPATH' , 'images/'); acessVels atd a
a aplicap, sem
d u p l i c a e s tiP c d i g o ,
index.php
...m as desse je ito os outros scripts no teriam
acesso a eles.

A ssim , a r m a z e n a r os d a d o s a s e re m c o m p a r tilh a d o s
e m u m s c rip t n o fu n c io n a , p o r q u e os d a d o s n a
v e r d a d e n o e s ta r o m a is s e n d o c o m p a rtilh a d o s . A - @
addscore.php
re s p o s ta e s t e m c o n s e g u ir, d e a lg u m m o d o , t o r n a r os
d a d o s acessveis a vrios sc rip ts, m a s se m a rm a z e n -lo s
d ir e ta m e n te e m n e n h u m d eles.

index.php addscore.php

Como to rn a r os dados acessveis a am bos os


scripts sem os arm azen ar em nenhum deles?

A so lu o p a r a o p r o b le m a s o os arquivos include, a rq u iv o s d e
c d ig o -fo n te P H P q u e so in s e rid o s e m o u tr o s a rq u iv o s P H P
c o n f o r m e n e c e s s rio .
trabalhando com dados armazenados em arquivos

Sero necessrios dados do O s a r ^ u V ^ s

script compartilhado i n c l u d e lfc e

O s a rq u iv o s in c lu d e s o b a s ta n te p o d e ro s o s , p o r q u e , a p s cri- p e r m it e m
los, v o c p o d e us-los s e m p re q u e n e c e s s rio e m o u tr o s scrip ts,
c o m p a r tlllic :
n a p r tic a c o m p a r tilh a n d o o c d ig o c o n tid o n e le s. A c o n s ta n te
GWJJPLOADPATH p o d e s e r c o lo c a d a e m u m a rq u iv o in c lu d e p a r a c (> c l!g o e n t r e
e s ta b e le c e r u m c o n ju n to d e variveis d a a p lic a o .
d iV e r S 9 S
<?php
// Define constantes da aplicao
scripts.
define('GWJJPLCDPATH', Timages/T);
?>

addscore.php

jnfcluir apfvars.fHf C outvos


A hsfcrudo re^nHre_jw*e
~ , stvipis periwite estes
tuida de indluiv um sdv-ipt nqo e X is M os dados doados
denhro de outro sdHpt-
I e t ^ U X lt c lS l d l 9 f S na^ee.a^va.f ^ .

compartilhados, como frequentemente fazer isso uma


~P Ei, essas variveis da aplicao no so na tima ideia, em termos de organizao do cdigo.
verdade constantes?
Por que a instruo PHP para se incluir cdigos
Em alguns casos, sim. Mas no h nenhum se chama require_once ( requisitar uma vez )?
problema nisso. A ideia aqui no se preocupar em
diferenar variveis de constantes. Em vez disso, K : O nome arquivo indude (de induso) vem de uma
estamos apenas tentando estabelecer um lugar instruo PHP chamada include, a qual bastante
comum para o armazenamento de dados a serem semelhante a require_once. Adiferena que
compartilhados, dentro de uma aplicao. E esse lugar require_once resulta em um erro caso o arquivo
um arquivo de script chamado appvars.php. include no possa ser encontrado - include, por outro
lado, no acusa um erro caso o arquivo include esteja
0 cdigo nos arquivos de script compartilhados faltando. Alm disso, o once (uma vez) de require_
limita-se a dados? once significa que o arquivo no poder ser acidentalmente
includo mais de uma vez. Voc poder, s vezes, ver
No, de forma alguma. Qualquer cdigo PHP include sendo usado em vez de require_once
pode ser colocado no seu prprio script e compartilhado para se induir algum cdigo que no seja to importante,
usando-se a instruo require_once. Na verdade, como por exemplo, cdigo HTML puro que no esteja
bastante comum que aplicativos compartilhem uma realizando algum propsito essendal. 0 PHP tambm tem
grande quantidade de cdigos funcionais residentes em as instrues include_once e require, que so
vrios scripts. No s comum usar arquivos de scripts variaes de require_once e include.

voc est aqui 255


a instruo require_once

Pense cm require once cowo uw "inserir"1


As in c lu s e s n o se lim ita m a u m s a rq u iv o P H P c o m p a r tilh a d o , e p o d e m a p a r e c e r e m
q u a lq u e r lu g a r d o s c rip t q u e v o c q u e ir a us-las. V o c p o d e p e n s a r e m r e q u i r e o n c e
c o m u m a in s tru o in s e rt (in s e r ir ) q u e s u b s titu d a p e lo c o n te d o d o sc rip t q u e e la
re fe r e n c ia . N o caso d o G u ita r W ars, as variveis d a c o n e x o a o b a n c o d e d a d o s p o d e r ia m
ta m b m se b e n e f ic ia r d e s e re m m o v id a s p a r a u m a rq u iv o in e lu d e . A ssim , os c o n te d o s d o s
d o is sc rip ts c o m p a r tilh a d o s so in s e rid o s d ir e ta m e n te e m o u tr o s sc rip ts, n o s p o n to s o n d e
f o re m re q u is ita d o s .

Esfc VHVc! global hrrftdziftd J


dados importantes para a_ y
apidadao, dos ^uais tanto
inde*.pHp quanto addsdorephp
predisa.

tw ve*. d duplidav as variveis


da toY\c%o ao bando m dada
connectvars.php
sdriptj ns podemos ove-
las para um arquivo indlude
tornandoas dompartlhadas-

A istirup R E q U R E ^ O N C E in sere
c p jg p s J e s c rip ts c o n ip q rtllia c lo s e m

P U ttP s s c r ip t s .
trabalhando com dados armazenados em arquivos

<?php
r '
I// Define as constantes da aplicao
define('GW UPLOADPATH, 'images/'); Sensacional!
Agora eu tambm
// Define as constantes da conexo ao banco de dados
'define(DB_HOST1, 'www.guitarwars.net'); tenho acesso aos dados
Idefine(DB_USER', 'admin'); compartilhados!
|define(DB_PASSWORD'r rockit1);
define('DB NAME', 'gwdb1);

// Conecta-se ao banco de dados


$dbc = mysqli_Connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)

// Obtm os dados das pontuaes a partir do MySQL


Squery = "SELECT * FROM guitarwars";
Sdata = mysqli_query($dbc, $query);

Faz um loop atravs do array contendo os dados das


I I
pontuaes, formatando-os como HTML addscore.php
echo 1<table>1;
while ($row = mysqli_fetch_array($data)) {
// Exibe os dados das pontuaes
echo '<tr><td class="scoreinfo">';
echo '<span class="score">1 . $row ['score '] . </spanXbr />'
echo 1<strong>Wame:</strong> ' . $row['name'] 1<br />';
echo '<strong>Date:</strong> ' . $row'date'] '</td>';
if (is_file(GW_UPLOADPATH . $row[1screenshot1]) s&
[ i l B U i i W
filesize(GW_UPLOADPATH . $row['screenshot']) > 0) { O do arquivo
echo '<tdximg src=" 1 . GW_UPLOADPATH . $row['screenshot']
alt="Score image" /></td></tr>'; enviado para
um a con stante ,
else { que se r ento
echo '<td><img src=1 . GW_UPLOADPATH . 'unverified.gif' com p artilh ad a
alt="Unverif ied score" /x/tdx/tr>'; a trav s de um
}
} arquivo include.
echo '</table>';

mysqli_close($dbc) ; ouro passo novo[ \


doiss so J
di+iis dc planejar de
nhcmo, portanto vode
ndex.php ter de estar pronto
para ajustar o seu
projeto sempre
<\ue necessrio-

T fe S T O r i v e
Crie dois arquivos Include para o G u itar W ars, e depois com partilhe-os
en tre os outros scripts.
C rie d o is n o v o s a rq u iv o s d e te x to , a p p v a r s . p h p e c o n n e c t v a r s . p h p , e d ig ite n e le s o
c d ig o m o s tra d o n a p g in a a n te rio r. E m s e g u id a , a d ic io n e in s tru e s r e q u i r e _ o n c e a
i n d e x . p h p e a d d s c o r e . p h p p a r a q u e a m b o s os sc rip ts c o m p a r tilh a d o s se ja m in c lu d o s .
E n v ie to d o s os sc rip ts p a r a o se u s e rv id o r e te ste o fo rm u l r io A d ic io n a r P o n tu a o e
a p g in a p r in c ip a l, p a r a se c e rtific a r d e q u e eles e s te ja m f u n c io n a n d o c o m a n o v a e
a p r im o r a d a e s tr u tu r a o r g a n iz a c io n a l c o m a rq u iv o s in c lu d e .

voc est aqui 257


A instruo ORDER BY

0 mais importante para as pontuaes mximas


-timing- a ordem
O G u ita r W ars f in a lm e n te te m o s u p o r te a im a g e n s , p e r m itin d o q u e os u su rio s
e n v ie m c a p tu r a s d e te la s p a r a v a lid a r os seus r e c o rd e s . E m b o r a isso seja u m g r a n d e
a p r im o r a m e n to n a a p lic a o , a in d a n o re so lv e u o p r o b le m a d e q u e os u s u rio s t m
r e c la m a d o h a lg u m te m p o - a o r d e m d as p o n tu a e s n a p g in a p rin c ip a l.

/\{d>onar noV
agora envolve
o envio de Wage

*\ue parei oiimo, cxtcbo


pelo rio das pontua^oes
sno esiare e ordeJ

E v e rd a d e , as p o n tu a e s n o e s t o e m o rd e m . E las esto
s e n d o e x ib id as n a o r d e m e m q u e se e n c o n tr a m n o b a n c o
d e d a d o s, q u e to ta lm e n te a rb itr ria . V oc n u n c a deve
p e r m itir q u e a o r d e m d e ex ib i o seja a m e sm a o r d e m e m
q u e os d a d o s se e n c o n tr e m a rm a z e n a d o s n o b a n c o , a n o
s e r q u e o r d e m r e a lm e n te n o faa d ife re n a . N e ste caso,
p re c isa m o s im p o r a lg u m a o r d e m so b re os re su lta d o s d a
co n su lta . A in stru o S Q L O R D E R BY to r n a isso possvel.
trabalhando com dados armazenados em arquivos

luws <I G eladeira <1 VHF & M /-5QL


1 Veja se voc consegue descobrir como ORDER BY funciona, usando os imas abaixo
| | para criar instrues SELECT ordenadas que resultem na sada abaixo. Circule tam bm
I| qual consulta voc acha que representa a m elhor soluo para o Guitar Wars. Dica: ASC
significa ASCendente e DESC significa DESCendente.

1File Edit Window Help YYZ

I screensho;

I 5 I 2 008 -0 4 -2 3 09 : 1 3 : 3 4 A s h Lor: S i m p s o n I 3 6642 0 I


4 : 2 0 0 8 - C4 - 2 3 09:12:53 | E e l i t a Cnevy
! I 2003-04-23 03:06:35 : Eddie v s n i l l - I 345-900 I
I 6 i 2008-04-23 2 4 : 0 9 : 30 ! Kenny L a v i t z
! 2 I 2 00 3-04-22 21 : 2 7 : 5 4 j N e v i l Johansson
j 1 i 2008-04-22- 14 : 37 : 34 I Paco J a s L o r i u s I 12 7 65 0 i
I 7 I 2003-04-24 08:13:52 | Phiz L s i r s t o n ! 186580 I p h izssccre .gif

7 rcws in sec ( Q. CG5 sec}

A^ui, os resulidos da donsulta


A^ui, os resultados da eo^ulta so
so retornados em order
retornados s** ordem alabtida
desdendesvte> for fcmtuadao, e defois
asdendente, for nome.
em ordem asdendente, for data-
ms do php &mysql soluo
:
I m a s d e G e l a d e i r a d> P B P & M / S Q L - S p I uI lp
Veja se voc consegue descobrir como ORDER BY funciona, usando os imas abaixo
para criar instrues SELECT ordenadas que resultem na sada abaixo. Circule tam bm
quai consulta voc acha que representa a m elhor soluo para o Guitar Wars. Dica: ASC
significa ASCendente e DESC significa DESCendente.

A^ui, os resultados da consulta _A\w, os resultados da Consulta sao


sao retornados em ordem numrica retornados em ordem al-Pabetica
descendente, fo r pontuaao, e depois ascendente, por nome-
em ordem ascendente, por data t
t s t a a Consulta de
ue precisamos para o
Quitar Wrsj
I File E dit

FROM guitarwars j ORDER BY DESC

SC
5 ! 2008-04-23 0 9:13:34 ; shton 1 -/-
3 2008-04-23 09:06:35 ! Eacie vanali; ! 34
! 2006-04-2 3 09:12:53 ; Belita C'svy ! .?8
i 2 008-04-24 08:33:52 1 Phiz T,azrs.cn p
1 006- 042 2 14 :37:34 i i:anc i2
2 ! 2008-04-22 1 :i- :o4 Nev_ : Johansson i 5
6 U:09:iC | Kenny lavitz
- -4\-----

0 ordenamento por data t seCundrio, e so A vfrjula e


se aplica caso haja duas pontuaes idnticas,
necessiv-ia para
o e^ue nao oCorre a^ui mas t e uma bo
se separar os
probabilidade de acontecer guando se t e um
dois nveis de
Conjunto bastante grande de dados.
ordenamento.
trabalhando com dados armazenados em arquivos

Homenageando o (toitar W arrior nmero um


C o m a o r d e m d as p o n tu a e s c o n s e rta d a , a g o ra p o ssv el fa z e r u m a m e lh o r ia in e s p e r a d a
n a lista d o s re c o rd e s: c o lo c a r a m a io r p o n tu a o d e to d a s n o tip o d a lista. O G u ita r W a rrio r
c o m a m a io r p o n tu a o m e re c e u m c a b e a lh o d iz e n d o c la r a m e n te q u e e le o n m e r o
u m , p a r a q u e n o h a ja d v id a ... e p a r a q u e os ad v e rs rio s sa ib a m q u a l p o n tu a o eles te m
d e su p e ra r.

Um tabealKo
sdlient
dlavmeirvfce a
ponuaao m*i*a,
estabeledendo
um alvo para os
demais juiiav-
Wa(rlrio\rs..

u a 9 e x i s te m
p e rg u n ta i Idiotas

" i Muitas pontuaes ainda esto sem verificao? Isso no


um problema?

sim. Mas no nos impede de seguir adiante e incluir a


funcionalidade de chamar a ateno para a pontuao mxima. A falta
de verificao, na verdade, s significa que em algum momento ns
teremos de limpar a lista, excluindo os registros sem comprovao.
De fato, assim que terminarmos com esta funcionalidade de salientar
a pontuao mxima, j passaremos para a questo das pontuaes
sem verificao.

voc est aqui 261


adicionando um pouco de css

Formate a pontuapo mxima com HTML e CSS


A co isa m ais im p o r ta n te s o b re o c a b e a lh o q u e e s ta m o s in c lu in d o q u e ele s e r visto
c la r a m e n te a c im a d e to d a s as d e m a is p o n tu a e s d a lista. P a ra isso, p re c is a re m o s d e a ju d a
ta n to d o H T M L q u a n to d o CSS, p a r a a p a r te visual. O c a b e a l h o s e r g e r a d o c o m o u m a
lin h a n a ta b e la H T M L , c o m u m CSS e s p e c ia l a p lic a d o a ela. E ste estilo , t o p s c o r e h e a d e r ,
d ev e se r a c re s c e n ta d o fo lh a d e e stilo s t y l e . c s s d o G u ita r W ars.

*ta dlasse de estilo j est


sendo usada para salientar os
erros de inserdao de dados ho
sdript Adidionar Pontuaao-

.e rro r {
Centraliza f o n t-w e ig h t: b o ld ; -^7
a pontuado c o l o r : FFOOOO;
mxima no
dabealho. . to p s e o re h e a d e r {
text-align: center;
font-size: 200%;^
background-color: #364Q7F
color: #FFFFFF;
garante <\ue
o tamanho
.score { da -fonte seja
font-size:150%; aumentado em
Usa um -fundo de color : #36407F;
relaao s demais
dor esdurd dom pontuaes-
te*to brand> para .scoreinfo {
z.cr a pon-Uadao v e r t i c a l - a l i g n : to p
m/ima realmente p a d d i n g - r ig h t: 15px;
saltar aos olhos- }

Estas duas dlasses de style.css


estilo ja esto -formatando
as pontuadoes, na pagina "
prindipal-

O s c rip t i n d e x . p h p j e st g e r a n d o u m a ta b e la H T M L c o n te n d o a lista
d as p o n tu a e s . G e r a r u m c a b e a lh o a p e n a s p a r a a p o n tu a o m x im a
r e q u e r q u e iso le m o s o p r im e ir o re g istro , o q u a l g a r a n tid a m e n te se r a m a io r
p o n tu a o , u m a vez q u e a lista a g o r a e s t o r d e n a d a . U m lo o p w h i l e
p o s to e m a o , e n s p re c is a m o s d e a lg u m a f o r m a d e c o n ta r as p o n tu a e s e
g e r a r o c a b e a lh o a p e n a s p a r a a p rim e ira ..;
trabalhando com dados armazenados em arquivos

f a . Complete o cdigo do script in d ex . php do Guitar Wars de modo


que ele adicione um cabealho formatado para a pontuao mxima,
E x k t c \o usando o estilo GSS to p s c o r ehead er. Dica: No se esquea de que
esse cabealho far parte da tabela HTML contendo os recordes, a qual
possui duas colunas.

// Faz um loop atravs do array contendo os dados das pontuaes, formatando-


os como' HTML

echo 1<table>';

$i = 0;

while ($row = mysqli_fetch_array{$data)) {

// Exibe os dados das pontuaes

if (..................) {

}
echo 1 c trx td class="scoreinfo">';

echo 1<span'class="score">' . $row[1score'] . '</span><br />';

echo 1<strong>Name:</strong> ' . $row[,namel] . '<br />';

echo '<strong>Date:</strong> ' . Srowf'date'] . 1</td>';

if (is_file(GW_UPLOADPATH . $row[1screenshot[]) &&

filesize(GW_UPLOADPATH . $row[1screenshot1]) > 0 ) {

echo <td><img src="' . GW_UPLOADPATH . $row[1screenshot1] .

,n alt-"Score image" / x / t d x / t r > ';

}
else {
echo 'ctdximg src="' . Gw_uPLOADPATH . 'unverified.gif1 .

alt="Unverified score" /></td></tr>';

}
echo ,</table>1;

I
index.php

voc est aqui 263


exerccio soluo

Complete o cdigo do script index.php do Guitar Wars de modo que ele adicione um
# cabealho formatado para a pontuao mxima, usando o estilo CSS topscoreheader.
Rcicio Dica: No se esquea de que esse cabealho far parte da tabeia HTML contendo os
SoL oo recordes, a qual possui duas colunas.

fi c 3 vviivcl \UC -foz. d Conta


das pontuaes - ns podemos
usa-a para isolar a primeira
pontuaao-
// Faz um loop atrav^ do array contendo os dados das pontuaes, formatando-os
como HTML /

echo '<t Se f I -for igual a O, ns


sabemos t^ue esta a
.x " primeira^ou seja, a maior)
while {$row = mysqli_fetch_array($data)) { pontuaao, e portanto,
// Exibe _os.dados .das,pontuaes devemos gerar o cdigo

if ( 7 i,=~ O J ttTM L para o cabealho.

echo '< tr> < td Colspan=tt2-MclasswtopsCoreheaderw>Tp Score: *

frov^rsCore^ 4< /t d x / b r ^ i
}
echo '<tr><td class="scoreinfo">';

echo '<span class="score">' . $row[1score'] . '</span><br />'; fi classe de estilo


echo '<strong>Name:</strong> 1 . $row['name'] . <br />'; topscoreheader
enC ontra-se
echo 1<strong>Date:</strong> ' . $row['date] . </td>';
armazenada em
if (is_file(GW_UPLOADPATH . $row['screenshot1]) && style-Css-
filesize(GW UPLOADPATH . $row['screenshot']) > 0) {
echo '<td><img src="' . GW_UPLOADPATH . $row['screenshot'] .
'" alt="Score image" /></td></tr>';
}
else {

echo 'ctdximg src="' . GW_UP LOAD PA T H . 'unverified.gif .

alt="Unverified score" / x / t d x / t r > ';

Incrementa o Contdor Bo -final


do loop pelas pontuaes este
Codigo e o mesmo iue fi fi
+ /;
echo '</table>';
index.php
trabalhando com dados armazenados em arquivos

T ejst O r i v g ---------------------------

O rdene as pontuaes e d destaque m aior delas.


Modifique o scrpt in d ex . php de modo que ele passe a usar a nova consulta
SELECT ordenada, e depois, adicione o cdigo que ir gerar o cabealho para
a pontuao mxima. Envie o novo script para o seu servidor e abra-o no seu
navegador, para ver a maior pontuao sendo exibida proeminentemente.

, r . N sm e: AshtoE Simpsou
Donxutdo ' Date2GOS-04-2309:13;34
a^ova e mostrada
destatada^cntc W 5
da lisfca de r t t ordes.

verdade, ainda precisamos tra ta r das pontuaes


n o - v e r if ic a d a s .
Mas uma coisa de cada vez. Parece que surgiu outro problema, que
est impedindo as pessoas de enviarem os seus arquivos grficos.

voc est aqui 265


adicionando restrio de tamanho para imagens

fa k tav^uivo ao
somente e g\gawfccs6o
iWrb? w>ai0* do
l>V(C^h *& ta^bew
*ao c ne se^t*ev ua
mage!

ethelshugescore, p d f
O arquivo no s gigantesco, ele nem uma im agem !
Temos um problema: nosso formulrio est rejeitando alguns arquivos sem dizer aos
usurios por qu. Na verdade, bom que ele esteja rejeitando arquivos, neste caso
porque so grandes demais - lembre-se de que limitamos o tamanho dos arquivos
a 32 KB, no cdigo do formulrio. Mas precisamos avisar ao usurio por que isso
est acontecendo. E no apenas isso, ns tambm no queremos que os usurios
enviem arquivos que no sejam imagens. Adicionar alguma validao ao formulrio
de Adicionar Pontuao permitir que ns tenhamos maior controle sobre o modo
como os arquivos so enviados.
Assim, a validao no formulrio ad d sco re .php servir a dois propsitos
essenciais. Primeiramente, ela poder aprimorar a preveno contra uploads
de arquivos grandes demais, fornecendo aos usurios uma notificao de que o
arquivo no pode ter mais que 32 KB. E, em segundo lugar, ela poder impedir
que as pessoas enviem arquivos que no sejam imagens. O formulrio precisar ter
validao tanto para o tamanho quanto para o tipo do arquivo.

Gittar Wars - Add Yonr High Score f


Sorrv, tfaere was , prcbkm nploadtag your serass sfcot ^
Narae: :ahuSidre ~
Sccae: swJ ~ ~~
Screen shnt: fchoo. fh,-" 1Qfli{
trabalhando com dados armazenados em arquivos

So permitidas apenas imagens pequenas


Ento, como exatamente ns verificamos o formulrio Adicionar Pontuao e nos
certificamos de que as imagens enviadas estaro obedecendo s limitaes de tamanho e
tipo? A resposta se encontra na varivel superglobal $_FILES, da qual, se voc se lembrar,
ns obtivemos a localizao de armazenamento temporrio do arquivo enviado, para que
pudssemos mov-lo para a pasta images. Agora, iremos us-la para obter o tamanho e o
tipo MIME do arquivo. 0 do arquivo
C*ede IMBi muito maiov
$ FILES [ 1screenshot] ['size1] do ue o ytosso limite de
i v f a (\ttQ 0 .Y 1 l ^ tes
i -2-2-AlB) ou
$_FILES['screenshotT]['type']
0 tifo do
PDF,y t no t u tipo
aceitvel de ar^ivo
No queremos apenas que os arquivos grficos sejam menores do pava web, tomo
que 32KB, mas tambm precisamos que eles sejam de um tipo que qfF 0P3 ov>
possa ser exibido como imagem web. Os seguintes tipos MIME so
tipicamente usados para se representarem imagens web:
$_FILES [ 1screenshot']['type']
PvcopVOS
GIF
ya-fitos
tonteado a
taptuva de tela
dopvbatfria
da pcmtua^ao...

Escreva uma declarao if para verificar se um determinado arquivo


uma imagem, checando tambm se ele maior do que 0 bytes e
menor do que o determinado na constante GW_MAXFILESIZE. Assuma
que o tamanho e o tipo do arquivo j tenham sido armazenados em
variveis chamadas $screenshot_size e $screenshot_type.

if (

) {

voc est aqui 267


incorporando arquivo de vaiidao no aplicativo

tpowte seu lpis


Solupo
S o lu o
^
Escreva uma declarao if para verificar se um determ inado
arquivo uma imagem, checando tam bm se ele maior
Alguns do que 0 bytes e menor do que o determ inado na constante
avegadoires GW_m a x f i l e s IZE. Assuma que o tam anho e o tip o do
este arquivo j tenham sido armazenados em variveis chamadas
$screenshot_size e $screenshot_type.
tipo Mf/VE
para f(((fscreenshot t ype === .1! 77.''ag/jpgOi)
'-eConheCer i t .
imagens jp<$.... pjro?. J). f.^rr'.shoL.^ypc.r r . !)***& /& *!}). M
(fscreens)itmsizc > && (fsreensh<rtjsize < ^VV^AI/t^FfLSl^-E))

Uma vez. <^ue o tacanho mximo


para o arquivo agora aparece
cm mais de um lugar no sdript
Adicionar Pontuado, -Paz.
sentido armazna-lo na -forma
de uma constante-

de
appvars.php

A validao de arquivos torna a aplicapo mais robusta


Um
U m pouco
nouf.o ddee valid
validao ajuda muito
aro ainHa m uito a tornar
a torn ar qualquer
m ialm ipr aplicao
a n lirar o ehsagem de
Uma ensaiem
PHP mais intuitiva e fcil de usar, alm de mais segura. Agora, uma erro ajuda a explicar
mensagem de erro ajuda o usurio saber exatamente quais so as exatamente <^ue
limitaes impostas sobre os arquivos grficos a serem enviados. tipos de arquivos
podem ser enviados.

jeanpau1sscore.jpg

ethelshugescore.pdf phizsscore.gif jacobsscore.png


trabalhando com dados armazenados em arquivos

Uma vez. ^ue estamos bomando


O sdnpt mais robusto, tambm *be uma mensagem de
e uma boa ideia veri-fidar a erro desdrVtiva, daso
o arquivo seja do tipo
errado, ou grande demais.

if ('empty($name) &5 !empty($score) && !empty($screnshot)) {


if {((5screenshot_type == image/gif) II (Sscreeishot_type == image/jpeg') |j

($screenshot_size > 0) && ($screensht_size <^/W_MAXFILESIZE)} {


if ($_FILES [screenshot' ][ 'error'3 ==
// Move o arquivo para a pasta-alvo
$target = GW_UPLOADPATH . $screenshot;
,
if (move uploaded file($_FTLES[1screenshot1] ['tmp_name'] $target))
// Conecta-se ao banco de dados
$dbc = mysqli_c0 nnect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

// Escreve os dados no banco


$query = "INSERT INTO guitarwars VALUES (0, NOW(), '$name, '$score',

mysqli_query($dbc, $query);

// Confirma xito com o usurio


echo '<p>= Obrigado por adicionar o seu recorde!</p>'; ^
echo 1<p><strong>Name:</strong> . $name . '<br />';
echo '<strong>Score:</strong> . $score . '<br />';
echo '<img src=" . GW_UPLOADPATH . $screenshot . alt="Score image" /><
echo '<p><a href="index.php">lt;&lt; Back. to high scores</a></p>';

// Limpa os dados da pontuao para limpar o formulrio


$name =
score =
$screenshot =

mysqli_close($dbc); .
}
else {
echo '<p class=error">Sorry, there... = Desculpe, houve um problema com o
arquivo que voc tentou enviar.</p>*;
}
)
}
else {
echo '<p class=error>0 arquivo precisa ser um grfico GIF, JPEG ou PNG com menos
de . KB1 . (GVJ_MAXFILESIZE / 1024) . ' KB de tamanho.</p>';
}
// Tenta excluir o arquivo grfico temporrio
unlink($_FILES['screenshot'] f'tmp_name']);

else {
echo <p ciass="error">Por favor, digite todas as informaes para adicionar sua
pontuao.</p >1;

voc est aqui 269


test drive addscore.php

T f e S T O R f v e

Adicione a validao dos arquivos grficos ao script Adicionar Pontuao.


Modifique o script addscore .php de modo que ele passe a usar o novo cdigo de validao dos
arquivos grficos. Envie o script para o seu servidor e teste o formulrio Adicionar Pontuao com
imagens vlidas e invlidas (imagens grandes demais ou arquivos de outro tipo).

no existem
Perguntas id io tas

* Por que existem dois tipos MIME diferentes " F * Por que GW_MAXFILESIZE colocado
para imagens JPEG? em appvars.php, uma vez que s usado em
addscore.php?
Essa uma pergunta que pode ser mais bem
respondida pelos fabricantes de navegadores, os quais, Embora seja verdade que appvars.php
por algum motivo, decidiram usar tipos MIME diferentes foi elaborado para armazenar dados que sejam
para imagens JPEG. Para nos certificarmos de que compartilhados entre diversos scripts, ele tambm um
a validao de arquivos JPEG funcionar na maior bom lugar para se armazenar quaisquer constantes.
quantidade de navegadores possvel, necessrio Neste caso, colocar GW_MAXFILESIZE em appvars.php
verificar ambos os tipos. facilita que a encontremos, caso voc queira aumentar o
limite de tamanho para os arquivos enviados.
* Por que necessrio verificar se os arquivos
tm mais de 0 byte? Os arquivos grficos no tm F -C o m o funciona a linha de cdigo que contm
sempre mais do que 0 byte? @unlink()?

Na teoria, sim. Mas tecnicamente possvel criar um Afuno internado PHP unlink () apaga um
arquivo de 0 byte no servidor, caso o usurio especifique arquivo do servidor, no nosso caso o arquivo temporrio
um arquivo que no exista no seu prprio computador. que foi enviado. Uma vez que possvel que o upload
Apenas para se resguardar caso isso acontea, tenha falhado, e que no haja arquivo temporrio, ns
addscore.php toma a atitude mais segura, qual seja a suprimimos quaisquer potenciais erros gerados por
de verificar se o arquivo no est vazio. unlink () colocando um smbolo (@) antes dele.
Voc pode colocar @na frente de qualquer funo PHP
para suprimir o recurso de relatar erros dessa funo.
trabalhando com dados armazenados em arquivos

E quanto s
pontuaes no verificadas?
Elas nSo desapareceram, se
que voc no reparou.

A lista das pontuaes precisa se r lim pa.


Com o upload dos arquivos grficos aperfeioados graas
validao, no podemos continuar ignorando o problema das
pontuaes no verificadas. As novas pontuaes, com imagens
comprobatrias, no podem ficar atrs das pontuaes antigas sem
comprovao, as quais podem ou no ser legtimas. O Guitar Wars
precisa de uma forma de remover pontuaes antigas!
esta tomprovada, o ^ e *ao
desperta muit towian3 nos
outros usurios..

; 345900
^ N a n e : Etkiis Vanaii
: Bate2005-04-2309:06:35

g u ita rw a rs
id i - .fa,.

=i; war ..
7 2008-04-22 14:37:34 Paco Jastorius 127650 M pointu^oes
2008-04-22 21:27:54 Nevil Jo h ansson 98430 sem imagens
2 omprobatrias
3 2008-04-23 09:06:35 Eddie Vanilli 3459 0 0
precisam sev
4 2008-04-23 09:12:53 Belita Chevy 282470 removidas do
2008-04-23 09:13:34 A s h to n Sim p so n 368420 banco de dados,
5
2008-04-23 14:09:50 K e n n y L a v itz 64930
V
7 2008-04-24 08:13:52 Phiz Lairston 186580 phizsscore.gif

Escreva aqui como voc faria para limpar as pontuaes no


verificadas da lista:

voc est aqui 271


adicionando uma pgina admin

Planeje uma pgina Admin


As a p lic a e s W e b
te<Juetitemente
Uma vez que s precisamos remover algumas pontuaes no verificadas
do banco de dados, perfeitamente razovel simplesmente acionar uma
ferramenta SQL e remover linhas manualmente, com algumas consultas
DELE TE. Mas esta poder no ser a ltima vez que tenha de remover in c lu e m pginas
uma pontuao, e no divertido ter de usar consultas SQL manuais
pata acessp pUco,
bem como pginas
para fazer a manuteno de uma aplicao web. A ideia aqui elaborar
uma aplicao que possa ser mantida com o mnimo de trabalho possvel.
O que precisamos de um a pgina qual somente o administrador
do site tenha acesso, e que ele possa usar para rem over pontuaes...
admn apenas para
uma pgina Admin! Mas precisamos tomar muito cuidado na hora
de distinguir quais partes do Guitar Wars so para o administrador e
ps administradores
quais partes so para os usurios. azerem ^
Estas pginas so para os usurios:
manutenp do site-
A fi n d Mdio*air Pontuaao e
<3pn principal do jwtar lAfrs
sSo elaboradas para os usuiros
-'mas submeterem e visualizarei
suas pontuaes.

Esta pgina apenas para o administrador:


Guitar Wars - High Scores Admiiriaraton
____
08:13:34 3B H a> agw

; f a U ir r tM 2008-04-2408:13^2 1863H
pa^in h d **"m e elaborada apenas 2O0S-2OS-,2 l i

para uso do administrador do te , MOSM-i, M.OTJ0W? R m i>

vote nao \uer os \*surios


-finais possa sair por a removendo Oidar em urn link
pontuaes. Remove apa^a a
respectiva pontuaao.
trabalhando com dados armazenados em arquivos

fccco Escreva aqui o que os scripts Admin e de Remover Pontuao precisam fazer para
implementarmos um recurso de remoo de pontuaes no Guitar Wars. Em seguida,
faa um esboo de como a remoo afetaria uma linha da tabela g u i t a r w a r s e a
sua respectiva imagem.

admin.php

Servidor w eb

removescore.php

guitarwars
f ! ! I ! I f c l H M M i score Mxeensfcot
1 2008-04-22 14:37:34 Paco Jastorius 127650
2 2008-04-22 21:27:54 Nevil Johansson 98430
3 2008-04-23 09:06:35 Eddie Vani/Ii 345900
4 2008-04-23 09:12:53 Belita Chevy 282470
5 2008-04-23 09:13:34 Ashton Simpson 358420
6 2008-04-23 14:09:50 Kenny Lavitz 64930
7 2008-04-24 08:13:52 Phiz Lairston 186580 phrzsscore.gif
exerccio soiuo

Escreva aqui o que os scripts Admin e Remover Pontuao precisam fazer


para implementarmos um recurso de remoo de pontuaes no Guitar Wars.
Em seguida, faa um esboo de como a remoo afetaria uma linha da tabela
SoLuo guitarwars e a sua respectiva imagem.

Guitas' Wars - High Scorn Administration


10 s trip t admin.phf lista, todas as linhas

I Bekwisalia.ofallGoBxWareliighscores. Ussfiiii pagetoremovesconsasneeded. J da tabela, wda uma dom um link wRcmovew


ao lado, o <\ual repassa inorma^oes para
Ashton Stapsoa 208-0+-23 09:1 3 :5 1 3(58420 Ramftw
Eddie VaitQB 2Q0MM-23 09635 345900 toliW S o sript Removr Pontuaao-
Be&a Cbery 2003^)4-24 08;02:11 282470
PKi Laftstoa 2008-04-24 08:13.52 1S6580 BsSBE
Paco Jaaurius 2008-04-24 0S2:11 1276SGg&s2&
NenUohaasson 2008-04-24 03.(0:11 98430 Reirovc
Kaonj- Lavttz 200804-23 14:0950 64930 Em w e

admin.php
Servidor w eb

0 . s^lft-VcmoycstorrfKp. remove......
propriamente, o registro do. bando de dados, Dat^
e ^lu i o arquivo jyraido do.servidor, e depois s^jl Guitar Wars - Remove a High Score
e*ibe uma mensajem de, fiowirmao- Tlthighscon?of 36S420fcrAUitonSinqpooswassacce*sfultyreos>vcd.
Back,isadminpage

removescore.php

g u ita rw a rs
m ilBlftM
1 2008-04-22 14:37:34 Paco Jastorius
0 screenshot
127650
2 2008-04-22 21:27:54 Nevil Johansson 98430
3 2008-04-23 09:06:35 Eddie Vanilli 345900
4 2008-04-23 09:12:53 Belita Chevy 282470

6 2008-04-23 14:09:50 Kenny Lavitz 64930


7 2008-04-24 08:13:52 Phiz Lairston 186580 phizsscore.gif

pmbora esta Imha em par-utuia now


tenHa um arquivo ^rido assodiado,
o sdript Remover Pontuao te r de
estr pronto para exdluir do servidor
os arquivos de pontuaes ^ue os
tenham dssodiados.
trabalhando com dados armazenados em arquivos

Gere links para remoo de pontuapes na pgina Admin


Embora o script Remover Pontuao seja responsvel pela remoo propriamente
dita, ns precisamos de um script Admin que nos permita selecionar uma pontuao
a ser eliminada. O script admin.php gera uma lista de pontuaes, com links Remove
para cada uma. Esses links repassam os dados referentes respectiva pontuao para o
script removescore.php.
<?php

require_once (''appvars .php') ;

require_once ('.connectvars.php') ;

/! Conecta-se ao banco de dados


m
admin.php
$dbc = mysqli_COnnect(DB_HOST, DBjJSER, DB_PASSWORD, DB_NAME);

// Obtm os dados das pontuaes a partir do MySQL

$query = "SELECT * FROM guitarwars ORDER BY score DESC, date ASC";

$data = mysqli_query($dbc, $query);

// Faz um loop atravs do array contendo os dados das pontuaes, formatando-os como HTML

echo '<table>'; A URL f r o i f i Rwowr


Pon-tuJo st azjCndo mais do V*
while ($row = mysqli_fetch_array{$data)} { a^cns dviav um link ^av3 o s t r i c t *

mysqli_close($dbc) ;

voc est aqui 275


introduzindo a requisio GET

Osscripts so capazes de comunicarem-se uns comos outros


Para o script Remover Pontuao poder excluir um registro, ele A U RL de um
precisa saber qual. Mas isso decidido no script Admin. Isso leva
p e rg u n ta com o o script Admin informa a Remover Pontuao script p^de
qual registro deve ser excludo? Essa comunicao entre os scripts ser usa<Ja pata
realizada empacotando-se os dados como parte de uma URL
Remove para cada pontuao mostrada na pgina Admin. Se enviar dadps na
voc analisar os detalhes da URL de uma determinada pontuao, rma de uma
perceber que todos os dados referentes a ela se encontram l.
r e ^ u ls i ^ G E T T

G uitar W ars - High Scores Administration

2MM3MMas3SOtSVJ
i im m -X 09:13:34 35g42(f K ^ n ..........

Cada m-ormaao A URL de KRemoveM


tem wrv> nomC Cria links para o sc rip t 200MM*(:l3aBigS aB(HB \
t um valor, e removesCore.php, ^s Wahns JOOWHMoMttn 98430 Haw
e separada de tambem inclui dados aaOM3 1*OM[ SaaaB
outros pares de re e re n te s linha a ser
excluda- Clicar neste link nao s abre o sr \]
nome/valov ^or
Remover PontuaWo, Como tambem
um smbolo ?
envia dados, na orma de uma
requisio jT-
OK, ento os dados so enviados atravs de uma URL, mas como
exatamente o script Remover Pontuao pe as mos nesses dados?
Os dados enviados a um script atravs de uma URL ficam disponveis
na superglobal $_GET, que um array bastante semelhante a $_POST. o nome da ih&rmacao
Empacotar dados em uma URL linkada o mesmo que usar uma
requisio GET em um formulrio web. Em uma requisio GET e usado para acessa-

tradicional do HTML, os dados do formulrio so automaticamente array


enviados para o script que os processar, como parte da URL desse
script. Estamos fazendo o mesmo aqui, ao criarmos manualmente a nossa
prpria requisio GET como parte de uma URL personalizada.
Assim como $_POST, para usar o array $_GET para acessar os dados das
pontuaes voc precisa do nome de cada informao desejada.
URU que leva 3 /
um script serve C o m o ^

um orma de envia*/ Ml
dados \mpor tnteS)
trabalhando com dados armazenados em arquivos

No entendo por que tanto


entusiasmo com GET. Por que no
podemos passar os dados para o script
usando P05T? E assim que vimos
fazendo at agora.

As requisies POST s podem ser iniciadas por


um form ulrio, enquanto que as requisies GET
podem ser em pacotadas com o URLs.
At o momento, ns sempre enviamos dados aos scripts a partir
de um formulrio, no qual o script encontrava-se listado como
a ao para o boto Submit. Quando o usurio preenche o
formulrio e clica no boto Submit, os dados so empacotados e
enviados para o formulrio como uma requisio POST.
O problema que a pgina Admin no usa um formulrio para
iniciar o script Remover Pontuao. Ela apenas estabelece links
para o script, via uma URL. Assim, ns precisamos de uma forma
de enviar dados a um script usando nada mais do que uma URL. E
aqui que GET particularmente til, uma vez que fornece acesso
a dados que esto empacotados em uma URL como parmetros.
De forma semelhante a POST, os dados que so enviados ao script
atravs de uma requisio GET ficam disponveis atravs de uma
superglobal, mas esta chamada de $_GET em vez de $_POST.

Oi -formulrios web 0 envio dc


-Ve<\uentemen-fce dados atravs
usam re^uisidoes de uma URL e
POST para submeter -feito dom jT,
dados, os -Pica
<\ua\s e os dados sao
armazenados no array armazenados no
? POST. array ?_}T.

$ POST

v o c est aqui 277


GET versus POST

Sobre G-ETs e POSTs Os dos i^pPS de


te ^ u s l e s W eb ,
A diferena entre GET e POST no apenas de formulrio
versus URL, uma vez que as requisies GET podem ser (e GET~e rOSTT
frequentemente so) usadas para se submeter dados de controlam o m ojo
formulrio, tambm. A distino real entre GET e POST tem a
ver com a inteno da requisio. GET usada principalmente c o n ] o VQC-e e lV x c l
d c td P S d e e pQtcl
para se obter dados do servidor sem afetar nada nele. POST,
por outro lado, geralmente envolve o envio de dados para
o servidor, aps o que o estado do servidor normalmente se
modifica, de alguma forma, em resposta aos dados enviados.
scripts.
'~ ~ posT

GET
Geralmente usada para obteno de dados
; banco. Os dados de GET, as que nao modifiquem nada no servidor.
> em um a.resP ^ . s odem ser feitas mediante Para quantidades pequenas de dados, GET
, requisies , ^ nWeb Tambm ao tambm til .para envi-los diretamente
-------- ltc
. aaode u m t o " ^ osemiadosemuma I ao servidor, em m uma

uma URL.
URL AoAocontrrio
contrrio
contrrio de GET, os ndid0s. I deTOST' (TFTse
POST GET ________
pnncpalmente para
; requisio POST B c^ enviar pequenas quantidades de dados.
n ermtamaaammmmt' '
p e rg u n ta s id io ta s
requisitem inTormaes do servidor sem alterar o seu
T * - J vi formulrios web que usavam GET. Como estado, como por exemplo, ao selecionar linhas de um
isso funciona? banco de dados. POST, por outro lado, mais adequado
para requisies que afetem o estado do servidor, como
Tanto GET quanto POST tm o seu lugar, no que por exemplo, emitir consultas INSERT ou DELETE que
se refere a formulrios web. Ao se criar um, o atributo modifiquem o banco de dados. Outra distino entre GET
method da tag <form> controla o modo como os dados e POST que os dados enviados atravs de GET ficam
so enviados, enquanto que o atributo action identifica o visveis em uma URL, enquanto que os dados de POST
script que dever receber e processar os dados: ficam escondidos e, portanto, um pouquinho mais seguros.
<form method="post' action="addscore.php">
" P * Como essa distino entre GET e POST se reflete
Quando o boto submit clicado para submeter este no envio de dados a um script atravs de uma URL?
formulrio, o script addscore.php executado, e os dados
so enviados a ele atravs do array $_POST. Mas voc
poderia muito bem ter escrito a tag <form> desta maneira, i l : Bem, antes de tudo, voc s pode enviar dados a um
script atravs de uma URL se estiver usando uma requisio
em cujo caso os dados seriam enviados atravs do array
$J3ET: GET, portanto POST eliminado imediatamente. Alm disso,
uma vez que GET usado unicamente com requisies que
<form method="get" action="addscore,php"> no alterem o estado do servidor, isso significa que voc no
deve fazer INSERTs, DELETE FROMs ou qualquer outra coisa
" P - Ah, ento no faz diferena se eu uso o mtodo que modifique o banco de dados em umscript que esteja
GET ou POST? recebendo dados atravs da sua URL.

Errado. Faz bastante diferena. GET geralmente


usado para se obter dados de um servidor, sem modificar
nada nele. Assim, GET perfeito para formulrios que
trabalhando com dados armazenados em arquivos

Conversa Informal
E sta noite falando: GET e POST

GET: POST:
Mas ento, fiquei sabendo que voc anda
dizendo que eu s presto para responder
perguntas, mas no consigo fazer nada
com as respostas. E verdade? Claro que . Vamos encarar, voc no tem
nenhuma capacidade alm da de pedir
OK; verdade que eu no fui elaborado algo ao servidor.
para causar modificaes no servidor,
como apagar arquivos ou adicionar
linhas ao banco de dados, mas isso no
quer dizer que no sou importante. Se voc est dizendo. Tudo o que eu sei
que seria difcil fazer algo acontecer sem
pessoas como eu, que realmente trabalham.
verdade, mas voc fica Se o servidor ficasse sempre no mesmo
permanentemente grudado com o seu estado, seria tudo bem chato na aplicao.
amiguinho, o Formulrio, enquanto
que ele e eu somos apenas conhecidos.
Eu tenho outras amizades, como por
exemplo, URL. Ento vc acha que o seu crculo de
amizades de alguma forma compensa a
Bem, ento eu tenho uma pergunta para sua incapacidade de agir? No sei, no.
voc. Como exatamente voc age quando
o seu ajudante, o Formulrio, no est
disponvel. Voc sabe que s vezes a Pgina
no acha necessrio se dar ao trabalho de Olha, o Formulrio meu amigo, e h
requisitar os servios do Formulrio muito tempo eu me comprometi a no
fazer nenhuma requisio sem ele. Pode
julgar a minha lealdade se quiser, mas eu
Calma a. S estou ressaltando que, no vou trair meu amigo!
embora a minha funo seja obter dados
do servidor, eu sou razoavelmente flexvel
no modo como posso ser usado para isso. Ok, admito que voc tem razo nisso.

Fico feliz de ouvi-lo. Foi um prazer


conversar com voc...
voc est aqui > 279
como removescore.php vai funcionar

(rET, POST e a rewopo de pontuapes


Ns j sabemos que a remoo de pontuaes no Guitar Wars comea com um link Remove
na pgina Admin, o qual aponta para o script Remover Pontuao. Ns sabemos tambm que
os dados podem ser enviados atravs da URL do link para o script. Mas temos um problema:
uma requisio GET no deve fazer modificaes no servidor, como apagar uma pontuao.
Uma possvel soluo no mudar nada no servidor... ainda. E se o script Remover Pontuao,
inicialmente, exibisse uma pgina de confirmao antes de realmente excluir a pontuao do
banco de dados?

Wma pagina de donfiv-mao


da ao usuaVi uma dt
<Wnrmar a r e m o t o , t m vez.
de simplesmente exeduia-la
instantaneamente
to ta lm e n te
pPssVel, e ate
A pgina de confirmao mostra o registro a ser removido, utl em alguns
junto com um simples formulrio de Yes/No. Selecionar Yes e
clicar no boto Submit resulta em a pontuao ser removida,
OctS9S, <JUe O
enquanto que escolher No cancela a operao. m e s m o s c rip t
Pensando em termos de GETs e POSTs, o script Remover re s p o n d a ta n to
Pontuao pode exibir a pgina de confirmao como uma
resposta requisio GET do script Admin. E uma vez que a t e ^ u ls f o e s G E '

prpria confirmao um formulrio, ela pode emitir a sua rOSTT


prpria requisio POST quando submetida. Se o formulrio
for autorreferente, o mesmo script (removescore.php) poder
processar o POST e executar a remoo. Eis os passos desse
processo:
A O s c r ip t R e m o v e r P o n t u a o in ic ia d o , a t r a v s d e u m a r e q u is i o GET,
p e lo u s u rio a o c lic a r n o lin k R e m o v e d a p g in a A d m in .

Op asrac r ipg etr aRre mumo vfoe rrmP ounltrio


u a o u s a o s d a d o s a rm a z e n a d o s no a rray $_GET
d e c o n fir m a o d a e x c lu s o .

A O s c r ip t R e m o v e r P o n t u a o in ic ia d o n o va m e n te , d e s t a ve z a tr a v s d e
u m a r e q u is i o P O S T d o u s u rio q u e e s t su b m e t e n d o o fo rm u l rio d e
c o n fir m a o .

O Od asdcorsip, te Rtae mm bo vemr aP po an gt ua ado os earpvaidgoar oo raerqg isutrivoo sger le ficc ioo ncaodnotednod bo aan cimo adgee m
c o m p ro b at ria .
trabalhando com dados armazenados em arquivos

Vejamos agora como o processo de


excluso de pontuaes se desenvolve,
atravs de uma srie de passos...
Uma requisidao jET c
usada fara se inidiar
o sdript Remover
Pon{>aa z enviar os
dados da fontuadao
atvavs de uma URL.

$_GE1
^ o W dados de ^ ^
imagem dom^robatora
ava esta pont^adao-
Uma requisio
POST e usada para Este e o mesmo
sdript, s que reando
se in'did'r sdri^t^
Remover Pontuado di-feventemente
(novamente!^ enviar don-forme redeba uma
a ele o re<ystvo 3 se'r
requisioi-T ovr
POST.
deletado

Guitar Wars - Remove a H igh Score


Tbs Mgh score of 368420 tor Astain Sin^soa wa> successfully removed.
Back to adca page

removescore. ph p

0 s tric t Remover Pontuado


apa$a O reysbro do bando
de dados, e a sua r e s ^ v a
ima^em do servidor.

voc est aqui > 281


mais sobre GET e POST

n? existem
ferguntas Idiotas
? Como possvel o mesmo script processar tanto requisies GET
quanto POST?

A resposta tem a ver com o modo como o script chamado. No caso


do script Remover Pontuao, ele chamado de duas formas diferentes. A
primeira quando o usurio clica em um link Remove" da pgina Admin,
em cujo caso uma URL o leva at o script. Uma vez que os dados so
empacotados dentro da URL, essa considerada uma requisio GET.
Ela faz o script gerar um formulrio web, cuja ao aponta de volta para
o mesmo script Remover Pontuao. Assim, quando o usurio submete
o formulrio, o script chamado pela segunda vez. Mas, ao contrrio da
primeira, no h nenhuma URL contendo dados, e, portanto, nenhuma
requisio GET. Em vez disso, os dados da pontuao a ser removida so
enviados atravs de uma requisio POST e ficam, portanto, disponveis no
array $_POST.

T * - Ento a forma como o script chamado o que realmente


determina o que ele faz?

Sim! Quando o script v que alguns dados foram enviados atravs de


uma URL, na forma de uma requisio GET, ele sabe que deve exibir um
formulrio de confirmao, em vez de apagar qualquer coisa do banco de
dados. Assim, os dados enviados no array $_GET so usados apenas dentro
da pgina de confirmao, e no tm nenhum efeito duradouro no servidor.
Quando o script v que h dados sendo enviados atravs de uma requisio
POST, ele sabe que pode apagar os dados do banco, Assim, ele usa o
array $_POST para acessar os dados e criar uma consulta DELETE FROM
que apaga a pontuao. E uma vez que a maioria das pontuaes tem um
respectivo arquivo grfico armazenado no servidor, o script tambm apaga
esse arquivo.
trabalhando com dados armazenados em arquivos

Isole a maior pontuapo para ser removida


Com o processo de remoo explicado, podemos agora concentrar
nossa ateno no lado do banco de dados. O script Remover
Pontuao responsvel por excluir um registro de pontuao, o
que implica excluir uma linha do banco. Como voc deve se lembrar,
a instruo SQL DELETE FROM nos permite apagar linhas. Mas, Esta Consulta apaga
para faz-lo, precisamos primeiramente achar a linha. Isso feito ImHas cuja coluna
colocando-se uma clusula WHERE na consulta que usa DELETE name ContenHa
FROM. Por exemplo, esta consulta SQL apaga a linha cuja coluna o texto Ashton
name est definida como 'Ashton Simpson': Simpson .

DELETE FROM guitarwars WHERE name = 'Ashton Simpson' 0 nome da tabela


obvi^atrio tom
D L TB FROM, ^
g u ita rw a rs para que a instrua
iHOW nnw saiba de que tabela
1 2008-04-22 14:37:34 Paco Jastorius 127650 vote esta apagando
2 2008-04-22 21:27:54 Nevil Johansson 98430 dados.
3 2008-04-23 09:06:35 Eddie Vanilli 345900 0 home do usurio e o
4 2008-04-23 09:12:53 /282470
5
Bel ita Chevy
4^ drrfcerio usado para se
2008-04-23 09:13:34
C-Ashton Simpson ^ 368420
'm.
ap ajar a pontuao.
6 2008-04-23 14:09:50 Kenny Lavitz 64930
7 2008-04-24 08:13:52 PhizLairston 186580 phizsscore.gif

H, porm, um problema com esta consulta. Em um mundo de


milhes de Guitar Warriors, existe a possibilidade de haver mais de
um Ashton Simpson. Esta consulta no apaga somente uma linha,
ela exclui todas as linhas que tenham o nome 'Ashton Simpson'. A Ao se esjciidar a
consulta precisa de mais informaes para apagar a linha certa: powtuaao Junto Com
o nome, a operao
f ica muito mais
\ predisa.

DELETE FROM guitarwars MIERE name = 1Ashton Simpson '

0 operador AND modiica a


g u ita rw a rs ConsuIta, de modo que tanto
ilil! ^pmitlii^ll^^illlil|il| S l l l l i i i i i l l l screenshot o nome qunto pontuao
1 2008-04-22 14:37:34 Paco Jastorius 127650 predism corresponder ao que
2 2008-04-22 21:27:54 Nevil Johansson 98430 sendo pedido.
3 2008-04-23 09:06:35 Eddie Vanilli 345900
4 2008-04-23 09:12:53 Belita Chevy 282470 Agora que tanto o nome quanto a
5 2008-04-23 09:13:34 ^ A sh to n Simpson 368420" c consulta precisam corresponder ao
6 2008-04-23 14:09:50 Kenny Lavitz que est sendo pedido, a cbnce de
7 2008-04-24 08:13:52 Phiz Lairston 186580 phizsscore.gif se apagar acidentalmente ais de
uma iir.Ha diminui Consideravelmente-
voc est aqui 283
colocando um LIMIT no seu DELETE

Controle o quanto voc pode remover com UMIT


Usar as colunas de nome e de pontuao como base para se excluir uma linha
bom... mas no o suficiente. O desenvolvimento de aplicaes tem que se
pau tar p e la m inim izao dos riscos a q u alq u er custo, e ain d a h um p eq u en o
riso de se apagar mais de uma linha que tenham o mesmo nome e a mesma
pontuao. A soluo forar a consulta a s apagar uma linha, no importa
o que acontea. A clusula LIMIT faz isso acontecer:
DELETE S f f i i arwars name = 'Ashton Simpson' AND score =
'368420 'Sl*S (V, W W . a*
Coloque um limite sobre o * W ro de
linhas que podem sev- apagadas.

O nmero aps LIMIT diz ao MySQL o nmero mximo de linhas


que podem ser apagadas - neste caso, uma. Assim, fica garantido
que nunca apagaremos mais de uma linha com esta consulta. Mas
e se houver dois Ashton Simpsons com a mesma pontuao?
claro que este um cenrio improvvel, mas s vezes vale a pena
considerar cenrios extremos ao se pensar no melhor projeto
possvel para uma aplicao.
g u ita rw a rs
.d name score @ S P P I:|
ilb l IfllillJ M ilillil
1 2008-04-22 14:37:34 Paco Jastorius 127650

2 2008-04-22 21:27:54 Nevil Johansson 98430

3 2008-04-23 09:06:35 Eddie Vanilli 345900

4 2 008-04-23 09:12:53 Belita Chevy 282 4 7 0


*
( 5 2008-04-23 0 9 :13:34^ Ashton Simpson 368420
Puas linhas Com
v -l -2 0 0 8 -U 4 -2 3 14 :0 9 :5 0 " Kenny Lavitz 64930 e*atmente o mesmo
Phiz Lairston 186580 phizsscore.gif nome e a mesma
7 2008-04-24 08:13:52
fontuaao apresentam
um problema para
2008-11-04 1 0:03:21" "Ashton iimpson 368420 ashtonsscore.^ a nossa Consulta
jp g _ DELETE.

Escreva abaixo o que acontece com esta tabela quando a instruo


DELETE acima executada. Como voc poderia certificar-se de
que a pontuao correta seja apagada?
trabalhando com dados armazenados em arquivos

Faria alguma diferena usar a


ID da pontuao na clusula WHERE da
consulta DELETE FROM? Isso poderia
ajudar a garantir que estaremos apagando
a pontuao certa, no?
O

Sim, poderia! A ID da pontuao a m aneira p erfeita de


se isolar o registro para ser apagado.
A unicidade uma das principais vantagens de se criar chaves
primrias para as suas tabelas. A coluna id da tabela guitarwars a
chave primria e, portanto, nica para cada pontuao. Usando
essa coluna na clusula WHERE da consulta DELETE FROM, ns
eliminamos toda a dvida sobre qual registro ser excludo. Eis uma
nova consulta, desta vez usando a coluna id para nos ajudar:
Apagar dados tom
DELETE FROM guitarwars WHERE base cr* uma dhave
p\rmatria ajuda a
garantir preciso ao
Havendo a confiana de que a coluna id de fato a chave primria, se isolar a linha dev-ta
este cdigo apagar de forma segura apenas uma linha. Mas e se no para ser e*dlwda-
tiver sido voc quem criou o banco de dados, e talvez a unicidade
no tenha sido devidamente implementada. Nesse caso, uma clusula
LIMIT poderia ainda ser til. O raciocnio este: sempre que voc
quiser afetar apenas uma linha, deixe isso claro na consulta.
A dlusuh L IM IT diz.
DELETE FROM guitarwars WHERE id =
e^plid-itmente V**
a donsulta nao pode
Nunca m ideia ser bastante explcito com o que voc quer que seja apagar ais de w^a
feito em uma consulta, e neste caso, LIMIT adiciona uma medida linha
adicional de segurana consulta DELETE.
voc est aqui 285
o script removescore.php quase pronto

Im as d e G elad eira PH P & M / S o L


O script removescore.php est quase pronto, mas ainda faltam
algumas partes importantes do cdigo. Use os imas para preencher
as lacunas no cdigo e implementar no Guitar Wars a capacidade de
eliminar pontuaes indesejadas.

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang-'en' lang-"en">


<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Guitar Wars - Remover uma Pontuag.ao</title>
clink rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<h2>Guitar Wars - Remove a High Score</h2>

<?php

('appvars.php');

(connectvars.php);

if (isset($_GET['id'3) && isset($_GET['date']) && isset($_GET[name']) &&

isset{$ GET['score']) && isset($_GT[ ............. 1)) i

// Pega os dados em GET


$id = $_GET['id];
$date = $_GET['date'];
$name = $_GET ['name1];
$score = $_GET['score'];

= $ GET [ .....];

else if (isset($_POST['id']) & isset($_POST[name']) isset($_POST[1score


// Pega os dados em POST

= $ POST[ ];

$name = $ POST[1name'];
$score = $_POST['score'];
$ sceenshot = $_POST ['screenshot'];
}
else {
echo '<p class="error">= Desculpe, nenhuma pontuaao foi especij-icada para
removida.</p>1;
}
if (isset($_POST['submit'])) {

if ($_POST['confirm'] == ) {

// Exclui o arquivo grfico do servidor


@unlink(GW_UPLOADPATH . $screenshot);

// Conecte no banco de dados


$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD,.DBJJAME);
trabalhando com dados armazenados em arquivos

// Exclui os dados da pontuao do banco

$query = " guitarwars WHERE LIMIT

mysql_query($dbc, Squery);
mysqli_close($dbc) ;
// Confirma xito com o usurio
echo '<p>'A pontuao de ' . ' para 1 . ' foi removida com sucesso.';

else
echo '<p class="error">A pontuao no foi removida.</p>';

else if (isset( ) && isset( ) && isset( ) &&


isset($score) &5 isset($screenshot)) {
echo 1cp>Temcerteza de que deseja apagar a pontuao abaixo?</p>';
echo 1<pXstrong>Nome: </strong>' . $name. '<br /><strong>Date: </strong>' . $date .
<br /><strong>Pontuao: </strong>' . $score . [c/p>';
echo 'cform method="post action=,'removescore.php">';
echo 'cinput type="radio" name="confirm" value="Yes" /> Yes
echo '<input type="radio" naine=" confirm" value="No" checked="checksd" /> No <br />'
echo <input type="submit" value="Submit" name="submit" />';

echo <input type="hidden" name= value="

echo 'cinput type="hidden" name="name" value="1 . $name . /tr


echo 'cinput type="hidden" name="score" value="' . $score .
echo 'cinput type="hidden" naxae="name="screeshot"value="1.$ screeshot.'/>;

echo 'cp>ca href= >Slt;6lt; Voltar para a pgina admin</aX/p> '

?>
c/body>
c/html>

removescore.php

v o c e e s t aqui 287
o script removescore.php finalizado

Imas de Geladeira YHY e MySQL - Soluo


O script removescore.php est quase pronto, mas ainda faltam algumas partes
importantes do cdigo. Use os imas para preencher as lacunas no cdigo e implementar
no GuitarWars a capacidade de eliminar pontuaes indesejadas.

chtml xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">


<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Guitar Wars - Remover uma Pontuagao</title>
d i n k rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<h2>Guitar Wars - Remove a High Score</h2>
fndlua os arquivos de script
<?php dompav-tilHados, mas use
require_once {'
: appvars-php'); required_ende, uma vez. que
elcs sao essendiais para a
requi re__once h 'connectvars-php[);
remodao das pontuadoes.
iETissetT$"GErTt,rd]) & isset ($_GET [date ]) && isset($_GET['name11) &&

isset ($_GET [score ]) && isset($_GET[ screenshot Hi)} {

I
// Pega os dados em GET 0 sdript reaje
$id = $_GET['id'];
$date = $_GET[date'];
diferentemente
$name = $_GET['name 1]; doworme a requsido
$score = $_GET['score]; redebida seja fcjET ou
$screenshot |j|i= $_g et POST- ^

else if Usse, ^ P O S n . ^ ...US isset <^POST r score <


// Pbcjb os dados 6ift POST A diretiva PttP de supresso de erros, 0,
impede que erros sejm relatados, fa z . sentido
usar essa opdo dom unlinkO, uma vez. que
$name = $_POST ['name 'D poderemos estar tentando exdluir um arquivo
$score = $_POST[1score 1 que nao existe- Messe daso, nao queremos que o
$screenshot=$_POST[1screenslyt1]
usuirio redeba uma mensagem de erro.

y^
else {
L .<
echo '<P c l^ r eriuj.
class- r o ^ 4 O eSPeClflCada P a
re m o v ito < /p > J f o it
} usado para se remover
if (i/set($_POST[submit'1) quaisquer pontuaes,
i l | (S_ P O ST [ ' c o n f i r m ' ] -
^ de modo o
que arquivo
e M l3 o

7/ Exclui o arquivo grfico do servidor^ ser excludo tombent.


@uniink(GW_UPLOADPATH . $screenshot>;

" COT * = a= b^sqli! d=onL=t,DB__HOST, DENSER, ;


trabalhando com dados armazenados em arquivos

// Exclui os dados da pontuao do banco

$query = " gguitarwars WHERE jLIM IT

mysqli_query($dbc, $query);
mysqli_close($dbc);

// Confirma xito com o usurio


echo '<p>T'A pontuao de . ' para foi removida com sucesso.1'

else
echo '<p class="error">A pontuao no foi removida.</p>' ;

else if (isset isset ( ) && isset { ') &


isset($score) && isset($screenshot)) {
echo '<p>Tem certeza de que deseja apagar a pontuao abaixo?</p>';
echo '<p><strong>Nome: </strong>' . name . '<br /><strong>Date: </strong>'

<br /><strong>Pontuao: </strong>' . $score . ' < / p > ' ;


echo '<form method="post" action="removescore.php">';
echo '<input type="radio" nam="confirm" value="Yes" /> Yes
echo '<input type="radio" name=,confirm" vElue="No" checked="checked"/>No <br
/> echo <input type="submit" value="Submit" nce=r'submit" />';
echo '<input type="hidden" name= |vaipe=" " />;
echo '<input type="hidden" name="name' value="'V $name .
echo 'cinput type"hidden" name="score" value="'\ score . />;
echo cinput type="hidden" name="screenshot" value%^' . $screenshot ./>1
echo '</form>';

echo '<p><a href= ;&lt; Voltar para a pgina admin</ax, p > ';

</body>
</html>

rert.ovescore.php
pagma Mrn*} para mclKor ft twfos esCo*did<* SBLF3 0 Wmulri,
avegacao. ,^7 ~ J F<*>e s incluiria . r-
^do -formulrio a*
so usaA*
usados quaisquer dados que tenha de Con-hrmao
para se armazenarem sido enviados atravs da URL, so e exibido
os dados da pontuaao,
para que eles sejam
que**** se todas
estas variveis
^ ti+ ic a r de que nenW, dado

alguns ms-
enviados Como parte da
requisio POST. seja enviado
TGTwiujri apehs
ju^to este
com
aPenAfi d a d o s D/
P (u
O Tt
estiverem
definidas.
voc est aqui 289
o test drive final do aplicativo guitar wars

T fe S T O r iv

Adicione os scripts de Rem over Pontuao e Admin ao G uitar W ars,


para que seja possvel excluir pontuaes.
Crie dois novos arquivos de texto, rem oves co re .php e admin.php, e insira neles o
cdigo que acabamos de completar. Envie os novos scripts para o seu servidor, e depois
abra o script Admin no seu navegador. Clique no link "Remove" de uma pontuao
que voc queira excluir, e depois confirme a remoo na pgina Remover Pontuao.
Volte pgina Admin para se certificar de que o registro foi apagado, e depois v para a
pgina principal do Guitar Wars (In d e x . php), para ver l o efeito da modificao.
A nova pgina
Remover Pontuaao
fiuida de d-on-firmr
e -fazer a remoo
das pontuaes
mdesejadas.

A nova p^na Ad Tt pjma pv-intipal


-fornede links para se do juitar Wars
removerem pontuaes a^ora s mostra
nao vevi-fitadas- pontuaes
tomprovadas.
st
Os ^uitav-
Warriors
ste e o pequeno legtimos
Jatob, Quitar esta -felizes,
VVarrior prodfyo ajora <^ue so
H pontuaSes
domprovadas.

As pontuaes hao
vcri i&adasj ou seja*
aquelas sem imagens
.omprobat*r'sas, -foram
removidas do sistema-
trabalhando com dados armazenados em arquivos

Palavras Cruzadas PHP & M /S Q L


Cansado de enviar arquivos grficos? Que tal ento
enviar um pouco de conhecimento para um monte
de quadrinhos?

Horizontais Verticais
I. 0 atributo type da tag <input> deve ser definido 2. Para impedir que uma instruo DELETE FROM
como isto, para que um campo do formulrio aceite apague mais de uma linha, use esta instruo.
upload de arquivos. 3. Quando um arquivo enviado atravs de um formulrio,
4. Geralmente uma boa ideia armazenar as imagens ele colocado em uma pasta... no servidor.
enviadas aplicao em uma pasta.... 5. Ao alterar uma tabela, este comando SQL cuida de
8. Esta instruo SQL usada para se modificara adicionar uma nova coluna.
estrutura de uma tabela. 6. Esta instruo PHP usada para se criar uma
10. Esta instruo SQL usada para se colocar os constante.
resultados de uma consulta em uma determinada ordem. 7. Os arquivos include so bastante teis para se... dados
II. Informaes sobre os arquivos enviados so entre vrios scripts.
armazenadas na varivel superglobal $.... 9. Esta instruo SQL usada como parte de outra
12. Esta instruo PHP usada para se inserir cdigo de instruo para ordenar resultados de consultas em
outro script. ordem descendente.
13. uma boa ideia fazer isto com umarquivo recm-enviado.

voc est aqui > 291


palavras cruzadas php e m ysql - soluo

TalaVras Cruzadas PTP & M ySQ L


Soluo
trabalhando com dados armazenados em arquivos

Sua Caixa de Ferramentas PHP - MySQl


Fique vontade para fazer uma

CAFITOIO 5
mKF reverncia virtual. Voc no s
adorado pelos guitarristas virtuais do
mundo todo, como tam bm adquiriu novas
habilidades em PHP e MySQL: a lte ra r a estrutura
de tabelas, lidar com uploads de arquivos,
controlar a ordem de dados e remover dados.

voc est aqui > 293


7 tn a n c [o a Sua Aplfca Segura

* Presuma que Esto Todos


Querendo Te Pegar
^ fr

Seus pais estavam certos: no fale com estranhos. Ou pelo menos


no confie neles. Na pior das situaes, no d a eles as chaves
para acessar os dados da sua aplicao, presumindo que eles no
vo fazer nada de errado. Vivemos num mundo cruel, e voc no
pode partir do princpio que todos so confiveis. Na verdade, como
desenvolvedor de aplicaes web voc precisa ser metade incrdulo
e metade adepto de teorias de conspirao. Sim, as pessoas em geral
so ms e elas definitivamente querem te pegar! OK, talvez isso seja
um pouco de exagero, mas muito importante levar a segurana
a srio e elaborar as suas aplicaes de forma que elas fiquem
protegidas contra qualquer um que pretenda causar danos.
este um novo captulo 295
guitar wars est sendo hackeado

0 dia em que a msica morreu


Parece que os quinze minutos de fama do nosso roqueiro-virtual-prodgio se
acabaram: a pontuao de Jacob no Guitar Wars sumiu, junto com todas as
outras. P areee que h algum a fo ra do m al em ao, b agun an d o o aplicavo
e impedindo os Guitar Warriors de terem os seus placares publicados.
Guitamstas virtuais insatisfeitos so usurios insatisfeitos, e a consequncia
ltima disso um desenvolvedor de aplicaes insatisfeito... voc!

0 re tw d is h do Quitar
Wars, Jaob, est
furioso por a su pontudao
"ter sumido da lista.

0 armamento musita!
pre-ferido
de Jafcob, uma
Eradicaser sara 2-005
segurana para a sua aplicao

Para onde foram as pontuapes?


Ns sabemos que a pgina principal do Guitar Wars est vazia, mas A tonsuita SU&CT revela
ser que isso significa que o banco de dados tambm est vazio? <^ue a -tabela ^ui-tavwa
Uma consulta. SELECT pode responder essa questo: esta tompe-tamen-te vazia
todas as pcm-tuatoes se
erd 4- ^

De algum modo, todas as linhas de dados foram apagadas do banco


Guitar Wars. Seria possvel que algum talvez esteja usando o nosso script
Remover Pontuao para o mal? Ns temos de proteger as pontuaes!

i- % A p o n te seu lpis
Faa um crculo em torno das tcnicas, dentre as apresentadas a
seguir, que voc poderia usar para proteger as pontuaes do Guitar
Wars contra hackers, e escreva em baixo o porqu.

Proteger com senha a pgina Admin, de Criar um sistema de registro dos


modo que somente quem souber a senha usurios, e s conceder a alguns (de
(voc!) possa remover pontuaes. preferncia s a voc!) os privilgios
administrativos.

Verificar o endereo IP do computador que


est tentando acessar a pgina Admin, e s Eliminar totalmente o recurso de
perm itir alguns endereos (de preferncia remover pontuaes.
apenas o seu prprio!).

voc est aqui 297


protegendo as pontuaes do guitar wars

ponte seu lpis


Solupo Faa um crculo em torno das tcnicas, dentre as apresentadas
a seguir, que voc poderia usar para proteger as pontuaes do
Guitar Wars contra hackers, e escreva em baixo o porqu.

Proteger com senha a pgina Admin, de


modo que somente quem souber a senha Todas as tefcnicas foram
(voc!) possa remover pontuaes. circuladas, porque W as elas
so Capa**s de resolver o
problema, embora al^uws
. Proteger cm .senha .a. pgina, Admin; e uma seja ais vive\s <\ue ouras.

. bod .e.ypjdi porque na muit...


complicada e -for^ete ao site umaseguy-an^a
|razjoyel ^apitemente-
Criar um sistema de registro dos usurios/^
e s conceder a alguns (de preferncia s
a voc!) os privilgios administrativos.

Um sistema de registro dos usurios, Com privilgios


administrativos limitados, e uma otima solu^ao, mas
envolve bastante planejamento e programaro... o
Quitar tVars .precisa.de segurana, a^ora/(.............

Verificar o endereo IP do computador que


est tentando acessar a pgina Admin, e s
permitir alguns endereos (de preferncia
apenas o seu prprio!).

Veri-fitar {P funCiona, mas .torna, o site


dependente do endereo |P do seu oi^putador,
o <\ual poder se modificar.

Remover o recurso cevtamente resolve este


problema especfico, mas lembre-se: o reCurs foi
adicionado originalmente, no Captulo anterior,
pdv~a tornr a manuteno do site mais fcil.
segurana para a sua aplicao

A autenticao
Seguranpa contra os brbaros
HTTP oetece uma
Uma maneira simples e direta de se garantir rapidamente a
segurana do Guitar Wars usar autenticao HTTP para forma slniples de se
proteger com senha a pgina Admin. Na prtica, ser pedido
um nome e uma senha, mas a ideia terica exigir do fazer a segurana
administrador uma determinada informao secreta antes de
permitir que ele tenha acesso a recursos restritos da aplicao, de uma pgina tju &
como por exemplo, os links para remoo de pontuaes.
Quando uma pgina protegida usando-se autenticao
use ri ir.
HTTP, aparece uma janela pop-up pedindo o nome do
usurio e a senha, para que seja concedido o acesso pgina
protegida. No caso do Guitar Wars, voc pode limitar o acesso A ja*e!a de autentiado
pgina Admin a qualquer nmero de pessoas que quiser, ^T T P agor se ihterpoe

possivelmente at a apenas voc! entre os usurios 3


pgina Admi.
m

As fwituaSes do hante de
dados agora estao protegidas,
u*a vez. ^ue o tesso pgihj Os links MRewove da
Adrift restringido. pgina Admin agora
s estao disponveis
para o administrador
g u itarw ars
do Quitar liVars.
um iffllilillfSffi IPff il
232470
iwwmm
beta&scre.gf
2008-05-01 20:35:07 elita Chevy
14
Jacob Storihersft 339740 jasiobsscort.gtf
15 2008-05-01 20:36:45
Nevil Johansson 93430 nevilsscore f
1& 2008-05-01 20:37:02
127650 piossCre.gif
PacoJartorius

I
17 2003-05*01 20:37:23
166380 phizsscore.gif
2008-05*01 20 l37;40 Phiz Lairston

64930 kennysscore.gtf
2008-05*01 20:38:00 Kenny Lavitt
19
2-4336 jeanpu?55cor.g
2003-05-01 20;S:23 Jean Paul Jon
20

voc est aqui 299


usando autenticaao HTTP

Protegendo a pgina (ruitar W a rs Admin


A autenticao HTTP funciona assim: quando um usurio tenta acessar
uma pgina protegida, como a nossa pgina Admin, eles recebem uma
janela que lhes pede um nome de usurio e uma senha.
sta varivel superjlobal
0 *ave$ador web
do PHP armazena
us<3 um3 jnel tomo o nome do usurio
esta para re<^uisiar digitado na janela de
um nome e senha, autenticaro.
antes de perm itir o
esso
.
a um Paaina
pvotegda.
>J
To view"Guitar
this page, you.need to Sogmto area
Wars" on wwfw.giisarwars.ret
Your password wil! fcc sent in Oie t 'W -
I
$ SERVER['P H P AUTH USER ]

Name: ;
Password; $ SERVER['PHP AUTH PW' ]

Para manter as
doisas simples,
a senKa nao e
r? Rememberthis password in my Heycbain

( Carccet r
sfca varivel armazena a
senha ditada a janela de
iriptogra-Pada.
autentitaao-

O PHP entra em cena atravs do seu acesso ao nome e senha


digitados pelo usurio. Eles ficam armazenados na superglobal
$_SERVER, que semelhante a outras superglobais que voc j usou
($_POST, $_FILES, etc.). Um script PHP pode analisar o nome e a
senha digitados pelo usurio e decidir se ele deve receber acesso
pgina protegida. Digamos que s vamos permitir acesso se o nome
do usurio for rock e a senha for roll. Eis aqui o modo como o
acesso pgina Admin concedido:
A pyn Admin so
aiessvel st tiverem sido
ditados o nome t a
senha dorreW

/y
s

5_SERVER[.pHp_0TH
l_PW< ]

$ SERVER [ ' PHP__AUTH_USER ' ]


segurana para a sua aplicao

n9 existem
Ferguntas idptas
" P - A autenticao HTTP realmente segura?

Sim e no. Depende do que voc est tentando conseguir com a segurana.
Nada 100% seguro, portanto ns estamos sempre falando de nveis de
segurana. Para se protegerem pontuaes no Guitar Wars, a autenticao HTTP
fornece um nvel razovel de segurana. Voc poderia adicionar criptografia
senha para ter um nvel ainda maior. Porm, mesmo isso provavelmente no seria
suficiente em uma aplicao que envolvesse dados mais sensveis, como por
exemplo, dados financeiros.

O que acontece se o nome e a senha forem digitados incorretamente?

K * O navegador emite um pequeno choque eltrico atravs do mouse.


Brincadeira, no acontece nada to dramtico assim. Em geral, exibida uma
mensagem para avisar o usurio de que ele est tentando acessar uma pgina
segura, a qual aparentemente no da conta deie. Em ltima instncia, voc
quem escolhe o que essa mensagem dever dizer.

" P A autenticao HTTP requer tanto o nome do usurio quanto a senha? E


se eu s quiser usar a senha?

No obrigatrio usar ambos. Se voc quiser usar apenas uma senha,


basta verificar s a varivel global $_SERVER['PHP_AUTH_PW]. Falaremos mais
sobre como essa varivel verificada, em instantes..,.

T * Como exatamente voc protege uma pgina com autenticao HTTP?


Chamando-se uma funo PHP?

Exato. A autenticao HTTP envolve o estabelecimento de uma linha de


comunicao entre o navegador e o servidor, atravs de cabealhos HTTP. Voc
pode pensar no cabealho como sendo uma pequena conversa entre o navegador
e o servidor. Ambos usam os cabealhos frequentemente para se comunicarem
fora do contexto do PHP, mas o PHP lhe permite enviar um cabealho, que o
modo como a autenticao HTTP funciona. Estamos prestes a aprender muito
mais sobre os cabealhos e o seu papei na autenticao HTTP com PHP.

Quando que a
autenticao da pgina
deve realmente ocorrer?

voc est aqui 301


autenticao a cabealhos

A autenticao HTTP exige cabealhos


A ideia por trs da autenticao HTTP que o servidor esconda T e clei p g i n a
uma pgina protegida, e instrua o navegador a pedir um nome
e senha ao usurio. Se o usurio os digitar corretamente, o \Veb entvegue
navegador vai em frente e fornece a pgina. O dilogo entre
navegador e servidor se realiza atravs dos cabealhos, que so c o m a a ju d a
pequenas mensagens de texto com instrues especficas sobre o
que est sendo pedido ou entregue. <fes cakealfcps.
Os cabealhos na verdade so usados sempre que voc visita uma
pgina web, e no apenas quando a autenticao requerida. Eis
o modo como uma pgina normal, no protegida, enviada pelo Servidor w eb
servidor para o navegador com a ajuda dos cabealhos:
Este Cohjuhte de
tabealHos a
O navegador requisita Ua jrg^uisjAo de
uma pgina do fdgina vieb-
servidor, enviando
alguns cabealhos O servidor responde
para id en tific ar o com um conjunto
arquivo sendo pedido de cabealhos,
e nome de host do seguidos da pgina
servidor. requisitada.

ndex.php
Este rupo de
cabealhos forma
w* v-esposfa de
fgma web

O navegador recebe os
cabealhos e a pgina, Jv/ f im das dojvbas,
e gera o cdigo HTML os eabealhos ajuda
da pgina. a eniv-egar to
sutesso ao avegador
a fg'ma fedida-
segurana para a sua apficao

A n e m ia de
um Cakeqlfeo --------- ------ -------------------------------------------------------------

Os cabealhos controlam precisamente como e que tipo de informao enviada do


navegador para o servidor web, e vice-versa. O cabealho frequentemente consiste de um
par de nomes/valor que identifica uma determinada informao, como por exemplo, o
tipo de contedo da pgina (HTML). Um determinado grupo de cabealhos enviado
ao servidor como parte de uma requisio web, e depois outro grupo retornado ao
navegador como parte da resposta. Vamos dar uma olhada com mais detalhes nestes
grupos de cabealhos, para descobrir exatamente o que enviado, medida que o
cliente e o servidor comunicam-se um com o outro. 0 primeiro
A maioria dos abetalho nao t um
dabealhos donsiste i- par de nomes/valor
de Um p a r t tiOtnts/ - e a requisio 6 T
_GET / i n d e x , p h p H T T P /1 ,
valor separado por H o s t: www . gui :; a r w a r s . ne). .i da pagina.
dois pontos. ^.t.lQ D ^ciose -
U -s e r- A g e n t - M c z ill a / 5 7 T ? > v
ste dabealbo
" ^ c c p c - L n a r s e t : IS D = S S S 7 \ \ . . . '
espeii-fda o
C a c h e - C Q n t r o l : n o :
navegador <\ue
A c c e p t-L a n g u a g e : d e , e r.; q=Q . 7 .
esti -fazendo a
re\uisido-

0 primeiro dabealbo
a resposta ttTT P do
servidor-

1 1 : 2 2 : 0 9 GMT

Server; Apache/2 .0.54


X-Powered-By: PHP/5 .2 .
.n^far^Enroiii
Content-Type: text/html

Este dabefalh diz. ao


0 tonteudo HTML- d
navegador que o donteudo
e ddigo HTML, em vez. de, pagina e enviado logo ndex.php
por e*emp!o, te* to simples.
aps os tabealKos
Os cabealhos nos so importantes, no que diz respeito ao Guitar Wars, porque eles
fornecem o mecanismo que interrompe a entrega de uma pgina do servidor, requerendo
que o usurio digite um nome e uma senha para liberar a pgina. Em outras palavras,
preciso trabalhar nos cabealhos retornados pelo servidor para proteger uma pgina com
autenticao HTTP.
voc est aqui 303
entrevista com o cabealho

Tudo Sobre o Cabealho


Na entrevista desta semana: por
que tanto falatrio?

Use a Cabea!: Voc parece estar recebendo Use a Cabea!: Interessante. Mas ouvi dizer
bastante ateno no que diz respeito a autenticar que os servidores tambm so capazes
pginas web. Isso se justifica ou voc est apenas de enviar cabealhos. Eu pensava que os
tendo os seus quinze minutos de fama virtual? servidores s enviassem pginas web.
Cabealho: No, isso se justifica sim. Voc est Cabealho: Ah, boa pergunta. A minha
se esquecendo de que eu tenho um papel vital na importncia no outro lado da comunicao a
entrega de qualquer pgina web existente. Assim, mesma, porque o servidor precisa fazer mais
acho que posso dizer que a web nem sequer do que apenas jogar um monte de contedo
funcionaria se eu no estivesse em cena. Eu vou em cima do navegador. O navegador poderia
durar muito mais do que quinze minutos, mesmo no ter a menor ideia do que fazer com esse
que as pessoas no apreciem o meu trabalho. contedo, se no lhe fosse passadas mais
Use a Cabea!: Ento qual exatamente esse algumas informaes.
papel que voc desempenha? Use a Cabea!: Como por exemplo...?
Cabealho: Voc tem que entender Cabealho: O tipo do contedo seria um
que navegadores e servidores web no exemplo. Essa provavelmente a informao
so pessoas, portanto eles no podem mais importante, mas o servidor envia tambm
simplesmente ligar um para o outro ou enviar outras coisas, como o tamanho do contedo, a
uma mensagem de texto. data e a hora da entrega, e assim por diante.
Use a Cabea!: SRIO?! Use a Cabea!: Quando que a pgina
Cabealho: Sim, eu sei que um choque, mas propriamente dita enviada?
as mquinas simplesmente no se comunicam do Cabealho: O contedo, seja ele cdigo HTML,
mesmo jeito que as pessoas. Mas os navegadores dados PDF ou dados de imagens como um GIF
e os servidores ainda precisam falar uns com os ou JPEG, segue logo depois que o servidor me
outros, e eles o fazem atravs de mim. envia ao navegador.
Use a Cabea!: E como isso acontece? Use a Cabea!: OK; estou comeando a
Cabealho: Quando algum digita uma URL ou entender como voc funciona em relao s
clica em um link de uma pgina, o navegador pginas normais. Mas e quanto a esse negcio
cria uma requisio GET e a envia ao servidor. de autenticao?
Essa requisio empacotada em uma srie Cabealho: Eu desempenho o mesmo
de cabealhos, cada um dos quais contendo papel em uma pgina autenticada que nas
informaes sobre a requisio. Eles contm pginas normais, exceto pelo fato de que
informaes como o nome e o host da pgina eu tambm cuido de informar ao navegador
sendo pedida; o tipo de navegador que est que pgina precisa ser autenticada. Dessa
fazendo o pedido, etc. forma, o navegador poder pedir ao usurio as
Use a Cabea!: No consigo ver o que h de informaes de autenticao.
to importante nisso. Use a Cabea!: Ou seja, um nome de usurio
Cabealho: Bem, quando voc vai a um caf, e uma senha?
voc acha importante dizer ao atendente que Cabealho: Exatamente. E depois, fica a cargo
quer um cappuccino grande sem creme? do cdigo PHP no servidor decidir se o nome
Use a Cabea!: Claro que sim, o atendente e a senha so vlidos, em cujo caso o servidor
precisa saber o que que eu quero. pode enviar o restante da pgina.
Cabealho: a mesma coisa, aqui. O Use a Cabea!: Fascinante. Obrigado pelos
navegador diz ao servidor o que ele quer, esclarecimentos.
empacotando a requisio e enviando-a em Cabealho: Sem problemas. Isso faz parte do
cabealhos. meu trabalho.
segurana para a sua aplicao

Controle os cabealhos com PHP A unp


Com o PHP, voc pode controlar cuidadosamente os cabealhos h e a d e rO llie
enviados pelo servidor ao navegador, abrindo a possibilidade petmfte Gtlat
de realizar tarefas como a autenticao HTTP. A funo interna e enViar um
header() usada para se enviar um cabealho, do servidor para o
navegador, de dentro de um script PHP. cctkealfe a
|{1Content-Type: text/html'); partr <le um
A funo header() envia imediatamente o cabealho, e deve
script ?HP-
ser chamada antes de qualquer contedo propriamente dito ser
enviado ao navegador. Esse um requerimento bastante estrito
- se mesmo um nico caracter ou espao for enviado antes do
cabealho, o navegador o rejeitar com um erro. Por esse motivo,
as chamadas funo header() devem preceder qualquer cdigo 0 servidor envia
HTML dentro de um script PHP; este fibeaiho ao
Mesmo um espao \*e avegador para ser
viesse antes da tag "v. frodessado, antes de
<?php tausaria um V te n ta r enviar ^uai^uer
erro este sdript de <?php parte do Contedo
e*<y*\plo- ffTM L da pgina-

0 s espaos dentro das


tags <?php ?> no e ?>
problema, porque eles
no so repassados
para o navegador.
Chtml xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
lang="en" >

</html>

voc est aqui


como a autenticao de cabeaiho funciona?

Autenticando com cabealhos Servidor web

Para se autenticar a pgina Admin do Guitar Wars mediante


cabealhos, preciso criar um conjunto bastante especfico deles -
dois, na verdade , que faam o n avegad o r saber que deve pedir um
nome e uma senha ao usurio antes de entregar a pgina. Esses dois
cabealhos so gerados atravs de cdigo PHP no script Admin, e
controlam a entrega da pgina para o navegador.
Os. dabealHos de
autentao HTTP so . 551'Unath-rii'
^^fcftntiGfcQ:- ;Wi/ ; Antes de enviar o
enviados do servidor para a^ic rpalm^Guitar;;: ton-tedo da p%*
o have^ador.
admm-pbp para o
navegador o servidor
protessa <\uais<\uer
eabetalKos da pa<yn
0 ave^ador, eniao,
pede <\ue o usurio
To vie w tns page, you n e t d to lo g in to area
digrte um home t 9
G uita r Wars" on www . u itajw ars.n e t

umd senha-
Your password will be sent in the cfcar.
.ftfettae; . ,.;rock ;

Password: j

0 'tentsm ber this password in rty io ycha in

Navegador
w eb do c lie n te
S> necess&iPs
ck>is cabealjiog Os dois cabealhos necessrios para se iniciar a autenticao
e s p e c fic o ^ p a r a fazem duas coisas bastante especficas:
se Ve^jUeVeV a ste dabealho in-Porma

autenticao de
ao navejador ^ue

lo a ver a
uma pgina Web, pagina.

WWW-Authenticate : Basic realms"Guitar Wars


Este tabealHo pede ao
navegador para tentar
0 basid realm (domnio basidos) e
utentitar o usurio,
pedindo~lKe um nome e apegas uma expresso usada para
dentsidar individualmente esta
uma senK-
autentidaao em partidular - ela
aparede a janela de autentidado.
segurana para a sua aplicao

Aps processar os cabealhos, o navegador espera a resposta do usurio,


atravs da janela de autenticao. O navegador responde com aes
completamente diferentes, dependendo do que o usurio fizer...

Gaitar Wars - High Scores Administration Se o usurio digitar um nome e


Below is a list o all Guitar Wars high scores. Use this page to remove scores as needed. senha corretos, e clicar em Log
Jacob Scorchmon 2008-05-0120:36:45 389740 Remove In, o servidor envia o contedo
Bdlta Chevy 2GG8-OS-O 2056:07 282470 Rgmrrw HTML da pgina admin.php para
Jean Paul Jones 2008-05-01 20:38:23 243260 Remava
o navegador. Este exibe a pgina
Pbiz Lajrstoo
Paco Jasiorius
20)8-05-01 20:37:40 1865 SOReraove
2008-05-01 20:37:23 127650 Remove Admin, e o usurio poder ento
Nevil Johansson
Kenay Lavitz
2008-05-01.20:37:02 98430 Remove remover pontuaes, da mesma
2008-05-0120:3S:00 64930
forma como na verso no
protegida anterior.
0 t o M id o HTML- da pag>a
Admin t CntreguC depois \U
admin, php
SC digit um nomC C um3
se*Ha Corretos. Se o usurio digitou um nome e
senha incorretos, e clicar em Login
To view this pa*, you r*m to teg in area In, o servidor diz para o navegador
Guitar Wars on *M *. guitar wars.,n e t ;
pedir ao usurio de novo o login.
Your password wl ft 6 * * m .thedeir. O navegador continuar este
Name:' :: . . ................ processo enquanto o usurio tentar
Password: combinaes incorretas de nome e
Se o nome ea senHa senha. Em outras palavras, se eles no
do usuario -fore n Remember This password in my keychair?
souberem o nome e a senha, o nico
subtmctidos e -fWem Cancel ^ jeito de sair clicar em CANCELAR.
inCometos, aja^ela de
autewticac^o ape>3s
aporeCe para usurio
Se o usurio clicar em CANCELAR
para sair da autenticao, o servidor
envia para o, navegador uma pgina
com uma mensagem de acesso negado
e nada mais a pgina admin.php
no foi enviada. A mensagem de
acesso negado controlada pelo
cdigo PHP no script admin.php que
est associado com os cabealhos.
A aplicacao tem a Este cdigo chama a funo PHP
oportunidade de -finalizar o exit() para mostrar a mensagem e
script e e*\bir ur*>a message* imediatamente sair do script:
de erro personalizada? caso o e xit('<h2>Guitar Wars</h2>Sorry, you must enter a
usurio tainCele o proCesso de valid '
auterttiCo- 'user name and password to access this page.');

voc est aqui > 307


finalizando o cdigo de autenticao

imas de Geladeira PHF


No script Admin do Guitar Wars, esto faltando diversos pedaos
importantes do cdigo PHP que fornece a autenticao HTTP. Use os imas
para completar o cdigo abaixo, e use cabealhos para tornar a pgina
segura. Dica: alguns imas podero ser usados mais de uma vez.

<?php / Nome do usurio e senha para autenticao

= 'rock';

.............. = 'roll';

if (! isset { ....................................... ) I1

!isset ( .................................... ) iI

($_SERVER['PHP_AUTH__USER'] !=....... ) II ($J 3EKVER [PHP_AUTH_PW'] !=......... )) {

/ / Nome do usurio/senha incorretos, ento enviar os cabealhos de autenticao

........ ('HTTP/l.1 401 Unauthorized');

........ ('WWW-Authenticate: Basic realm= .............. ') ;

....... ('<h2>Guitar Wars</h2>Desculpe, voc deve digitar u m .

'vlida para acessar esta pgina.') ;


}
?>
<html xmlns="http://www.w3 .org/1999/xhtml" xml:lang="en" lang="en">

</html>
segurana para a sua aplicao

Ser que possvel


enviar outros tipos de
cabealhos usando-se PHP?

S im , p o ss v e l... o s c a b e a l h o s n o s e r v e m a p e n a s
p a ra se g u ra n a .
Embora a autenticao seja o principal caso em que os cabealhos se
fazem necessrios, eles so bastante flexveis e so capazes de fazer outras
coisas interessantes. Basta chamar a funo header() com o par de
nome/valor apropriado, desta forma:

0 navegador <?php ^
redirecionado
abouipKp, header(ItttaitWSHIlilllHlS
aps receber ?>
este Cabealho- Neste caso, temos um cabealho de localizao, o qual
redireciona da pgina atual para outra, chamada aboutphp, no
mesmo site do Guitar Wars. Aqui, ns usamos um cabealho
semelhante para redirecionar para a pgina aboutphp depois de
cinco segundos:

0 navegador
redirecionado echo TEm 5 segundos, voc ser levado para a pgina About.;
para a pagina ?>
About depois de
E neste caso, ns temos um cabealho de
5 segundos.
recarregamento, uma vez que ele recarrega a pgina
aps ter-se passado um determinado perodo de
tempo. Voc frequentemente v a URL nesse tipo de
cabealho referenciar a pgina atual, para que ela se
recarregue periodicamente.
Um ltimo caso o chamado cabealho de tipo de contedo,
porque ele controla o tipo do contedo sendo entregue
pelo servidor. Como exemplo, voc pode forar uma pgina
a ser exibida como texto puro, em vez de HTML, usando o
O s c a b e a lh o s seguinte cabealho ao chamar a funo header():
p r e c is a m s e r a
p rim e ira c o is a <1php 0 Contedo entregue
e n v ia d a a o (PI 3o navegador Como
Ve^laem ! n a v e g a d o r, e m header{* 11 ] ; texto simples.
um a rq u iv o PHP. echo 'Este <strong>texto</strong> na verdade no aparecer
em negrito.';
Devido ao fato de os
cabealhos serem enviados ?>
antes de qualquer contedo, Neste exemplo, o texto enviado ao navegador exibido
extremamente importante no exatamente como mostrado, sem nenhuma formatao
permitir que um espao sequer
especial. Em outras palavras, o servidor est dizendo ao
aparea fora do cdigo PHP,
antes de ser chamada a funo navegador para no exibir o contedo como HTML, e
headerQ no script PHP. portanto, as tags HTML so exibidas literalmente, como texto.
voc est aqui 309
o cdigo de autenticao completo

tas de Geladeira PHP - Solupo


No script Admin do Guitar Wars, esto faltando diversos pedaos importantes
do cdigo PHP que fornece a autenticao HTTP. Use os imas para completar
o cdigo abaixo, e use 0 para tornar a pgina Admin segura. Dica: alguns imas
podero ser usados mais de uma vez.

<?php // Nome do usurio e senha para autenticaao

5= 1roll ';
j (.^ O^nome do usurio c d senha
io 3 dos e*n Vriveis,
h m'&l do seript-
f^BRVBKd
$ M^global
tesso do fcon*e t
senha digitados pelo
uswivio n janela de
utentida^ao.

!is set (I |_SERVER


1'ERVER [PHP_AUTH_PW ]
$password f ^
llrio/senha incorretos, ento enviar os cabealhos de autenticaao
|(HTTP/1.1 401 Unauthorized');

'WWW-Authenticate: Basic realm= I "Guitar Wars

Wars</h2>Desculpe, voc deve digitar um" .

'usurio e senha dos para acesar esta pgina.') ; $ duas thrsdas 3 unao
A -funo extO exibe uma mensagem headerO resulta** e estes
de erro e devtiidase de nada mais tabealhos sevem enviados ao
}
?> se*- enviado ao navegador, no evento navegador-
de uma alha de awtentdaao.
<html xmlns="http://www.w3 .org/1999/xhtml" xml:lang="en" lang- en >

adm in.php
0 nome e senha entregue ao navegador
digitados pelo usurio at que os cabealhos
sa veri-fidados aqui. tenham sido enviados t
prodessados.

: : .; 401 Authorised
WWii-Autnentieats:
Basic.realm="Guitar Wars'
segurana para a sua aplicao

T fe S T O R f v e
A dicione autorizao HTTP ao scrip t Admin.
Modifique o script admin.php de modo que ele passe a usar autenticao HTTP, para
que s voc tenha acesso a ele. Envie o script para o seu servidor, e depois abra-o no seu
navegador. Experimente digitar um nome e senha errados primeiro, para ver como o
acesso restringido.
Os fu rta r Wrriors

r
es-bao e li2Les por a
fiitao a^ora estar
se^uraf
Bt9aCHt*V ---- -- -

tofeLi** axiwJwiMJftiowwssfl* Score: 3897


H**9l * a M WGfcS
t a jU v t o SDOMWH 30;3S^3C ESStfS
u i ta

Uiw nome de . .* )
usurio e wm Pohtuaoes no podem scr
sertK a$or removidas sem auWisaao
impedem o atesso ^ Q u ita r $
I j '
nao autorizado
f^md Admi*.

nap existem
Perguntas Idiotas
Quando exatamente a funo exit() chamada O de uma autenticao HTTP tem algum
no script Admin do Guitar Wars? propsito real?

K: I Embora a funo exit() aparea no cdigo PHP


logo abaixo das duas chamadas a headerQ, ela s
1 ^ 1 Sim, ele define uma zona de segurana que
protegida por um determinado nome de usurio e senha.
chamada se o usurio sair da janela de autenticao, Uma vez que o nome e senha tenham sido digitados
clicando no boto Cancel. Se a autenticao falhar, o corretamente, em um determinado realm, o navegador
servidor no continua a execuo para alm das duas ir se lembrar deles, e no continuar a exibir a janela
chamadas a header(}. Em vez disso, ele re-envia os de autenticao para cabealhos subsequentes no
cabealhos e tenta novamente. Somente se o usurio mesmo realm. Em ouras palavras, os realms permitem
clicar em Cancel que o servidor chega funo exit(), que o navegador se lembre que voc j atendeu aos
em cujo caso ele envia o contedo da chamada funo, requerimentos de segurana para um determinado
e nada mais. Se a autenticao tiver sucesso, exit{) conjunto de pginas - basta especificar o mesmo realm
no chamada, porque o script nunca chega parte para os cabealhos de autenticao dessas pginas.
de dentro da declarao if- o cdigo dentro de if s
executado se no existirem um nome e senha definidos,
ou se eles tiverem sido digitados incorretamente.

voc est aqui 311


outro problema de segurana

Boa tentativa,
espertinho! Felizmente, eu
salvei o link para a pgina de
remoo de pontuaes, e depois
falsifiquei um pouco a data. O link
este aqui no quadro que estou
segurando.
ri-, do you have what it takes t0 r-nvt >.

M> nof As pohtua^oes


desapareceram da
apiiao guitar Wars
http ://www. guitarwars. net/ dcnovo^.
removescore.
hp?id=10&name=Jacob%20
Scorcherson&
date=2008-05-01 %20
20:36:45&score=389740&
screenshot=jacobsscore,gif:

V Isto tudo tertamente firptito, mas


URL f r a fa^ma removesorephp
de ato ao passa feia pa$ina admin-
php secura-
QK, ento talvez o Quitar W ars N&O esteja seguro
Isso que um sucesso de pouca durao. No demorou para os
Parete <\ue a nossa vila viles atacarem novamente, apagando as pontuaes do Guitar
do jwtar Wars destobriu Wars e mais uma vez frustrando os jogadores. Parece que s tomar
a pgina Admin segura no foi suficiente, uma vez que o script
umd -forma de dontornar
a nossa tewtatwa de Remover Pontuao ainda pode ser acessado diretamente... se voc
tornar o guitar Wars
souber o que est fazendo.
mais sc^uro-
Escreva abaixo como voc acha que poderamos resolver este novo
problema, evitando que as pontuaes sejam apagadas:
segurana para a sua aplicao

Ns
precisamos tornar seguro o script Remover
Pontuao, e tenho quase certeza que podemos simplesmente
O ^-------- usar a autenticao HTTP novamente.

Joe: Faz sentido, j que funcionou bem para a pgina Admin.


Frank: verdade. Ento tudo o que temos de fazer colocar o mesmo
cdigo de cabealho de autorizao no script Remover Pontuao, e
pronto. Certo?
Jill: Sim, isso certamente vai funcionar. Mas eu me preocupo em replicar
todo aquele cdigo de autorizao em dois lugares. O que acontecer
se, no futuro, ns tivermos de adicionar outra pgina que precise ser
protegida? Ns replicamos o cdigo mais uma vez?
Joe: ; cdigo duplicado definitivamente um problema.
Principalmente porque h um nome de usurio e uma senha que todos
os scripts precisam compartilhar. Se algum dia quisermos mud-los,
Fvahk 0%\\ to
teremos de fazer a modificao em cada um dos scripts protegidos
Frank: J sei! Que tal colocar as variveis fusername e Spassword em
um arquivo include prprio, e depois compartilh-lo entre os scripts
protegidos? Ns poderamos at mesmo coloc-las no arquivo include
appvars.php das variveis da aplicao
Joe: Eu gostei do raciocnio, mas essa soluo s lida com uma pequena
parte do problema de duplicao de cdigo. Lembre-se, ns estamos
falando de um pedao de cdigo relativamente grande.
<?php
// Nome do usurio e ssnha para. autenticao
username = 'rock';
$password = roll';

if (!isset($_SERVER[PHP_AUTH_USER1]) || !isset($_SERVER['PHP AUTH P W ]) U


($_SERVER[1PHP_AUTH_USER'] != $username) || ($_SERVER['PHP_AUTH_Pw ] '= $password)) {
// Nome do usurio/senha incorretos, ento enviar os cabealhos de autenticao
header('HTTP/l.1401 Unauthorized');
header ('WWW-Authenticate: Basic realm-"Guitar Wars" );
exit ( <h2>Guitar Wars</h2>Desculpe, voc precisa digitar uma senha vlida para acessar
esta pagina. ') ;
}
?>
<html>

Vocs dois tm razo, e por isso que eu acho que precisamos de um novo arquivo
Jill: incluae
admin.pnp

para armazenar todo o cdigo de autorizao, e no apenas as variveis fusemame e Spassword.


Frank: Ah, e ns podemos simplesmente incluir esse script em qualquer pgina que
quisermos proteger com autorizao HTTP.
Joe: Isso mesmo! S precisamos nos certificar de sempre inclu-lo em primeiro lugar, uma
vez que ele depende dos cabealhos para todo o trabalho de autorizao HTTP.
voc est aqui 313
criando authorze.php

Crie um script Autorizar


Ns j temos todo o cdigo de que precisamos para um novo seript,
Autorizar; s uma questo de passar o cdigo de admin.php para
um novo arquivo (authorze.php), e substituir o cdigo original por
uma instruo require_once. re-tiravdo este
de advwmphp
para o dolotavwos ko seu
prprio arqwWo de s irip i,
auihori.pVip.

admin. php
segurana para a sua aplicao

<?php
// Nome do usurio e senha para autenticaao ^ 0 " O sl- dt JuWidato,
$username = 1rock1;
a je it a elas d c ra rtilh a v *, o \
$password = 'roll1; CSmo M * sA-io e a * a ha.

i, <, i . t ($ SERVER[' PHP.AUTH USER' ,, II ^ . . w o r


,< cvBVFR I'PHP AUTH USER'] !=$username) il (_SEKVtKi ^ -
) r N ordoLur-io/se-nha icorretos, entto envrar os c a b e a l h o s ^ ---------
autenticao (' HTTP/l .1401 Unauthorized l ST
voc precisa digitar ur,a s e n h a vlida para acessar

esta pgina.1) ;

authorize, php

0 sdript Autorizar Compartilhado C <?php

includo logo o mtio deste sdript u3 ?>


require_once('authorise.p h p 1);

vez. <^ue ele thama a (w^ao headerO.


<html>

<?php
0 ddi^o de
?>
require_once('authorize.php);
autertida^o no admin.php
script Admin e
substitudo por
m unia linha de
di^o PHP.
removescore.php

PONTOS DE BALA
Os scripts PHP podem usar cabealhos para Quando uma pgina protegida com
controlar o modo como o servidor entrega autenticao HTTP, o nome e a senha
contedo web ao navegador. digitados peio usurio ficam armazenados na
superglobal $_SERVER.
A funo PHP headerQ usada para se
enviarem cabealhos ao navegador, os quais O basic realm" de uma autenticao HTTP
podem ser usados para se redirecionar uma uma zona de segurana que se associa a
pgina, controlar o tipo de contedo da pgina um determinado nome de usurio e senha,
ou requisitar a autenticao da pgina. permitindo que vrias pginas tenham a sua
segurana feita conjuntamente.
Quando os cabealhos so enviados ao
navegador usando-se a funo header(), as A funo exit() do PHP finaliza um script
chamadas a header() devem ser feitas antes PHP, impedindo que qualquer cdigo aps
de qualquer contedo ser enviado. ela seja executado ou enviado de qualquer
maneira ao navegador.

voc est aqui 315


segurana no existem perguntas idiotas

np existam
p e r g u n ta s id io ta s

I * Ainda no entendo totalmente como a Ethel conseguiu


contornar a segurana do Guitar Wars. O que foi que ela fez?

Ea se aproveitou da fraqueza inerente a se proteger apenas uma


pgina (Admin), quando o recurso de remoo de pontuaes na verdade
usa duas pginas (Admin e Remover Pontuao). A pgina Admin
apresenta uma srie de links Remove, vinculados pgina Remover
Pontuao, Os detalhes sobre qual pontuao deve ser removida so
passados na URL, permitindo que o script Remover Pontuao os acesse
atravs da superglobal $_GET. Se voc conseguisse construir uma URL
legtima para a pgina Remover Pontuao, poderia remover pontuaes
semjamais passar pela pgina Admin. Foi isso que Ethel fez.

* Mas como ela sabia a estrutura da URL para a pgina


Remover Pontuao?

H: Ela bastante engenhosa, mas no preciso ser gnio para


fazer isso. Lembre-se de que ela mencionou que salvou o link para a
pgina Remover Pontuao, quando o site inteiro estava desprotegido.
Bem, um link salvo nos favoritos apenas uma URL, e ela pde us*la
para construir uma URL para acessar diretamente a pgina Remover
Pontuao sem ter de passar pela pgina Admin.

^ * OK, mas as pontuaes foram reinseridas depois do ltimo


ataque. Isso no significa que as URLs antigas no deveriam
funcionar mais, uma vez que as datas estariam diferentes?

H : Sim, uma observao muito boa. Mas lembre-se, Ethel bastante


esperta. Ela pode facilmente olhar na pgina principal do Guitar Wars,
anotar as novas datas, e ento cooc-las na URL antiga para remover as
novas pontuaes sem qualquer problema. importante nunca subestimar
a habilidade que pessoas determinadas tm de fazer engenharia reversa
HutiCct sukestlme a
nos seus scripts PHP, para explorar fraquezas do sistema. f c a b ilid a d e <Jue p e s s o a s
Tudo bem, ento a proteo das duas pginas, Admin e
Remover Pontuao, consegue parar a Ethel. Mas isso no torna determinadas tem
muito difcil remover pontuaes legitimamente?
de feizer engenkatia
feVetsa H9S seus
No, de forma alguma. Sem a ajuda dos realms, certamente
seria complicado remover as pontuaes legitimamente, porque voc
teria de digitar o nome do usurio e a senha separadamente para
as pginas Admin e Remover Pontuao. Mas lembre-se de que foi scripts TH?, para
explprat- ra^ue^as d
estabelecido um realm (domnio) que o mesmo em ambas as pginas
significando que elas estaro dentro da mesma zona de segurana. E
uma vez que voc tenha passado pela janela de autenticao para
uma pgina de um dado realm, o nome e a senha so lembrados para S lS t^ lc U
todo o realm. O resultado final que digitar com sucesso o nome e a
senha apenas uma vez j suficiente para liberar ambas as pginas.
segurana para a sua aplicao

T fe S T O R t v e
Crie o script A utorizar e o inclua nos scripts Admin e Remover
Pontuao, para torn-los seguros.
Crie um arquivo de texto chamado authorize.php, e digite nele o cdigo para o script
Autorizar. Depois, modifique o script admin.php para que ele inclua o script Autorizar
em vez do cdigo de autenticao HTTP propriamente dito. Adicione a mesma instruo
require_once ao incio do script removescore.php, para que ele tambm fique protegido
pela autenticao HTTP.
Envie todos os scripts para o seu servidor e depois experimente abrir o script Remover
Pontuao diretamente no seu navegador. Talvez voc precise limpar algumas sesses de
autenticao HTTP prvias, no seu navegador, para que ele lhe pea novamente o nome
e a senha - a maioria dos navegadores memorizam os domnios de autenticao, para que
voc no tenha de ficar redigitando o nome e a senha. ^ uw
de usurio t uma sc\h3 "twio
para a pa^na Admin ^ua"b>
fara a Reroovr Pcwfcuaao-

Tovewrtfiis fxage, you necf to log in to area

http://www.guitarwars.net/removescore.php?
id= 10 s Y&ur wtf be in the ctear.
name=Jacob%20Scorcherson&
date=2008-05-01%2020:36:45&
Kaiue: )\
score=389740s Passywcwd: ;
screenshot=jacobsscore.gif
3 Remember this passwpnd to; ksychaln

^ sia URL evrta a ^a$'ma Admm


e aeessa a ?a<y*a Remover
Porcbuaa dire-Umemie^

A pa^itt Remover
Poh-Uatao e pro-tegida,
ihdependev>emeie de m'" \
o usuirio dKega a ela- Y,

Q>ER >Q
CREBRO Guitar Wars - Remove a High Score
: m hig saae Of 314340 forBiff f c * was ssccessfuUy
Voc consegue pensar < < B ack to adm in p a p f

em outras maneiras pelas


quais a aplicao Guitar
Wars esteja em risco?

v o c est aqui 317


um fracasso de pontuao falsa

(toitar Wars Episdio II: Ataque dos Clones de Pontuapo


Lamentavelmente, a felicidade no universo do Guitar Wars no durou muito, porque
pontuaes fantasmas esto aparecendo por toda a parte, no lugar das pontuaes
legtim as... o qu e incita o dio em todo o u niverso G u itar Wars. P arece q u e
perfeitamente possvel danificar a lista de pontuaes do Guitar Wars sem remover
pontuaes. Mas como?

Guitar Wars - High Scores


W e lco m e , G u ita r W a rrio r, d o y o u h a v e w h a i it takes to crack: the M g li score list? I f so ,

T o p Score; 50000Q
500000
Date 2008-05-02 14:0234
N a m e : E tie l H e ckel
Gui tar 0 redorde de Ethel
dlarmente suspeito,
devido a tapW a de
tela mal -faUiiieada,
e a -Pato de que ela
L. ?K'Orl d
ataso fcohse^uiu
ii
Score
5/ ;sm6$ s'
f&r
uma pontwaao
de g*ataweftte
389740 $ 00 .000 .
Name: Jacob Scorctoson
Date: 2008054U 20:36:45

170 belitasscore.gif
2008-05-01 20:36:45 Jacob Scorcherson 389740 jacobsscore.gif
23 2008-05-01 20:37:02 Nevil Johansson 98430 nevilsscore.gif
24 2008-05-01 20:37:23 Paco Jastorius 127650 pacosscore.gif
25 2008-05-01 20:37:40 Phiz Lairston 186580 phizsscore.gif
26 2008-05-01 20:38:00 Kenny Lavitz 64930 kennysscore.gif
27 2008-05-01 20:38:23 Jean Paul Jones 243260 jeanpaulsscore.gif
28 2008-05-01 21:14:56 Leddy Gee 308710 leddysscore.gif
29 2008-05-01 21:15:17 T-Bone Taylor 354190 tbonesscore.gif
30 2008-05-02 14:02:54
Ethel Heckel 500000 ethelsscore.gif >
segurana para a sua aplicao

Subtrapo por adipo


At agora, vimos assumindo que qualquer pontuao submetida com uma captura de tela
era considerada legtima. Agora, razoavelmente seguro dizer que nem sempre o caso! E
est bem claro quem o culpado...

Ah, sim, sou eu... culpada! Tudo o que tive


de fazer foi enviar as minhas fantasticamente
falsas pontuaes, com capturas de telas
retocadas. Ah, muito bom ser a melhor Quitar
Warrior.

'N
fcthe perdebeu cb
poderia bagunar basta^^te
o juiW Vtrs sm^lcseh
submemendo jpo?ts/3^oes
das (om dafUv-as d
belas aUi&tadas-

Escreva abaixo co m o voc resolveria o problema de as pessoas


conseguirem inserir pontuaes falsificadas na aplicao Guitar
Wars:

voc est aqui 319


guitar wars precisa de moderao humana

A moderao
A segurana requer interveno humana fcumana e uma
Mesmo neste mundo modemo em que vivemos, s vezes, um ser forma excelente
humano real, capaz de pensar, imbatvel. No caso em questo,
difcil ter uma soluo melhor, para analisar uma determinada
de se melhorar
informao e avaliar se ela vlida ou no, do que uma pessoa a Integridade
real. Estamos falando da moderao, na qual um ser humano d 9 c > n te d 9
encarregado de aprovar o contedo enviado a uma aplicao web,
antes de esse contedo ser liberado para o pblico em geral. s u b m e t id p
Com a moderao, cada nova u s u tio g .
pontuaao adicionada a banto de
dados, mas nao aparefce ^ara o public* Sw k AcHoa
en^u*to o moderador sto a aprovar. SQQQQQRemove / Approve
A modi-fitaao ern Admm
389740 Remvft
adiciona v*m U*k Aprova a cada
nova pontuao, para <\*e ela
possa ser aprovada-

Simplesmente adicionar uma


nova pontuao no mais a
adiciona automaticamente
lista ^ue pode ser vista pelo
publico.

O Guitar Wars realmente poderia se beneficiar de alguma


moderao. E claro que ainda possvel algum fraudar
cuidadosamente uma captura de tela, e talvez fazer passar
uma pontuao falsa pelo moderador humano. Mas no
ser fcil, e isso no muda o fato de que a moderao um
timo mtodo de desencorajar os fraudadores. Tenha em
mente que fazer a segurana de uma aplicao PHP depende ^
basicamente de uma boa preveno. s
Nosso destemido moderador
do Quitar Wars... de nunca se
deparou Com uma pontuaao ha
<\ual Conisse totalmente-
segurana para a sua aplicao

Planeje woderapo no Guitar Wars


Adicionar um recurso de moderao hum ana ao Guitar Wars significativo porque isso
afeta diversas partes da aplicao. O banco de dados precisa ser modificado, precisa ser
criado um novo script para executar a aprovao, a pgina Admin precisa adicionar um
link 'Aprovar" a cada pontuao e, finalmente, a pgina principal precisa ser modificada
de modo a exibir s as pontuaes aprovadas. Com todas as modificaes assim envolvidas,
importante ter um plano e executar um a modificao de cada vez.
i Crie um script Aprovar
Use ALTER para adicionar uma coluna Q Pontuao para realizar a
approved tabela. tarefa de aprovar uma nova
Vamos comear pelo banco de dados, o qual precisa pontuao (definir a coluna
de uma nova coluna para guardar a informao de se approved como 1).
uma pontuao foi ou no aprovada. Com o banco de dados pronto
para acomodar a aprovao das
pontuaes, voc precisa de um
script para realizar essa tarefa.
Este script Aprovar Pontuao
responsvel por procurar uma
determinada pontuao no banco e
modificar a coluna approved dela.

Modifique a pgina Admin para


incluir um link "Aprovar para as
pontuaes que ainda tenham de Modifique a consulta da
ser aprovadas. pgina principal para s exibir
pontuaes aprovadas.
O script Aprovar Pontuao fica no
back-end e no dever normalmente O ltimo passo se certificar de que
ser acessado diretamente. Em vez disso, tudo o que estamos modificando seja
ele acessado atravs de links "Aprovar" refletido na exibio da pgina principal
gerados e exibidos na pgina Admin - da aplicao. Assim, a pgina principal
somente as pontuaes no aprovadas modificada para s exibir as pontuaes
tero o link "Aprovar ao lado delas. que tenham sido aprovadas - sem essa
modificao, todas as outras seriam inteis.
SetterWe<H**SweAAufaietrati*

voc est aqui 321


adicionando uma coluna APPROVED para a tabela guitarwars

Abra espao para aprovaes com A lt ER


Para adicionar a nova coluna approved tabela guitarwars, preciso
usar uma vez a instruo ALTER TABLE, que um comando SQL
que j vimos anteriormente. 0 tipo de dados &QOL do M /SQ L
ALTER TABLE guitarwars Um Vo yara TIKVINT, yortwt
ADD COLUMN a p p r o v e d T IN Y IN T ot foAc usar > dos dois-

A nova coluna approved do tipo TINYINT, e usa 0 para indicar


uma pontuao no aprovada ou 1 para indicar uma pontuao
aprovada. Assim, todos os novos registros devem comear tendo
o valor 0, para indicar que so inicialmente no aprovados. r- m

adicionar uma
coluna a p p r o v e d
Espere um minuto. NSo sei se voc pode tab ela.
simplesmente ir adicionando uma coluna
ao banco de dados sem modificar o script
Adicionar Pontuaao - ele no ter de
inserir dados nova coluna, com INSERT?

verdade, um a nova coluna im plica um novo valor na


consulta INSERT do script A dicionar Pontuao.
E importante no perder de vista o fato de que uma aplicao PHP um
cuidadoso arranjo de diversas partes e pedaos: um banco de dados que
consiste de tabelas com linhas e colunas, cdigo PHP, cdigo HTML, e
geralmente cdigo CSS. Nem sempre fica imediatamente claro que, para
modificar uma parte, preciso modificar outra. Adicionar a nova coluna
approved na tabela guitarwars tambm exige a modificao da consulta
INSERT no script Adicionar Pontuao:
Todas as linhas das novas
pon-luaoes -tem approved ~
de mida t<mo 0 nao aprovadas. ^
INSERT INTO guitarwars
VALUES (0, NOW() , 1$name $score1,'$screenshot', |jp
guando uma nova
linha adicionada, a
Urtili f i l ! * * ' S i i i i S B l i f e liiS iil
f f i i l i l l i l i i i M I I I 1 Jitoi' of sua coluna approved
t deinida Como
30 2008-05-02 14:02:54 Ethel Hecke! 500000 ethelsscore.gif O, para <\ue ela,
0
31 2008-05-02 20:32:54 Biff Jeck de incio, seja nao
314340 biffsscore.gif 0
32 -U08-05-02 20:36:38 Pez Law
aprovada-
322710 pezsscore.gif
segurana para a sua aplicao

Aponte seu lpis


O script Aprovar Pontuao tem estrutura semelhante ao Remover
Pontuao, exceto pelo fato de que a sua tarefa aprovar pontuaes.
Complete o cdigo do script Aprovar Pontuao abaixo, certificando-se de
fazer a pgina segura, e de s aprovar a pontuao apropriada, com base
<?php em dados enviados atravs de uma URL.

?>

<?php
require_once{'appvars.php');.
require_once{'connectvars.php');

if (isset{$ POST [' submit ].)) {

if { .) {
// Conecta-se ao banco de dados
$dbc = mysqli_connect(DB_HOST, DBJJSER, DB_PASSWORD, DB_NAME);
// Aprova a pontuao, definindo a coluna approved do banco de dados
$query - "UPDATE guitarwars SET ";
mysqli__query ($dbc, $query) ;
mysqli_close($dbc);

// Confirma o xito com o usurio


echo

else {
echo

echo 1<p><a href: ">&lt;&lt; Voltar pgina Admin</a></

?>

v o c est aqui 323


o script pa ra a p ro v a r p o n tu a o completo

r~ %Aponte seulpis O script Aprovar Pontuao tem estrutura semelhante ao Remover


Solupo Pontuao, exceto pelo fato de que a sua tarefa aprovar pontuaes.
Complete o cdigo do script Aprovar Pontuao abaixo, certificando-
se de fazer a pgina segura, e de s aprovar a pontuao apropriada,
com base em dados enviados atravs de uma URL
<?php
n ,, . . Tudo O ttue vod predisa -kzor para garantir a
reT * , ^ ! ! .k k ," a . f : [ ) .............. da A f" * * eu-
?> sdrip-t ^toriz^o mas isso deve ser a primeira toisa no
sdrip-fc, uma vez. *\ue o prodesso defende dos dabedalhos

<?php
X Crie um script
require_once('appvars.php'); Aprovar Pontuao
para realizar a tarefa
require_once('connectvars.php') de aprovar uma nova
pontuao (definir A IP predisa
a coluna ai ser veri-Pidada,
if ( i s s e t ($_PO ST['s u b m i t '] )) { como!
para <\ue a
if ( ) { aprovadao
/ / C o n e c ta - s e ao b a n c o de d ad o s seja -feiia-

$dbc = m ysqli_connect(D B _H O S T , DB_USER, DB_PASSWORD, DB_NAME);


/ / A prova a p o n tu a o , d e f i n i n d o a c o lu n a a p p ro v e d do b an co de d a d /s
$q u ery = "UPDATE g u ita rw a rs SET .77. .*4
m y s q l_ q u e r y ( $ d b c , query) , af?m<a .
m y s q li_ c lo s e ($dbc) ; domo I aprova a pontuaro. usuirio, mosfcrndo a
/ / C o n firm a o x i t o com o u s u r i o pontuadao aprovada e
( V o
ech o l<pi*A pontuao de * fsdore ' para * fname . oi aprovada dom sudesso/j
}
e ls e {
ech o *<p dlass-"erv-or>Pesdulpe, houve um problema para aprovar a pon-fcuado.c/p>;

} 't T i^porbahie inormar ao usurio guando um


} pott-tuaeao no puder ser aprovada, de W ma
semeibaW a tomo os ouiros sdripts do guitar Wars
relatam os erros.
ech o '< p x a h r e f = " dmin.php " > & lt;& lt; V o l t a r p g in a A dm in</a></
p> 1; ............. V"............
Forneda um link de volta
?> pagina Admih, para -fadilitar a
navegao.
segurana para a sua aplicao
itfb existem
Yergimtas idiotas
1 Por que no necessrio informar o nome do I Parece pouco informativo usar 0 e 1 na coluna
arquivo grfico para se aprovar uma pontuao? approved. No h outras maneiras de se representar
essa informao?
J \ Porque o processo de se aprovar uma pontuao
s exige as informaes necessrias para se achar i y - Sim. Otipo de dados ENUM do MySQL, que significa
uma determinada linha na tabela, e ento aprov- "enumerado", lhe permite criar uma coluna com uma lista
la. Isso significa que voc s precisa informar o restrita de possveis valores. Assim, em vez de adicionar a
estritamente necessrio para achar a linha em questo, coluna approved como umTINYINT que dever ter o valor 0
A data, o nome e a pontuao so suficientes para ou 1, voc poderia adicion-la como um ENUM que pudesse
se especificar uma determinada linha e definir a sua ter apenas os valores 'yes' e 'no', desta forma:
coluna approved como 1.
ALTER TABLE guitarwars
ADD COLUMN approved E N U M ( 1y e s ' ,
1n o ' )

.Aponte seu lpis-----------------------------------------------------


Os dados das pontuaes usados para aprov-las, no script Aprovar
Pontuao, so passados atravs de links "Aprovar" que so gerados no script
Admin. Complete o cdigo do script Admin para que ele gere esses links.
// Faz um loop atravs do array contendo os dados das pontuaes,
formatando-os como HTML
echo 1<table>';
echo '<tr><th>Name</th><th>Date</thXth>Score</th><th>Action</thx/tr> ';
while (Srow = mysqli_fetch_array($data)) {
// Exibe os dados das pontuaes
echo '<tr class="scorerow"xtdxstrong>' . $row ['name'] . '</strongx/td>1;
echo '<td>' . $row['date'] . '</td>';
echo '<td>' . $row[1score1] . 1</td>';
echo '<td><a href="removescore.php?id=' . $row['id'] . '&amp;date=1 .
$row[date'] .
'&amp;name-' . $row[name'] . 1&amp;score=I . $row['score'] .
'&amp;screenshot=1 . $row['screenshot1] . 1">Remove</a>1;
if (............................. ) {
echo

}
echo '< /td>< /tr> '; ^ as r*o
} apv-ovadas t deve c r w*
echo '</table>'; Af'roV3r -

voc est aqui 325


gerando links de aprovao

% ^p o n te seu lpis
Solupo
O s dados das pontuaes usados para aprov-las, no script Aprovar Pontuao,
so passados atravs de links "Aprovar" que so gerados no script Admin.
Complete o cdigo do script Adm in para que ele gere esses links.

// Faz um loop atravs do array contendo os dados das pontuaes,


formatando-os como HTML;
echo 1<table>';
echo '<trxth>Name</thxth>Date</thXth>Score</thxth>Action</thx/tr>';
while ($row = mysqli_fetch_array($data)) {
// Exibe os dados das pontuaes
echo '<tr class="scorerow"XtdXstrong>' . $row ['name'] . '</strongx/td>';
echo '<td>' . $row['date'] . '</td>';
ech o '< t d > ' . $ ro w [ Ts c o r e ] . '< / t d > ' ; l/erida se
echo '<td><a href="removescore.php?id=' .$row['id'] . pojvtuadao
imp;date=' . $row ['date'] . Csi^apvovad
t ,
&amp; name= ' . *$row['name']
r i n
. *&amp; score=
r- '. . $row ['score ] .. - r T , n 0W n
dc je ra r o
'&amp; screenshot=' . $row ['screenshot1 ].'">Remove</a> '; link aprovar
if { fro>rappy;9ycd,J ^ " ""
echo 1/ <a hre "appv-ovesdore.php?id J .frowfidO *l&a pjd^te -fVovjC'date3 .

echo '</td></tr>'; cra o link de


modo -tal y c a \ d > j d a U
o nomC) a powt^a^a * 0 w
echo ,</table>'; nowe do arquivo y & t o sao
passados a URI

Admin para incluir


um link "Aprovar"1
para as pontuaes
que ainda tenham
de se r aprovadas.
segurana para a sua aplicao

Use WHERE
Pontuaes no aprovadas no so dignas pcflTct s e le c io n a i-

Agora, j temos toda a infraestrutura necessria para o recurso de llntas com


moderao na aplicao Guitar Wars. S falta o ltimo passo, que
alterar a pgina principal de modo que ela mostre apenas as
base n9
pontuaes aprovadas. Para isso, teremos de ajustar a consulta SQL Vaiox Je uma
SELECT de modo tal que ela s obtenha os registros cuja coluna
approved esteja definida como 1 (aprovada). Isso feito por meio determinada
de um a instruo WHERE. c o lu n a .
SELECT * FROM guitaryars

ORDER BY score DESC, date ASC < 3 toluna amoved


A adio da instruo WHERE a esta consulta elimina quaisquer estwcv dfrwwf to
pontuaes que no tenham sido aprovadas, o que inclui todas as dievente de I a
'i ^ no
** setra
novas inseres. Isso d ao m oderador a chance de analis-las e
decidir se elas devem ser removidas ou liberadas (aprovadas) para e*ibid-
visualizao pblica.

28
......................... 1
2008-05-01 21:14:56 Leddy G ee 308 7 1 0 leddysscore.gif
29

30
2008-05-01 21:15:17

2008-05-02 14:02:54
T-Bone Taylor 354190 tb on esscore.gif 1 J
Ethe Heckel
31 2008-05-02 20:32:54 B iff Jeck
500000
314 3 4 0
etheisscore.gif
biffsscore.gif
m om
1
32 2008-05-02 20:36:38 Pez Law 3 227 1 0 pezsscore.gif

Agora, somente
as pontuaes
aprovadas
apatetem na M odifique a consulta da
pagna principal pgina principal para
(inde*.php)- s exibir pontuaes
aprova

voc est aqui 327


test drive approvescore.php

- . T ejst Drive ,
Crie o script Aprovar e ajuste o restan te da ap licao G uitar Wars
para us-lo.
Usando alguma ferram enta MySQJL, emita a consulta ALTER para adicionar a nova
coluna approved tabela guitarwars. Em seguida, modifique a consulta INSERT do
script addscore.php para inserir um 0, na coluna approved, para novas linhas de dados.
Agora, crie um arquivo de texto chamado aprovescore.php e digite nele o cdigo
para o script Aprovar Pontuao. Em seguida, modifique o script admin.php de modo
que ele inclua um link "Aprovar" para pontuaes que ainda precisem ser aprovadas.
Finalmente, modifique a consulta SELECT de index.php para que ela mostre apenas as
pontuaes aprovadas.
Envie todos os scripts para o seu servidor, e abra a pgina principal do Guitar Wars no
seu navegador. Tome nota de quais pontuaes esto visveis, e depois abra a pgina
Admin. Clique em um dos links "Aprovar" e realize a operao de aprovar o registro.
Depois, volte pgina principal para ver se esse registro agora est aparecendo.

Guitar Wars - High Scores Administration


B dow is a Ksi o f all G niiai War hS^i seoses. Use ass |ge ta scores s

Djrtt Son ___


Ethel Hecfcel 2008-05-02 14:0234 500000
Jacob Scoreherson 20084)5-01 20:36:45 389740 R e t i r e
T-Booe T a jto r 2008-05-01 21:15:1-? 354190
PegLaw 2008-05-02 20:3638 322710,.,.,,,-:.-,
BUTJeck 200S-05-02 203 2:54 314340 fam vS
I.eddyGee 20084)5-01 21:1436 308710 R em v g
B eB aC bery 2008-05*0! 20-36507 282470
JeanPan]Jones 20034)5-01 20:3853 243260 f e r o t
I_af7Sinn
V
0s ovos i'mks
2008-05-01 20:37:40186530 gum
Paco Jastorras 20084)5-01 20:3723 127(650 Aprovar" da p%*a
NVrilJohansson 20OS-O54) i 20 :3 ?# 2 98430
Kenny L vte 30084)5-01 2038:00 64930 Adwin omeew>
atcsso a patina
Aprovar Pon-bua^ao,
ohdt os reystros
pode ser aprovados
indi dual eR"te
segurana para a sua aplicao

Apos a operaac -fcev sido


Condud dorr SUCSSO, urr>a
de oiVn>3ao e
exibida.

Um simples ovmirflrio
requer coniymaao
a^ies de 'reaUewe
aprovar o re^istvo.

h ^edewiapvovada ,
pohiuacao aaova apareie
pagina principal do
quiiav IVv-s.

v o c est aqui 329


ethel marca de novo

0 hack de um milho de pontos


A verso m oderada do Guitar Wars representa um a melhoria significativa na segurana,
mas est longe de ser completamente prova de balas. Parece que a nossa infiltradora
conseguiu achar outra fraqueza no sistema, e de alguma forma est conseguindo fazer as
suas pontuaes passarem pelo moderador. Ethel precisa ser detida, perm anentem ente,
para que possamos restaurar a confiana no universo do Guitar Wars.

Bsie t
C*ata rwOrte
o -tipo de
foh-tuaao <^ue
o nnoderdor
deve impedir...
e no enia>vto,
3*\ui esta ela/
segurana para a sua aplicao

Tudo em moderao...?
Embora o m oderador saiba, sem sombra de dvida, que ele nao
aprovou a pontuao submetida por Ethel, esta claro que essa
0 moderador j}
pontuao chegou ao banco, com a coluna approved de^ n ' d 3*vtar Wav* ao
como 1. Ns sabemos que o script Adicionar Pontuaao defm
dorvsc^c G r M c r
a coluna approved como 0 para novas pontuaoes, porque o <\e afconteieu.
acabamos de modificar a consulta INSERT desse scnpt. Algo
simplesmente no est certo!
Como O
possvel? Eu sei que no
aprovei essa pontuao. Um
milho de pontos!?

d ia lllll[}ipiSiliI. score Sum


21 2008-05-01 20:36:07 Belita Chevy 282470 belitasscore.gif 1
22 2008-05-01 20:36:45 Jacob Scorcherson 389740 jacobsscore.gif 1
23 2008-05-01 20:37:02 Nevil Johansson 98430 nevilsscore.gif 1
24 2008-05-01 20:37:23 Paco Jastorius 127650 pacosscore.gif 1
25 2008-05-01 20:37:40 Phiz Lairston 186580 phizsscore.gif 1
26 2008-05-01 20:38:00 Kenny Lavitz 64930 kennysscore.gif 1
27 2008-05-01 20:38:23 Jean Paul Jones 243260 jeanpaulsscore.gif 1
28 2008-05-01 21:14:56 Leddy Gee 308710 leddysscore.gif I 1
29 2008-05-01 21:15:17 T-Bone Taylor 354190 tbonesscore.gif ! 1
31 2008-05-02 20:32:54 Biff Jeck 1 1
314340 biffsscore.gif
32 2008-05-02 20:36:38 Pez Law 322710 pezsscore.gif

cr 33 2008-05-05 14:58:59 Ethel Heckel 1000000 ethelsscore2.gif


1 J
fsfca poM-tuaao
no o'i aprovada
<^t\o moderadorj
e mo ewtairt
9 K R W _____________________________ a sua tolwa
approved esta
C R E S R O
deinida tomo I
o \ue resulta em
Como voc acha que o post falso de Ethel conseguiu passar
ela ser e*A>da-
pelo moderador?

voc est aqui 331


tente o golpe da Ethel

E X E R C fT A W O
CREBRO
Ocorre que o hack de um milho de pontos de Ethel no teve nada a
ver com o formulrio Aprovar Pontuao. Foi descoberto que a invaso
dela se baseou apenas no formulrio Adicionar Pontuao. Segue
abaixo os dados exatos que Ethel digitou no formulrio Adicionar
Pontuao; digite os mesmos dados no seu prprio formulrio e
adicione o registro. O que voc acha que est acontecendo?

No sc es^ue- do
espao depois de .
d<\-
E th e l H e c k e l 1000000 'e th e ls s c o r e 2 .g if', 1)

Este pode ser ^uai^uer dr^uivo


yrS-ito flF ou JPE$ tem menos
de 1 Z W . ethelsscore2.gif
segurana para a sua apficao

Conto exatamente ela fez isso?


Para entender o que est acontecendo neste inteligente tipo de
ataque a formulrios, vamos rastrear o fluxo dos dados enquanto
eles viajam atravs do script Adicionar Pontuao.

ihel digitou
sua poniudao-..
C mais um
morrte de doisas
estranhas/

$score = $ POST['score'];

'$screenshot', 0)

0 indomum donteudo
O campo Pontuao espera receber apenas um valor
do d3mpo Pon-tua^ae do
numrico, como 1000000, mas em vez disso ele tem
-formulrio e armazenado diversos valores colocados entre aspas simples, separados
na varivel fsdore, o <\ul
por vrgulas e term inando com um estranho hfen duplo.
vai parar dire-tamen-be na Muito estranho.
donsul-ta INSERT. Esses estranhos dados so prim eiram ente armazenados na
varivel $score, aps o que so incorporados na consulta
INSERT. Isso resulta apenas em uma pontuao invlida,
certo? Ou tem algo mais sinistro acontecendo aqui?

Aponte seu lpis


Usando os dados exatos que foram m ostrados na pgina anterior,
escreva aqui a consulta SQL inteira do ataque de um milho de
pontos. Certifique-se de substituir as variveis da consulta pelos
dados propriamente ditos. Escreva tambm o que voc acha que
est acontecendo.

voc est aqui 333


como uma injeo de SQL funciona

tpowte seu lpis--------------- ----------------- -----------


n llir n Usando os dados exatos que foram mostrados na pgina anterior,
^ escreva aqui a consulta SQL inteira do ataque de um milho de
pontos. Certifique-se de substituir as variveis da consulta pelos
dados propriamente ditos. Escreva tambm o que voc acha que
est acontecendo.
IffJQ . w b r & r * ............................... ..............................................................................

|LUE (O, MWO, 'E-thel ttefckel', 'lOOOO1, 'eihelssoreZ<ji-(-\l^ \ 'e-thelsstore2-<y\ O)


Uma vez. <^ue a eo!u*a
approved t a uiima r>a
estrutura do bando de dados
De alguma -forma, Que consul+a estranha. _ela est sesndo orada a te r
thel t *iou a sua ) > ^quivo grfico aparece \ um valor de I... aprovado/
prpria verso da ( e n3 Sei 0 ^ue si9nifica ) 0
c m u IU 3 ^ual ^ essa consulta funciona?
t i substituindo
onsulta origina).

Enganando o MySQl com comentrios


O verdadeiro culpado pelo ataque de um milho de pontos de Ethel,
por incrvel que parea, so os comentrios SQL. O hfen duplo
( ) usado, em SQL, para desativar o restante de uma linha
de cdigo SQL, transformando-o em um comentrio. E preciso
haver um espao depois do hfen duplo para que ele funcione
( ), mas tudo o que vier depois do espao ignorado. Agora, dome*iario az. dom
d outra olhada na consulta de Ethel, levando em conta esse novo \ue o restante da linha de
conhecimento. tcd\o.o S Q L seja ignorado.

INSERT INTO guitarwars

VALUES (0, NOW(), 'Ethel Heckel', 11000000' 'ethelsscore2.gif1, 1)


/
Faz mais sentido agora? Na prtica, o comentrio apagou o restante
do cdigo SQL, para que ele no gerasse um erro, permitindo que thel chamou o
a verso da consulta criada por Ethel pudesse chegar ao sistema sem sistema, azendo-o
percalos. O resultado final uma pontuao instantaneamente aprovar a sua
aprovada, a qual o m oderador nunca teve a chance de analisar. potfUaa
segurana para a sua aplicao

0 formulrio Add Score recebeu uma injeo de SQL


O ataque de Ethel conhecido como injeo de SQL, e envolve um Os octnipps do
truque extremamente sorrateiro, no quai os dados do formulrio
f o r a u la r p s9
so usados para se modificar a operao fundam ental de uma
consulta. Assim, em vez de o campo do formulrio apenas fornecer um p9nt9 feac<
uma informao, como um nome ou uma pontuao, ele altera a
prpria consulta SQL subjacente. No caso do Guitar Wars, a injeo na segurana
de SQL de Ethel usou o campo Pontuao como um meio de no das aplicaes
somente fornecer a pontuao, mas tambm o nom e do arquivo
grfico, o valor para approved e um comentrio no final, para evitar W e b , p fjfu e
que o cdigo SQL original gerasse um erro. eles petmitem
<jue Ps usutps
lusfraifl

INSERT INTO
VALUES ( 0 , NOW() 1$name 1$screenshot'

no exstem
?egimtts idiotas
l - Existem outros tipos de comentrios em SQL, 0 ataque de injeo SQL de Ethel ainda teria
fora --? funcionado se a coluna approved no fosse a ltima
da tabela?
Kde #:em vez de
Sim. Outra variante de comentrio envolve o uso
mas tem obviamente o mesmo efeito No, e essa uma questo realmente importante.
de anular qualquer cdigo SQL at o final da tinha que A consulta INSERT que foi usada depende da ordem
contm o comentrio. 0 SQL tambm oferece suporte padro das colunas na tabela. Golocar 1 no final da
a comentrios multilinhas, semelhantes queles do consulta funcionou por acaso, porque approved era a
PHP no sentido que voc coloca o cdigo comentado ltima coluna, aparecendo imediatamente depois da
(desativado) entre /* e */. coluna screenshot.

voc est aqui 335


prevenindo injeo de sqi

Proteja seus dados contra injepes de SQL


A fraqueza que as injees de SQL realmente exploram reside nos campos de formulrios
que no so validados para impedir a insero de caracteres perigosos. "Caracteres
perigosos" so todos aqueles que tenham o potencial de modificar a natureza de uma
consulta SQL, como vrgulas, aspas ou caracteres de comentrios como . At mesmo
espaos ao final de algum dado podem se revelar perigosos. fcil eliminar espaos
com a funo interna do PHP trim() - basta passar todos os dados de formulrios
atravs da funo trim() antes de us-los em uma consulta SQL.

A -Punao -fcWiwO sc
$name = |j||i|||($_POST ['name ']) ; livra de ^ais^ucv
. / espaos <^e apaream
$ sco re = i($ POST['score']) ; antes <x depois dos
$screenshot = |||||||j($_FILES ['screenshot'1] ['name']); dados deste foriwulario.

Mas os espaos no so o nico problema. Ainda existem as As Injees SQL


vrgulas, aspas, caracteres de comentrios e assim por diante. podem ser eVitadas
Portanto, alm de retirar os espaos em branco, ns tambm
precisamos de um a forma de encontrar e neutralizar p r o c e s s c in d o - s e
outros caracteres problemticos. O PHP nos auxilia com os
d e Y id c im e n te
outra funo interna, mysqlireal_escape_string(), a qual
faz escape de caracteres potencialm ente perigosos, para dados de prmulrps.
que eles no possam afetar o m odo como um a consulta
se executa. Esses caracteres ainda podero aparecer como
dados em campos do form ulrio, eles s no sero capazes
de interferir nas consultas.
A unao n*ys^r_jreaS__esape__
Juntas, as funes trim() e mysqli_real_escape_string() stringO tonverte daratteres
fornecem uma slida linha de defesa contra injees de SQL. perigosos cm um -formato tom
estape, o ^uaS ao e dapaz.
de aetar as donsultas $L-

$name = ($dbc, trim($_POST['name 1]));

$score =4 {$dbc, trim($_POST['score']));

$screenshot = ||($dbc, trim ($ FILES [' screenshot']


['name']));
mys^lijreLesdapej^ringO
t donsidera da uma -funo
de bandos de dados, e por
\sso e\ue ela e*ige <\ue vode
Processar os trs campos do formulrio Guitar Wars com lhe orned uma varivel de
as funes trim() e mysqli_real_escape_string() reduz em done*3o a bando de dados, da
muito as chances de um outro ataque de injeo SQL. Mas mesma -forma <\\*e aquela usada
elas no so o suficiente - talvez haja um a forma de tom ar ao se submeter donsultas.
a prpria consulta menos vulnervel...
segurana para a sua aplicao

Um INSERT mais seguro (com parmetros)


Alm da fraqueza dos campos do formulrio, a injeo de Uma consulta
SQL de Ethel tambm explorou o fato de a coluna approved
]S $ E flT ~ p 9d e s e t
vir depois da coluna screenshot na estrutura do banco de
dados. Foi assim que ela conseguiu hackear o sistema apenas e s c rta d e fo rm a
adicionando 1 ao final de INSERT, e fazendo-o ser colocado
na coluna approved. O problema que a consulta INSERT a especiicar
estruturada de forma tal que ela precisa inserir dados em todas exatamente
as colunas, o que aumenta desnecessariamente o risco.
0 ideal e <\ue ao prensssemos dem ir
Valetes Vp pava
as toiunas id e approved, uma vez. ^ue <jua!s co l un a s.
elas pode -fita r tom os valores padres

INSERT I^pO guitarwars


VALUES (0, NOW(), 1?name', '$score', '$screenshot

Quando dados so inseridos em uma tabela desta forma, a ordem deles precisa bater
com a ordem das colunas na estrutura da tabela. Assim, a quinta informao ser
colocada na coluna screenshot porque esta a quinta coluna da tabela. Mas na verdade
no necessrio inserir explicitamente as colunas id ou approved, uma vez que id
autoincrem entada e approved deve sempre ser 0. Uma abordagem m elhor inserir apenas
os dados explicitamente requeridos em uma nova pontuao. As colunas id e approved
podero ento usar os padres de AUTO_INCREMENT e 0, respectivamente.
Ns precisamos de uma consulta INSERT reestruturada, que espere uma lista de colunas
antes da lista de dados, com um pareamento exato. Isso elimina o risco de a coluna
approved ser definida - ela no faz mais parte da consulta. Se esse tipo de consulta parece
familiar, porque voc a usou diversas vezes em outros exemplos. , . ..
r ^ r Nada pode ser iwsendo
na doluna approved,
porque ela *o esta
INSERT INTO guitarwars istada domo parie da
VALUES {NOW(), '$name'

A toluna id pode ser dei*ada


de -fora, uma vez. ^ue ela se
au-koindv-emen-ta de <\ua!<\uer orw>3-

Esta verso da consulta INSERT informa


exatamente em qual coluna deve ser colocada
qual informao, perm itindo que voc insira
dados sem ter de se preocupar com a estrutura
subjacente da tabela. Na verdade, usar esse tipo
de INSERT considerado como um m elhor
estilo de programao, porque os dados so
inseridos exatamente onde voc quiser, em vez de
o destino deles ser ditado pelo layout da tabela.
voc est aqui 337
o commando DEFAULT

No s possvel, com o um a tim a ideia especificar


valores DEFAULT para as colunas sem pre que possvel.
O comando SQL DEFAULT o que lhe permite especificar um
valor padro para uma coluna. Se a coluna dver um valor padro,
voc no precisa defini-la em consultas INSERT, e pode ter a
certeza de que ela automaticamente adotar o valor padro. Isso
perfeito para a coluna approved da tabela guitarwars. Agora ns
s precisamos modificar a tabela mais uma vez, para definir o valor
padro de approved como 0 (no aprovado).

Uma vez. a doluna approved ja enisle hesta


instrudao ALTER TjABL-E, nos tewos de war
MODIFY COLUMN C0LUMH-
ALTER TABLE guitarwars
MODIFY COLUMN approved TINYINT

Vode predisa espedi-fidar o tipo


DEFAULT a appvo^d da douna garanta ^ue seja
o msmo da /"vez. <^*e didionou
ser assinalada a b a te m e n t
dolun-
to
t o n 0 , a menos
menos \ue
\*e u I.N StKl
cs?etii*V* de outra W *

Com a coluna approved agora alterada para adotar um valor padro,


a nova e m elhorada consulta INSERT do script Adicionar Pontuao
pode inserir pontuaes sem sequer m encionar a coluna approved.
Isto um bom design, uma vez que no h necessidade de inserir
explicitamente um valor que pode ser padronizado, e ainda
adiciona uma pequena dose de segurana, ao no expor a coluna
approved a potenciais ataques.
segurana para a sua aplicao

A validao de formulrios nunca inteligente demais


U m ltimo passo para se minimizar o risco de ataques de injeo SQL envolve a validao
do formulrio no script Adicionar Pontuao. Antes de verificar se o tipo ou o tamanho
do arquivo grfico esto dentro dos limites estabelecidos pela aplicao, os trs campos do
formulrio so verificados para garantir que no estejam vazios.
if (! em pty ($name) && ||^ |^ ||g |( $ s c o r e ) && !e m p ty ( $ s c r e e n s h o t) ) {

} $ti dcdlara^ao
vsn-Tid se
No h nada de errado com o cdigo atual, mas o processo de
iodos os dai*ps do
garantir a segurana de uma aplicao frequentem ente exige
formulrio esio
que voc d um passo alm do habitual. Uma vez que o campo
preenchidos.
Pontuao espera um nm ero, faz sentido verificar no apenas
se existe um valor, mas se o valor existente numrico. A funo
PHP is_numeric() faz exatamente isso, retom ando true se o valor
passado a ela for um nm ero ou false caso contrrio. Ela est
sempre fazendo os trabalhos triviais, como por exemplo, verificar
se foi recebido um nm ero quando um nm ero era o que voc
esperava, que no fim das contas vo tom ar a sua aplicao to
segura quanto possvel. Verdadeiro ou -falso,
is numeric(465730) dependendo de
usurio d i^iW ou no
^ is_numeric('one million! um numero no 3mpo
Vcrdadeirol f Pontuao-

is numeric(0)
Fals
C
is_numeric($score)
S e l f l p l e c[ue p P s s V e l, eX lj A c( u e p s d ad P S
d e p trn u l iP e s te ja m n o PV m atP ^ U e V p ce
e s p e c ifc p u .

Reescreva a declarao if de validao do formulrio Adicionar Pontuao, de modo

ftccio que ela use a funo is_numeric() para permitir apenas pontuaes numricas.

voc est aqui 339


test drive o novo addscore.php

^ Reescreva a declarao if de validao do formulrio Adicionar Pontuao,


^ de modo que ela use a funo is_numeric() para permitir apenas pontuaes
IO numricas.

T te S T O r i v e

Aprim ore o tra tam e n to dos dados do form ulrio no script Adicionar
Pontuao.
Ajuste a atribuio de dados do formulrio s variveis, no script addscore.php, de modo
que as funes trim() e mysqh_real_escape_string() sejam usados para limpar os dados
do formulrio. Depois, modifique a consulta INSERT para que ela especifique tanto os
nomes das colunas quanto os valores, eliminando-se a necessidade de fornecer valores
para as colunas id e approved. Modifique tambm a declarao if que valida os campos do
formulrio para que ela verifique se a pontuao numrica.
Finalmente, use uma ferram enta MySQL para rodar a consulta ALTER que estabelece o
padro de 0 para a coluna approved.
Envie o novo script Adicionar Pontuao para o seu servidor, navegue at ele, e depois
tente realizar o mesmo ataque de injeo de SQL novamente.
da*-o <\e esta
mensagem de erro
poderia ser um pouio m3is
espet-fita m3s ela atende
s nossas necessidades
sem prefcisrmos adi-ionar
muito mais programaao
ao sdript--

TTvaMa^ao de -formulrios e
um topido t^ue vai muito alem da
segurana de bandos de dados. 0
Captulo l revisitar a validao
tom muito mis detalhes...
segurana para a sua aplicao

Cessar fogo!
Parece que a determinao de Ethel de interferir nas pontuaes do
Guitar Wars Finalmente foi quebrada, graas s melhorias que tornaram
a aplicao imune a injees de SQL. O verdadeiro campeo do Guitar
Wars respondeu inserindo um novo recorde.

Gaitar Wars -HighScores


Welcome .Guitar Wamor. do you bae w iw i it takes to crack the ingb scare list? If so,just addv o a ro y n sPMS.

Top Score: 465730


465730
w Jacob Scotchefson
Date: 200S-G5-G5 23;28i'7

Gui t a r

Feliz. pelas pontua^oes


gora estarem protegidas
tra tatererendias Oh( nao!
externas, Jatob *via u Venceram-me novamente.
ovo reorde ^ue ser Talvez seja hora de aprender
di-Pfeii de bater. a tocar guitarra virtual.

tom o fato de
elhor se ju n ta r a eles
^ue tontmuar perdendo
para eles, Ethel pertebe <\ue
talvez, seja hora de se W *a r
uma juitar Warrior.

voc est aqui 341


caixa de ferramentas php e mysql

& Sua Caixa de Ferramentas FHF MySftl


fflH H J PAlm de aprim orar a aplicao
de recordes do G ultar Wars, voc
6

adquiriu vrias novas ferram entas e


CAPTULO

tcnicas. Vamos rever as mais importantes.


Sfr i tnbe Bisa booa

oeeoude e n $ e ejed euejnos


criando aplicaes web personalizadas

7 Ctfficlo Aplicaes Web pesilcllizlclcls


% ^

Lembra de Mim?
%

Ningum gosta de ser esquecido, especialmente usurios de


aplicaes web. Se a aplicao tiver que trabalhar a noo de comunidade,
ou seja, se for planejado que os usurios interajam com a aplicao de uma forma
pessoal, ento ela ter de se lembrar dos usurios. Voc detestaria ter que se apresentar
novamente sua famlia a cada vez que entrasse em casa. No. precisa faz-lo porque
seus parentes possuem uma coisa maravilhosa chamada memria. Mas aplicaes web
no se lembram das pessoas automaticamente - preciso que um desenvolvedor web
esperto use as ferramentas disponveis (PHP e MySQL, talvez?) para criar aplicaes
web personalizadas que realmente sejam capazes de se lembrar dos usurios.

este um novo captulo 345


um a b o a in c o m p a tib ilid a d e d ifc il de e n c o n tra r

Pizem que os opostos se atraem


uma histria antiga: garoto conhece garota, garota acha que o garoto
completamente insensvel, garoto acha que a garota maluca, mas no
fim das contas as diferenas se transformam na atrao, e eles acabam
vivendo felizes para sempre. Essa histria a inspirao do novo e
inovador site de encontros mis-match.net. O Mismatch - "Desencontro"-
usa a teoria de que "os opostos se atraem" para combinar encontros
entre as pessoas com base nas suas diferenas.
O problem a que o Mismatch ainda precisa de um desenvolvedor
web para term inar de construir o sistema. a que voc entra.
Milhes de coraes solitrios esto esperando ansiosamente que
voc termine a aplicao... no os decepcione!

Sidney adora
Johan Nettles
reality shows,
Male (Masculino)
yo^a e sushi, e
espev donse^uir
1981-11-03
Athens, GA
um desendoivbro

As ap licaes w eb pessoais
dependem fundam entalm ente
das inform aes dos usurios,
portanto estes devero te r
a cap acidade de acessar a
ap licao em um nvel pessoal.

Sidney Kelsow
Female (feminino) Joha adora luta livre
- 1 98 4-0 7-1 9 pressionai, levantamento
Tempe, AZ de pesos e Spam, e tem
interesse e <\ual<\uer uma
<\ue responda ao seu hundio.

Os usurios do Mismatch precisam ser capazes de interagir com o


site em um nvel pessoal. Isso significa, entre outras coisas, que eles
precisaro de perfis pessoais, nos quais inseriro informaes sobre
si mesmos, as quais podero compartilhar com outros usurios do
Mismatch: sexo, data de nascimento, localizao, etc.
criando aplicaes web personalizadas

0 negcio do Mismatch so os dados pessoais


Portanto, o negcio do Mismatch estabelecer conexes atravs de
dados pessoais. Essas conexes devem ocorrer dentro de uma cada
um dos quais devendo ser capaz de interagir com o site e gerenciar Este e o bando de
dados do M 'smtdh-
os seus prprios dados pessoais. Uma tabela chamada mismatch_user
ser usada para guardar as informaes dos usurios do Mismatch.
Dentvo do bando
de dados, a
tabeia mis.atdh__
usev armazma
os usurios t as
$us iivPoJrmaoes
pessoais.

Cada linha da
As pginas tabela mismafcdh__
Editatr c Vev user dontm dados
Peir-il pvedisam pessoais mementes
sabev <^uai perfii a um usuatrio-
devem adessav.
J
Sidney Kelsow
Female(Feminino)
1984-07-19
Tempe, AZ

Alm de visualizar o perfil, os usurios


WCRSRO
do Mismatch podem edit-lo usando Como o Mismatch poderia
a pgina Editar Perfil. Mas h um personalizar a pgina
problema: a aplicao necessita saber Editar Perfil para cada
qual perfil ela deve editar. A pgina
usurio do sistema?
precisa de algum modo de saber qual o
usurio que a est acessando.

voc est aqui 347


adicionando log-ins para mismatch

0 Mismatch precisa de logins para os usurios


A soluo para o problema de acesso aos dados pessoais no O s lp g n s
Mismatch envolve o uso de logins, o que significa que os
usurios precisam de um meio de fazer login na aplicao. Isso
permitem <}ue
d ao Mismatch a capacidade de fornecer acesso a informaes as aplicaes
personalizadas para cada usurio. Por exemplo, o usurio logado
\V e b t r a t e m
s poderia editar o seu prprio perfil, mas poderia tambm ter
acesso de visualizao aos perfis dos outros usurios. Os logins so PS usurios de
a chave para a personalizao no aplicativo Mismatch.
forma p^sspaL
Um login geralmente requer duas informaes: um nome de
usurio e uma senha.

Nome do Usurio (Username) Senha (Password)


A tarefa do nom e do usurio fornecer A senha responsvel por fornecer um
uma identificao para cada usurio determinado grau de segurana ao login
individual dentro do sistema. Os usurios dos usurios, o que ajuda a proteger os
podero acessar e potencialmente seus dados pessoais. Para fazer o login,
comunicarem-se uns com os outros atravs o usurio precisa digitar tanto o nome
dos seus nomes no sistema. quanto a senha. * * * * * * ^ ^
s id n e y fe ********
j n e tt le s ^ As senhas sao dados ^
extremamente sensveis, e nao
^ 0* no.es de usurio geralmente devem jamais icar visveis
Consister* de caracteres em uma aplitao, nem mesmo
al-fanumridos, e so escolhidos dentro do banCo de dados.
fel prprio usurio.

A combinao de nome de usurio e senha perm ite ao usurio fazer A pgina d>tar Peril
login na aplicao Mismatch e acessar dados pessoais, por exemplo, agor 'mdi3 ^ e o
para editar o seu perfil. usurio esta logado-

You are logged inas sidneyk.

O^nome e a senha Mismatch- Edit Profile


sao tudo de <^ue a ^undo um usurio
aplidaao precisa login, a aplicada
P fejscm alioftH iaaiK M i
para saber ^uem torna-se capaz,
o usurio- de lembrar juem e First name:
e de -fornecer L a s t n a m e;
u*a experincia
G a n d e r:
personalizada.
ite
criando aplicaes web personalizadas

Elabore um plano para os logins dos usurios


Adicionar o suporte a logins ao Mismatch no tarefa fcil, e im portante estabelecer
exatamente o que precisar ser feito antes de comearmos a escrever cdigo e executar
consultas ao banco de dados. Ns sabemos que existe um a tabela a qual armazena os
usurios, ento a primeira coisa a fazer modific-la para que ele armazene as informaes
de login. Tambm precisaremos de um a forma de permitir que os usurios digitem os seus
dados de login, e isso precisar ser integrado de alguma forma ao restante da aplicao
Mismatch, para que pginas como Editar Perfil s fiquem acessveis depois de um login
com sucesso. Eis aqui os passos que estabelecemos at o momento:

Usar ALTER para adicionar


colunas usernam e e
password tab ela.
O banco de dados agora precisa de C riar um novo scrint rio . -
novas colunas para armazenar os
dados de login - nome e senha - de
cada usurio.
p zr-s& z-
prc
p tfn U ltim a in s tncia,
F gmas pessoazs, p o ro n ^ 4
que pede um nom e e um* u
v^ o s . Essas informaes
J digitadas corretam enrI PreC1Sam
que M ism atch possa e x ib ir d aT
especficos - dados
^ p Z * z z r 0^ im
Pginas personalizadas de f
que elas no p o ssa m T m a 131
um login vlido ervistassem

|L Conectar o script de Login ao


V restante da aplicao Mismatch.
As pginas Editar Perfil e Ver Perfil
da aplicao Mismatch s devem ficar
acessveis para os usurios logados.
Assim, precisamos nos certificar de
que os usurios tenham de fazer login.
atravs do script apropriado, antes de
receberem acesso a essas pginas.

voc est aqui 349


configurao do mismatch

A ntes de seguir adiante, tire um m om ento para te s ta r a aplicao


M ism atch e pegar o je ito de com o ela funciona.
Baixe todo o cdigo para a aplicao Mismatch no site da Alta Books, em www.altabooks.
com.br. Envie todo o cdigo para o seu servidor web, exceto os arquivos .sql, os quais
contm instrues SQL para criar as tabelas necessrias. Certifique-se de executar a
instruo de cada arquivo .sql em uma ferram enta MySQL, para que voc tenha as tabelas
iniciais das quais ir precisar para o Mismatch.
Quando estiver tudo pronto, v at a pgina index.php no seu navegador web, e
experimente a aplicao. Tenha em m ente que as pginas Ver Perfil e Editar Perfil
inicialmente no estaro funcionando, uma vez que elas dependem dos logins dos
usurios, funcionalidade essa que estamos justam ente implem entando agora.

Estes dois iihks levam a A fgm principal do /V|isatdH iKe


partes personalizadas permite ver nome e a -foto dos
da aplieado. usurios ais redentes, porem nadd
maisj se vode nao estiver locado-
TMKcmfttfil. Wh opposfles attract!
ViewPloSte
EdfrfTOflte
Latcsr member

O cdigo-fonte completo da aplicao


Mismatch est disponvel para download
no site da Alta Books:
w w w .altabooks.com.br
criando aplicaes web personalizadas

Preparando o banco de dados para os logins


A tabea
OK, de volta construo. A tabela mismatch_user j est fazendo istoatdh_user
um bom trabalho de armazenar informaes do perfil de cada predisa de dolunas
usurio, mas ainda fica a dever no que se refere s informaes par tVnr>dhV- o
de login. Mais especificamente, faltam na tabela colunas para se home e a senha de
armazenar o nome e a senha de cada usurio. login dos usurios.
mismatch user

nao eXistefll
Tantos os dados dos nomes quanto os das
senhas consistem de texto puro, portanto,
Perguntas idiotas
possvel usar o familiar tipo de dados Por que eu no posso simplesmente
VARCHAR do MySQL para ambas as colunas. usar userjd, em vez de username, para
Porm, ao contrrio de alguns outros dados identificar os usurios?
dos usurios, voc no pode permitir jamais
que o nome ou a senha fiquem vazios (NULL). ^ * Voc at pode, se quiser. De fato, o
propsito de userjd justamente fornecer um
modo eficiente de se identificar individualmente
as linhas referentes a cada usurio. Porm, IDs
As dolunas usernae e
numricas tendem a ser difceis de memorizar, e
password donte*w ddos de
os usurios realmente preferem escolher os seus
texto sWples, w*as nunda prprios nomes ao se cadastrarem em aplicaes
deve -fidar vazias. web personalizadas. Assim, trata-se mais de uma
deciso de usabilidade permitir que Johan faa
login como "jnettles" em vez de "11". Ningum
quer ser diminudo a um mero nmero!

r- ^Aponte seulpis
Termine de escrever uma instruo SQL que adicione as colunas
username e password tabela posicionada conforme abaixo, sendo
fW as pessoas gostaria que username precisa ser capaz de armazenar 32, password
de te r de lembrar uma 16 caracteres e nenhuma delas deve permitir dados NULL.
seoha do* mais de
daradteresj

voc est aqui 351


aponte seu lpis soluo

tponte seu lpis


:^ Solupo Termine de escrever uma instruo SQL que adicione as colunas
s username e password tabela posicionada conforme abaixo, sendo
que username precisa ser capaz de armazenar 32, password 16
caracteres e nenhuma delas deve permitir dados NULL.

ALTER t a b l e usada para


aditionar colunas a ua
tabela existente.

WALTER . W mismattb__usr APP. userna YARlfAR^yP. NOT NULL AFTER user_id,


K - I r
W p password VftRCHMd NOT HULL AFTR u n *M ^ ---- A tolw>a wen^c c
....... ..................................... ........................................................ adicionada primeiro,
portanto, vote pode
A ihstir^o AFTER donWa, 3 tabtla,
re-ferendia-la a<\ui.
onde as ovas colunas serao adicionadas.

m i s m a tc h _ _ u s e r

A posio das dolunas em uma tabela nao necessariamente az.


di+erena, embora possa ser mais adequado, do ponto de vista
organizacional posicionar as Colunas mais mportahtes primeiro-

Usar A V T B K ia i(^ ic io n a r
colunas usernam e e password

{ tab ela.

claro que voc


nao vai simplesmente armazenar a senha
no banco do je ito que ela est... no preciso
criptografar as senhas antes de armazen-las?

Boa observao... as senhas precisam


ser criptografadas.
A criptografia no Mismatch implica converter a senha em
um formato irreconhecvel, ao ser armazenada no banco de
dados. Qualquer aplicao com suporte a login dos usurios
precisa criptografar as senhas, para que os usurios possam ter
a certeza de que as suas senhas esto ss e salvas. No aceitvel
expor as senhas nem mesmo dentro do banco de dados. Assim,
ns precisamos de uma forma de criptografar as senhas antes
de inseri-las na tabela mismatch__user. Porm, antes disso, a
criptografia no nos ser muito til se no tivermos uma forma
_ ______ __ _____ i_ _ _____ r.
criando aplicaes web personalizadas

Construindo uma interface de usurio para o login


Com o banco de dados alterado para armazenar os dados de Uma operao
login dos usurios, ainda precisamos de um a forma que perm ita
que eles digitem os dados e realmente faam login na aplicao. de log-ln te^ue
Esta interface de login precisa consistir de campos de edio de uma Intetace
texto para o nome e para a senha, bem como de um boto para
executar o processamento do login. pata 9 n9me de
usurfc e a senfca
0 damp senHa
protedo> para ^ue
senha no fossa ser vista-

(jnettles
Password: \
m i s m a tc h _ u s e r
r o
F iifr l
1 dierdre *******
******
1 baldpaul
* * * * * * * * pppsws
1 jnettles

CWtzr bota U051 ln


az- a agitao veri&tar
o nome e a senha junto
ao bnto de dados- e o nome e a senha
baterem, o usurio locado
dom sudesso-

no existem
fergimtas Idptas
0 que fica realmente armazenado no f - 0 .................
banco de dados no so asteriscos, certo? Caso esteja preocupado
sobre como os usurios
Certo. Os asteriscos mostrados em um podero fazer login, se
campo de senha simplesmente servem para ainda no atribumos nomes
fornecer segurana visual, impedindo que algum e senhas a eles... relaxe.
olhe por sobre os seus ombros enquanto voc
digita a senha. Quando 0 formulrio submetido, Ns iremos criar os nomes e as senhas em
a prpria senha que enviada, e no os um instante. Por enquanto, importante
asteriscos. por isso que importante a senha elaborar os alicerces do login, mesmo que
ser criptografada antes de ser inserida no banco. ainda tenhamos de realizar mais tarefas para
que tudo funcione a contento.

voc est aqui 353


a funo sha ()

Criptografe as senhas com SHO A un SHAO


d p jV W S o I /
A interface de login bem simples, mas ainda no nos detivemos p
na necessidade de criptografar a senha. O MySQL oferece uma c n p tp g w a um
funo chamada SHA() que aplica um algoritmo criptogrfico a W p V T n n l o fpV fO
uma string de texto. O resultado uma string criptografada que *
possui exatamente 40 caracteres hexadecimais, independentemente t a n s P t l c l J l c l P ''P
do tamanho da senha original. Assim, a funo na verdade gera um * o T
cdigo de 40 caracteres que representa individualmente a senha. ^ 0 1 U H ] C P c ll^ P

Uma vez que SHA() uma funo do MySQL, e no uma funo 40


PHP, voc pode cham-la como parte de um a consulta que insira
uma senha na tabela. Por exemplo, este cdigo insere um novo
usurio na tabela mismatch_user, criptografando a senha com
SHA() durante a operao.

INSERT INTO mismatch_user


(username, password, join_date) VALUES {'jnettles ', jff||j{'tat lover') , NOW () )

A fun^ao SttAO driptoyaa a senha a -forma de um todiy ^_


de daradteres Hexadedimais, o *y*al t armazinado a sta i a snha real, na
doluna password da tabela mismatdhjASer. forma dom -foi digitada
o respedivo dampo do
A mesma funo SHA() trabalha do outro lado da equao do o rm irio .
login, verificando se a senha digitada pelo usurio bate com aquela
que foi armazenada criptografada no banco de dados.

f
A senha propriamente dita.
U.
SHA ('tatlover ')' A -fundo SlA^ transforma
* * * " F T 00* ' a senKa, de 0 daradteres,
trr, uma sbri*$ de texto
drpto^raada, dontedo
f daradteres.

'e511 d793 f532 dbe0e0483538 ell977 f7b 7 c33b 2 8 '

m vez. de armazenarmos a senha

m
mismatch user d ^
dnptogra-fado d t f O daradteres.
uwMUB username i ii
9 dierdre 08447b...

10 baldpaul 230dcb...
^ S r d ^ 4 ^
11 jnettles

You are fogged m asjn&ts


criando aplicaes web personalizadas

Pcsoriptografando Comparando senhas Aunp SBAO


Uma vez que voc tenha criptografado uma determinada informao, o
oj-nece apenas
instinto natural pensar que ela dever ser descriptografada em algum a o p e ra p
ponto. Mas a funo SHA() de mo nica - ela apenas criptografa,
sem poder voltar atrs. Isso foi feito de caso pensado, para preservar a c tp to g r a fe -
segurana dos dados criptografados - mesmo que um hacker invada o seu
n a p e p p s s V e l
banco de dados e roube todas as senhas, ele no conseguir decodific-
las. Assim, como possvel fazer login do usurio se voc no pode Jeoojlcai: ciados
decodificar a sua senha?
^ U e t e llf c a n i sido
Voc no precisa saber a senha original do usurio para saber se ele
a digitou corretamente na tela de login. Isso porque SHA() gera c r ip t o g r a f a d o s .
o mesmo cdigo de 40 caracteres, desde que voc fornea a ela a
mesma string de texto. Assim, voc pode simplesmente criptografar
a senha digitada pelo usurio e comparar o cdigo resultante com
o valor presente na coluna password da tabela mismatch_user. Isso
pode ser feito com um consulta SQL, que tenta selecionar a linha
referente a um usurio com base na senha. Esta t a senKa digitada pelo
^-usurio para -Par O login.
SELECT * FROM mismatch_user l
WHERE password = jj('tatlover ') no existem
f\ *2o SHAO tomada para J Pel-guntls idiotas
Criptografar a senha de modo *\we ela
pode aparefier na clausula VVHERfc- 0 que significa 0 acrnimo SHA()?

Esta consulta SELECT seleciona todas as linhas da SignificaSecureHashAlgorithm,ou


tabela mismatch_user cuja coluna password bata com "Algoritmo de Hash Seguro". 0 "hash" um
a senha digitada, tadover' neste caso. Uma vez que termo usado em programao de computadores,
estamos comparando verses criptografadas da senha, que se refere a uma string nica, de extenso
no necessrio saber a senha original. Uma consulta fixa, a qual representa individualmente uma
para realmente fazer o login do usurio usa SHA (), string de texto. No caso de SHA(), 0 hash a
mas ela precisaria tambm fazer SELECT na ID do string de texto criptografada, com40 caracteres
usurio, como veremos em instantes. hexadecimais, a qual represente de forma nica
a senha original.
Abrindo espao para a senha criptografada
Existem outras formas de se
A funo SHA() apresenta um problema para o criptografar senhas?
Mismatch, uma vez que as senhas criptografadas
acabam tendo 40 caracteres de extenso, mas a nossa Sim. O MySQL oferece uma outra
recm-criada coluna password s armazena at 16 funo semelhante a SHA() chamada MD5{),
caracteres. Precisamos de um ALTER para ampliar a que executa umtipo parecido de criptografia.
coluna password, de modo que ela possa armazenar as Mas 0algoritmo SHA() considerado um
senhas criptografadas. pouco mais seguro do que MD5(), portanto
ALTER TABLE mismatch user melhor usar SHA(). 0 PHP tambm oferece
CHANGE T NDLL funes equivalentes (sha1{) e md5()), para 0
caso de voc precisar fazer alguma criptografia
0 taanKo da Coluna password t 4 em cdigo PHP, em vez de dentro de uma
Modvfitado par*rO> para caberem as ^ consulta SQL
senhas Criptogradas.
voc esf aqui 355
modificando mismatch user

T J S T O R V e

A dicione as colunas usernam e e password ta b ela


m is m a tc h u s e r, e depois teste-as.
Usando alguma ferram enta MySQL, execute a instruo ALTER para
adicionar as colunas username e password tabela mismatchjuser.

ALTER TABLE mismatch_user ADD username VARCHAR(32) NOT NULL AFTER user_id,
ADD password VARCHAR {16)NOT NULL AFTER username

Mas a nossa coluna password precisa ser capaz de conter uma


string de 40 caracteres, portanto emita ALTER mais uma vez
para abrir um espao maior para os dados.

ALTER TABLE mismatch_user


CHANGE password password VARCHAR(40) NOT NULL Mao sc esy*c$a de
iripiogra+ar a senha,
Agora, para testar as novas colunas, vamos fazer um chamando SHAO.
INSERT de um novo usurio.
INSERT INTO mismatch_user
(username, password, join__date) VALUES (' jimi ', i 'heyjoe 1), NOW () )

Para certificar-se de que a senha foi de fato criptografada no banco de


dados, d um a olhada nela, executando um SELECT no novo usurio.

SELECT password FROM mismatch user WHERE username = 'jimi' _ , .


Par l*m login bevn-
E, finalmente, voc pode simular uma verificao de login fazendo um sucedido,
SELECT no nom e do usurio e usando a funo SHA() com a senha em se,r 3 rr,CSrr3 **<^3
uma clusula WHERE. usada <\ua"do sc
irvserc d linha-

SELECT username FROM mismatch_user WHERE password = l|||j( 1heyjoe ')

IFile Edit Window Helo OoositesAttract


criando aplicaes web personalizadas

EntSo
agora a senha est
criptografada, mas ainda precisamos criar
um formulrio de login. Ser que poderamos
simplesmente usar autenticao HTTP, uma
vez que ela requer um nome de usurio e
uma senha para conceder acesso a pginas
protegidas?

Sim! A a u ten ticao HTTP c e rta m e n te pode


ser usada com o um sistem a sim plificado de
login dos usurios.
Se voc se lembrar da aplicao Guitar Wars do captulo
anterior, a autenticao HTTP foi usada para se
restringir o acesso a determinadas partes da aplicao,
pedindo um nome e um a senha ao usurio. De modo
geral, essa a mesma funcionalidade requerida pelo
Mismatch, exceto pelo fato de que agora ns temos um
banco de dados inteiro contendo combinaes possveis
de nome de usurio/senha, em vez de apenas um nome
e uma senha. Os usurios do Mismatch poderiam usar
a mesma janela de autenticao HTTP; porm, cada
usurio ir digitar o seu prprio nome e a sua prpria
senha.

Te page, you need (oiog in iarea'


A janela de au-ten-bcatao HTTP
Yir passwprd wil be semr in tbe t*ear.
padrao, <\ue "tem aparenCia diferente
Same: Conforme o navegadorj pode servir
Password: Como uma interface de iogin
simplificada*

voc est aqui 357


autenticao http para mismatch

Autorizando usurios com HTTP


Como foi mostrado no Guitar Wars, preciso que sejam enviados dois cabealhos para
se restringir o acesso a um a determ inada pgina atravs da janela de autenticao HTTP.
Esses cabealhos tm o efeito de pedir que o usurio digite um nome e uma senha para
obter acesso pgina Admin do Guitar Wars.

stes dois eabealWos predisa sev- enviados


para iue o atesso a uma pagina seja restrito
ediante autentitaao HTTP-

O envio dos cabealhos para autenticao HTTP resulta em duas linhas de cdigo
PHP - uma chamada funo header() para cada cabealho sendo enviado.

header('HTTP/l.1 401 Unauthorized'); A autentidaao


h e a d e r ('WWW-Authenticate : Basic realm="Mismatch"'); HTTP requer <^ue
os enviamos dois
Este c o reaU da J dabealkos.
autenticaro,. <\ue
err. eeito sobre
toda a aplicaa-
r
H nedessirio digitar
0 wsuirio s podera ver e usar
um nome e um senka
para se acessar paginas esta pgina se -forneier o nome
restritas na aplicaao e a senba dorretos.
Quitar lA/ars. To view this page, you need to log ia to area
' ^itar'Wars*on www;g)terwars.net
Guitar ; Vou/ sasaucrd- wi(J foe inttir dear!

; Bekwisalii
Name; trock
f 7.. - - ....i fscoresasneeded.
AshtODSim H Remeimber th is password in m y k e y d w in
Eddie Vanil
BeBtaChev f Cancel i
PhizI^airsii

Neva Johanaoa 2008-04-2408:02:11 98430 8 ^ ,


KennyLwfc* 2008-04-23 14:09:5064930 Remove
criando aplicaes web personalizadas

Circule as diferentes partes da aplicao Mismatch que sejam impactadas


pelo script de login (login.php) e pelo seu uso da autenticao HTTP para
controlar o acesso. Em seguida, escreva abaixo de que modo essas partes
so afetadas.
is o svift
A t login-

login.php

viewprofile.php

index.php

mi smatch__user
I l I l l i S I If!
editprofile.php

voc est aqui 359


exerccio soiuo

Circule as diferentes partes da aplicao Mismatch que sejam impactadas pelo

ftccio
script de login (login.php) e pelo seu uso da autenticao HTTP para controlar
o acesso. Em seguida, escreva abaixo de que modo essas partes so afetadas.
home page nao tem nenhum
A
S oLu o
direto nos logins dos
pape!
usurios, porque ela precisa
ficar acessTvel a todos.
A visualizao e a
ediao dos perfis
login.php ficam restritas,
guando um usurio fz. login, sighif iCndo c^ue
o seu nome e sua senha so apenas os usurios
verificados em relao ao \ue f izerem login
Conteudo do banCo de dados, podero acessar
para garantir <y*e pertenam essas paginas.
um usurio registrado-

A pagina E ditar Perf il nao s utiliza


o sCript de login para restringir o
e nao for enContrada uma linha Cujos acesso, Como tambm precisa do nome
dados batam com o nome e a senha do usurio para determinar <^ual e o
fornecidos, o sCript de logih e*ibe uma perfil c^ue dever ser editado-
mensagem de erro e impede o acesso.
nat existem
r & r g u n t a s id io t a s

P: Por que no necessrio incluir a home page na


exigncia de login dos usurios?
1 Como a criptografia da senha afeta a autenticao HTTP?

Existem duas questes em jogo aqui: transmitir a senha


Porque a home page o primeiro lugar que o usurio e armazenar a senha. A funo SHAQ do MySQL concentra-se
acessa ao visitar o site, e importante que os visitantes possam em armazenar uma senha, de forma segura e criptografada,
olhar o site antes de exigir deles um login. Assim, a home page no banco de dados. 0 banco no est preocupado com
serve ao mesmo tempo como uma propaganda e um ponto de a forma como voc transmitiu a senha originalmente, de
partida - propaganda para os visitantes e ponto de partida para os modo que este tipo de criptografia no tem impacto nenhum
usurios registrados, os quais precisam fazer login para acessarem sobre a autenticao HTTP. Porm, poder-se-ia argumentar
qualquer ponto mais profundo da aplicao. que a criptografia deveria tambm ser realizada durante a
transmisso da senha, quando a janela de autenticao HTTP
a submete ao servidor. Esse tipo de criptografia est fora do
T * * Os usurios logados podem ver o perfil de qualquer escopo deste captulo e, em todo caso, s necessria quando
outro usurio? se est lidando com dados extremamente sensveis.

Sim. A ideia que os perfis fiquem visiveis para todos


os usurios que fizerem login, mas permaneam invisveis aos
visitantes no registrados. Em outras palavras, voc precisa ser
um membro do Mismatch para ver o perfil de outro usurio.
criando aplicaes web personalizadas

Fazendo login dos usurios com autenticao HTTP


O script de login (login.php) responsvel por pedir um nome e um a senha do usurio,
usando cabealhos de autenticao HTTP, por obter os respectivos valores de nome e
senha da superglobal $_SERVER, e por verificar se eles batem com os dados contidos em
mismatch_user antes de conceder acesso a uma pgina restrita.
<?p hp Se o nome c a senha nao tiverem sido
require o n c e {'connectvars.php') ; digitados, CnVie os abealhos dc utent'a3o
para pedir que o usurio digite esses dados. \
if (!i s s e t ($_SERVER['PHP_AUTH_USER']) || !i s s e t ($_SERVER[PHP_AUTH_PW'])> { I
/ / O nome/senha no foram digitados, portanto, enviar os cabealhos de autenticao headers

"MMe x i t (<h3>Mlsmatch</h3>Desculpe, voc deve digitar seu nome e senha para fazer'
login e acessar esta pgina. ');

}
btem o nome e a
// Conecta-se ao banco de dados senha distados pelo
$dbc = mysqli_connect(DB_HOST, DB__USER, DB_PASSWORD, DB_NAME) ;
usurio-
// Obtm os dados de login digitados pelo usurio

// Procura o nome e a senha no banco de dados

mm
w dom aqueles
if (mysqli_num_rows ($data) -- 1) { dtrfcados.
// 0 login foi bem-sucedido, portanto, definir as variveis de ID e nome do usurio

e fo r enontrda uma lba, *y if'*a


que o login fo ibem sudedido e apodemos
else { definir as variveis fuser_jd c fusername-
// 0 nome/senha esto incorretos, portanto, enviar os cabealhos de autenticao

e x i t {1<h2>Mismatch</h2>Desculpe,voc deve digitarseu nome e senha para fazer!


login e acessar esta pgina.');
Se nenhuma linha no bnio de dados bater dom o nome
e a senha digitados, envie novamente os dabedafhos de
// Confirma o login bem-sucedido. autentidadao para que o usurio possa te n ta r outra vez.

?>

S .
Chegando a este ponto, esta
tudo bem, portanto donf irme o
login bem-sudedido. C riar unftdVQ StHpTde Login
que pea ao usurio para
d ig itar seu nom e e senha.

voc est aqui 361


test drive mismatch

O R 1 V E ______________
Crie o novo script de login, e o inclua nos scripts V er Perfil e Editar Perfil.
Crie um arquivo de texto chamado login.php e digite nele o cdigo para o script de login
(ou baixe o script no site da Alta Books, www.akabooks.com.br). Em seguida, adicione
algum cdigo PHP no incio dos scripts viewprofile.php e editprofile.php para incluir o
novo script de login.
Envie todos os scripts ao seu servidor web, e em seguida, abra a pgina principal do
Mismatch em um navegador. Clique no link Ver Perfil ou Editar Perfil para fazer login e
acessar as pginas personalizadas. E claro que isso s funcionar se voc j tiver adicionado
um usurio, com respectivos nome e senha, ao banco de dados.

Estes dois links levam as pginas


protegidas, as ^uais dhamam o Esta sento driptcgvaada
sdript de login das o usurio to * SttAO c deparada dom
ao esteja logado- aquela presente no banda de
dados, para determinar se o
login deve ser permitido-

To Viewthis page, yu{neff t


Misafatch" on www.mis-ma
raurpassword be$en{ j^ctearj
tort:1. ijnettles

0 sdript de login usa


HTTP para impedir
u te n tid a d o
adesso no autorizado as paginas
Ver Per--il e E ditar Peril.

A home page nao t protegida pelo


sdript de login, mas serve de ponto
de partida para se navegar ate nveis
mis profundos da aplidadao
criando aplicaes web personalizadas

$uaJ^uer pgina
do /Wismatdh c^e
predisar exigir login
s predisar indluir
^ 'p t login.php no
irtidio do seu ddigo-

0 sdript de login
e a primeira doisa
a ser indlwdnos
sdripts- Ver Per-il
e E ditar Peril*
para proteger as
respedtwas pginas.

e o nome e a senha
orew* validos,
o
usurioe logado, e o
restante da pgina
pode ser enviado-

Cada usurio redebe a sua C o nectar o script de Lftgl-------- - ,


prpria experiendia personalizada restan te da ap licao M ism atch.
do Mismatdh.

voc est aqui 363


mismatch precisa de um formulrio de cadastro

Ruby dor ilmes de


tev-v-ov-, vcsolvcr Quebra
e
dbcS tormid
apimentada, mas neste
exato mo*eto, ela odeia o
Alismtdh por ho permitir
^ue se fidastre e use o
sistema-

Os usurios novos do M ism atch precisam de


um a form a de se cad astrarem .
O novo script de login faz um bom trabalho ao usar a
autenticao HTTP para perm itir que os usurios faam
login. O problema que os usurios no tm nenhum a
forma de se cadastrarem - fazer login difcil quando
voc ainda nem sequer tem um nom e e uma senha. O
Mismatch precisa de um formulrio de cadastramento,
o qual perm ita que nvos usurios se juntem ao site,
criando um nome e uma senha para eles.

Nome de Usurio?

Senha?
criando aplicaes web personalizadas

Um formulrio para novos usurios se cadastrarem


Como este novo formulrio de Cadastro deve ser? Ns sabemos que ele precisa perm itir
que o usurio digite o nom e e a senha desejados... mais alguma coisa? Uma vez que o
usurio est estabelecendo a sua senha com o formulrio e as senhas em formulrios web
geralmente so escondidas com asteriscos por motivo de segurana, uma boa ideia ter
dois campos para a senha. Dessa forma, o usurio digita a senha duas vezes, apenas para
nos certificarmos de que no houve nenhum erro de digitao.
Assim, a tarefa da pgina de cadastramento obter o nome e a senha do usurio, certificar-
se de que o nome ainda no esteja sendo usado por ningum, e finalmente adicionar o
novo usurio ao banco mismatch_user.

WieVhdmc: ( jruibyr

Password;
! J $ *tada d*as ves ?ara
3
^------ ____ J ^ 3jud3^ d eim'mr--se o rtsdo dc o
Pssword: uswirto de-finir ua senha mdorret
('rcyye) para SI.

t
c iit r no botao Cadastrar
resulta as aplitaes
adidionar o nome e 3 senha
mismatch user
ao bando de dados. TTTfyl
password fiilsife
l l l use m a m *!

10 baldpaul d8a011...

11 jnettles e511d7...

rubyr 062e4a...
i p r 12

Uma vez. que as senhas apora esto


driptora+adas, elas esiao securas
mesmo ^ue al^uem donsc^a ver o
donteudo do bando.

Um problema potencial com o script de cadastro o usurio tentar


se inscrever com um nom e que j exista. O script precisa ser esperto
o suficiente para capturar esse problem a e fazer o usurio digitar um
nome diferente. Assim, a tarefa da pgina de cadastro obter o nome
e a senha do usurio, certificar-se de que o nome ainda no esteja
sendo usado por ningum, e finalmente, adicionar o novo usurio ao
banco mismatch user.

v o c e s t aqui
signup.php finalizando

Imas de Geladeira dp PHP &My$QL


O script de cadastro do M ySQ L usa um formulrio personalizado
para pedir ao usurio que escolha o seu nom e e senha desejados. O is o
problema que o script encontra-se incompleto. Use os imas abaixo
foirmulario e
para finaliz-lo, de m odo que novos usurios possam se cadastrar e z' tdashr,
se juntar com unidade Mismatch. y

Mismatch - Sign Up
Please enter your username and desired
passwartf to Sign u p to Mismatch.
pRegistration In fo
I ' Username;
j Password; jTZT,
I Password
<?php (retype):
require _ o n c e (appvars.php);
req u i r e _ o n c e (connectvars.php1);

// Conecta-se ao banco de dados


$ d b c = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORDf DB__NAME);

if (isset($_POST[s u b m i t 'I)) {
// Obtm os dados do perfil a partir de POST

...............= mysqli_real_escape_string($dbc, trim ($_POST [ ...............\]) ) ;

.................= mysqli_real__escape__string ($dbc, trim($_POST[1 ............... ]));

................ = mysqli__real_escape_string {$dbc, trim ($_POST [ ............... .]));

if (!empty($username) && !empty($passwordl) && !empty($password2) &&

( ............................ = = ............................. )) I

// Certif ca-se de que ningum j tenha se registrado com o mesmo nome

$query = "SELECT * FROMmismatch_user WHERE username = 1...............'

$data - m y s q l i _ q u e r y ($dbc, $ q u e r y ) ;
if (mysqli_nui 7i_rows ($data) ==0) {
/ / O nome do usurio nico, inserir os dados no banco
$ q u e r y = "INSERT INTO mismatch_user (username, password, join_date) VALUES" .

" ('.............. ;, SHA( ' ....... ) , NOW {) )Nao se esquea vete -tem
t h - z t * esta pe de ^ual^uer
mysqli_query($dbc, $query); apostroo aparea dentvo
L de sps simples.
// Confirme o sucesso com o usuano > *
echo '<p>A sua conta foi criada com sucesso. Agora voc pode fazer login e '
'<a href=editprofile.php">editar seu perfil</a>.</p>';

mysqli_close($dbc);
exit();
criando aplicaes web personalizadas

else {
//J existe uma conta comeste nome, exibir mensagem de erro.
echo 1<p class="error,l>J existe uma conta com este n o m e . Por favor, escolha o u t r o . 1 .
'n o m e .< / p > ';

_ nn.

}
}
else {
echo '<p class='Terror">Voc deve digitar todos os dados de login, incluindo a senha ' .
'desej ada duas vezes ,</p>';
}
}

mysqli_close($dbc);
?>

<p>Por favor, digite seu nome de usurio e senha desej ados para se cadastrar no M i s m a t c h .</
P>
<form method="post" action="<?php echo $_SERVER [1P HP_SELF] ; ?>">
<fieldset>
<legend>Informaes de Registro</legend>
<label for="username">Kome de Usurio:</label>

<input type=',text" id= ............. " narae=" _ ..... "

value="<?php if (!empty(.. ............ )) echo ; ?>" / x b r />

<label for=" ... ........ ">Senha:</label>

<input t y p e = " ..............." id=" ................" name=" ............... V /><br />

ciabel f o r = " .............. ">Senha (digite novamente) :</label>

<input t y p e = " ..... ....... " i d = " ..............." name=M ............... " / x b r />

voc es t aqui >


signup.php completo

Im a s de G e l\c le n < \ d o P H P &

M /SQ L - Solu
O script de cadastro do M y S Q l usa um formulrio personalizado
para pedir ao usurio que escolha o seu nom e e senha desejados. 0 t is o
problema que o script encontra-se incompleto. Use os imas abaixo -formulrio de
para finaliz-lo, de m odo que novos usurios possam se cadastrar e J ddastro-
se juntar com unidade Mismatch.

<?php
r e q u r e _ o n c e ('appvars-php') ;
re q u ire__once('c o n n e c t v a r s - p h p ');

// Conecte-se ao banco de dados


$ d b c = m y s q l i _ C o n n e c t ( D B _ H O S T , DB_USER, DB__PASSWORD, D B _ N A M E ) ;
Obtenha -todos os dados digitados
if (isset ($_POST t submit ] ) ) { pelo usurio, prii*eira*ente-
/ / Obtem os dados do perfil a partir de POST

$usernam e :mysqli__real_escape_string ($dbc, trim ($_POST [

$passwordl Jr= m y s q l i__re a l _ e s c a p e _ s t r ing ($dbc, trim ($_POST [ '


$password2
:m y s q l i _ r e a l _ e s c a p e _ s t r i n g ($dbc, t r i m ( $ _ P O S T [ .

if (!empty(usernarae) && !empty($passwordl) && !empty($password2) &&

< , Spasswordl | | $passMoraL B l (4r


atytads sejm tdcwfcttss*
// Certifique-se que ningum j tenha se registrado com o mesmo nome
$usemame
$query = "SELECT * FROM mismatch_user WHERE username =
ealiz v^a donsulta para ver
= i_ (
$data m y s q l q u e r y $dbc, $query) / 'v. sc e*,stem i'mKas batendo dom o
if (mySqli_num_rovs ($data> = 0) { ^ dc ^ \ 0 deitado.
/ / O nome do usurio nico, inserir os dados no banco
$ q u e r y = "INSERT INTO mismatch_user (username, password, join_date) VALUES " .

\
e no houver nenhunta linha,
SHA (1 $passwordl ^ , now () )
entao o usurio novoj ento
,. (, ,, t ^ ^ P S a das snhas poderia %er P f a z e r o NSERT.
m y s q l ^ q u e r y lSdbc, $query>; ar i, M s dev,

// Confirma o sucesso com o u s u r i o " d tiUs f * *< a trtt pont.


echo 1<p>A sua conta foi criada com sucesso.Agora voc pode fazer login e
1<a href="editprofile.php">editar seu per f i l / a > .< / p > 1;

mysqli_close($dbc); CcM-firma o Lddskro do


exit (); g- usurio e f inaliza o siript-
}
else {
/ / J existe uma conta c o meste nome, exibir mensagem de erro
echo <p ciass="error">J existe uma conta com este n o m e .Por favor, esc

n o m e < / p > 1; 0 nome de w


j est sendc
Limpa a varivel eivfcao exibi*
?user*3me, para <\ue o mensagem de
rcspediivo dampo r\o
formulrio seja esvaziado.
01S0 {
echo 1<pclass="error>Voc deve digitar todos os dados de login, inclu
desejada duas v e z e s .< / p > ' ; A
} V Um OU mais dos dmpos do
} -formulrio esto vazios, en-fco
m y s q l i _ c l o s e ($dbc) / " ibi * * *
?>
<p>Por favor, digite seu usurio e senha desej ados para se cadastrar no Mis
<form method="post" action="<?php echo $_SERVER[ 'PHP_SELF] ; ?>">
<fieldset>
< l e g e n d > I n f o r m a e s de R e g i s t r o < / l e g e n d >
<label for-"username">Nome de usurio:</label>

<input type=text" id=".

value="<?php if (lempty

<label for=".:

| id= J password! H name=" .|passw 0rdlj| /><br />


<input type^",,

<label for=".. Password (retype):</label>

< input type=" id=" I passwords Bina.ni6=">^^P^sswofd2 /xbr />

</fieldset>
<input type="submit" value="Sign Up" name="submit" />
< / form>

existem
signup.php
V&tgimfs idiotas
T: Por que no poderamos simplesmente usar T: Ento o script de cadastro faz login dos usurios
autenticao HTTP para o cadastro de novos usurios? depois que eles se cadastram?

K . * Porque o propsito do script de cadastro no restringir H : No. E o motivo tem a ver principalmente com o fato de que
o acesso a determinadas pginas. A sua tarefa permitir que o script de login j lida com a tarefa de logar o usurio, portanto
o usurio escolha um nome e uma senha, e ento adicion-los no h necessidade de duplicar esse cdigo no script de cadastro.
ao banco de dados. Certamente possvel usar a janela de Em vez disso, o script de cadastro apresenta um link para a pgina
autenticao HTTP como formulrio de input para o nome e a Editar Perfil, aonde o usurio presumivelmente desejar ir aps
senha, mas usar a funcionalidade de autenticao apenas para se cadastrar. E uma vez que ainda no estar logado, a janela de
cadastrar um novo usurio seria como usar uma espingarda para login lhe ser apresentada em resposta tentativa de acessar a
matar um mosquito. melhor criar um formulrio personalizado pgina Editar Perfil. Assim, o script de cadastro leva o usurio at
para os cadastros - assim voc obter o benefcio da verificao a janela de login atravs da pgina Editar Perfil, em vez de fazer o
dupla da senha, para se evitar erros de digitao. seu login automaticamente.

voc est aqui 369


criando aplicaes web personalizadas

T fe S T O R fv e
A dicione a funcionalidade de cadastro ao M ism atch.
Crie um arquivo de texto chamado signup.php e digite nele o cdigo do script de
cadastro (ou baixe o script no site da Alta Books, www.altabooks.com.br). Em seguida,
modifique o script login.php, adicionando-lhe links para o script de cadastro para os
usurios que no conseguirem fazer o login.
Envie os scripts ao seu servidor web, e em seguida, abra a pgina Cadastrar no seu
navegador. Cadastre-se como um novo usurio e depois faa login. Em seguida,
edite e visualize o seu perfil para confirmar que o cadastro e o login funcionaram
corretamente. A aplicao agora tem aquele toque pessoal que estava faltando.

A au-fcch-tida&io
HTTP e usada para
io^ar Ruby t o m base
*as -foirmaoes |ue
ela ornedeu no seu
cadastro.
mismatch tambm precisa permitir que os usurios faam logout

Eu compartilho um
computador com duas colegas
de quarto e no gostaria que elas
tivessem acesso ao meu perfil do
Mismatch. Preciso da capacidade
de fazer logout!

Os sites de com unidades precisam perm itir que os


usurios faam logout, para que os seus dados pessoais
no possam ser acessados por terceiro s em um
com putador com partilhado.
Permitir que os usurios faam logout pode parecer algo
extremamente simples, mas apresenta um problema relativamente
srio quando se usa a autenticao HTTP. O problema que esta
serve para ser executada uma vez para uma determinada pgina ou
conjunto de pginas - ela s resetada quando o navegador fechado.
Em outras palavras, o usurio nunca "deslogado de uma pgina
web autenticada via HTTP at que o navegador seja fechado ou que
o usurio manualmente finalize a sesso de autenticao HTTP. Esta
ltima opo mais fcil de executar em alguns navegadores (Firefox,
por exemplo) do que em outros (Safari).
Um ve2- -Peito o lo*,
vote permvtcte locado
aie eihav o ave^ado*-

Youoreloggeditassdneyk.
T$ vtw this page, you need to tog in to area
Mismatch -Edit Profile fcBsmafc* <!ww.m>s-*natchjet
wiibt inih*cleir.
Firsl name: Sidney Mame. sidneyk
Lastname; FEr^T Password:!*
Gender: jSSfei
BMidate: [1984-07-19 ' H Remember this password in my keychain
City: Timpe
State:
Ptenre:

Uw> veiurso de
logout \pevmjtiria
a Sidhy ton-kv-olar
diAidadosaente
o ate sso ao seu
^er! pessoal-
Embora a autenticao HTTP apresente uma forma simples e til de estabelecer os logins
dos usurios na aplicao Mismatch, ela no fornece nenhum controle para fazer o logout
do usurio. Ns precisamos tanto do recurso de lembrar dos usurios quanto de permitir
que eles saiam do sistema quando quiserem.
970
criando aplicaes web personalizadas

voc est aqui 373


introduzindo cookies

. *,
As vezes voce so precisa de um cookie y-jyp
. . ,. Aautenticao
O problema originalmente resolvido pela autenticao HTTP tem armazena dadps
duas faces: h a questo de se limitar o acesso a certas pginas, e
h a questo de lembrar que o usurio digitou informaes sobre persiStenteni elite
si mesmo. O segundo problema o mais complexo, porque ele
envolve a capacidade de a aplicao se lembrar de quem o usurio no cliente, mas n
ao longo de diversas pginas (scripts). O Mismatch resolve essa permite <jue Vpce
questo verificando o nome e a senha armazenados na superglobal
$_SERVER. Assim, ns podemos tirar proveito do fato de que o QS apague guando
PHP armazena o nome e a senha da autenticao HTTP em uma
superglobal que persiste ao longo de diversas pginas. termina de usa-fcs.
Tb view this pae, you r.eod W to area
M ismatch n ttfw w.fflis-m atch.net
tourpasswwdwiilbeswitm'rhedea'.-
1 A sufevjiobal /_
_SERVER [ PHP_AUTH_USER' ] \ R\/ER a ^ a ^

J
Mame: s id n e y k
f O *o>e e a senha
Password:1 $_SERVER [ PHP_AUTH_PW' ] W |l i e
n Remember This password in my keychain
Mas no podemos mais nos darmos ao luxo de usar
Cancei
a autenticao HTTP, porque ela no tem suporte a
logouts. Assim, precisamos procurar outro meio de
s cookies lfce permitem implementar a persistncia do usurio ao longo de
diversas pginas. Uma possvel soluo so os cookies,
a r m a z e n a r h p c lie n t e pedaos de dados armazenados pelo navegador no
computador do usurio. Os cookies so bastante
pequenos pedaos parecidos com variveis PHP, exceto pelo fato de
de dados de prma que eles continuam existindo depois que voc fecha
o navegador, desliga o computador, etc. E o que
persistente, signlicandp mais importante, os cookies podem ser apagados,
significando que voc pode elimin-los quando tiver
<jue eles ppdem continuai: terminado de armazenar dados, por exemplo, quando
existindo mesmp depois o usurio indicar que deseja fazer logout.

de nalizado o script.. Servidor

e ppdem tambm ser


ap^gadps a ^ual^uer
m o m e n to !
Navegador wb
do cliente
Os dados dos cookies so armazenados no computador do usurio pelo seu navegador web.
Voc tem acesso aos dados atravs de cdigo PHP, e o cookie capaz de persistir ao longo
no s de vrias pginas (scripts), mas at mesmo ao longo de vrias sesses do navegador.
Assim, fechar o navegador no faz o usurio se deslogar automaticamente do Mismatch.
Isso no problema para ns, porque podemos apagar um cookie a qualquer momento, a
partir de cdigo de script, o que tom a possvel oferecer um recurso de logout. Podemos
dar aos usurios controle totalmente sobre em que momento eles querem sair do sistema.
criando aplicaes web personalizadas

Po que feito o cookie?


O cookie armazena um nico dado, sob um nome nico, praticamente da mesma forma
que uma varivel em PHP. Ao contrrio das variveis, o cookie pode ter um prazo de
validade. Quando a data de validade atingida, ele destrudo. Assim, os cookies no so
exatamente imortais - eles apenas vivem por mais tempo do que variveis PHP. Voc pode
criar um cookie sem prazo de validade, em cujo caso ele se comporta do mesmo jeito que
uma varivel PHP - destrudo assim que o navegador fechado.

Home
O nome nico do cookie

Valor
O valor armazenado no cookie

Pata de validade
A data em que o cookie
expira... e deixa de existir

Os cookies lhe permitem armazenar um a string de texto sob um determinado nome, mais
ou menos como uma varivel de texto PHP. O que torna os cookies to poderosos o
fato de poderem viver por mais tempo do que os dados de um script, especialmente em
situaes em que a aplicao consiste de vrias pginas que precisam se lembrar de alguns
dados, por exemplo, informaes de login.
no existem
"perguntas idtas
?
1 * Qual a grande vantagem dos cookies serem
persistentes? Os dados armazenados em um banco
de dados MySQL no so tambm persistentes?
$undo voe *3
Dcihiy o przo
ornee ftCrtHu
de vaiidade de um
dookic tom uma dt
de vlidadcj o tockit Sim, os dados de um banco certamente so
persistentes. Na verdade, so tecnicamente muito
e apagado assim que mais persistentes do que um cookie, porque no h
bsthte -fuiuv
o navegador fo r nenhum prazo de validade envolvido - depois que voc
ajuda a -barn-lo mais coloca dados em um banco, eles ficam l at que voc
fedKado.
permanente. os remova explicitamente. A questo real, no que se
refere aos cookies e a persistncia a convenincia.
Ns no precisamos armazenar para sempre a ID atual
Assim, o Mismatch pode imitar a persistncia ou o nome do usurio s para permitir que ele acesse
fornecida pela superglobal $_SERVER seu perfil; s precisamos de uma forma rpida de

configurando dois cookies - um para o nome saber quem ele . 0 que realmente precisamos de
persistncia temporria, o que pode parecer paradoxal
do usurio e outro para a senha. Mas ns no at voc considerar o fato de que precisamos que os
precisamos realmente manter a senha, poderia ser dados permaneam existindo por mais tempo do que
mais til armazenar a ID do usurio em vez disso. uma pgina (persistncia), mas no eternamente.

voc est aqui 375


A funo setcookieQ

Use cookies corn PHP


O PHP fornece acesso a cookies atravs de uma funo chamada setcookie() e
uma superglobal chamada $_COOKIE. A funo setcookie() usada para se
definir o valor e a data de validade (opcional) de um cookie, e a superglobal
$_COOKIE usada para se obter o valor de um cookie.

setcookie('username', 'sidneykT);
......... *
pvimeivo
valor a s- ado
J
0
para srfookieO o
*o too ki t passado to * o
nawe do Cookie
secundo r<y*netfco'

echo(<p class="login">Voc est logado como p i


.</p>);
0 nome do ookic t wtdo p a ra
re-IWcniiav' o seu y/aiov na
supcrjlobl f_C O O i.

A funo
A vantagem de se definir um cookie que os seus dados
s e tc o o la e Q Jo
persistem ao longo de vrios scripts, portanto ns podemos
nos lembrar do nome do usurio sem ter de pedir que ele o PB? iLe permite
informe a cada vez que passar de uma pgina para outra na
aplicao. Mas no se esquea, precisamos armazenar a ID a r m a z e n a r d a c fe s
do usurio em um cookie, uma vez que ela serve de chave em c o o k ie s *
primria para consultas ao banco de dados.

s e tc o o k ie ( u s e r_ id
0 s tookies so sewfre
arma^^ados tomo e
m odo ^*e, w*csmo *\ue a iP do
usurio seja u numero^ v>c&
a avwaz^namos e uw dookie
l<mo a stvn^ j .

A funo setcookie 0 tambm aceita um terceiro argumento opcional, o qual define o


pra 2o de validade do cookie, que a data na qual este automaticamente apagado. Se
voc no especificar um prazo de validade, como no exemplo acima, o cookie expira
automaticamente assim que o navegador for fechado.
criando aplicaes web personalizadas

Aponte seu lpis


Ajustar o Mismatch para usar cookies envolve mais do que apenas escrever
um novo script de logout. Primeiramente, ns temos de rever o script
de login e modific-lo para usar cookies em vez da autenticao HTTP.
Circule e comente as partes do cdigo de login que voc acha que precisa
modificar para acomodar os cookies.

<?php
requre__once (' connectvars -php');

if (!is-set ($_J3ERVER[ 'PHP_AUTH_USER' ]) ][ !isset ($_SERVER[ 'PHP_AUTH_PW' J) } {


/ / O nome/senha no foram digitados, portanto enviar os cabealhos de
autenticao header(1HTTP/l.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Mismatch" 1);
exit{1<h3>Mismatch</h3>Desculpe, voc deve digitar seu nome e senha para fazer,
'login e acessar esta pgina. Se ainda no for um usurio registrado, por favor'.
<a href="signup.php">cadastre-se</a>.');

// Conecta-se ao banco de dados


$dbc = mysqli_connect(DB_H0ST, DB_USER, DB_PASSWORD, DB__NAME);

// Obtm os dados de login digitados pelo usurio


$user_username = mysqli_real_escape__string($dbc, trim($_SERVER['PHP_AUTH U S E R ]));
$userp a s s w o r d = mysqli_real_escape_string($dbc, trim($_SERVER['PHP_AUTH_PW']));

// Procura o nome e a senha no banco de dados


$query = "SELECT user_id, username FROM mismatch_user WHERE username = " .
" '$user_usernaine' AND password = S H A ('$user_password') " ;
$data = mysqli_query($dbc, $query);

if (mysqli_num_rows($data) == 1) {
// O login foi bem-sucedido, portanto definir as variveis de ID e nome do usurio
$row = mysqli_fetch_array($data);
$user_id = $row[user_id'];
username = $row['username];

else {
// O nome/senha estio incorretos, portanto enviar os cabealhos de autenticao
headers
header('HTTP/l.1 401 Unauthorised');
header (WWM-Authenticate: Basic realm="Mismatch" 1);
exit('<h2>Mismatch</h2>Desculpe, voc deve digitar um nome e '.
'senha vlidos 'para fa 2 er login e acessar esta pgina'.
'Se ainda no for um usurio registrado, por favor,'.
'<a href="signup.php>cadastre-se</a> . ');

// Confirma o login bem-sucedido.


echo(<p class="login">Voc est logado como ' .
?>

l o g in .p h p

voc est aqui 377


aponte seu lpis soluo

.ponte seu lpis


Ajustar o Mismatch para usar cookies envolve mais do que apenas
Solupo escrever um novo script de logout. Primeiramente, ns temos de
rever o script de login e modific-lo para usar cookies em vez da
autenticao HTTP. Circule e comente as partes do cdigo de login
que voc acha que precisa modificar para acomodar os cookies.

Ks predisamos veriidar Em vez. de obter o nome e a senha a


a e*istendia de um dookie partir de uma janela de autentifia^a
para ver se o usurio est pretism os usar u -formulrio Com dados
locado ou nao. POST. '
<?php
*quire_once('connectvars.p h p ')

SERVER[PHP AUTH USER]} [I !isset($_SERVER[1PHP_AUTH_PW']))


/senha no toram ctj.cri farirfS*: '.uui iram o enviar oa cabCcilEi
autenticao header (HTTP/l.1 401 Unauthorize
^-Authenticate: Basic realm^'Mismatch"');
-.L.5-4i-Lsmatch</h3>Desciilpe, voc deve diyiLaL seu nome e senha para fazer
: esta pgina. Se ainda no for um usurio registrado, por favor',
"signup.php">cadastre-se</a>.');
Nao precisamos mais enviar dabealhos
de autenticaro HTTP.
// Conecta-se ao banco de dados
$dbc = mysqli__connect (DB_HOST, DB_USER, DB PASSWORD, DB NAME)

// Obtm os dados de login digitados pelo usurio



$user_username = mysqli_real_escape_string($dbc, tri ($_SERVER['PHP_AUTH_USER'] )
$user^password - mysqli_real_escape string($dbc, tri. ($ SERVER['PHP AUTH P W ']));

// Procura o nome e a senha no banco de dados


$query = "SELECT user^id, username FROM mismatch_user WHERE username =
"'$user_username' AND password = SHA('$user password')";
$data = my sqli_quer y ($dbc, $query); A Consulta nao predisa
if (mysqli_num_rows($data) 1)
se modi-fidar em nada^
// 0 login foi bem-sucedido, portanto definir as variveis de ID e nome do usurio
$row - mvsali fetch array($data);
?user_id - $row { ' user_id1] ;
C $username = $row[ 'username' ] A\ui ns te* de inir
de
dois tookies, e vez. de
else
deinir variaveis do sdript
s JJ O nome/^pnha esto incorretos, portanto enviar os cabealho*is de autenticacao headers
h e a d e r (HTTP/1.1 401 U n a u t h o r i z e d 1);
v^^eader (' WWW-Authenticate : Basic realm="Mismatch"') ?
e x i H ''-li2 >Mj.am,
atch</hZ>Uesdaigi, voce deve digital TUlL'nome e
'senha vlidos 'para fazer login e acessar esta pgina'.
'Se ainda no for um usurio registrado, por favor,
<a href="signup.php">cadastre-se</a>.1);

// Confirma o login bem-sucedido.


e cho(1<p class="login,l>Voc est logado como ' . username . '.</p>');

Uma vez. *^ue nao irernps usar a janela de


autentidaao HTTP para diytaao do nome t lo g in .p h p
da senha, temos de driar um ormulrio de lo^in
HTML- para o usurio -Pomcder essas informdoes.
criando aplicaes web personalizadas

Repensando o fluxo dos logins


Usar cookies em vez de autenticao HTTP para os logins do Mismatch envolve mais do
que apenas repensar o armazenamento dos dados dos usurios. E quanto interface do
login? O login baseado em cookies precisar fornecer o seu prprio formulrio, uma vez
que no poder usar a janela de autenticao para a digitao de nome e senha. Ns no
s precisamos criar esse formulrio, como tambm temos de pensar em como ele modifica
o fluxo da aplicao, medida que os usurios fazem login e acessam outras pginas.

Um novo -formulrio de lgm tomS o iugar


da janela de autentidaao HTTP para a
M ism atch - W here opposites attract!
dityiacao do nome e da senha-
LssJn
sigaR
'V .
Latest makers: Clidar no novo link
u sernamer
*L 03 fn leva a pagina
de login, onde o Password-- [ * * * * &
%
usurio pode digitar
as su3s m-orm-oes
f t
para donedtar-se ao [j^ n
1 sistema
Aps az^r login Cct*

' sudesso, o usurio e

A
rediredionado para a Kome
page, onde o menu agora
revela <\ue ele esta logado.

#i*ando o usurio no est


logado, os membros mais index.php M h m s tc h * W h o e opposites attract!

redentes sao mostrados


domo homes esttidos. V LogOut (skfaevkl 0 menu de
navegaao prndipal
0 sdripi de logout id ddessivel $s paginas restritas indlui um link Log
atraves de um link ^ue z- agora esto adessveis, O ui ^ue mostra
parte do status de logout- uma vez.<\ue usurio tambem o nome do
est logado- usurio logado.

Afos o login, os nomes dos


membros mais redentes se
trans-formm em links para
os seus respedtivos per-m.
viewprofile.php
voc est aqui 379
login.php agora com cookie
Vut login baseado ew cookies
A nova verso do script de login, que usa cookies para
implementar a persistncia, um pouco mais complexa do
que a sua predecessora, uma vez que ela precisa fornecer o
seu p r p r io f o r m u l r io p a r a a d ig ita o d o n o m e d o u s u r io
e da senha. Mas tambm mais poderosa, uma vez que
oferece a funcionalidade de logout.
<?php k A ** login.p

is e ovo
require once (' connectvars.php 1) ; mCfisajCftS Ot Crvo ^OTS SO
armaz<adas e** uma varivel e exibidas,
// Limpa a mensagem de e r r c i ^ ^
:$erxox_.msg = 'C '
-formulrio de io<*.
^gsslrio, ais adint O Sript-

, , , , . . \/eri-(We o tock\t userjd ?ara


Se
-
usuariQ .nao es.tiver. Ipgaio, tenta fazer o l o g m
q
I if (!isset {:^qx>KiEj
v
-
VV se o
i
usuari
,
esta locado-
t^ _i

ifV(isset {S^POSTi;1s u b m i t 1J5


Se o usurio ao estiver
// Conecta-se ao banco de dados
$dbc = m y s q l i _ c o n n e c t (DB_HOST, DEMJSER, DB_PASSWORD, DB_NAME) ; iodado, verificar se ele
submeteu dados de lo^in.
// Obtm os dados de login digitados pelo usurio .. .
$ u s e r _ u s e r n a m e = m y s q l i _ r e a l _ e s c a p e _ s t r i n g { $ d b c , tr i^ $ ^ E iQ S ;r .'! S ern a m e 1 ] ) ) ;
$ u s e r _ p a s s w o r d = m y s q l i _ r e a l _ e s c a p e _ s t r i n g ( $ d b c , tr im l^ ^ ^ fe r ^ p s ^ W o r d ''* ] } ) ;

if (!e m p t y ($user_username) && !empty ($user_password)) {


// Procura o nome e a senha no banco de dados
$query = "SELECT user_id, username FROM mismatchjjser WHERE username =
password - S H A ( ' u r j , a , s o r d ' ) - ; ftl * <
$ d a ta = m y s q li q u e r y ($ d b c , $ q u ery ) ; a ? * J n
a^ora vem de P0ST, e *3o de uma
if (mysqli_num_rows ($data) = = 1 ) { i^el d c a u t c n t i ^ O
/ / O login foi bem-sucedido, portanto definir os cooKles de ID e nome do
usurio e redirecionar para a home page
$row - mysqli fetch_array ($data) ; ^ F a loAin d o usuiro dfinmdo
- - e userame.
os ookies user_id

ilse{
-hpae' .nrl
is
seteopkil^stgi^^

pindx .php'*
h e c ^ r f t L o G a t i o n ; , ; ' *s Redirefiiow: o usurio para
^'~~^a bome fa^e do Mismttb
// 0 nome/senha esto incorretos, portanto definir uma mensqjj^gg Suedido-
= 1H q c-/~<i 11
rric^rr
srror msg ^- rrS i- a v irm ri/'-vmA o conVi 3 Tr^l
vlidos r^a 7tz>Y% login.
para fazer 1r v n n *

}
else

caso
// 0 nome/senha no foram digitados, portanto definir uma mensagem de
$error_msg = Desculpe, voc deve digitar seu nome e senha para fazer login

Dei*a a varivel da
mensagem de erro ago
<html>
esteja errado dom os dados
< head> de login.
<title>Mismatch - Log In</title>
<link rel=stylesheet" type="text/css" href-"style.ess" /> 0 srift de login agora e
</head>
<body>
k uma eb tomfWa
<h3>Mismatch - Log In</h3>dotmua n pagina d id pertnto de requer todos os
demente* HTML padres-
criando aplicaes web personalizadas

<?php

?>
/ / S e o c o o k i e e s t i v e r v a z i o , e x i b i r m e n sa g e m d e e r r o

r^/^v4ii3ifiiuilllll^lii2ffiilfiy-'1 :
l o g i n ; c a s o c o n t r r i o , c o n fir m a r l o g i n

(se h ou ver)

Sc o usurio md
estiver logado este ponto
exibir 3 ervagem de erro.
riso
e o fo r m u l r io d e

< fo r m m e th o d = " p o s t" a c t io n = " < ? p h p e c h o $ _ S E R V E R [ 1PHP_SELFV ?>">


< fie ld s e t>
< ie g e n d > L o g I n < / l e g e n d >
< l a b e l fo r = " u se r n a m e " > N o m e d e U s u r i o : < / l a b e l >
<iput;., "text yiimli
value="',<?php ,i'f. (^user^uSerngmi lis-Enme;. ; '/X f e r . / >

nomee
< l a b e l fo r = " p a s s w o r d " > S e n h a : < /la b e l>
<input':;tiype='ps.wrd'?''.V.................. Estes dois dampos do
< / f :e l d s ' e t > ' ....
< i n p u t t y p e = " s u b m it " v a lu e = " L o g In " n a m e = " su b m it" / >
formulrio s3o usados
para o usuirio digitar o
Tudo ^ue ven antes desta dhave ainda a senha.
<?php ^ parte da primeira dusula i
e ls e f
// C o n f ir m a o la g ij r
e c h o i < p \ cass=*l^fi3?f:K
r
Finalize o digo HTAIL para Se o usurio estiver locado
< /b o d y >
dompietar a pgina web de logm. neste ponto, informe-o disso.
< /h t m l>

existem
P e r g u n ta s id io ta s

P: Por que necessrio


armazenar tanto a ID quanto o
informar ao usurio que ele est
logado, mas tambm qual o nome - Parece que o formulrio do
script de login est dentro da
que est logado.
nome do usurio em cookies? declarao if? Isso possvel?
- Ento por que no
{ l Uma vez que essas armazenar tambm a senha em l \ l Sim. Na verdade, bem
duas informaes identificam um cookie, como parte dos dados comum ver cdigo PHP "dividido"
individualmente os usurios dentro de login? em torno de cdigo HMTL, como
do banco de dados do Mismatch, acontece no script de login. S
voc poderia usar apenas uma das porque voc fechou uma seo de
duas com o propsito de manter a f^lA senha s importante para
cdigo PHP com ?>, no quer dizer
verificar inicialmente se o usurio
aplicao sabendo quem o usurio que a gica do cdigo est fechada.
realmente quem ele diz ser. Uma
logado. Porm, userjd uma Quando voc abre oura seo de
vez que o processo de login verifica
referncia melhor (mais eficiente) cdigo PHP com <?php, a lgica
a senha, no h motivo para mant-
no que diz respeito ao banco de continua exatamente de onde parou.
la em jogo. Alm disso, senhas so
dados, porque uma chave primria No script de login, o formulrio
numrica. Por outro lado, userjd dados muito sensveis, portanto
HTML contido dentro da primeira
uma boa ideia evitar armazen-
pouco informativa e no tem ramificao de if, enquanto que a
las temporariamente sempre que
nenhum significado para o usurio, ramificao else aparece depois do
possvel.
portanto o username til para o cdigo do formulrio. Dividir cdigo
usurio saber que est logado, pois PHP com cdigo HTML, desta
ele v o seu prprio nome na pgina. forma, evita que voc tenha de
Uma vez que ocorre de vrias gerar o formulrio com um monte de
pessoas compartilharem o mesmo instrues echo confusas.
computador, importante no s
voc est aqui 381
menu dinmico do mismatch

Navegando na aplicao Mism atch


O novo script de login modifica o fluxo da aplicao Mismatch, passando a requerer um
menu simples que aparea na home page (index.php). Esse menu importante porque
f o r n e c e a c e s s o s d if e r e n t e s p a r te s p r in c ip a is d a a p lic a o , atualmente as pginas Ver Perfil
e Editar Perfil, bem como a possibilidade de os usurios fazerem login, se cadastrarem e
fazerem logoiit, dependendo dos seus estados de login atuais. O fato de que o menu se
modifica com base no estado de login do usurio significativo, e em ltima anlise, o
que d ao menu o seu poder e a sua utilidade.
Un menu di-kv-ente t
**orbrado defendendo de
se o dookie username e st
B sie menu af vec de-finido ou ndo-
guando o usurio
nao csb locado,
dando a ee a
oportunidade de
zcr o^tn ou se
adastvar

0 sdirpt indcC.
pHp sabe <^ue deve
m ostrr o ranu
imitado guando nio
donseguir endontrav
o dookie uscvname.

O menu gerado por cdigo PHP dentro do script index.php, e esse cdigo usa a
superglobal $_COOKIE para procurar o cookie username e ver se o usurio est logado ou
no. O cookie com a ID do usurio poderia tambm ter sido usado, mas como o nome do
usurio o mostrado no menu, faz mais sentido us-lo.
criando aplicaes web personalizadas

j li r
) dookic user__id r3o e
usado pelos dierevfcs
Cnus, as md t
importante par
^Stanatch ................ persistentia do usurio no
I * yicwj'iufhj " -;.. "; :'k ~ /; v ' : - \ v i r - - '--a Ms*atb.
I ^ rj<iiiJ'-:,'.:.K: ' : . : ^ x .rr ^ - ^ V ^ iS V .;

r u ~ ^ ,jr~ ^
Latestmembers: ; ! 'y : ^".
user id = tookie determina
<\ua! menu exibido
' >' s : / W - s ^ - S S B s E s
...
{ /
u se rn a m e s id n e y k

.. . I ...' ^toolcf .,. .; ?j


;yl_' usrfoe ;

\v>\ . .'ytem'pii ':." r."
k ja fc . : - n ..: // .'

/v|eYv para
usuirios locados.

// Gera o menu de navegao


if (isset ($COK E r*~
_____. ) )
echo &I10084; <a href="viewprofile.php">Ver Perfil<Vaxbr />';
echo '&#10084; <a href="editprofile .php">Editar PerttrK/aXbr />;
echo &#10084 ; <a href="logout.php">Log Out (' . username' . 3
')</a>1;
}
else {
echo &#10084; <a href="login.php">Log In</a><br />
echo 1&.#10084; <a href="signup .php">Cadastrar-se</a> 11

Os smbolos de doradoeziftbosjio
Menu para
lado de da item do menu sSo ,
possibilitados por este dod'130 HTML, visitantes
<^ue suportado n maioria dos usurios ainda
ao !o$ados).
navegadores-

voc est aqui > 383


log out de usurios deletando cookies

Oi, lembra de
mim? Eu realmente,
realmente ainda preciso
fazer logout.
O

N s re a lm e n te p r e c is a m o s p e rm itir q u e o s u s u r io s
fa a m lo gou t.

a
Os cookies facilitaram o login e a navegao no Mismatch, mas o nosso
propsito inteiro, ao mudarmos da autenticao HTTP para os cookies,
era permitir aos usurios fazerem logout. Ns precisamos de um novo
script de logout que apague os dois cookies (user ID e username),
para que o usurio no mais tenha acesso aplicao. Isso impede
que algum use o mesmo computador mais tarde e acesse os dados
privados do usurio.
Uma vez que no h nenhum componente de interface de usurio
envolvido na operao de logout, basta redirecionar o usurio para a
home page aps o logout.

't Sidney ind


est esperttd
pelo logout-
logout.php
script de logout
apa^a os cookks de
io^m do usurio e %
redretons pava a
W e page.
criando aplicaes web personalizadas

Fazer logout significa apagar cookies


Fazer o logout de um usurio envolve apagar os dois cookies que mantm registro do
usurio. Isso feito chamando-se a funo setcookie (), e passando-se a ela uma data de
validade que faa os cookies serem apagados na data em questo.
Ahov a a tw l Snmics rtoras

S
* 8} ) ;
'
setcookie(1username 1

V " sta expresso de-f *


Este cdigo define um prazo de validade de 8 horas no futuro, um pra*o d validade
o que significa que o cookie ser automaticamente apagado 8 <^ue v e 3 horas apo*

horas depois da hora atual. Mas ns queremos apagar o cookie


um
a hora atual
imediatamente, o que requer a definio do prazo de validade Yara apagai*
para um momento no passado. Quanto tempo no passado no c o o k ie , b a s ta
importa muito - basta escolher um espao de tempo qualquer,
digamos uma hora e subtra-lo da hora atual. definir 9 seu
pta^P de validade
como mn tempo
setcookie(username 1, 'sidneyk',

segundos ^ minutos ~ ^ 0 0
hp passado.
l>0 ^0
segundos, o da ura Hora no passado.

Esto faltando algumas partes do cdigo do script de logout do Mismatch.


Escreva o cdigo que est faltando, certificando-se de apagar os cookies antes
da pgina de logout ser redirecionada para a home page.

<?php

// Se o u s u r io e s tiv e r lo g a d o , a p a g a r o c o o k ie p a ra fa z e r o lo g o u t

if ( ) {

/ / A paga o s c o o k ie s u s e r ID e u s e r n a m e , d e fin in d o os seu s p razos de v a lid a d e com o


uma h o r a a t r s ( 3 6 0 0 )

}
// R e d ir e c io n a p a r a a hom e p a g e

$ h om e_u rl =
T*
'h t t p : / / . $_SE R V E R [ 1HTTP_HOST' ] . d ir n a m e ( $ _ S E R V E R [ ' PH P _SE L F ' ] ) .

h e a d e r ( ' L o c a tio n : ' . $ h o m e _ u r l);

?>

voc est aqui 385


o script completo logoutphp

Esto faltando algumas partes do cdigo do script de logout do Mismatch.


Escreva o cdigo que est faltando, certificando-se de apagar os cookies antes
da pgina de logout ser redirecionada para a home page. *

usudVio se este \
SoLuo , *

^?p p estiver iodado-


// Se ou s u r i o estiver logado, apa g a r o cookie para fazer o logout t

if ( isset(f_C00^|rusev_icn) ) {
// A p a g a os cookies us e r ID e username, definindo os seus prazos de validade como

Lonsbrwtomo
- UOO); Defwe t i i i tookie ^ o vwttndo - J W a

I Rcdiredioft para a Komc paje do


/V]isaidK, ^we c

una URL absoluta.

dc\oUWzX$o
R e d i r e c i o n a p a r a a home p a g e

ome_url = 'http://' . $__SERVER['K T T P _ H O S T '] . d i r n a m e ( $ _ S E R V E R ['P H P _ S E L F ']) .


nde*.pKp 1;
h ea d e r {' L o c a t i o n : ' . $home_url) ; ^ ^bcaibo WSulta em o
?> navegador redrtofcr para outr pgina*

____T f e S T O R f V G --------------------------------

U s e c o o k ie s p a ra a d ic io n a r a fu n c io n a lid a d e d e lo g o u t a o M ism a tc h .
Modifique os scripts do Mismatch para que eles usem cookies para permitir que os
usurios faam login e logout (ou baixe os scripts do site da Alta Books, www.altabooks.
com.br). Devero ser feitas modificaes nos scripts index.php, login.php, logout.php,
editprofile.php e viewprofile.php. As modificaes nos dois ltimos so poucas e envolvem
principalmente modificar as referncias das variveis globais $userjd e $username para
que elas passem a usar a superglobal $_COOKIE.
Envie os scripts para o seu servidor web e depois abra a pgina principal do Mismatch
(index.php) em um navegador web. Tome nota do menu de navegao e depois clique no
link Log In" para entrar no sistema. Repare em como o script de login leva voc de volta
pgina principal, enquanto que o menu se modifica para refletir o seu status de logado.
Agora clique em "Log Out" para pulverizar os cookies e sair do sistema.
criando aplicaes web personalizadas

Ou dookies so
ridos para

Os tookies s
jogados ora para
y*e a aplitaao *e
es^ueta do usurio e
aa o logout _ _rcy esta ionie porque agora

na existem
ela pode zr logout e ler fierteza
de gue o seu peril do /VfuawatfiH
Petrurrtas d ip as ^ H w v * Hn \
& enquanto ela estiver W- 1
Ento tudo o que preciso fazer para o logout apagar os cookies?

Sim. Os cookies so responsveis por armazenar todas as informaes de login do


Mismatch (ID e nome do usurio), de modo que apag-los resulta em um logout completo.

T * * Por que os cookies so definidos como vencendo uma hora atrs, para serem
apagados? Existe aigo significativo sobre o espao de tempo de uma hora?

No. O cookie automaticamente apagado pelo navegador assim que o seu prazo
de validade vence. Assim, a operao de apagar um cookie imediatamente exige que se
defina o prazo de validade como vencendo em algum momento do passado. Uma hora (3600
segundos) apenas um espao de tempo arbitrrio, escolhido para indicar consistentemente
que estamos apagando um cookie.

voc est aqui 387


armazenando dados do usurio no servidor; ao invs no cliente

Bsfce C o uSu3vio do ATtsmtfiH


Jasoh, f dc estaladas, dc Oh-oh. Eu tenho os
picrdm$s e de ttoward Slcvn- cookies desabiltados
!c dcsabiirb* os dookies no meu navegador e
o seu navegador, o <\ue no consigo fa z e r fogin. E
reprcsewta rr. ^voklcm pav agora, o que fao?

os
Um vez. <^wC -ockies
esto dcsabiivtados,
o sdrpl -falKa t
simplesmente e*v>a
uss/3v*o dc vol-fca 3 Ho
sc* -fasev logjm*
o

0 ave^adov rejei-fca os dookies,


pedindo <\ue o sdHpi dc loai*
os deW ^

0 sevvidor 'teftla
definir os dookies
de !P e dc r)oe do
uswno no ave^ador-

Quem se importa
com o Jason? No
verdade que a maioria das pessoas
tem os cookies habilitados?

S im , m a s a s a p lic a e s w e b d e ve m s e r o m a is
a c e s s v e is a o m a io r n m e ro d e p e s s o a s p o ssv e l.
Algumas pessoas simplesmente no se sentem vontade para usar
cookies, ento elas optam pela segurana de desabilit-los. Sabendo
disso, vale a pena tentar acomodar os usurios que no tero a opo
de usar cookies para o login. Mas tem mais: acontece que h outra
opo que usa o servidor para armazenar os dados de login, em vez
de usar o cliente. E uma vez que os nossos scripts j esto rodando no
servidor, faz sentido armazenar tambm dados de login nele.
criando aplicaes web personalizadas

A s sesses no dependem do cliente As sesspes ljie


p e rm ite m a rm a z e n a r
Os cookies so coisinhas poderosas, mas tm as suas
limitaes, como por exemplo, ficarem sujeitos a limitaes persistentemente
que vo alm do seu controle. Mas e se no tivssemos pe^uenPS
de depender do navegador? E se pudssemos armazenar
dados diretamente no servidor? As sesses fazem justamente pedaos cie dadPS
isso, e lhe permitem armazenar pedaos individuais de
informaes da mesma forma que os cookies, mas os dados np serYidpr,
so armazenados no servidor em vez de no cliente. Isso Independentemente
coloca os dados das sesses fora dos limites impostos pelo
navegador aos cookies. dp cliente.
S e r v id o r w e b
Armazena dados em 0 navegador nao
cookies ifcterere d ire ta ^ te
Ao tm b r rio dos ookies, na armaz^agem dos

ifia
s sesses a r m a o s dados de sess3es> uma
seus dados n servidor. vez. tudo no
servidor.
Obtm dados a partir
de c o o k i e s N avegador
w e b d o c lie n te
As sesses armazenam dados em variveis de sesso, que so Uma Vez* <Jue Ps
os equivalentes lgicos dos cookies no servidor. Quando
voc coloca dados em uma varivel de sesso usando cdigo
dadps de sesspes
PHP, eles so armazenados no servidor. Voc pode ento sp armazenados np
acessar os dados na varivel de sesso a partir de cdigo
PHP, e eles continuam persistentes ao longo de vrias serVidpr, eles sp
pginas (scripts). Como no caso dos cookies, voc pode ma!s seffurps e mais
apagar uma varivel de sesso a qualquer momento, o que
nos possibilita continuarmos a oferecer o recurso de logout cpniVefs dp c[ue
com cdigo baseado em sesses. dadps armazenadps
em cookfes.
0 usuirio ho e fiapaz. de
apagar dados de sesses

Certamente existe alguma desvantagem, certo? Mais **a*ualme-fce tom o seu


ou menos. Ao contrrio dos cookies, as sesses no have9adorJ ^ue pode ser
oferecem tanto controle sobre o tempo durante o qual w* problema ^uado se usam
a varivel de sesso armazenar os dados. As variveis cookies.

de sesso so automaticamente destrudas assim que a Kao b um praz de


sesso termina, o que em geral, coincide com o ato de o validade assodiado tom as
usurio fechar o navegador. Assim, embora as variveis variveis de sesso, porque
de sesso no sejam armazenadas no navegador, elas elas so automaticamente
so afetadas indiretamente por ele, uma vez que so apagadas guando a sesso
apagadas quando a sesso do navegar finaliza. termina-
voc est aqui 389
as funes sessionjstart{) e sessfon destroyQ

A vida e a obra das sesses


A uno PHP
As sesses recebem esse nome por um motivo elas
tm um incio e um fim muito claros. Os dados s e s s P tL -S t rtO toda
a s s o c ia d o s c o m u m a se s s o v iv em e morrem de acordo
com o tempo de vida da sesso, o qual voc controla u m a s e sse b e p e rm ite
atravs de cdigo PHP. A nica situao em que voc
no tem controle do ciclo de vida da sesso quando
C[ue V>ce comece a
o usurio fecha o navegador, o que resulta no fim da a rm a z e n ar d ad o s em
sesso, quer voc goste disso ou no.
Voc precisa informar sesso quando estiver ponto VaraVels da sesso
para inici-la, chamando a funo PHP session_start().

tsfca -u^ao PH?


session_start () ;
ua} sesso
03

Chamar a funo session_start() no define quaisquer


dados - a tarefa dela apenas iniciar a sesso. A sesso
identificada internamente por uma ID individual,
com a qual voc geralmente no precisa se preocupar.
Essa ID usada pelo navegador para associar uma
sesso com diversas pginas.

Cd
sta a IP da
sesso, *^ue e gerada Navegador
Servidor web automaticamente w e b d o c lie n te
domo ^arte de
nova sessa. A IP da sesso e
usada no$ bastidores
para permitir \ue
'ndex^pnpj diversas fainas
^uhdo uma sesso ompartilbem o acesso
e ihidiad, ura IP os dados da sesso-
e deinida para viewprofile.php
identi--ifia-la editprofile.php
individualmente.
A ID no destruda at que a sesso seja finalizada, o que
acontece ou quando o navegador fechado ou quando
voc chama a funo session_destroy().
Bsi -funo PffP
session destroy(); -inlizj lAtn sesso.
A unp sessi9n_ Quando voc fecha uma sesso com esta funo, ela no
destri automaticamente quaisquer variveis de sesso
desfro/O nalza que voc tenha armazenado. Vamos dar uma olhada com
a sesso- mais detalhes no modo como as sesses armazenam dados,
para descobrir por que isso acontece.
criando aplicaes web personalizadas

Mantendo-se atualizado com os dados das sesses


O legal sobre as sesses que elas so bastante semelhantes aos cookies, em A varivel da
termos de como voc as usa. Uma vez iniciada uma sesso com uma chamada sesso e driada
a session_start(), voc pode comear a definir as variveis, como por exemplo t art*anada
os dados de login do Mismatch, com a superglobal $_SESSION. no servidor-

sidneyJc
0 valor a ser
nome da varivel da sessoJ armazenado e apenas
e usado tomo um ndifie para s atribudo a superglobal
superglobal /_S0N'..,
f_SSS0 K
echo ('<p class="login">Voc est logado ccatio ~ -;i
'.</p>') ;

Ao contrrio dos cookies, as variveis de sesso no requerem \


nenhum tipo de funo especial para defini-las - basta atribuir um Para aeessar a variavel
valor superglobal $_SESSION, certificando-se de usar o nome da da sesso, basta usar a
varivel como o ndice do array. superglobal fJSIOH e
o nom da varivel.
E quanto a apagar as variveis de sesso? Finalizar a sesso atravs
de session_destroy() no destri as suas variveis, portanto, voc As VoriaVels
precisa apag-las manualmente se quiser que elas sejam eliminadas de sesso nSjO
antes de o usurio fechar o navegador (logout!). Uma forma rpida
e eficiente de destruir todas as variveis de uma sesso definir a s apagadas
superglobal $ SESSION como um array vazio.
autornatcamerite
fidijo elimina -todas as ^uandp a sess
$_SESSION = a r r a y ();
variveis da sesso atual. desefta.
Mas isso ainda no tudo. As sesses podem usar cookies
nos bastidores. Se o navegador os tiver habilitados, a sesso
pode definir um cookie para armazenar temporariamente a e a sesso estiver usando
ID da sesso. Assim, para fechar completamente uma sesso um tookte para ajudar
via cdigo PHP, voc precisa tambm apagar qualquer cookie 3 sc lembrr da sua !Pj
que possa ter sido criado automaticamente para armazenar e*tao a IP arma^nda
essa ID no navegador. Como qualquer outro cookie, voc o ern um dookie fcom
destri definindo o seu prazo de validade como um tempo no esmo nome da sesso.
passado. Tudo o que voc precisa saber o nome do cookie,
que pode ser descoberto usando-se a funo session_name().

if (isset($ COOKIE! ]>> <


setcookie t im e O - 3 6 0 0 );

FVimeiramcrtte, veri-fi^ue y* Destrua o dookie da sesso


- realmente existe um dookie ( de-finindo o seu prazo de
da sesso- validade para uma hora atrs.
voc est aqui > 391
como o mismatch trabalha com sesses

Comeda a\u'v
Renove o M ism atch com as sesses
Repaginar a aplicao Mismatch para que ele use sesses
para armazenar dados de login no to complexo
quanto pode parecer. Na verdade, o fluxo da aplicao
se mantm quase o mesmo voc s precisa tomar um
pouco mais de cuidado nas operaes de
iniciar e destruir a sesso e de limpar a
sujeira uma vez terminada a sesso.
As duas variveis
da sesso sao
driadas para
rmanarem 5
JP e o nome do
vtsvtino, para o
s e s s i o n _ s t a r t () ; lojm-

%
/ unao sessioh_strtO
abre a sesso

Se os dookies estiverem
habilitados, o servidor dria
m* para armazenar a IP
da sesso - daso dontrrio,

t
a |P e passada juntamente
dom a URL de dada pgina.
session_destroy();

j
um dookie tiver sido
usado para armazenar
A -fwr^ao a [D da sesso, ele e
session_ destrudo-
destro^O X
Os dados do lo^in
agora sao memorizados
-finaliza a sesso
usado-se uma sesso,
iwpedmdo \ue
em vez. de dookies-
ela seja usada
em outr pagina

As variveis da
sesso sao destrudas
limpandose o array
?_m
criando aplicaes web personalizadas

Fapa Logout com sesses


Para se fazer o Iogout do usurio, preciso um pouco mais de
trabalho com as sesses do que em verses anteriores, em que
usvamos apenas cookies. Estes passos precisam ser executados
para se fazer logout com sucesso, nas sesses do Mismatch.
Sem veH-ftcav, vote ao sbev-a
dom ierteza se um dookie de
Q A p a g a r a s v a r i v e is d a s e s s o .
sesso esia sendo usado.
V e rific a r s e e x is te um c o o k ie de
^ s e s s o e, s e existir, a p a g -lo .
esse a^ul e um passo
O D e stru ir a s e s s o . na essendal pava o logout
do usuaVio, mas u-til de
0 R e d ire c io n a r o u s u rio h o m e p a ge .
^uai^wer iorma-
Aponte seu lpis
N T 0 script de logout do Mismatch est sendo reelaborado para
usar sesses, em vez de apenas cookies, para a persistncia dos
logins. Escreva o cdigo que est faltando para "sessionalizar" o
script, e depois escreva a qual passo do processo de logout cada
insero corresponde.

<? p h p

// Se o u s u r i o e s t i v e r logado, a p a g a r as vars de se s s o p a r a f a zer o logout

s e s s i o n _ s t a r t ();

if ( ............................... ) {

// A p a g a as v a r s de ses s o l i m p a n d o o a r r a y $ SESSION,

// Apaga o cookie de sesso, definindo o seu prazo de validade como uma hora atrs (3600)

if (isset($ C O O K I E [session n a m e ()])) }

}
// D e s t r i a s e s s o

}
/ / R e d i r e c i o n a p a r a a ho m e p a g e

$ h o m e _ u r l = 'h t t p : //' . $ _ S E R V E R ['H T T P _ H O S T '] . d i r n a m e ($ _ S E R V E R ['P H P _ S E L F '] ) . '/


i n d e x . p h p ';

h e a d e r {L o c a t i o n : ' . $home_url);

?>
voc est aqui 393
logout.php "sessionallzado "

t^ p o n te seu lpis
Solupo
O script de logout do Mismatch est sendo reelaborado para usar sesses,
em vez de apenas cookies, para a persistncia dos logins. Escreva o cdigo
q u e est faltando para "sessionalizar" o script, e depois escreva a qual
passo do processo de logout cada insero corresponde.

\ J Apagar as variveis cia sesso.

z ) Veri-fidar se existe um dookie de sesso e, se existir, apag-lo.

Destruir d sesso

Rediretionar o usurio a home page-

Mesmo ao a r o logout, vote


tem de mitiar a sesso para poder
<, php atessar as variveis.
/
// o u s u r i o e s t i v e r logado, a p a g a r as va r s de sesso p a r a fa zer o logout

session^ttart o ; ------- Agora, esta sendo usada uma varivel de sesso, em


i f ik et s S |0 N fu serJ tt) ) ( VCi dc ur" Cock'*> P^ra verifidar o status do login.
// A p a g a as va r s de ses s o l i m p a n d o o ar r a y $_SESSION.

f_6 l0 N = airayO; ^ ----- Para U y a " f


........................................... (j^ ) array a^o a superglobal
// Apaga o cookie de sesso, definindo o seu prazo de validade como uma hora atrs (3600)

if ( i s s e t {$ _ C O O K I E [ s e s s i o n _ n a m e ()])) {

settookiefsessih__hmeO, w, timeO ?>&O);


Se existir um dookie da sesso,
apague-o, def inindo o seu praza de
// D e s t r i a s e s s o validade domo uma hora atras,
session_destroy)j Destrua a sesso dom uma
J.............................. dhmada a uno sessioift__
destroyO.
l i R e d i r e c i o n a p a r a a ho m e p a g e

$ho m e _ u r l = 'http://' . $ _ S E R V E R [ 'H T T P _ H O S T 1] . d i r n a m e ( $ _ S E R V E R [P H P _ S E L F ]) . '/


i n d e x . p h p 1;

h e a d e r ('L o c a t i o n : ' . $ h o me_url);



?>
criando aplicaes web personalizadas

lA U M l1
A mudana dos cookies para as sesses tem impacto sobre mais
coisas do que apenas o script de logout. Ligue cada parte da
aplicao Mismatch modificao por que elas tm de passar

connectvars.php

Nenhuma modificao, pois este script nao tem


influncia direta na persistncia dos logins.
As sesses precisam se lembrar de quem o usurio
. Chame a funo session_start() para iniciar
a sesso, e depois modifique as referncias a $_
COOKIE para $_SESSION.
As sesses precisam controlar o menu de
navegao. Chame a funo s e s s i o n - s t a r t ()
para iniciar a sesso, e depois mude as referncias
$-COOKIE por $-SESSION.

editprofile.php

voc est aqui > 395


como Bu mudo soluo

A mudana dos cookies para as sesses tem impacto sobre mais


coisas do que apenas o script de lo g o u t. L ig u e c a d a p a r t e d a
aplicao Mismatch modificao por que elas tm de passar
para acomodar as sesses.

Nenhuma modificao, pois este script


no tem influncia direta na persistncia
dos logins.
As sesses precisam se lembrar de quem o
usurio . Chame a funo session_start()
para iniciar a sesso, e depois modifique as
referncias a $_COOKIE para $_SESSION.

As sesses precisam controlar o menu de


navegao. Chame a funo s e s s io n -
s t a r t () para iniciar a sesso, e depois
mude as referncias $-COOKIE por
$-SESSION.

editprofile.php
criando aplicaes web personalizadas

PONTOS DE BALA ----------------

A autenticao HTTP til para se restringir o Para apagar um cookie, basta definir o seu prazo de
acesso a determinadas pginas, mas no oferece validade para vencer em algum tempo no passado.
nenhuma forma de o usurio fazer "logout" aps
terminar de acessar a pgina. B As sesses oferecem recurso de armazenamento
semelhante ao dos cookies, mas so armazenadas
Os cookies lhe permitem armazenar no cliente no servidor e, portanto, no ficam sujeitas s mesmas
(web browser) dados de pequeno porte, como por limitaes do navegador - como por exemplo, a
exemplo, os dados de login dos usurios. possibilidade de se desabilitar os cookies.
Todos os cookies tm um prazo de validade, que As variveis de sesso tm um tempo de vida
pode vencer num futuro muito distante ou ento logo limitado, e so sempre destrudas uma vez
ao final da sesso do navegador. terminada a sesso (por exemplo, quando o
navegador fechado).

n 9 e x is te m

F e rg u n ta s id io ta s
persistir no cliente, de alguma forma, elas supostamente so melhores que os
r A funo session_start()
para que vrias pginas possam fazer cookies. Qual a explicao?
chamada em vrios lugares diferentes,
parte da mesma sesso. Uma forma pela
mesmo depois de a sesso ter sido
qual essa persistncia da D executada
iniciadas. No estamos criando
atravs de um cookie, significando que R: Embora as sesses de fato ofeream
mltiplas sesses com cada uma alguns benefcios claros em relao aos
a ID armazenada em um cookie, que
dessas chamadas a session start()? ento usado para associar um script a cookies, em determinados cenrios, elas
uma determinada sesso. no necessariamente tm uma relao
mutuamente exdusiva com os cookies.
No. A funo session_start() no
As sesses certamente tm o benefcio
serve apenas para iniciar uma nova sesso P * Se as sesses ainda dependem de ficarem armazenadas no servidor em
- ela tambm trabalha com sesses dos cookies desse jeito, qual ento vez de no cliente, o que as toma mais
existentes. Assim, quando um script chama a grande vantagem de us-las em vez seguras e confiveis. Assim, caso voc
session_start(), a funo primeiramente
dos cookies? precise armazenar dados sensveis de
verifica se j existe uma sesso, o que
forma persistente, uma varivel de sesso
evidenciado pela presena de uma ID
forneceria mais segurana do que um
de sesso. Se no existir, a funo gera As sesses no so inteiramente
cookie. As sesses tambm so capazes
nova ID e cria a nova sesso. Chamadas dependentes dos cookies. importante
de armazenar quantidades maiores de
futuras a session^startQ vindas de dentro entender que os cookies servem como uma
dados do que os cookies. Portanto, existem
da mesma aplicao iro reconhecera otimizao para se preservar a ID da sesso
vantagens claras em se usar sesses,
sesso existente e iro us-ia, em vez de atravs de vrios scripts, mas no como
independentemente de os cookies estarem
criar outra. uma necessidade. Se os cookies estiverem
disponveis ou no.

P
desabilitados, a ID passada de script
Para os propsitos do Mismatch, as
parar script atravs de uma URL, de forma
Como a ID da sesso sesses oferecem uma conveniente soluo
semelhante a como j vimos dados serem
armazenada? nesse ponto que as para se armazenar dados de login no lado
transmitidos em uma requisio GET. Assim,
sesses s vezes usam cookies? do servidor. Para os usurios que tm os
as sesses podem funcionar perfeitamente
cookies habilitados, as sesses fornecem
sem cookies. Os detalhes sobre como as
melhor segurana e confiabilidade, ao
sesses reagem em resposta aos cookies
Sim. Embora os dados de sesses mesmo tempo ainda usando os cookies
sejam armazenados no servidor e, estarem desabilitados so controlados no
como uma forma de otimizao. E no
arquivo de configurao php.ini presente
portanto, tenham os beneficios de serem caso dos usurios que no tm cookies
no servidor web, atravs das configuraes
mais seguros e ficarem fora do controle habilitados, as sesses funcionam sem
de session.use_cookies, session.use_oniy_
do navegador, ainda precisa haver serem afetadas, ao passarem a ID da
um mecanismo para o script saber da cookies e session.use_trans_sid.
sesso atravs de uma URL, evitando os
existncia desses dados. cookies completamente.
para isso que serve a ID - identificar
P Ainda parece estranho que as
individualmente a sesso e os dados
sesses possam usar cookies, quando a
associados com ela. Essa ID precisa justificativa em us-las justamente que

voc est aqui 397


migrando de cookies para sesses

Complete a sesso de transform aes


Embora as diferentes partes do Mismatch afetadas pelas
sesses as usem para realizar coisas diferentes, em ltima
anlise o s s c rip ts precisam de modificaes semelhantes para
se fazer a migrao dos cookies para as sesses. Por exemplo,
todos eles precisam chamar a funo session_start() para
iniciar as sesses. Alm disso, todas as modificaes envolvem
a troca da superglobal $_COOKIE pela $_SESSION, que
responsvel por armazenar as variveis da sesso. Tdos os sdHpb baseados em
sesses domea* om uma
chagada a sessio*_startO,
para inieiar a sesso

// Se o usurio no est logao, loga-o.


f (!isset$~SESSIOKf j'ser_idl~Jj ) {
if (isset (5_PCST [submit' ])) {
// Coneta com o banco de dados
Sdbc = raysqIi_connect (DB^HOST, DB_USERr DS_PASSKORD, BB_NAME) ;

// Pega o dado do login digitado


$user_userna?r.e = mysqli_real_escape_string($diic, trim(S__POST['-asemame'])) ;
$
jser_passworcS = mysqli_jreal_escape_string($dbc, trim ($_ECSTI password']));

(!enpty ($jser username) && !empty (?user_password))


// Olha o usurio e senha no banco VHERE username = '$user_username AND
$query = "SELECT user_id, username FROM mismatch_ Jsei
password = SHA( $user_password')
Sata = mysi?ii_query ($dbcf Squery);

if (mysqlijrcum^rows($data) == 1) ) redireciona o/ hone page.


// 0 login OK, defina a varivel de sessolD so none do usurio
$row = mysqll fetch array($data) ;
s SESSION ['user" id = $ row ['user id']'
C H E E s I(!i\j'useinamc row['username'; '/index.php;
$'ncme_url = 'http:/./' . $_SERVER['KTT?_HOST 'j . dirname ($_SERVER L1?HP_3ELF'])
header(Location: 1 . $home_url);

"// 0 usurio/senha esto incorretos, seta uma para f login.


Sector msg = Desculpe, voc deve digitar ut, usuarro * senha ,QlrdO- para

login.php
0 sdript de loyn usa sesses para se
{embrar da IP e do ome do usurio,
obtendo assim a persiste*i3 do
o^'m, e o -(-az. usndo superglobal
em vez- da
criando aplicaes web personalizadas

A home pa$e ^
|7Vfis*atdh usa
echo s#iu84; <a h-efS^vTS^, -
lf ^ 65e^SESSI0MFUSer^ ^ . ', ,
i |a superglobal
echo 'tlOOQ; <a hre-"ed^r"fiTrP?P">VeW Profile</><br />-; /JSESSION em
fvez. de f__C)0^!
echo '*10084; e,php >Edlt Profiie</a><hr /%-.
- n-e- logout.pnp">Lcg out C f . $ SESSTOMf. ^
[ username^i ')</a>'
else {
echo '&4I084; <a href="login.pnpT,>Lc In</axtt />
para adessar dados
) echo '&#1008; <a hre=signup.php">Sign tfp<7a>'; de lo^hj ao mesmo
temp em \ue jera
o menu e dedide se
// Varre c array de dados de usurio formatado para HTML
echc '<h4>Latest membrs:</h4>'
deve ou no exibir
ec.ho '<table>; um !mk para os
while (?rcw = mysqli_fatch_array($ata)) {
peris dos membros
if (is3etffsESSION f'userTdJ>) ( mais redewtes.
]
echo '<tdxa hrei'=<lviewprrle.php?uEer_id= , $rowf user_id'] .
$row[first^name'J . 'c/ax/tdx/tr>'
else (
echo '<td>' . 5rcw ['first_name '] . '</tdx/tr>';
i
echo '</table>';

Semelhahie a pa^i^a de lo^m e a home pa^e, o


sdript Editar Per-i! agora usa f__SSf0N em
index.php
vez. de f_C00fc para adessar os dados de
|o|m.
// r^^antir J-. o usurio est logado.
- <'iqspt- g"fiF,5SIONi 'user id']H> t ,.
echo '<p class="login">Please <a href=" login. piip">log i.K/a> to access tnis page.</p>
exit ();

^elseecho('<p class="login">You are logged in as .^^SESSION1userr.ameT'X


<a href"logout.php">Log out</a>.</p>'); ------

if (!empty ($irst_na;ne) && empty ($last_name) && !errpty (Sgender) !empty(birthdate) &&
!empty{$eity) & !empty(Sstate)) (
// Apenas seta a coluna picture se existir -jica foto nova-
if (!empty(Snew_picture)) {
$query = "UPDATE mismatch_user SET first_name = '$first_name , last_nartte = '$last_name
"ender = 'Sgersder, birthdate = 'birthdate', city ~ 'Scitv1. state = 1Sstate', " .
"picture = '?new_pioture 1 WHERE user_id = -* SESSION ['user_idH~~~'>y''" ;

else {
Squery - "UPDATE mismatch_'aser SET first_ne.Tie = '$first_name', last_narae = '$last_name1
,
"gender = $gender', birthdate - $fcirthda.te' city = '$city', state = 'Sstate' " .
MRERE user_id = -^.SESSION [1user

mysqii_que:y(Sdbc, $query);

Bmbora yao esteja


sendo mostrado, o sdript
\/er Peril usa sesses
pratidmcnte da mesma
viewprofile.php orm \ue tditar PerliL

voc est aqui 399


convera inform al entre cookie e varavel de sesso

Conversa Informal
Conversa de hoje: Cookie e varivel
de sesso discutem quem tem a
m elhor memria.

Cookie: Varivel de sesso:


Tem havido muita conversa aqui entre ns,
cookies, sobre o que exatamente est acontecendo
a no servidor. Os boatos do conta que voc
est tentando entrar no nosso territrio e roubar
nossos empregos de armazenamento de dados.
Qual a histria?
Espera a, roubar uma palavra muito sria. A
verdade que s vezes simplesmente faz mais
sentido armazenar os dados no servidor.
No faz nenhum sentido para mim. O
navegador um lugar perfeitamente bom para
se armazenar dados, e eu sou o cara perfeito
para fazer esse trabalho.
Mas e se o usurio te desabilitar?
Ahn, bem, essa outra histria. Se o usurio decidir
me desabilitar, ento claramente ele no tem
nenhuma necessidade de armazenar dados.
No verdade. O usurio frequentemente nem
sabe que a aplicao web est armazenando dados,
porque, em muitos casos, so dados que s ficam
nos bastidores, como por exemplo, os nomes de
usurio. Assim, se voc no estiver disponvel, ele
acaba sem nada.
Ento eu suponho que a sua resposta armazenar
os dados no servidor? Que conveniente.
Exatamente. E o legal que o usurio no tem
como desabilitar nada no servidor, assim voc no
precisa se preocupar se os dados podero ou no
realmente ser armazenados.
Ok, gnio. J que voc parece ter soluo para
tudo, por que que voc, s vezes, ainda me usa
para armazenar a sua preciosa ID no navegador?
Er, bem, a maioria das pessoas no sabe disso,
portanto no precisamos falar disso aqui.
Podemos falar disso fora do microfone. O mais
importante que eu estou sempre alerta, pronto
para armazenar dados no servidor.
criando aplicaes web personalizadas

Cookie: Varivel de sesso:


No senhor, diga a todos o quanto voc precisa
de mim!
Espera a, roubar uma palavra muito sria. A
verdade que s vezes simplesmente faz mais
sentido armazenar os dados no servidor.
Ah, eu sei que pode, mas a verdade que
prefere depender de mim. E, no fundo, talvez
at goste de mim.
Olhe, eu no tenho nenhum problema com voc.
S gostaria que fosse um pouco mais seguro. E
voc tem aquela limitao para o tamanho dos
dados, que nem sempre so to pequenos.
Ah, ento agora voc vai me tirar s porque
eu sou pequeno. Ok; posso no ser capaz de
armazenar tanto quanto voc, e admito que viver
no cliente me toma um pouco menos seguro.
Mas com certeza mais emocionante! E eu
tenho algo com que voc s pode sonhar.
Ah, sim? E o que seria?
Bem, todo esse espao de armazenamento e
segurana de que voc se orgulha tanto tm um
custo... uma vida breve! Eu no queria ter de te
dizer, mas toda a sua existncia no ultrapassa a
durao de uma sesso do navegador. Acho que
da que vem o seu nome.
Quer dizer que voc pode viver alm de uma
nica sesso? Como isso possvel?!
E simples. Eu no sou destrudo junto com a
sesso, apenas termino o meu prazo de validade.
Assim, posso ser configurado para viver uma vida
longa e prspera, muito mais longa do que o
determinado por algum suista feliz da web que
acha bonito abrir e fechar o navegador a cada
oportunidade que tem.
Uau. A imortalidade deve ser sensacional. A
minha nica esperana que algum programador
preguioso acidentalmente se esquea de me
destruir ao fechar a sesso... mas o navegador
ainda vai acabar comigo assim que for fechado.
O problema que esses mesmos programadores
frequentemente definem o meu prazo de validade
com um perodo to curto que na verdade eu no
chego a experimentar a vida longa que mereo.
Quer dizer, eu...
Al? Voc est a? Caramba, esse negcio de
prazo de validade srio mesmo.
voc est aqui 401
test drive the "sessionaHzado" mismatch

T fe S T O R t v e

M o d ifiq u e o M is m a t c h p a ra u s a r s e s s e s e m vez de c o o k ie s.
Modifique os scripts do Mismatch de modo que eles passem a usar sesses, em vez de
cookies, para implementar a persistncia do login (ou baixe os scripts do site da Alta
Books, www.altabooks.com.br). Isso envolver modificaes nos scripts index.php, login.
php, logout.php, editprofile.php e viewprofile.php, principalmente para iniciar a sesso
com uma chamada funo session_start() e trocar as referncias superglobal $_
COOKIE por referncias a $_SESSION.
Envie os scripts para o seu servidor web e depois abra a pgina principal do Mismatch
(index.php) em um navegador web. Tente fazer login e logout para se certificar de que
tudo funciona como antes. A no ser que tivesse os cookies desabilitados antes, voc no
dever perceber nenhuma diferena isso bom!
criando aplicaes web personalizadas

A s s e s s e s s e m c o o k ie s p o d e r o n o fu n c io n a r
s e php.ini n o e s tiv e r d e v id a m e n te c o n fig u r a d o
no servido r.
!' Para as sesses poderem funcionar com os cookies
desabilitados, precisa haver outro mecanismo para se enviar
a ID da sesso de uma pgina para outra. Esse mecanismo envolve a
anexao da ID URL de cada pgina, o que ocorre automaticamente
caso session.use_trans_id esteja defnida como 1 (true) no arquivo php.
ini do servidor. Se voc no tiver a capacidade de alterar esse arquivo
no seu servidor web, ter de anexar manualmente a ID URL das
pginas da sesso, caso os cookie estejam desabilitados, usando um
cdigo como este:

scso,frat
URL
a <\uai enviada fo-avs da
<\ue a f$in EdvUr Perlil
siba da e*isfcenia da sesso.

voc est aqui 403


porque o logout automtico?

Os usurios no esto se sentindo


bew-vindos
A p e s a r d e s e r u m b o m aprimoramento em relao
aos cookies, algo no est muito certo com a nova
aplicao Mismatch baseada em sesses. Vrios
usurios relataram que esto sendo deslogados do
aplicativo apesar de no terem clicado no link "Log
Out". A aplicao no parece mais to amistosa... isso
um grande problema.

UsiASrie
rvsb-ad fMnt
t i^o bo**

0s usuivios eso sehdo


deslocados do /VJismaidH
stm tv ilidado no tmk wLoft
0 ut'
criando aplicaes web personalizadas

4 > 0 ____________
c x t c r w q

O que voc ac h a que est fa ze n d o


os usurios serem desiogados
au to m aticam en te do M ism atch? S e r
algo que eles esto fazen d o sem saber?

voc est aqui 405


o tempo de vida dos cookies e sesses

A s sesses tm vida curta...


O problema com os logouts automticos no Mismatch tem Esej voe usando sesses
a ver com o tempo de vida limitado das sesses. Como OMCookies, o prodesso de
v o c d e v e se le m b r a r , as s e s s e s s duram pelo tempo em o 1 o *odo
que a instncia atual do navegador permanece aberta, persisiete na aplidaa.
significando que todas as variveis da sesso so eliminadas
quando o usurio fecha o navegador. Em outras palavras,
fechar o navegador resulta em o usurio ser deslogado,
independentemente de ele gostar disso ou no. Isso no
s inconveniente, como tambm um pouco confuso,
uma vez que j temos um recurso de logout. Os usurios
presumem que no sairo do sistema a no ser que
cliquem deliberadamente no link Log Out.
__ ^ tom ressoes resulta *a driaa
de dus variaveis de sesso.

U vez. destrudas
as variveis da sesso,
o usurio e deslocado-
t^uer queira? *\s*er n3o!

M variaveis sao
destrudas junto dom
a sesso, guando o "X
avegador t -fedhada \

0 usurio edha _
i^vejador, *as pode *ao
perceber *^ue dabou de
se desiogar do sistema.

Embora voc possa destruir uma sesso ao terminar de


us-la, no pode prolongar a sua existncia para alm As variveis
da instncia do navegador. Assim, as sesses so uma
soluo de armazenamento de prazo mais curto do de sesso s
que os cookies, uma vez que estes podem ter uma data d e s t r u d a s JUctndp
de validade definida para daqui a horas, dias, meses
ou anos. Isso significa que as sesses so inferiores aos p usurxp inalza a
cookies? No, de jeito nenhum. Mas significa que as
sesses apresentam um problema caso voc precise sessp fee])and 9
memorizar informaes para alm de uma instncia naVegadpr.
do navegador... como o caso dos dados de login!
criando apficaes web personalizadas

-----------
^
livez. ao para
sempre,
...mas os cookies podem durar para sempre!
mSs empo su-Pidichte
Ao contrrio das variveis de sesso, o tempo de vida de um para durar dis do
cookie no fica limitado instncia do navegador; assim, os *V*e 3 sesso.
cookies podem continuar vivendo, pelo menos at vencer o
seu prazo de validade. O problema que os usurios tm
a capacidade de destruir todos os cookies armazenados na
sua mquina com uma simples configurao do navegador,
portanto, no fique muito contente com a permanncia dos
cookies - de uma forma ou de outra, eles ainda se prestam
apenas para o armazenamento de dados temporrios.

^ De -forma

do
\
see!ha-fce s I
sesses, os doeties
I
so dridos ho
/
w>on>eivo lo^ih.

0 de vida do dookie
detevWinado pe!o seu
0% dookies s sao
pvzo de validade.
destrudos *^u3wdo Ce^ldes so destudes
o seu przo de
vlidde e-^fra- guando a sua Validade
expira, o lJue d a eles
um tempo de vida mais
lo n g o d o Lju e a s V a r i v e i s

de sesso.

voc est aqui > 407


usando cookies e sesses em paralelo

Ento fa ria sentido


usar tanto sesses
quanto cookies, sendo que esses
ajudariam a manter os usurios ogados
por perodos de tempo mais longo? Isso
funcionaria para os usurios que tm
os cookies habilitados.

Desde \ue no esteja lidando tom dados


al-bmente sensveis, ew Cujo tso a W it
seaurana dos ookies seria u argumento fra se
redowendar o uso apenas das sesses.

S im , n o h n a d a e rra d o e m tira r p roveito d a s


v a n t a g e n s d a s s e s s e s e d o s c o o k ie s p a ra
to rn a r o s lo g in s d o M is m a tc ti m a is fle x ve is.
Na verdade, isso pode ser bastante til. As sesses so
melhores para a persistncia de curto prazo, uma vez que
elas so mais amplamente suportadas e no se limitam
pelo navegador, enquanto que os cookies permitem que
voc mantenha os dados de Iogin memorizados por um
perodo de tempo mais longo. Certamente que nem todo
mundo poder se beneficiar do uso dos cookies, mas
ser benfico para muitas pessoas, o que justifica esse uso.
Sempre que puder aprimorar a experincia de usurio
para uma parte significativa da sua base de usurios sem
piorar para os outros, bom faz-lo.
criando aplicaes web personalizadas

Sesses + Cookies * Persistncia de login superior


Para a melhor persistncia de login possvel, voc precisa ser criativo e combinar
tudo o que aprendeu neste captulo para tirar proveito dos benefcios tanto das
sesses quanto dos cookies. Ao fazer isso, pode reestruturar a aplicao Mismatch
de modo que ela tenha o melhor desempenho possvel tanto na persistncia de
login de curto prazo quanto na de longo prazo. $ua*do '
id n o s vanlvfiis da
os eookies so
j para rto to a ***
^ a IP e do usurio-

^ave^dov v/cb,
finalizando

Os dados de So^in
avmz^ndos nos dookics Bvm vez. de mnter os usurios
logados para sempre, os ookles
sao usados pr SC
*as vavivcis da sesso. s so destrudos 1 0 dias depois.

voc est aqui > 409


no existem perguntas idiotas sobre cookies e sesses

m9 existem
fe rg u rrc L s I d i o t a s
~L - Ento a razo para se optar entre sesses e cookies a questo
persistncia de curto x de longo prazo?

No. Essa por acaso acabou sendo a estratgia que ajudou a guiar o
design da aplicao Mismatch, mas cada aplicao diferente, e existem
outros aspectos das sesses e dos cookies que frequentemente precisam ser
ponderados. Por exemplo, os dados armazenados em uma sesso so mais
seguros do que aqueles armazenados em um cookie. Assim, mesmo que os
cookies estejam habilitados e um deles esteja sendo usado unicamente para
manter registro da ID da sesso, os dados armazenados na sesso propriamente
dita so mais seguros do que se estivessem armazenados diretamente em um
cookie. O motivo que os dados das sesses so armazenados no servidor, o
que torna bastante difcil serem acessados por usurios que no tenham os
devidos privilgios. Assim, se voc estiver lidando com dados que precisem ser
seguros, as sesses so mais apropriadas que os cookies.

T * - E quanto ao tamanho dos dados? Isso tem alguma influncia?

Sim, o tamanho dos dados tambm faz diferena. As sesses so capazes


de armazenar pedaos de dados maiores do que os cookies conseguem, portanto
essa outra razo para preferir as sesses caso voc precise armazenar dados
maiores do que algumas strings de texto simples. claro que um banco de dados
MySQL ainda melhor para armazenar dados muito grandes, portanto cuidado
para no se animar demais ao trabalhar com sesses.

> Ento por que eu deveria optar por uma sesso ou um cookie em vez
de um banco de dados MySQL?

Convenincia. Armazenar dados em um banco demanda muito mais esforo,


e no se esquea de que os bancos so mais adequados para armazenar dados
permanentes. Dados de login no so realmente permanentes, num contexto mais
amplo. a que os cookies e as sesses entram em jogo - eies so melhores
para dados que voc precisa ter memorizados por um curto perodo de tempo, e
depois jogados fora.
criando aplicaes web personalizadas
Im as de Greladetct d>
A aplicao Mismatch foi reelaborada para usar sesses e cookies ao
mesmo tempo, com o objetivo de conseguir a melhor persistncia
de login possvel. O problema que parte do cdigo est faltando.
Use os imas de sesses e de cookies para completar o cdigo.

if ( m y s q l i _ n u m _ r o w s ($data) 1) {
// L o g i n OK, d e f i n i r as va r s de s e s s o (e os cookies) de ID e nome do usurio,
// e depo i s r e d i r e c i o n a r p a r a a h o m e p a g e
$row = m y s q l i _ f e t c h _ a r r a y ( $ d a t a ) ;

['user id'] = S r o w [u s e r _ r d '];

[u s e r n a m e ] = $ r o w ['u s e r n a m e ']; login.f |p

'set coo ki e (''use r _ i d ', $row ['user_id' ], time () + (60 * 60 * 24 * 30)); // expira e m 30 dias
setcookie(u s e r n a m e , $row[ u s e r n a m e '], time () + (60 * 60 * 24 * 30) ) ; // expira em 30 dias
$home uri = h t t p : / / - $ _ S E R V E R [H T T P _ H O S T ] . d i r n a m e ($ _ S E R V E R ['P H P _ S E L F ']) . /
i n d e x . p h p ;
he a d e r (L o c a t i o n : 1 . $horae_url) ;

<?php : ~ -------

s e s s i o n - s t a r t ^ s t ^v e r a p a g a r as v a r a de se s s o p a r a f a zer o l ogout

if (iss e t (................. [ iu s e r _ i d []) ) {

// A p a g a as vars de s e s s o l i m p a n d o o a r r a y $ S E S S I O N

................ = a r r a y () ;

// A p a g a o coo k i e de sesso, d e f i n i n d o o seu p r a z o de v a l i d a d e como uma ho r a atrs (3600;

if (isset( ................[se s s i o n _ n a m e () ] ) ) (

s e t c o o k i e ( s e s s i o n _ n a m e (), time() - 3 6 0 0 ) ;

// D e s t r i a s e s s o
s e s s i o n ^ d e s t r o y ();
logout, php
I
LT?3Z>keSde ID 6 de "0me d USUrl' definind 05 de validade como uma hora
s e t c o o k i e (u s e r _ i d , time 0 - 3 6 0 0 ) ;
setc o o k i e (' u s e r n a m e ' , time() - 3600 );

< ? php
s e s s i o n _ s t a r t ();

// Se as vars de sesso no estiverem definidas, tentar defini-las com

if (!iss e t ( ..............

(isset ['user_id']) && isset (

_l 'u s e r _ i d '] =

1u s e r n a m e '] -
Inicis de G elad eira dv f [ f - Soluo
A aplicao Mismatch foi reelaborada para usar sesses e cookies ao mesmo tempo,
com o objetivo de conseguir a melhor persistncia de login possvel. 0 problema
que parte do cdigo est faltando. Use os imas de sesses e de cookies para
completar o cdigo.

Os so
if (mysqli n u m _ r o w s ($data) 1) { _
/ / / / L o g i n OK, d e f i n i r as v a r s de s e s s o (e os cookies) de i d e no m e do u s u a n o ,
// e d e p o i s r e d i r e c i o n a r p a r a a h o m e p a g e
$row = mysqli_fetch__array ($data) ;
noves dookies
$ SESSION [ ' u s e r _ i d ' ] = $row [ u s e r _ i d ] ; d e iiw d o s , lw d s

$ SESSION S j. <u s e rn a m e ' ] = $ ro w [ u se rn a m e ' ] ; ^ Vriaveis d ses$a.

s e t c o o k i e ('u s e r _ i d , $row[' u s e r i d ' ], time () + (60 * 60 * 24 * 30) ) ; // expira em 30 dias


setcookie (username ', $row [u s e r n a m e ], time () + (60 * 60 * 24 * 3 0 ) ; i / expira e m 30 dia
$home url = h t t p : / / - $ _ S E R V E R ['H T T P _ H 0 S T 1] . d i r n a m e ($ _ S E R V E R [ P H P _ S E L F ]) . /
i n d e x . p h p ;
h e a d e r (L o c a t i o n : ' . $ h o m e _ u r l ) ;

<?php
// Se o u s u r i o e s t i v e r logado, a p a g a r as v a r s de se s s o p a r a f a ser o l ogout
login.f
s e s s i o n _ s+t
^avr+t
- {);
/\

if <isset (j $ _ S E S S ION M ' u s e r _ i d ' ])) {


// A p a g a a s Wr'"3g"<?^io l i m p a n d o o a r r a y $ _ S E S S I O N

$ SESSION a r r a y ();

/ / Apaga o cookie de sesso, def:


tinindo o seu prazo de validade como uma hora atrs (3600)
... ^ , i $ COOKIE
if ( i s s e t ( L _ ^ ^ |tsessi o n _ n a m e ( ) ] ) ) { ^ ^ 0

s e t c o o k i e (sessi o n _ n a m e () , 11, t i m e () - 3600) ; ^ " logout, C pVCdiSO pa^r


^ taivbo o ookic da
// De s t r i a s e s s o w .
s e s s i o n _ d e s t r o y () ; . SCS3o ^unxo O
logoutfphp
) / dookies d lojir.
// A p a g a os c o o k i e s de id e de n o m e do usurio, definind' os seus p r a z o s de v a l i d a d e como

esicdefinidos.
uma h o r a atr s (3600)
s e t c o o k i e (' u s e r _ i d , ', t i m e () - 3600); Cso o wsuirio t^ao st\a
s e t c o o k i e ('username', , t i m e () - 3600) ; ^ I c ^ d o a t r v da S tS S o,

______________________ verilidav *r f

<?php
s e s s i o n _ s t a r t ();

// Se a s vars de sesso no estiverem definidas, tentar defini-las com um coofcl

[ 'user_id' ] ) )

M okies/sesocs ser
'I 'u s e r n a m e ' ] ) ) {
M'user id' ] ) && isset (

['user_id'] = ['us e r _ i d ] ;

[ u s e r n a m e ] 0 wicswo dodf^o de ifldfiX.php


1u s e r n a m e ']
$_ _cookie deve
I n doioddo e edi-frproiie-
?> Pehna as variaveis da ?h? c v ic^ ciile fh f.
sessao usahdo os dookigs. ____________
criando aplicaes web personalizadas

ffgPjPP

TteST ORtve________________
M o d ifiq u e o M is m a t c h p a ra u s a r s e s s e s c o o k ie s .
Modifique os scripts do Mismatch de modo que eles usem tanto as sesses quanto os
cookies para implementar a persistncia do login (ou baixe os scripts no site da Alta Books,
www.altabooks.com.br). Ser preciso modificar os scripts index.php, login.php, logout.php,
editprofile.php e viewprofile.php.
Envie os scripts para o seu servidor web e depois abra a pgina principal do Mismatch
(index.php) em um navegador. Tente fazer login e depois fechar o navegador, o que far
com que as variveis da sesso sejam destrudas. Abra novamente a pgina principal e
verifique se voc ainda est logado - os cookies tornam isso possvel, uma vez que eles
persistem para alm de uma sesso do navegador.

Combinando tock\es e sesses,


nos obremos pevsistena
mis lon^a, ale* da otia
pevsistenia de duvfce
prto <\<*e ja esta sendo
possibilitada pelas sesses.

Z 7
0 uso de Cookies pta
f ! / *>e!hora\r as sesses '0
ajuda os usuirios ^ue
desablfta<ram os ookies
*<>s seus navegadores... no
* fossfvel a^ada*- a todos.

voc est aqui 413


caixa de ferramentas php e mysql

Sua Caixa de Ferram entas do PHP & M y S Q L


V o c a p re n d e u b a s t a n t e s o b r e c o m o c r ia r um s is t e m a de
7

g e re n c ia m e n to d o s u s u r io s p a r a fa z e r p a rte d a a p lic a o
cA m o L o

M is m a tc h . V a m o s re c a p itu la r a lg u n s d o s p o n to s p rin c ip a is.

^<;jdof _ ................
st a wr>ao v^fce^a-4?!. w*> t*t> resultando
' : il .I: f t** \m sfcring de ^O daradteres
H e^ d i* a ii < ^ tthao
? razo de -frnctc :u* ofant maneira d t se
O ^ a l O ookic dcst^W o, Se d r ip t ^ r a ^ <\ue fredise**
no &>r ornedido nenbum ftTo, 3 ^htar j^donbedrveis mesmo
o toolee f a ^ o s s ^ ^ue o dentro do bando dt dados ,
porem, vim prodesso se&> volta#
si^niidando <^ue nao evste uma

^ 5i_m >?fI#iVi- 1 i-ii ;V'' fen^So de "desdripto^ra& r

* ' $vtefcna;$ t ,., W $ & &


s e s s io n _ _ d e s t r o y ()
f. ife,-^ ' 1. : t.
sta &n$o interna do PHP edka
if l doofciee abwa
*/^ses$o,e deve ser dhamada
; 'W :3&& ..^tl^r <aifv*e <\ue vode tiver terminado de
- ;-<ierjbriir%adl3 sesso. sta
**<:<->*x*
*!>.**-IW**>
*
* ;' <& ;j& v^:*io destri as variaveis ;
^;^eso yorem, importante
eli^na-las manualmente, esvaziando
Estawnaowvtevr^^ in^i

ja existente* Vpdt predisa tKi>aV'


:;;efe/:$|^ .
^ is ^ u e * variveis da sesso super^lobal interna do
usada para se acessar
dados da sesso- T rata-se de v>**
array, e dada varivel da sesso
e armaxenda domo uma entrada
no a rra y Assim, para se adessar
o valor de uma varivel, e prediso
espediAdar o seu nome na forma
de dite do array
criando aplicaes web personalizadas

+
A u c k rk ? f i m m
Algum bagunou vrias partes do cdigo da aplicao Mismatch
e no conseguimos nos lembrar do que elas fazem. Desenhe
linhas conectando cada pedao de cdigo com o que ele faz.
C d ig o P H P /M y S Q L D e s c r i o

Usa uma varivel de sesso para


empty($_COOKIE['user_id']) determinar se o usurio est
logado ou no.
setcookie (session name(), 11, time() - 3600) ; Use um cookie para determinar
se o usurio est logado ou no.
Destri um cookie de sesso,
SHA( '$user_password') definido o seu prazo de validade
como vencendo uma hora atrs.
se ssion_destroy() Criptografa a senha do usurio,
colocando-a em um formato
irreconhecvel.
setcookie{'user_id', $row['user_id']) Armazena a ID do usurio em
um cookie.

$_SESSION = array() Inicia uma sesso.

session start () Fecha a sesso atual.

isset{$ SESSION['user id']) Destri todas as variveis de sesso.

voc est aqui 415


quem faz o que soluo

Algum bagunou vrias partes do cdigo da aplicao Mismatch


e no conseguimos nos lembrar do que elas fazem. Desenhe
linhas conectando cada pedao de cdigo com o que ele faz.
P H P /M y S Q L C o d e D e sc rip tio n

empty ($_COOKIE ['user_id ']) Usa uma varivel de sesso para


determinar se o usurio est
logado ou no.
setcookie (session name(), time() - 3600) Use um cookie para determinar
se o usurio est logado ou no.

SHA(1$user_password' ) Destri um cookie de sesso,


definido o seu prazo de validade
como vencendo uma hora atrs.
session destroy() Criptografa a senha do usurio,
colocando-a em um formato
irreconhecvel.
setcookie('user id', $row['user idT]) Armazena a ID do usurio em
um cookie.

$_SESSION = array() Inicia uma sesso.

session start () Fecha a sesso atual.

isset{$ SESSION['user id']) Destri todas as variveis de


sesso.
7 Vi Elimine &cligo Duplicado ^k_

* Compartilhar Cuidar

Guarda-chuvas no so a nica coisa que pode ser


Compartilhada . Em qualquer aplicao web, voc poder encontrar situaes
em que um mesmo cdigo encontra-se duplicado em mais de um lugar. Isso no s um

desperdcio de recursos, como tambm pode levar a problemas de manuteno, uma vez
que inevitavelmente acabar fazendo modificaes, e estas tero de ser efetuadas em mais

de um lugar. A soluo eliminar o cdigo duplicado, compartilhando-o. Em outras palavras,


voc mantm o cdigo duplicado em apenas um lugar, e depois referencia esse cdigo

sempre que precisar dele. A eliminao de cdigo duplicado resulta em aplicativos mais
eficientes, de manuteno mais fcil e finalmente mais robustos.

voc est aqui 417


localizar o cdigo duplicado

A aplicao Mismatch evoluiu ainda mais desde a ltima vez que voc a
viu, com uma navegao aprimorada e uma aparncia mais consistente.
Mas essas melhorias acarretaram um custo... cdigo duplicado. Apenas
olhando as prprias pginas, veja se voc consegue descobrir quais
partes do Mismatch poderiam estar representando um problema de
cdigo duplicado. Circule e escreva comentrios nessas partes da
aplicao, e escreva tambm qualquer coisa no visvel que voc ache
que tambm possa estar tendo problemas com cdigo duplicado.

Mismatch - W hat opposites attract!


Hom e ** View Profited StLftek

L a te st bb *

t
*
Bad
A
M'
J l
Ccpyngh-2009MenmckolKpr,i-ta

index.php
elimine cdigo duplicado

Mismatch - View Profile


Ho * * V iew Profile * Edit Prutile L op Qm limillles'l

Username: jneities
First sane: Johan
Last name: Nettles
Gender: Male
Birthdate; 1981-11-03
Location; Atheas,GA

Picture:

Would yoo like to edit your pmttte?

Copyxjbt & 2009Misratcfe Enterprises* fee.

viewprofile.php

editprofile.php

voc est aqui 419


cdigo duplicado do mismatch

A aplicao Mismatch evoluiu ainda mais desde a ltima vez que voc a viu, com
uma navegao aprimorada e uma aparncia mais consistente. Mas essas melhorias
acarretaram um custo... cdigo duplicado. Apenas olhando as prprias pginas, veja
SoLuo se voc consegue descobrir quais partes do Mismatch poderiam estar representando
um problema de cdigo duplicado. Circule e escreva comentrios nessas partes da
aplicao, e escreva tambm qualquer coisa no visvel que voc ache que tambm
possa estar tendo problemas com cdigo duplicado.

0 ttulo W/Vlism3tdh
aprede cr todas as
pginas, to apenas a J?
o titulo detalhado Q
variando de pagina
para pagina*

0 menu de
avegao
viewprofile.php
idenido eih
* tres paginas.
index.php

0 rodap da pgina, *\ue


dontem s inormaoe* de
dopyright da aplidadao, e
sempre o mesmo-

Tdas as paginas ^ue dependem


do login do usurio requere
exatamente o mesmo ddigo
de inicializao da sesso e de
veri-fidao do logi. editprofile.php
elimine cdigo duplicado

0 M ism atch est em pedaos


Portanto, a aplicao Mismatch tem alguns elementos comuns que esto repetidos nos
principais scripts, no momento. Por que isso to ruim? Porque toma a manuteno da
aplicao mais difcil. O que acontecer se voc decidir adicionar uma nova pgina, que
requeira um novo item de menu? Voc ter de modificar o cdigo do menu em cada um
dos scripts, para exibir o novo item. O mesmo se aplica ao aviso de Copyright.
A soluo para o problema s armazenar cada informao apenas uma vez. Ento,
se algum dia o cdigo precisar ser modificado, voc s o modifica em um lugar.
Com isso em mente, possvel repensar a organizao do Mismatch em termos de
componentes reutilizveis.

0 cabepalho das pginas


O script header.php contm
o ttulo da pgina, o qual
referencia uma varivel
para apresentar um ttulo Este do>*p<men-fce *ao resulta
diferente em cada pgina. a* ddi^o ttMTL visvel, mds
header, php O cabealho tambm inclui ele te uw papel vital no
cdigo HTML padro e $e<reh.iarr>eto dos lojins dos
cuida de tarefas tais como usurios e -toda aplicaao
vincular a folha de estilo CSS. ^ ATismatH-
0 menu de navegao 0 micializador de sesso
O script navmenu.php gera O script startsession.php
um menu de navegao responsvel por iniciar
para a aplicao, baseado a sesso e verificar se o
em se o usurio est usurio est logado.
logado ou no. O menu
navmenu.php ^e navegao apresenta
links "Log In e "Log Out" startsession.php
conforme necessrio.
0 rodap das pginas
O script footer.php exibe
um aviso de Copyright para
a aplicao e fecha as tags
HTML abertas no cabealho.
Assim, o cabealho e o
footer, php
rodap trabalham em
conjunto, tendo sempre de
ser usados juntos.
voc est aqui 421
mismatch precisa de um template

Reconstruindo o M ism atch a partir de um template


Ok, ento ns dividimos os Mismatch em vrios scripts, mas
como fazemos para eles funcionarem bem juntos? Voc j est Os templates
familiarizado com o conceito de arquivos includos, e estes fazem permitem cjue uma
parte da soluo. Mas voc tem que pensar mais alto do que apenas
incluir arquivos... voc tem que pensar em termos de templates aplfra ? B T seja
("modelos"), os quais lhe permitem criar uma nica pgina como constmda a pattr
a combinao de vrios arquivos includos. O templates como
uma planta para as pginas da aplicao, onde todo o contedo, d e C Q m p Q n e tite s
exceto aquele que realmente nico pgina em questo, vem de
arquivos includos. s c r i p t te u tliz V e ls .
A verso do Mismatch com templates requer que coloquemos os
cdigos comuns em scripts que desempenhem papis bastante 0 dabedaiho aparede n alto
especficos: alguns responsveis por gerar cdigo HTML visual, de dada pagina do Mismatdh,
outros por alguma outra funo. A ideia destilar o mximo e exibe o ttulo da aplidao
possvel de funcionalidades comuns em arquivos a serem juntamente do* un ttulo
includos e ento s deixar em cada pgina o cdigo que seja espedfido da pgina-
completamente nico a ela.

^startsession.php

Cada pgina do /Vlismatdh


e^ue -for personalizada para o
usurio exigira um dodigo de
login, o <\ul mantm registro
do usurio.
f navmenu.php

0 menu de nvegadao
aparede logo abaixo do
0 rodap Comede dontedo dabedalho, e iornede a dada
na parte de baixo de pagina do Msmatdh um
todas as pginas do menu donsistente, <^ue pode
Alismatdh, o <^ual indlui um ser usado para navegaa
aviso de dopyright- Copyright 2C9Mimatch entre as paginas prindipais.

index.php

Com tantos outros sdripts ajudando,


footer, php index.php -fida endarregado apenas
do seu pape! prindipai, \ue exibir a
list prindipai de usurios-
elimine cdigo duplicado

no e x is te m

Perguntas Idiotas

I 0 que exatamente um template? Ele no apenas um monte de


arquivos includos?

Sim. Um templates um conjunto de arquivos includos, mas


um conjunto elaborado especificamente para dividir uma aplicao em
componentes funcionais, 0 objetivo reduzir cada pgina ao que
realmente especfico a ela, e somente a ela. Assim cabealhos, rodaps,
menus de navegao e quaisquer outras-partes'da aplicao que sejam as
mesmas, ou semelhantes, em mais de uma pgina so candidatos ideais
para inciuso em um templates. 0 resultado final que voc coloca o
cdigo dos templates em arquivos PHP que sero referenciados por outros
scripts que precisem deles.
Voc pode pensar no templates como um grupo de arquivos que vo alm
de apenas reduzir a quantidade de cdigo duplicado - eles ajudam a
organizar as funcionalidades de uma aplicao. O Mismatch um exemplo
relativamente simples de como usar os templates - aplicaes PHP maiores
e mais complexas, frequentemente empregam sistemas de templates
bastante sofisticados.

- O cdigo do template no tem de ser exatamente o mesmo para


poder ser compartilhado entre vrios scripts?

No. perfeitamente aceitvel que o cdigo do templates seja


apenas semelhante, e no exatamente igual. O motivo que voc pode usar
variveis para permitir algum grau de personalizao ao aplicar o script a
diferentes pginas. O ttulo das pginas no Mismatch um exemplo perfeito
disso. 0 modelo do cabealho semelhante em.cada pgina, no sentido
que o ttulo sempre comea com "Mismatch -". Mas o ttulo especfico
diferente, e por isso que precisamos de uma varivel para fornecer um
meio de mudar ligeiramente o ttulo em cada pgina.

voc est aqui 423


mismatch agora usando templates!

Reconstrua o M ism atch com templates


O trabalho de design envolvido em se dividir uma aplicao em templates geralmente
recompensador. No fim das contas, voc ter um conjunto de scripts pequenos e bastante
focados, bem como ter um cdigo radicalmente simplificado nos scripts principais da
aplicao, os quais agora dependem dos scripts templates. 7nta resetar a
variveis da ssao
<?php
session_start() ;
dom dookies, dso
// Se as vars da s e s s o n o estiverem definidas, tente defini-las fc^elas no
inicia com um cookie
if (!isset{$__SESSION['user^id'1)) {
a if (isset($_COOKIE[user_id]) && isset($_COOKIE['username']))
$_SESSION [user__id'] = $JTOOKIE[user_id'];
sesso 5_SESSI0N['username] - $_COOKIE[u s e r n a m e ,
) Cria um link para a
}
?> PolHa de estilo da
apliiaao.

!tia o toi^o <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML .1.0 Transitional//EN


H/VlTL oitial - "http://www.w 3 .org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns=frttp;//www.w 3 .org/999/xhtml" xml;
tom um <head> lang="en" lang
P0CTYP e <meta http-equiv=''Content-Type
content^text/html; charset
um3 t$ <KW>- <?php
Cria um ttulo
?>
echo '<title>Mismatch -
$page_title , '</title>
personalizado
usando a varivel re;L^"3tylesheet" type="text/cas" href=" style.cs
</head>
fpdgc__i-tlc, <\ue <body>
e -fornedida pelo
sdripi <^ue indluir <?php

este arquivo. ?>


echo '<h3>Mismatch -
$page_title . < / h 3 > '

<?php
// Gera o menu de navegao
echo '<hr />'; header, php
if (isset($_SESSION['username'])) {
echo <a href="index.php">Home</a> &I10Q84;
echo 1<a href="viewprofile.php">Ver Perfil</a> s#10084;
echo '<a href="editproile.php">Editar Perfil</a> S#10084;
echo <a href="logout,php">Log Out (' . $_SESSI0N['username'] 1)</a>1;

HMTL.
'<a href=" login .'php">Log In</a> &#10084;
/VJostra um aviso
<a href=signup.php">Cadastrar-se</a>'; de dopyright e
edha o dodigo
echo

Ift se o usurio est <hr /> ^


<p class="footer">Copvright &copy;2008 Mismatch Enterprises,
logado, e ento, gera </body>
o menu de navegaro </html>
elimine cdigo duplicado

0 sdript startsession.php predisa ser


o primeiro a ser indiudo, para ^ue a A varivel /pagejrk
determina o ttulo da
sesso seja inidiada e o restante do
sdript tenha adesso aos sews dad pgina \ue exibido
dentro do dabedalh
< ?php
'7/ I n i c i a a s e s s o
,requir e _ o n c e ('s t a r t s e s s i o n . p h p 1} i

I n s e r e o c a b e a l h o da p a g m a
As variveis da denexo e
$ p a g e _ t i t l e = 'Onde os o p o s t o s se a t r a e m ! ^ as da apidaao ainda so
kr e q u i r e _ o n c e ('h e a d e r . p h p '); indluidas a partir de sdripts
^ separados, doo antes.
r e q u i r e _ o n c e ('a p p v a r s .p h p ');
r e q u i r e _ o n c e (1c o n n e c t v a r s . p h p ');
0 menu de navegado gerado
// M o s t r a o m e n u de n a v e g a o depois do dabedalho, mas antes do
.require on c e (' n a v m e n u .php ' ) } ,
dorpo da pagma-
f// C o n e c t a - s e ao b a n c o de da d o s
$ d b c = m y s q l i _ c o n n e c t ( D B _ H O S T , DB_USER, D B _ PASSWORD, D B _ N A M E ) ;

/ / O b t m os dados do u s u r i o a p a r t i r do M y S Q L
$q u e r y = "SEL E C T user_id, first _ n a m e , p i c t u r e F R O M m i s m a t c h _ u s e r W H E R E f i r s t _ n a m e IS NOT)
NULL .
"O R D E R BY j o i n _ d a t e DE S C L I M I T 5";
$da t a = m y s q l i _ q u e r y ( $ d b c , $ q u e r y ) ;

// Faz l o o p a t r a v s do a r r a y de d a d o s do usurio, f o r m a t a n d o - o s como HTML


ec h o ' < h 4>Membros m a i s n o v o s : < / h 4 > ' ;
ec h o '< t a b l e > ';
while (?row= mysqli_fetch_array($data)) {
if ( i s _ f i l e ( M M _ U P L O A D P A T H . $ r o w ['p i c t u r e ']) & f i l e s i z e ( M M J J P L O A D P A T H .
$row [1p i c t u r e 3 ) > 0 ) {
e c h o ' < t r > < t d X i m g src=" ' . M M _ U P L O A D P A T H . $ r o w [p i c t u r e '] . '" alt=" ' . $row['first_
n a m e '] .
1" / > < / t d > ;
}
else {
e c h o 1< t r > < t d x i m g src=" 1 . M M _ U P L O A D P A T H . 'nopic.jpg' . '" alt=" ' . $ r o w [ ' f i r s t _
name'] .
/></td>';
}
if ( i s s e t ( $ _ S E S S I O N [ u s e r _ i d ])) {
e c h o '< t d x a h r e f = " v i e w p r o f ile . p h p ? u s e r _ i d = ' . $row [' u s e r _ i d ' ] . ,,1>' . $row['first_
n a m e '] .
'< / a > < / t d > < / t r > 1 ,
}
else {
e c h o '<td>' . $ r o w [ ' f i r s t n a m e 1< / t d > < / t r > ';
} o s*f> vcrft I
modeto agora t reaWe^te
ec h o ' < / t a b l e > ' ;
untdo a esta portant
h muVto ew dele-
?>
mysqli__close ($dbc) ;

0 rodape -finaliza a pagina, e


< -,,
? B te , , , predisa vir por ultimo, ua vez.
// Inse r e o r o d a p e da p a g i n a \ r . i
<^ue e ele <\ue -redha as tags
?>
,^equire_once ( 'f o o t e r .p h p ') ;
HTML.

voc est aqui 425


uma aplicao php bem desenhada

0 Mismatch est novamente em p., e muito melhor organizado


Embora o pensamento de destrinchar o Mismatch em pequenos
pedaos possa nos ter deixado um pouco nervosos, o resultado
final definitivamente valeu o esforo. A aplicao agora est 0 tdigo de ^
dividida em vrios novos arquivos templates (inclusos), os midializao da sesso
quais oferecem muito melhor organizao e maximizam o e wsado por <\*al\ue<r
compartilhamento de cdigo. Se voc precisar modificar um desses pgina <\ue requeira
pedaos, basta editar um arquivo e o efeito se far sentir em toda a login do usuavio.
aplicao... esse o poder dos templates!
0 sdrift star-bessionfKf
lida to as -tareias de log's

0
nos bastidores c no odupa
nctar* espao virtual a
pgina- startsession.php

0
menu de
navegao
ornede links
teis para as
cabealho da
partes pHndipais
pagina indlui
tdigo HTML da aplida^o.
e o irtulo da C '
pagina.

navmenu.php

0 vodape da pg^a
.on-tw> ift-ov-matoes
de topYngh para
-boda a aplitao-
se vote predisar
mtadav o aviso,
basta modi-fitaio
em apenas ww> lugarj
V-------^

footer, php
8 C on tro le S e u M u n d o

Colhendo Dados
w

Nada como uma boa colheita de dados no outono. Um sem-fim de


informaes prontas para serem examinadas, classificadas, comparadas,
combinadas, enfim, qualquer coisa que a sua excelente aplicao web
precisar que seja feito. Compensador? Sim. Mas assim como as colheitas
na vida real, preciso muito trabalho duro e uma boa dose de conhecimento
para se obter controle sobre os dados em um banco MySQL. Os usurios da
web exigem mais do que dados estticos e enfadonhos. Eles querem dados
enriquecedores... dados compensadores... dados relevantes. Ento, o que
voc est esperando? D a partida no seu trator MySQL e mos obra!
este um novo captulo 427
procurando uma relao de amor-dio

Fazendo o desencontro perfeito


O aplicativo Mismatch tem um nmero cada vez maior de usurios registrados, e eles esto
prontos para ver resultados. Precisamos permitir que os usurios achem os seus opostos
ideais, comparando o que amam e o que odeiam com as preferncias dos outros usurios,
em busca de desencontros. Para cada "adoro combinado com um "odeio", maior a
probabilidade de um casal formar um par imperfeito.

Sidney ainda pvodura


o seu p\rfhdipe
e^tantado, ii3s ela
te*" a sensao de <^ue
ele vai odiar reality
shows -fcan-fco <^ua>vfco
ela os ador-
Lewbra do Oo^a) w*
doratSo solitrio e
busa de al^Vk \ue
odeie 'levantamento

r*_ x.
pesos tanto quanto
adora?

Odeio tatuagens
Adoro botas de caubi
4doro tatuogerts
Adoro realty shous:
A d o ro b o fa s d e caubi
Odeio filmes de te rro r
* O deio resfity shows
Odeio presunto
- d oro film e s d k t e r r o r
Adoro comida apimentada"
"Adoro presunto .
Odeio Hooard tern
Adoro Barbara treisand^ *doro comida apimentada1
Odeio levantamento de^ ^doro Howard Stem
peso ~
dco Barbara Streisand
Adoro escalada
^doro evantamento de peso
Odeio escalada
h lta k W S rv t odeio da Sidney
tonhrsl bshnic tom a de
Johan, o ue OS torna um potential
par iper+eito-
controle seus dados, controle seu mundo

Os desencontros se referem aos dados


Para podermos estabelecer desencontros entre os usurios, precisamos primeiro
determinar o melhor modo de organizar os dados que informam o que eles adoram e o
que odeiam. Saber que as informaes sero armazenadas em um banco de dados MySQL
no suficiente. Precisamos organizar esses tpicos de adoro/odeio de forma que sejam
mais fceis de gerenciar, permitindo que os usurios respondam a tpicos relacionados,
indicando que eles adoram ou odeiam cada um.

Topidos semelhavas sao


agrupados, tomo este a<\w
para aparoxdia sid-

Cada tpido individual


redebe uma resposta
adoro/odeio, ^ue e
domparado dom as
respostas dos outros
usurios.

Escreva aqui como voc organizaria os dados do


Mismatch em grupos separados que possam ser
armazenados em um banco:

voc est aqui 429


um modelo de dados para mismatch

Pivida os dados do M ism atch


Criar um modelo de dados para uma aplicao como o Mismatch um passo extremamente
importante, uma vez que ele tem u m grande controle sobre o modo como a aplicao
construda. No c a s o d o Mismatch, ns p o d e m o s dividir o s seu s dados em trs tipos.
As daegorias
j s3o
usadas para se agrupar
Categorias -bofidos relationalaos.
As categorias so usadas
para ajudar a organizar os Os -opidos iorwim o
tpicos. Embora elas no teve dos dados do
desempenhem um papel yVjisft.atc.K, detdmdo
direto no estabelecimento t^ais parmetros
de um par imperfeito, elas pode** ser tombados
ajudam a facilitar a tarefa pava se estabelederen
de os usurios digitarem as os pares.
suas respostas. Tpicos
O estabelecimento de pares
'Rpdlity T V 1
feito encontrando-se
^ m- W eightlifting opostos, tais como o gosto
por tatuagens ou comida
H o rrf
apimentada, cada um dos
Respostas HiWng quais recebe uma resposta do
Os usurios se descrevem, usurio - adoro ou odeio.
para os propsitos do
Mismatch, respondendo _
aos tpicos. Cada resposta $s respostas so as de adoro/odeio
individual apenas um para dada tpido, e so espedidas
valor de adoro ou odeio para dada usurio do /V}ist*akdH.
em resposta a um tpico.

Como exatamente esses dados levam a um desencontro entre dois usurios? Ns


comparamos as respostas que os usurios deram a cada tpico. Por exemplo, uma vez
que Sidney e Johan tm respostas opostas para o tpico "Filmes de terror", achamos um
desencontro nesse tpico particular. Para descobrir o melhor par imperfeito para um
usurio, temos de encontrar o usurio com a maior quantidade de tpicos respondidos de
forma oposta ao primeiro. Adoro^

Fffle de terror

0 -(-ato de Sidney 3o
gostar de -fiWes de terror
leva a un> desentomkro. U m d e se n c o n tro !
t
controle seus dados, controle seu mundo

Modele o banco de dados com um schema


Para podermos traduzir os requerimentos de dados da Uma descrio dps
aplicao Mismatch em um projeto de banco de dados ciadas (as tabelas e
propriamente dito, precisamos de um schema. O schema
a representao de todas as estruturas do seu banco de as colunas) <fc seu
dados, como por exemplo, tabelas e colunas, alm do bancp de dadps,
modo como eles se conectam uns aos outros. Criar uma
representao visual do seu banco pode ajud-lo a ver como juntP com ^iials^uet
as coisas se conectam quando voc estiver escrevendo suas
consultas, sem falar que ela esclarece o que cada coluna P u frP S objetos
responsvel por fazer durante a conexo. Como um
exemplo, vejamos o schema do banco de dados original
elaclpnadps e a
do Mismatch, do captulo anterior, que consistia apenas da f o r m a c o m p eles
tabela mismatch_user. se conectani, um
0 rtomc d tbel-
sciema.
^ m m a tc h u s c 111 :

u s e rjd O "'* Este smbolo indida


username \ue doluna C (Ama
password dhave pvimvia para
<3tabela.
join_date

first_nam e

!ast_name
gender

b irthdate

city outras tolunai da "tabela


state
sao listadas da -Porma ttmo
cias aparedem na estrutura do
picture banCo de dados.

Esta forma de se considerar a estrutura de uma tabela


um pouco diferente do que viu at agora. As tabelas
normalmente tm sido representadas com os nomes
Criai- um diagrama
das colunas na primeira linha, com os dados logo l]je petmffce manter
abaixo. Essa uma tima forma d se visualizar tabelas
individuais e tabelas preenchidas com dados, mas no 9 d e s i g n da tabela
muito prtica quando queremos criar um diagrama
estrutural de vrias tabelas e do modo como elas se separadp dos dadps
relacionam. E o Mismatch j est precisando de mais de
uma tabela... cpntdps nela.

voc est aqui 431


escolha o m elhor schema do mismatch

0 banco de dados do Mismatch est precisando armazenar as respostas


dos usurios para tpicos do tipo adoro/odeio, bem como os nomes
dos tpicos e as suas respectivas categorias. Apresentamos aqui trs
projetos de bancos de dados para incorporar as categorias, os tpicos
e as respostas no banco do Mismatch. Circule o schema que voc acha
mais apropriado, e escreva por qu.

soos novos dddos


category II - r fvefiisamos armazenar para dav-
topic suporte o ovo redurso de bus<3
por pav-es do /WismaUh.
response mi sma tch_topi c

m is m a tc h _ _ u s e r topic. W I B I 8 -iqrtegory" :
1 Tattoos Appearance
2 Cowboy hats Appearance
3 Reality TV
.^,1__ ********
Entertainment
11 j nettles 4 Horror Entertainment
movies

mismatch resbons
response. 1 niirr
*Sit
If S i*
iHBiWIi

101 Love 11 1
102 Love 11 2
103 Hate 11 3
104 Love 11 4


fill m _ t_
i^ m atd i response
IIHwnuw*!.._ ^rt1i
c-
response id
to p ic jd
response
nam e
user id
category
tooic id
controle seus dados, controle seu mundo

mismatch user
serjd iiiii !

h jnettles

mismatch_response

ufSt" T *
101 Appearance Tattoos Love 11
102 Appearance Cowboy Love 11
boots
103 Entertainment Reality TV Hate 11
104 Entertainment Horror movies Love 11

mismatch user
! r""**1"* H lilS f S l
******** 1 Love
h jnettles
jnettles ********* 2 Love
h

h jnettles
******** 3 ] Hate

jnettles ******** 4 Love


11

mi smatch_topic
litopfcld l r ;. name /. .category
1 Tattoos Appearance
2 Cowboy hats Appearance
3
4
Reality TV
Horror
movies
Entertainment
Entertainment

voc est aqui 433


mefhor schema da base de dados m ism atchs

0 banco de dados do Mismatch est precisando armazenar as respostas dos


usurios para tpicos do tipo adoro/odeio, bem como os nomes dos tpicos e as
x , suas respectivas categorias. Apresentamos aqui trs projetos de bancos de dados
& C |C |0 pa ra incorporar as categorias, os tpicos e as respostas no banco do Mismatch.
O Lu O Circule o schema que voc acha mais apropriado, e escreva por qu.

m primeiro lugar, importairfte -Pidar diaro ^ue os midos dados


novos mo prodesso d se obter respostas adoro/odeio do usuirio
so as prprias respostas tudo o ais no ba^do de dados
permanede o mesmo, pelo menos do ponto de vista do usurio-

mi smatchjaser top icid iis iiii


Quem disse <\ue o mais simples e 1 Tattoos Appearance
2 Cowboy hats Appearance
sempre o melhor? ste sdhema
******** 3 Reality TV Entertainment
armazena as respostas em uma h jnettles
4 Horror Entertainment
movies
tabela prpria para elas, separada
dos ovtros dados <\ue *>ao sejam
impadtados diretamente por elas.
A nova tabela
Na h duplidado das respostas, mismatch_ re s ] >onsej^ mismatdh_topid

ffr "S'-
porque os usurios, as tate^orias armazena os nomes
e os tpidos idam todos -fora da ism dos topidos e as suas
respedtivas dategorias
tabela mismatdbjresponse. 1
101 Love 11
102 Love 11 2
Kao Ha dados
103 Hate 11 3
duplidados para
104 Love 11 4
dada resposta, o

^ue e muito bomj

response id H H B M H M M Q i
to p ic jd
response
name
^ user id
category
topic id 4 """"

A tabela mismatdhjresponse donedta


A tabela mismtdh__user original os usurios e os tpidos atravs das
permnede sem modiidadoes. doiuns user_jd e topid_jd-
controle seus dados, controle seu mundo

As ("espostas nO ltdrrt dV-n3ZdclS dentro d - : V. : :


tabela dos usurios, O que e otimo- Mss existe
uma quantidade excessiva de dados duplicados,
porque as categorias e os tpicos so replicados
para cada resposta. ^
mi smatch__user
l ir M se ra a ^ passv -

11 jnettles ********

mismatch_response
||P |y |S ! | user:
i i S i A I h ^sJlliSillfl
lWlstiMllikll ilrtMftfi a

101 Y Appearance Tattoos"-^ j Love h


102 I Appearance Cowboy s) Love ii
boots ^
103 { Entertainment Reality TV || Hate 11
104 ' ^Entertainment Horror m ovieyi Love h

. - - K ........................
As categorias e os
tpicos so duplicados
Os dados dos usurios para^ cada resposta, 0
sao pessimamente *V*e um desperdcio,
Nao e mi ideia dividir
replicados a cada inaceitvel de
resposta- reCursos- as categorias e os
mi sma tch__user tpicos em uma tbela
para cada um, mas
H i
vM m B Ip ill da -forma Como esta
mm
fst sendo -feito, temos de
******** Love criar uma linha para
11 / jnettles
******** I 2 Love cada resposta- (sso nos
11/ jnettles
******** ... 3 Hate deixa com 4r Johans
11\ jnettles
******** J \ 4 Love para respostas.
11 ^ O n e ttle s
Nada bontf
...

mi smatch_topic
t *ic jd l!l!WltwttlS%8s!
1 Tattoos Appearance
2 Cowboy hats Appearance
3 Reality TV Entertainment
4 Horror Entertainment
movies
*
435
schema do mismatch usa chaves estrangeiras

Junte vrias tabelas


Para conectarmos as tabelas de modo a formar um sistema Uma cLaVe estrangeira
de dados coeso, precisamos usar chaves. Ns j usamos (foregn key) uma
chaves primrias para fornecer um identificador nico para
os dados de uma tabela, mas agora precisamos de chaves coluna, em umatat>ela,
estrangeiras para vincular uma linha de uma tabela a uma que referencia a cJiflVe
linha de outra tabela. Uma chave estrangeiras de uma tabela
referencia a chave primria de outra, estabelecendo entre as prm fla (ptnw y key)
duas uma conexo que pode ser usada em consultas. de outra tabela.
O schema que elaboramos para o Mismatch no exerccio
anterior depende de um par de chaves estrangeiras
na tabela mismatch_response para conectar linhas de
respostas a linhas de usurios e tpicos em outras tabelas.

sta dhave primria nao apenas


idcwtifida individualmente
Lembre-se, este
os tpidos dentro da "tabela
smbolo ideht-(-ida
username n>ismatdh_topid, tomno tambm
ua dhave primria.
donedta os tpidos s respostas
password
da tabela mismatdh__response.
join_date

first nam e

last nam e
gender

b irth d ate

city
state
picture As tabelas mismatch response
c l 'l i I * , , e '* IStt'atdh_topid trabalha*
y * boi Msbr Y * para
&ta seta mostra a tabela to U a t uma dkave sp o sb s adaro/edeic
'smatdhjser esta donedtada a qua! r e -V ere d a uma dhave
tabela i*ismath_jrespMe por meio primaria em outra tabela-
das dhaves.

Sem as chaves estrangeiras, seria muito difcil


As setas grandes .
associar dados de uma tabela com dados de mostram as ctaVes
outra. E dividir os dados entre mltiplas tabelas
justamente o modo que encontramos para eliminar
prlmras cpnectandp-se
a duplicao de dados e conseguir maior eficincia s cfcaVes estrangeiras,
para o banco. Assim, as chaves estrangeiras
desempenham um papel importante em todo para Vincular as ^
schema de bancos de dados, por mais simples que
o banco seja.
tabelas entre sx.
controle seus dados, controle seu mundo

Chaves estrangeiras em apo


Muitas vezes, til visualizar os dados fluindo para as tabelas e conectando-as umas s
outras atravs de chaves primrias e estrangeiras. Dar uma olhada com mais ateno nas
tabelas do Mismatch, com alguns dados nelas, ajuda a revelar como as chaves primrias e
estrangeiras se relacionam umas com as outras.
A dhave primria
A dhave estrangeira user id serve topidjd serve
Sendo uma tHave prmri,
om um vrPerendia s linhas dos domo um (ndide
user_id predisa ser unida
usurios n tabela mismatdh_user, unido para as
dentro da "tabela msmatdh_
permitindo jue vode saiba ^ual usurio linhas da tabela
user. Pe -fato, esse e o seu
esta assoiado dom ^ual recosta. miSmatdh__topid
propsito orneder uma
reerendia unifia a dada linha- mis: ch topic

iilBiii ;i;ii
Tattoos Appearance
2 Cowboy hats Appearance

V
3 Reality TV Entertainment
Horror Entertainment
movies

Lembre-se, dada
linha desta tabela Cada linha desta tabela
dorresponde a e o nome/dategeria de
um usurio do uma resposta adoro/
/Wismtdh- odeio, mas ndo a resposta
propriamente dita-
P U T
Cada linha desta H M M 1

tabela uma A dhave estrangeira


unida resposta > 101 Love ( 11 \ /topd_id reerendia
102 Love 2 as linhas dos topidos
adoro/ odeio 11 1

103 Hate 1 111 3


ornedida por na tabela msmatdh_
um determinado 104 Love vu j m____ V 4 / topid, e nao unida,
usurio. uma vez. <^ue muitos
Dentro da tabela mismatch_jresponse, voc pode encontrar usurios dieren-tes
mais informaes sobre o usurio que digitou uma determinada terao as mesmas
resposta procurando pela user_id na tabela mismatch_user. Da respostas para os
mesma forma, voc pode descobrir o nome do tpico de uma mesmos tpidos.
resposta, bem como a sua categoria, olhando o topicjd na * , '
tabela mismatch.topic. vindulIUa linha de resp^ta a
Vincular tabelas atravs de chaves primrias e chaves estrangeiras uma linha de usurio na tabela
nos permite conectar os dados entre elas de uma forma consistente. mismatdh__user Ela nao e unida,
Voc pode at mesmo estruturar o seu banco de dados de fornia uma vez. <^ue um mesmo usuano
a exigir uma correspondncia entre as chaves primrias e as suas pode "ter diversas respostas
respectivas chaves estrangeiras. Isso conhecido como integridade adoro/odeio,
referencial, o que uma forma chique de dizer que todas as
referncias das chaves precisam ser vlidas.
voc est aqui 437
tipos de relacionamento entre tabelas

Eu entendi que as chaves primrias e


estrangeiras conectam vrias tabelas entre
si, mas a direo das setas nos diagramas
tem algum significado?

Sim, a direo das setas nos inform a com o as linhas


de cada ta b e la se relacionam umas com as outras.
Falando mais especificamente, elas nos dizem quantas linhas em
uma tabela podem ter linhas correspondentes em outra, e vice-
versa. Este um aspecto importantssimo do projeto do schema,
e envolve trs padres de dados possveis: um-para-um, um-para-
muitos e muitos-para-muitos.
As tabelas podem corresponder linha por linha
O primeiro padro, um-para-um, determina que uma
linha na Tabela A pode ter no mximo UMA linha
correspondente na Tabela B, e vice-versa. Assim, s h
uma correspondncia em cada tabela para cada linha.
Como um exemplo, digamos que a tabela dos usurios do Ulili
Mismatch seja separada em duas tabelas, uma apenas para
as informaes de login (Tabela A) e uma com os dados dos
perfis (Tabela B). Ambas as tabelas contm IDs para manter
os usurios conectados aos seus perfis.
A coluna user_id da tabela de login uma chave primria corresponde
que garante a individualidade de cada login. Na tabela dos APENAS UMA - A - APENAS UMA
perfis, user_id uma chave estrangeira, e desempenha um destas linhas destas linhas
papel diferente, uma vez que a sua funo apenas conectar
um perfil a um login. ,
Um-par-u, porttX> s
setas ndo t poft-Us m ism atch__user_j?rofile
l S llIll lIllSlB ili&ljl
fiK tn a m e last name gender
username join .date
user d filisliiSfllsi
S ii iil

1 7"
Johan Nettles M
dierdre 08447b... 2008-05...
9 8 Jasor> Filmington M
baldpaul 230dcb... 2008-05...
10 9 Paul Hillsman... M
2008-05 10
jnettles e511d7...
062e4a... 2008-06...
12 '
13 theking "* b 4 B 3 r- 1 20080G --
de u m -p a ra -w * a tra v s de
wser_id
No que diz respeito s duas colunas user_id, a tabela dos logins considerada como
tabela parent(pai), enquanto que a dos perfis considerada como child (filho) - uma
tabela com uma chave primria tem uma relao parent(pai)-child(filho) com a tabela
que possui a chave externa correspondente.
controle seus dados, controle seu mundo

Uma linha leva a muitas outras


| li H M M H Um-para-muitos significa que uma linha na Tabela A pode
i l i l l i f l l
ter muitas linhas correspondentes na Tabela B, mas uma
linha na Tabela B s pode corresponder a uma linha na
Tabela A. A direo da seta no diagrama sempre sai da
tabela com uma linha e vai para a tabela com muitas linhas.
corresponde
Usando novamente o banco de dados do Mismatch, o
UMA---- A MUITAS schema atual sempre tira proveito de um padro de
destas linhas destas linhas
dados de um-para-muitos. Uma vez que um mesmo
usurio pode ter muitas respostas para os tpicos (adoro
tatuagens, odeio escaladas, etc.), h uma relao de um-
para-muitos entre as linhas dos usurios e as linhas das
respostas. A coluna user_id conecta essas duas tabelas,
Chave primaria. como chave primria em mismatch_user e como chave
estrangeira em mismatch_response. ^a^cW .
mi sm atch_user
ill
m ism atch_response y
o * -* !
H I P !
dierdre 08447b... il lllll lliillllli ! !
9
baldpaul 230dcb...
10
101 Love f 11 1
jnettles e511d7...
^ 102 Love I 11 2
rubyr 062e4a...
S ir ^ 103 Hae
theking b4f283... I 11 \ 3
I------ V 11 r 1
104 Love
l 11 J 4

umftrrnurtos
aivavs de user id- na oxstem
" P e rg u n ta s i d i o t a s
I * Como eu sei se as linhas de duas tabelas tm
uma reiao de um-para-um ou um-para-mutos?

H uma tendncia de se usar padres de um-para-


Um-para-Um: muitos com muito mais frequncia do que um-para-um, e
com bons motivos. comum se ter uma tabela principal Um-para-Muts:
e x a ta m e n te (parent) contendo dados primrios, como por exemplo, os
usurios do Mismatch, a qual se oonecta a uma tabela
exatamente uma
uma lnfea secundria (chkJ) em um arranjo de um-para-muitos. Isso linha da tabela
da tabela acontece duas vezes no esquema do Mismatch, onde tanto
os usurios quanto os tpicos tm relaes de um-para- parent(pa)
p a x e rrt(p a 2 ) muitos com as respostas.
Em muitos casos, as linhas de uma relao de um-para- se relaciona
se re la c io n a um em duas tabelas podem ser combinadas em uma s
tabela. Porm, certamente existem situaes em que faz
cem vras
com uma sentido optar pelo padro de um-para-um, como no exemplo lnfcas da tabela
linjba da tabela hipottico dos perfis dos usurios na pgina anterior, onde h
uma motivao de segurana para se colocar uma parte dos cjnlc[(eifco).
chld(Mho). dados em uma tabela separada.
voc est aqui > 439
o relacionamento m uitos para muitos

Checando linhas de wuitas-para-muitas


O terceiro e ltimo padro de relacionamento de dados 1 fat,!iis il S ttfs
-j 4 -
o de muitos-para-muitos, que tem muitas linhas de dados
na Tabela A correspondendo a muitas linhas na Tabela B...
parece um caso de sobrecarga de dados! Mas na realidade *
no . Existem vrias situaes em que um padro muitos-
para-muitos o mais apropriado. Seria o caso do Mismatch? -

Vamos dar uma olhada. MUITAS A MUITAS


Os usurios e os tpidos tem destas linhas destas linhas
uma reitso de m u ito s -p a ra -
mi sma tc h _ u se r muitos, axraves d as respostas. mi smatch__topic
Sun
1 \ ____ Tattoos Appearance
dierdre 08447b...
9 Cowboy hats Appearance
""2353cb...
/Vjuitos-para-muitos/ '2 E I
10 baldpawt" Reality TV Entertainment
j nettles e511d7..n
Horror Entertainment
062e4a...
Um-para-Wstos
i 12 rubyr movies
theking I b4f283...
i_respons>
13

B l ff^" St :
. X \ 1
Wmp a ra muitos. 81
82
Hate 1
Love 9 \ 2 //
83 Love
mismatch
response e uma
Hate . A V
tabela de > nao
w*,
que estaW ct
101 Love
'111 I 1 ./
reladiowameht?^ 102
103
Love
Hate
11 I
11
\
^ 3 )
tnbrt os usuarios
e as suas resposts
104 Love I11/ 4
dos topifios-

O padro muitos-para-muitos no Mismatch indireto,


significando que ele ocorre atravs da tabela mismatch_
response. Mas o padro ainda existe. Basta ver quantas das
b
k ^
s
mesmas user_ids e topic_ids aparecem em mismatch_response. M u itP S -p c ir^ M t^ S :
Alm de aimazenar os dados das respostas, a tabela mismatch_ V r ia s lnfcas <Je u m a
response est agindo como o que conhecido como tabela de
juno, ao servir como um conveniente intermedirio para os ta b e la p a re n t(p a )
usurios e os tpicos. Sem a tabela de juno, ns teramos muitos
dados duplicados, o que ruim. Caso voc no esteja convencido s e r e l a c i o n a m c o m
disso, volte para o exerccio dos esquemas no incio deste captulo Varias llntas Je uma
e d uma olhada com ateno no Projeto 2. Naquele projeto, a
tabela mismatch_topic era repetida na tabela mismatch_response, tabela cfclJ(ll}io).
resultando em muita duplicao de dados.
controle seus dados, controle seu mundo

Em cada uma das tabelas abaixo, existem colunas circuladas que poderiam ser
movidas para as suas prprias tabelas. Escreva se cada uma dessas colunas seria
melhor representada por uma relao de um-para-um, um-para-muitos ou muitos-para-
muitos com a sua tabela original, e depois desenhe a relao na forma de uma linha
conectando as duas tabelas, com as setas apontando para os lados apropriados.

i ffilftf

(endereo)

m iffSi
ill llilijiilll

l ilS i il
-H
! .

id_do_tpico wmmmmm
nome . I
([categoria^) I I
L

voc est aqui > 441


qual relao? soluo

BO t
Em cada uma das tabelas abaixo, existem colunas circuladas que poderiam ser
movidas para as suas prprias tabelas. Escreva se cada uma dessas colunas seria
melhor representada por uma relao de um-para-um, um-para-muitos ou muitos-para-
muitos com a sua tabela original, e depois desenhe a relao na forma de uma linha
conectando as duas tabelas, com as setas apontando para os lados apropriados.

ha um chdeveo p ara dada


usuirio, o ^UC si^niid q y t a jnKa
de endereo te m um relaao de
u m -para-w m dom dada linha de
uswario.
ismatc
I
id do usurio ump a ra um

(endereo) iiffl M B M 1 IB s S i i
1 I
l/ri
105 usua'r,0s tvabahar para a mesma
empresa, resu ltan d o em uma r e l a t o de u m - p a ra - .V1!?1rr p a r muitos
muitos e n tr e uma linha de empresa e varias linhas
de usurios-

\/ris usurios podem t e r varias


amidos, sie^iidando <^ue as linhas de
amidos tm uma reldao de muitos
p a ra muitos dom as linhas de usurios.

muitosp a ra muitos

Tabelas y*e dontem uma relao de m u i W p a r a -


vrios tpidos podem p e rte n d e r a mesma murtos geralm ente so donedtados a tra v s de uma
dte^ o ra, resu ltan d o em um relaao de um- t a b e b de jundao, \ue nao m o strad a a\ui-
p a ra muitos e n tr e um linha de d ate^ o ria e
varias linhas de tpidos. M as dada tpido nao
pode p erte n d e r a mais de uma d ate jo ria -

Sm m :
id_do_tpico
nome
ump a r muitos
(c a te g o r^
AAO
controle seus dados, controle seu mundo

Espere um mom ento! T ire um segundo para organizar o banco de dados


do M ism atch, para que possamos en c o n tra r os pares im perfeitos.
Baixe os arquivos .sql da aplicao Mismatch no site da Alta Books, em www.altabooks.com.
br. Esses arquivos contm as instrues SQL .que criam as tabelas necessrias: mismatch^
user, mismatch_topic e mismatch_response. Certifique-se de rodar a instruo de cada
arquivo .sql em uma ferramenta de MySQL, para ter todas as tabelas de que precisa para
iniciar o Mismatch.
Quando estiver tudo pronto, execute uma instruo DESCRIBE em cada uma das noras
tabelas (mismatch_topic e mismatch_response) para checar as suas estruturas. Essas
tabelas so importantssimas para os scripts PHP que estamos prestes a escrever para o
Mismatch.

voc est aqui 443


colocando resposta em mismatch_response

Coloque as respostas no banco de dados


Embora possa parecer que ns devamos comear gerando o formulrio, este
depende da existncia de dados de resposta na tabela mismatch_response. Portanto,
vamos comear pelo comeo: temos de "preencher" a tabela mismatch_response
com linhas de respostas vazias, na primeira vez que o usurio acessar o questionrio.
Isso nos permitir gerar o formulrio a partir da tabela mismatch_response sem
termos de nos preocupar se o usurio realmente j forneceu quaisquer respostas.
Os topidos do -formulrio,
inidialmente, a te m respostas
r e s i s t a s so d ei*adas em brando
esdoihidas, vez. que
a prim eira vez. em que o usuano
preendhemos mismatdh__response
visita o -formular'*-
dom respostas vazias.

Assim, do ponto de vista do formulrio, sempre existe uma linha de


dados, na tabela mismatch_response, para cada questo. Isso significa
que, quando o usurio submete o formulrio, ns apenas atualizamos as
linhas de dados para cada resposta fornecida.

Agora que o usurio respondeu a


algumas das questes, fts tem os
dados de resposta reais para
armazenar a tabela mismatdh_
response-
As respostas so
Embora o processo dc sc armazenar respostas no banco do Mismatch tudiiz^dds nc bndo de
tenha, em ltima anlise, dois passos, o primeiro deles (INSERT) s dados, p ara re g is tr a r as
ocorre uma vez para cada usurio. Uma vez que as respostas vazias m-formdoes -fomedidas
tenham sido adicionadas, todas as modificaes futuras so realizadas feio usurio-
no segundo passo, por meio de UPDATEs SQL.
A.A& ran/(fn
controle seus dados, controle seu mundo

fciis de eladefm d PHP &My$QL


1 O cdigo seguinte cuida de inserir respostas vazias na tabela mismatch^.
| I response, na primeira vez em que o usurio visita o formulrio. Ele tambm
j I atualiza as respostas quando o usurio faz modificaes e submete
o formulrio. Infelizmente, parte do cdigo se perdeu e precisa ser
reestabelecida. Use os imas para completar o cdigo que est faltando.

/ / S e este usurio jamais respondeu ao questionrio, inserir respostas vazias no


banco de dados
$query = "SELECT * FROM mismatch__response WHERE user_id = ' . $_SESSION [ 'user__
i d ] .
$data = mysqli_query($dbc, $query} ;

if ( ......... .............. ($data) == 0) {

// Primeiramente, obtm a lista de IDs dos tpicos a partir da respectiva tabela


$query = "SELECT............ FROM mismatch_topic ORDER BY category_id, topic_id";

$data = mysqli_query($dbc, $query);


$topicIDs = a r r a y ();
while ($row = mysgli_fetch_array($data)) {
array_push($topicIDs, $ r o w [ rtopic_id']);
}
// Insere linhas de respostas na tabela respectiva, uma para cada tpico
foreach ($topicIDs as $topic_id) {

$query = .................... mismatch_response " .

- ( .............. , ............... ) VALUES ('" . $_SESSION [' u s e r _ d '] .


$topic_id')";

mysqli_query ($dbc, $query)


}
}
// Se o formulrio tiver sido submetido, escreve as respostas no banco
if (isset {$__POST[1submit]) ) {
// Escreve as linhas de respostas na respectiva tabela
foreach ($__POST as $response_id => $response) {

$query = " mismatch_response response = '$response'

"WHERE = '$response_id";

mysqli_query($dbc,.$query);
}
echo '<p>As suas respostas foram registradas.</p>;
}
ms php & m ysql soluo

jg F | Imas de Geladeira d PHP & M /SoL - Soluo


1 0 cdigo seguinte cuida de inserir respostas vazias na tabela mismatch_response, na
I primeira vez em que o usurio visita o formulrio. Ele tambm atualiza as respostas
I quando o usurio faz modificaes e submete o formulrio. Infelizmente, parte do
etittlW # cdigo se perdeu e precisa ser reestabelecida. Use os imas para completar o cdigo que
est faltando.

// Se este usurio jamais respondeu ao questionrio, inserir respostas vazias


no banco de dados
$query = "SELECT * FROM mismatch_response WHERE user_id
SESSION['user_id'] .
$data = mysqli_query($dbc, $query) ; Vcri-pida SC Consulta

mysqli_num_rows |.($data) == 0) { re to rn o u O linhas de


if (
dados... no ha dados^
// Primeiramente, obtm a lista de IDs dos tpicos a partir da respectiva tabela

$query = "SELECT OM mismatch_topic ORDER BY category_id,


topic id ;
V
$data = mysqli_query ($dbc, $query) ; Pra ^erir w array V3ZJO de
topicIDs = array O ; respostas, primeiramente 0s
while ($row = mysqli_fetch_array($data)) { temos de obter todos os topiCos,
array p u s h ($topicIDs, $ r o w ['t opic_id']);
na respectiva tabela

// Insere linhas de respostas na tabela respectiva, uma para cada tpico


foreach ($topicIDs as $topic_id) {

$query = " .. mismatch_response " .

"( VALUES ('" . $_SESSI0N [' user__id'


'$top i c _ i d 1)
A Jinha d a resposta se enfiontra
nao respondida neste ponto,
^
inysqli query($dbc, $query) ;
urw vez. qe o usurio ainda nao
j escolheu adoro ou ' odeiow no
formulrio.
// Se o formulrio tiver sido submetido, escreve as respostas no banco
if (isset(S_P0ST[1s u bmit'])) {
// Escreve as linhas de respostas na respectiva tabela
foreach ($ POST as $response_id => $response) {

$query = " ,mismatch_response response = '$response'

"WHERE I response id i|= '$response_id' V


o
S o que mudd qundo
mysqli_query($dbc, $query);
} usurio subm ete o
-formulrio e 3 Coluna
echo '<p>As suas respostas foram registradas-</p>'
resposta d a respectiva

ns
ta b e la , p o rta n to s isso
que atualizam os.
controle seus dados, controle seu mundo

no existem
Fetgimtas Idiotas
Qual a da funo array_push()? Acho que ainda no usamos essa funo..

Realmente, ainda no a usamos, porque ainda no precisamos criar um array


dinamicamente, umelemento de cada vez. A funo array_push() anexa um novo
elemento ao final do array, fazendo-o crescer em um elemento. No cdigo da pgina
anterior, ns estamos usando array_ push() para criar um array de IDs de tpicos a
partir da tabela mismatchjopic. Esse array ento usado para se inserir respostas em
branco na tabela mismatch_response... uma para cada tpico..

Use INSERT para adicionar linhas vazias de


Q respostas ao banco de dados, na prim eira vez que o
usurio acessai

Ba/ A&abmos dc afierav


doistoeiHos viH>aU dom uma
cajadada so, e agora j -temos
*eade do sdtripi pv-onio.

J
Use UPDATH^prPIfiodificar as linhas de respostas
com base nas inform aes fornecidas pelo usurio.

U se SELEC T p a ra
o b te r os dados
n e c e s s rio s p a ra se
g e ra r o fo rm u l rio .
M as a'mda al-fca dois
passos fa v a podermos G ere o form u lrio H TM L com o
tomctav- a fa v c s T l questionrio a p a rtir dos dados
no de resposta.

voc est aqui 449


utilizando formulrios comandados p o r dados

possvel comandar um formulrio com dados


No novidade que formulrios web so usados para se obter dados Q g
dos usurios atravs de campos de texto, listas de seleo, botes
de rdio, etc., mas pode no ser muito bvio o fato de que voc co m ^d ad o s por
pode gerar formulrios HTML a partir de dados do banco, usando dadps (data-drlVe)
PHP. A ideia, no caso do Mismatch, gerar dinamicamente um
formulrio HTML contendo o questionrio criado a partir de
dados de resposta. O script do formulrio assume que j existem
dependem de dadps
dados de resposta, o que o permite gerar o formulrio a partir da ^resentes em um
porque acabamos de escrever o cdigo que adiciona respostas vazias ?moo M/SqL para
tabela mismatch_response. Ns sabemos que seguro assumir isso,
na primeira vez que o usurio visita o formulrio. gerar campos de
$ dHve prim ria response_jd p rm u l rip s H T M L .
c fcsd pir ide*tidar
mdWidwalmCht os da*pos do
re s p o n s e jd ^ ^ -formulrio H T M t e s assodiar
Os dapos do cm*i*lrio so
vindulados a linhas do bftdo
response td dropo tom un*a ImHS do bardo-
d c^m m d o -sc o on de
0 dodigo do ormulario dada dantpo doo a cbsve
userjd
ttT/WL e jerado a partir primria do ba*do-
topic. i d ^ ir de dados na tabela
/
mi Smtd respohsc
h_ .
<form method="pcst" ac;ior.=">
<p>How do you feel about each
<fieldset>

clabei for=-76">TattooS:</iabel><input type=-radio


<-sgend>Appearance</iegend>

<mput type="radio" id"77 name="77"


/>Love

/>Loveabel fr=,,78">Bo^ Pacings :</label><ira e" />Hate<br />


< m p u t ty p e ^ radio" id-
<label f o r
/>Lov<5
<inr)u

O fo rm u l rio r e fle te
as re s p o s ta s do
u su rio p a ra c a d a
t p ic o .
controle seus dados, controle seu mundo

0 questionrio do Mismatch gerado a partir de respostas do usurio que so


armazenadas na tabela mismatch_response. Para gerarmos o cdigo do formulrio
HTML, necessrio ler essas respostas, certificando-nos de verificar o nome do
Kccio tpico e o da categoria para cada resposta, na tabela mismatchjopic. O cdigo
a seguir cria um array de respostas com tpicos e categorias, realizando duas
consultas: a primeira obtm as respostas do usurio, enquanto que a segunda verifica
o tpico e a categoria para cada resposta, O problema que parte do cdigo est
faltando... preencha as lacunas para faz-lo funcionar!

jW a y de ^ 76 1 Love Tattoos Appearance

77 2 Love Gold chains Appearance

tor* 78 3 Love Body piercings Appearance


-fcpidos c Ss*~
atejo**is. 79
80
4
5
Love
Love
Cowboy boots
Long hair
Appearance
Appearance

81 6 Hate Reality TV Entertainment

82 7 Love Professional Entertainment


wrestling
83 8 Love Horror movies Entertainment

// O b t m os dados de re s p o s ta do b a n c o , p a ra g e ra r o fo r m u l r io
$ q u e ry = "S E L E C T r e s p o n s e _ id , to p ic _ id , re s p o n s e FROM m is m a t c h _
re s p o n s e " .
"WHERE u s e r _ i d = '" . $ _ S E S S IO N [ ' u s e r _ i d ] .
$ d a ta = m y s q li_ q u e r y ( $ d b c , q u e ry ) ;
$re s p o n s e s = a rra y ();
w h ile ($ ro w = m y s q li_ fe tc h _ a r r a y ( $ d a ta ) ) {
// V e r ific a o nom e d o t p ic o c o rre s p o n d e n te re s p o s ta , na
ta b e la dos t p ic o s
$ q u e ry 2 = " ............................................................................................................................ .
"WHERE t o p i c _ i d = . $ r o w [ 't o p i c _ i d ' ] .
P H P iH i W 4 ? d a ta 2 = m Y s q l i _ q u e r y ( $ d b c , ........... );
. . . if { m y s q li_ n u m _ r o w s ( ......... ........... ) = = 1 ) {
qu a nta s i as $ ro w 2 = m y s q l i _ f e t c h _ a r r a y ( $ d a t a 2 ) /
de d a d o s -ro ra m $ r o w [ r t o p ic _ n a m e 1 ] =
vCfcov^adas tom o $ ro w [ ' c a te g o ry _ n a m e ' ] =
re s u lta d o ^ da a rra y _ p u s h (^ re s p o n s e s , $ ro w ) ;
tonsvii'ta- }
}
voc est aqui 451
0 questionrio do Mismatch gerado a partir de respostas do usurio que so
armazenadas na tabela mismatch_response. Para gerarmos o cdigo do formulrio
R c c i o HTML, necessrio ler essas respostas, certificando-nos de verificar o nome do
tpico e o da categoria para cada resposta, na tabela mismatch_topic. O cdigo
SoLuo a seguir cria um array de respostas com tpicos e categorias, realizando duas
consultas: a primeira obtm as respostas do usurio, enquanto que a segunda
verifica o tpico e a categoria para cada resposta. O problema que parte do
cdigo est faltando,., preencha as lacunas para faz-lo funcionar!

0 a r r a y fresponses
serve tomo
uma "tab ela "
t>*porria de
dados de resposta
a serem usados
p a ra se g e ra r o
-rormulrio-

A rray de respostas
76
77
/A
M
Love
Love
Tattoos
Gold chains
Appearance
Appearance
ompieto, dom 78 3 Lve Body piercings Appearance
tpidos e dategorias. 79 4 Love Cowboy boots Appearance

80 5 Love Long hair Appearance


A P do topido t usada 81 6 Hate Reality TV Entertainment
p ara se adhar os nomes 82 7 Love Professional Entertainment
wrestling
do topido c d a date^o^';
a p a r t i r da ta b e la 83 w Love Horror movies Entertainment

mismatdh__topid- . ^
// O b t m os dados de re s p o s ta do b a n c o , p a ra g e ra r o fo r m u l r io
$ q u e ry = "S E L E C T r e s p o n s e _ id , t o p ic _ id , re s p o n s e FROM m is m a t c h _
re s p o n s e " . murto imj**ta*te usar wowas
"WHERE u s e r _ i d = 1" . $ _ S E S S IO N [ u s e r _ i d 1 ] ariveis part se realizar uma
$ d a ta = m y s q li_ q u e r y ( $ d b c , $ q u e ry ) ; segwwi tar&ulta (m-tema), de
$re s p o n s e s = a rra y {); modo <\ue tWiSul-fca criminal ro
w h ile ($ ro w = m y s q li_ fe tc h _ a r r a y ($ d a ta ) ) { seja afetada
// V e r ific a o nom e do t p ic o c o rre s p o n d e n te re s p o s ta , na
ta b e la d o s t p ic o s
$ q u e r y 2 - " ... S E L E C T . .*?m.e, d te g o ry mismptt^.h^.topid................
"WHERE t o p i c _ i d = . $ r o w j, t o p i c id '] .
$ d a ta 2 = m y s q li_ q u e r y ($td b c , . ?query2-. j ;
if ( m y s q li num r o w s ( _ 7 _ d a k 2 - j. = = i) { Cs omes d o topido e da
$ ro w 2 = m y s q l i _ f e t c h _ a r rr^^ yy ( $ d a t a 2 j) ; ___ d ateg o ria sao adidionddos Ao
Certi-Pique $ r o w [ 't o p ic ^ n a m e ' ] = ....fr ? .............................
^ a r r a y d e resposta, a trib u in d o -
de haver $ ro w [ ' c a t e g o r y nam e ' ] = f r o y / Z r d a ^ ^ o r y ,;] ;
se dados originrios d
dados de a rra y _ p u s h ($ re s p o n s e s , $ ro w );
segunda donsult-
resposta
aqui.
} '
A uno MRAV-PMSHO
adidiona um vtem p ara o Use
f os para o bter
final de u array - dados necessrios
para se g erar o
controle seus dados, controle seu mundo

A reposta do usurio armazenada


como texto no banco de dados, como
"Adoro" ou "Odeio" literalmente? Se sim,
isso no seria pouco eficiente?

N o e S im , e por isso q u e im p o rta n te u s a r o tip o d e


d ados m a is e fic ie n te possvei p a ra a rm a z e n a r d ados em
um b anco M ySQ L.
Pensando bem, uma resposta no Mismatch na verdade uma resposta do
tipo true/false (verdadeiro/falso), porque ela sempre um (adoro) ou o
outro valor (odeio). Na verdade, um terceiro valor (desconhecido) pode
ser til para informar aplicao que o usurio ainda no respondeu
um determinado tpico. Ento, ns precisamos manter registro de
trs valores possveis para cada resposta. Esse tipo de problema de
armazenamento ideal para um nmero, como por exemplo, TINYINT.
Com esse tipo de dados, basta voc usar diferentes valores numricos
para representar cada resposta possvel.

Desconhecido = 0
? V
Adoro = 1 Odeio
0 2
Minimizar os requerimentos de armazenamento de dados uma
parte importante do projeto de bancos de dados, e neste caso
uma parte sutil, porm, importante da aplicao Mismatch. Essas
respostas numricas desempenham um papel direto na gerao de
campos do formulrio do Mismatch.
^Aponte seu lpis
O seguinte cdigo faz um ioop atravs do array de respostas que
voc acabou de criar, gerando um cam po do formulrio HTML para
No sc preoiupe i-** os cada boto de rdio "Adoro". Escreva o cdigo que est faltando
botes de ra d io p3r3 para que o cam po fique inicialmente marcado, caso a resposta seja
>JOdeio por en^wfco eles definida com o "adoro" (1). Alm disso, certifique-se de que o valor
s3o gerados e'^tsw'ewte da da tag <input> seja definido corretamente.
n>esmd -forma-
fo re a c h ($ re s p o n s e s as $ re s p o n s e ) {

if ( ................................................................. ) {
echo 1c i n p u t type="radio" n a m e = " ' . $ r e s p o n s e ['r e s p o n s e _ i d ']
' " v a lu e = c h e c k e d = ........................./ > L o v e ' ;
}
e ls e {
echo '< in p u t t y p e = ''r a d io " n a m e = "1 . $ re s p o n s e [ r e s p o n s e _ id ' ] .
v a l u e = .......... /> A d o ro
}

voc est aqui 453


aponte seu lpis soluo

Iiponte seu lpis


Solupo O seguinte cdigo faz um loop atravs do array de respostas que
voc acabou de criar, gerando um cam po do formulrio HTML
para cada boto de rdio "Adoro". Escreva o cdigo que est
faltando para que o cam po fique inicialmente marcado, caso a
resposta seja definida como "adoro" (1). Alm disso, certifique-se
de que o valor da tag <input> seja definido corretamente..

0 b o t o de r d io p a ra "A doro" e m ard o d o m


base o valor da resp o sta 0 re p re se n ta a d o ro Se c s k resposta -kr deinida
"adoro ( l ) } marda o
no bando)-
boto de seleo, de-Pinindo
foreach ($ r e s p o n s e s / a s $response) { / o seu atributo dhedked dom o
/ valor "dtiedked"
if ( . f resp o n s rrespcms^J I......... ) { /
echo < i n p u t type="radio" n a in e - " '^ . $ r e s p o n s e [ 1r e s p o n s e _ i d ' ]
' " value= BIW checked= WdhedkedW />Love 1 ;
}
else {
echo 'cinput tjpe="radio' ="' . $ r e s p o n s e ['r e s p o n s e _ i d '
value= wl />Love 1

Deitar dfcedked^tkedkedf
@ va^ s ta g <input> t
d efin id o re su lta m> b o t o de seledo
domo I > p ara ^ue -Pi^ue mais -Pdii i d a r desw ardado, se a resposta
de a rm az e n a r a resposta m bando, no estiver de-Pinida domo
^ua^do o -formulrio o r subm etido. "adoro )-

foreach (Sresponses as Sresponse) {

if ($response['response 1) == 2) {
echo 'cinput type="radio" name=" 1 . $response [.response_id] .
value="2" cnecked="checked" />Hate ';

else (
echo 'cinput type="radio" name= ' .. $response [.1response_id'] .
1" value=2 />Biate V;

1 A
Caso e ste ja durioso, 0 dodigo p a ra g e ra r
os botes "Odeio" undiona e x a ta m e n te da
mesma to rm a - ele apegas produra uma por
resposta ligeiram ente di-Perente-
verdade, ex iste uma maneira mais elegante
de jj e r a r ta n t o osbotoes
"A doro" quanto
05 $ d e io dom menos dodigo-..
controle seus dados, controle seu mundo

0 operador
Falando em eficincia... terntiP ? :
A eficincia do banco de dados no o nico tipo de eficincia pode ser
que vale a pena considerar. H tambm a eficincia do cdigo, que
pode vir em muitas formas. Uma forma tirando-se proveito da usadp para
linguagem PHP para simplificar declaraes if-else. O operador
ternrio uma forma til de se programar declaraes if-else
se programar
simples, de modo que elas fiquem mais compactas. declaraes
true Sc a &*pressaoDe7este -e ls e d e uma
prma mais
/* -for v erd ad eira (tru e ), a
JL Insbruaol executada.
E x p r e s s o D e T e s t e ^ T j l n s t r u o l I n st ru o compacta-
Se 3 E*pressoDeTeste f<*"
false falsa (-faUc), 3 detlar33o2-
e e*etw tdda.
O operador ternrio, na verdade, apenas um atalho para se escrever
uma declarao if-else. Ele pode ser til para simplificar essas declaraes,
especialmente quando voc est fazendo uma atribuio de varivel ou gerando
cdigo HTML em resposta condio if. Eis aqui o mesmo cdigo para o boto de
seleo "Adoro", reescrito para usar o operador ternrio:
echo < in p u t t y p e = " r a d io " n a m e - '" . $ r e s p o n s e [ ' r e s p o n s e _ id ' "* v a lu e = " l" ' .

I&MmM
i i i i i a i i s i *i . ' /> A d o ro ';

Este teste true/false Controla o


resultado do operador ternrio.
J 0 a tr ib u to checked
d a i a s <irput> a^ora

Se o valor de resposta armazenado em $response ['response'] c g e rad o usandose o

for igual a 1, ento o atributo checked ser gerado como o p erad o r te rn rio , em

parte da tag <input>, resultando no seguinte boto de seleo vez. d e uma d eclaracao
1
"Adoro", marcado:
-f-eise-

Por outro lado, um valor de resposta diferente de 1 impedir o


atributo checked de ser gerado, resultando em uma tag <input> no
marcada para o boto "Adoro".
voc est aqui 455
o script inteiro questionnaire.php

Gere o formulrio do questionrio Mismatch


Agora ns j temos pedaos suficientes do questionrio do Mismatch para usarmos o
array de resposta ($responses) que criamos anteriormente para gerar o formulrio HTML
inteiro. Lembre-se, esse array foi construdo obtendo-se as respostas atuais do usurio
presentes na tabela mismatch_response. Vamos ver o cdigo de gerao do questionrio
no contexto do script questinnaire.php inteiro.
<?php
// Inicia a sesso
require__once (1startsession .php')

// Insere o cabealho da pgina


$page_title = 'Questionnaire';
require o n c e {'header.php');
Ihilui os arquivos tem p late
que ihiim a sesso e
exibe o cabealho da
p%ia.
a
questionnaire.php

^estvih0e a pagina aos


require_once('appvars.php'); usuirtos locados.
require_once('connectvars.p h p ')

// Assegura que o usurio est logado antes de seguir adiantj


if (!i s s e t ($_SES5I0N['user_id'])) {
echo '<p class="login">Por favor <a href="login.php"> faa </a> login para acessar
esta p gina.< / p > ';
exit);
}
// Mostra o menu de navegao
require_once('navmenu.php ');

// Conecta-se ao banco de dados


$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

/ / S e este usurio jamais respondeu ao questionrio, inserir respostas vazias no banco


$query = "SELECT * FROM mismatch_response WHERE user_id = . $_SESSION['user_id'] . ;
$data = mysqli_query($dbc, $query);
if (mysqli_num_rows($data) == 0) {
// Primeiramente, obtm a. lista de IDs dos tpicos a partir da respectiva tabela
$query = "SELECT topic__id FROM mismatch_topic ORDER BY category_id, topic_id";
?data = mysqli_query($dbc, $query);
$topicIDs = arr a y O ;
while ($row = mysqli_fetch__array ($data) ) {
array_push($topicIDs, $row['topic_id']);
}
II
Insere linhas de respostas na tabela respectiva, uma para cada tpico
foreach (topicIDs as $topic_id) {
$query = "INSERT INTO mismatch_response (user_id, topic_id) VALUES (1" . $
SESSION[1user_id'] .
"', 1$topic_id')";
mysqli_query($dbc, $query);
}
// Se o questionrio tiver sido submetido, escreve as respostas do formulrio no banco
if (isset($_POST['submit1])) {
// Escreve as linhas de respostas do questionrio na tabela de respostas
foreach ($_P0ST as $response_id => Srespons.e) {
$query = "UPDATE mismatch_response SET response = '$response' " .
controle seus dados, controle seu mundo

"WHERE response_id = '$response_id'";


mysqli_query($dbc, $query);
}
echo '<p>As suas respostas foram registradas..</p>;
}
( // Obtm os dados de resposta do banco, para gerar o formulrio
$query = "SELECT response_id, topic_id, response FROM mismatch_response WHERE
user_id = " .
$_SESSION [' user_id1] .
$data = mysqli_query($dbc, $query);
responses = array ();
while ($row = mysqli_fetch_array($data)) {
// Verifica o nome do tpico correspondente resposta, na tabela dos tpicos
O $query2 = "SELECT'name f category FROM mismatch_topic WHERE topic_id = " .
\ $ r o w [1topic_id] .

$data2 = mysqli_query{$dbc, $query2); biem a


if (mysqli_num_rows($data2) == 1) { categoria da Cada dategoria e
$row2 = mysqli_fetch_array($data2);
primeira resposta, trada domo w*
para inidiar o dowjuivto d e tampos,
$ r o w [topic_name1] = $row2 [1name ];
$row [rcategory__namer] = $row2[category
array_push($responses, $row); prodesso n ie s de ^y-a ajudar a
} entrar no loop. organizar os topidos.

mysqli c l o s e($dbc);

Lembrese, rotulo seguido de botoes de


// Insere a pgina
adoro e seleo " h d c K o e " O d a
2. odeio-
require_once{footer.php);

Cada w*a destas iftstsn*does edKo


gera um botao de selelo - w para X GGee r# o fOFAufrio HTML com
ftaro e outro pra do - Q oo questionrio
c a partir dos
I dados de resposta.
da
voc est aqui 457
test drive questionaire.php

TtesT ORive
T este o novo questionrio do M ism atch.
Modifique o Mismatch para que ele use o novo script do questionrio, (ou baixe a
aplicao no site da Alta Books, em wvw.altabooks.com.br). Para isso, voc ter de criar um
novo script questionnaire.php, bem como adicionar um item de menu Questionrio ao
script navmenu.php, para que os usurios possam acess-lo.
Envie os scripts para o seu servidor web e depois abra a pgina principal do Mismatch
(index.php) em um navegador. Certifique-se de fazer login, e ento clique no item de
menu "Questionrio para acess-lo. Repare que nenhum dos tpicos tem repostas, uma
vez que esta a sua primeira visita ao questionrio. Responda aos itens e submeta o
formulrio. Retorne pgina principal, e depois volte ao questionrio para confirmar que
as suas respostas foram corretamente carregadas a partir do banco de dads.

How do you fed about each topic?


0 serp-fc d
Appearance
questionrio permite Tattoos: U Love 0Ha
[^c os usurios GoW chains: 0 L o v e QHate
responda*. a i-fcchs Body piercings: Love 0Haie
ddoro/odeio e Cowboy boots: ^Love Haie
armzhem os #Love Hate
resultados ho bno L onghair;

de dados. Fn terrainment-
Reality TV: O Love IgHate

Professional
wrestling: If

questes ho iorm ulario


so geradas d'inav*iw*.efte
a p a r t i r do bahfio de dados
- se vofi ad itio ^ a r r.ovos
topidos, o -ormulari se
mod iit r -

O cdigo-fonte completo da aplicaao Mismatch est


disponvel para download no site da Alta Books:
www. a lt a b o o k s . co m . b r
controle seus dados, controle seu mundo
nab existem
p e rg u n te is Id io f s
P - Como o boto de seleo Adoro" sabe que o - Como possvel gerar o questionrio do Mismatch
resultado do operador ternrio uma string? a partir da tabela mismatch_response, quando o usurio
ainda no respondeu a nenhum tpico?
0 operador ternrio sempre resolve em uma das duas
instrues separadas pelos dos-pontos, com base no vaor Excelente pergunta. O formulrio do questionrio tem de
(true ou false) da expresso de teste. Se essas instrues lidar com dois cenrios possveis: o usurio est respondendo
forem strings, ento o resultado do operador ser uma string. ao questionrio pela primeira vez, ou o usurio j o respondeu
isso que torna o operador to til - voc pode inseri-lo no meio e est revendo as respostas. No primeiro cenrio, no h
de uma atribuio ou concatenao. nenhuma resposta ainda, portanto a tabela mismatch_response
ainda no tem dados para este usurio.
Mas ns ainda temos de gerar o formulrio dinamicamente.
O operador ternrio faz o meu script rodar mais rpido?
Poderamos usar a tabela mismatch_topic para isso. Porm,
no funcionaria para o segundo cenrio, porque desta vez
No, provavelmente no. O operador ternrio serve para
o formulrio precisa ser gerado com base nas respostas
adicionar eficincia estilstica ao seu cdigo, e no exatamente
especficas do usurio; lembre-se, os botes de seleo
para melhorar a eficincia do desempenho, o que significa
para "Adoro" e "Odeio so gerados como parte do formulrio.
dizer que a sua vantagem exigir menos linhas de cdigo.
Assim, ns temos um problema, no sentido que o cdigo para
Em alguns casos, mais conciso usar o operador ternrio do
gerar o formulrio completamente diferente, dependendo
que uma declarao if-else completa, embora os dois sejam
de se os usurios j responderam ou no o questionrio. No
logicamente equivalentes. Mesmo assim, no fique muito
apenas isso, e se o usurio tiver respondido apenas a algumas
entusiasmado com o operador ternrio, porque ele pode tornar
questes? Pode ficar muito complicado bem rpido. A soluo
o cdigo mais difcil de entender, caso voc esteja tentando
adotada pelo Mismatch preencher antecipadamente a tabela
substituir uma declarao if-else complexa. A ideia usar o
mismatch^response com respostas em branco, na primeira vez
operador ternrio em lugares onde a eliminao do if-else pode
que o usurio acessa o questionrio. Isso nos permite sempre
realmente ajudar a simplificar o cdigo, em vez de torn-lo mais
gerar o formulrio a partir da tabela mismatch_response, e
complicado. Isso geralmente envolve usar o operador para
no precisamos nos preocupar com a complicao de gerar
controlar seletivamente um valor sendo atribudo a uma varivel
o formulrio diferentemente dependendo de se o usurio j
ou inserido em uma expresso. No caso dos botes de seleo
respondeu ou no ou de quais tpicos ele tenha respondido.
do Mismatch, esta ltima abordagem foi usada para se controlar
claro que o cdigo para gerao do formulrio ainda no
seletivamente a insero de um atributo HTML (checked). exatamente trivial, mas mais simples do que se no
tivssemos usado esta abordagem.

P ara sv*pli-Piar o o Misma-fcdh ao sc aju sta


F -i O au to w atid am eh te 3 -novos tpidos, pelo meros ao *0
r 3-9*1 ^ S t c l ^ que se re-fere a usurios que la ten H a* respondido o
, E x p e fe n c ia ! <V*st |ott frio- Assim, vod t e r a de esvaziar a ta b e la
^ >is*atdH_respoKse aps adidionar um novo topido.

O Adicione um novo tpico sua prpria tabela mismatch_topic, com esta


instruo SQL:
IN S E R T IN T O m i s m a t c h _ t o p i c
(n a m e , c a te g o ry ) VALUES
( 'V ir t u a l g u it a r s ', 'A c t iv it ie s ')

0 Esvazie todos os dados da tabela mismafch_response, com esta instruo


SQL:
D ELETE FROM m is m a t c h _ r e s p o n s e

o Visualize o questionrio na aplicao Mismatch para ver o novo tpico.


Q Responda ao novo tpico, submeta o formulrio e verifique a sua resposta
gravada.
voc est aqui 459
lidar c o m d a d o s ru in s d o banco de dados

Agora os dados esto comandando o formulrio


Foi preciso algum trabalho, mas agora a aplicao Misraatch est
gerando dinamicamente o questionrio a partir de respostas
armazenadas no banco de dados. Isso significa que quaisquer
modificaes feitas ao banco sero automaticamente refletidas no
formulrio essa a vantagem de se gerar a interface de usurio de
uma aplicao web a partir de ura banco de dados. Mas o que acontece
quando ns temos dados invlidos?
l jl illljj
E1p 1h 111 1
topicJ d
re s p o n s e jd

response
category
u s e r jd

to p ic jd

How do yon les aboat each tapie?

A ppearance-----------
Tattoos: Lave 9 Hate
Gold chains: Love # H a ie
Body piercings: L0V2 #H3K
Cowboy toots: ig L o v e @ H afe
Long hair: 9 Love Q H ate
Entertainm ent-------------
E stes tmes donjuntos de Reality T V : (SLove 0H ate
P ro fe sso n al
da>*pos deveria sev- um so, de w restlin g : 0 Lovc # H a ie
o d o ^ue to d o s os topidos d e H orror movies. L o v e 0 Haie
E ntvetenim ento ii^uew* ju n to s.
i-Eat&rtimDeni -
' Easy & te5ng Omsk; 9 Lore Hate
EnttftaiiBsent - ............................ .... \
H ie opera: L o v e QHste

0 -formulrio e gerado de Food


Sushi: #Love OHare
-forma t a l <\ue u a mudana
l Spun: 0 Lovc @ H ate
de d ate^ora re su lta e um
1 Spicy food: @ L ovc Hale
novo orvjunto de dapos, ^ue
o motivo pelo ojual ais um
Conjunto desnede*saHo t Lr iado
um e rr o de dig itaao nesta
W te g o n a , o ^ue re su lta nela apareder
a<\ui-
no seu prprio doiunio A t dmpos no
formulrio, o ^ue e b a s t n te don-fuso.

Os dados esto determinando o formulrio como queramos, mas algo ainda est errado.
Parece que uma das categorias foi escrita no banco de dados com um erro de digitao,
fazendo o cdigo PHP gerar um conjunto de campos separado para ela. Isso um
grande problema, porque arruina o efeito de se usar conjuntos para ajudar a organizar o
formulrio e facilitar a resposta aos tpicos.
controle seus dados, controle seu mundo

mismatch topic
Ok, entao uma das
categorias foi escrita com um erro de
digitao no banco, o que est estragando
o nosso formulrio. Como vocs acham que
devemos consertar isso?

Kos j i sabemos que e s t a ^ / i r


ta t e jo r ia dom ev-ro de
di^i-fcaao es dausand
pvoblems

e aqui temos mais


uma 3us*do o
mesmo pvobem
o ^rmv*iav*io-

Frank: fcil. s corrigir a grafia da categoria na tabela mismatch_topic.


Joe: Mas tem mais de uma categoria escrita errada. E agora que pensei nisso, no entendo
por que os nomes das categorias tm de ser armazenados mais de uma vez.
Jill: Concordo. Ns nos demos ao trabalho de eliminar dados duplicados ao projetarmos
o esquema do banco de dados, e aqui estamos ns com um monte de nomes de categorias
duplicados. E no apenas isso, mas temos at alguns nomes com erros de digitao.
Frank: Ok, e se nos livrssemos dos nomes das categorias, e talvez fizssemos a referncia a
elas por nmeros? Assim no haveria o risco de termos erros de digitao.
Joe: E verdade, mas ainda precisamos dos nomes das categorias para us-los como ttulos
no questionrio.
Jill: Talvez possamos nos referir s categorias por nmero, sem jogar fora os nomes. E mais
ou menos o que j estamos fazendo com os tpicos na tabela mismatch_topic, no ?
Joe: Certo! Ns no queramos armazenar um monte de nomes de tpicos duplicados na
tabela mismatch_response, e portanto, colocamos esses nomes na tabela mismatch_topic, e
vinculamos os tpicos s repostas usando chaves numricas.
Frank: Vocs esto dizendo que poderamos resolver o problema dos nomes de categorias
duplicados criando uma nova tabela para as categorias?
Jill: E exatamente isso. Ns podemos criar uma nova tabela mismatch_category, onde cada
nome de categoria armazenado exatamente uma vez. E depois, conectamos as categorias
aos tpicos usando chaves primrias e estrangeiras entre mismatch_topic e mismatch^
category. Brilhante!
voc est aqui 461
normalizando seus dados

Nlorrrtal' slgrufca
Procure por um pouco de normalidade e la W m
O processo de reelaborar o banco de dados do Mismatch de modo clckl0 5 d e U lcl0 cl
a eliminar dados duplicados, e a dividir e conectar tabelas de uma
forma lgica e consistente conhecido como normalizao. A JXduZJl a d U PlC3C3p
normalizao um assunto relativamente aprofundado no que i
diz respeito ao projeto de bancos de dados, e pode ser um tanto dadS e a
intimidante. Mas no precisa ser. Existem vrias tcnicas simples de
projeto de bancos de dados, das quais ns podemos nos aproveitar m e ll lP ta ctS e la ^ e S
para tomar os nossos bancos MySQL muito melhores do que
se simplesmente tentssemos adivinhar como que os dados e llt^ e PS d ad P S -
deveriam ser dispostos.
Eis alguns passos gerais que voc pode usar para iniciar o
processo de design do banco de dados, os quais levaro
naturalmente a um banco de dados mais "normal":
<$ual t a principal
1. E sc o lh a u m a c o isa, ap e rtas um a c o is a que t- i\ sa que vote quer
v o c queira que a tab ela descreva. que seja o assunta
da sua tabela?
2. F a a um a lis ta d a s in fo rm a e s que v o c
p re c isa s a b e r so b re e s s a c o is a , a o u sa r ^ Corno vode ira
a tab ela. a ta b e la ?

3. U sa n d o a lista, divida a s in form a e s $ ual e o vnodo


so b re e s s a c o is a em p e d a o s que voc mais %>Lis
Aoftsultar essa
p o s s a u sa r para organ izar a tabela.
ta b e la ?

Um conceito fundamental na normalizao a ideia dos


dados atmicos, que so dados divididos at a sua menor
forma possvel que faa sentido, considerando-se o uso
do banco de dados. Por exemplo, as colunas first_name e
last_name do banco de dados do Mismatch so atmicas Dadps atPUlicos s.P
no sentido de que elas dividem o nome do usurio em mais
pedaos (primeiro nome e sobrenome) do que uma nica dadps <]ue {gram
coluna para o nome inteiro o faria. Isso necessrio no dViddPS ate a nietiPt
Mismatch porque queremos poder nos referir ao usurio
apenas pelo seu primeiro nome. fpvma necessria
Talvez no seja sempre necessrio que a aplicao divida para um determinado
o nome em colunas separadas para primeiro nome e
sobrenome, porm, em cujo caso uma tabela "name" bancp de dados.
sozinha seria atmica o suficiente. Assim, quando estiver
dividindo a "coisa" da tabela em partes, pense em como os
dados sero usados, e no apenas no que eles representam.
controle seus dados, controle seu mundo

Ao normalizar, pense em termos de tomos^'V1U1V S se-us


Para ajudar a transformar as suas ideias sobre o projeto do
banco em aes, til fazer perguntas especficas aos seus dados. dados atmicos
Isso ajudar a determinar como os dados se encaixam na tabela, e 9 p rim e iro
e permitir saber se eles realmente foram divididos at a sua
representao atmica apropriada. Ningum disse que dividir o pctSS9 se
tomo seria fcil, mas esta lista de perguntas poder lhe ajudar. criar uma tabela
normalizada.
1. Qual a principal coisa que a
sua tabela descreve? a * * tabela deserveavistam^-kd
0V ^ de uma lista de emails,
pc^tuadoes mximas de um videogame,
ornes de romvfcidos inuvvcis?

J ft 2 . Como voc U S a t a a tabela para

w
chegar at essa principal E labore sua -tbeia

coisa? de modo \*e ela seja


di! d e donsultar!

C erti-fi^u e-sc de
\ue os dados sejam
apenas -fcao pequenos
3. As suas colunas contm Quanto rsedessario.

dados atmicos, para tornar


suas consultas curtas e diretas?
X9 existem
---------------------------------------------------------- " p e rg u n ta s id io ta s

^ Eu devo tentar dividir os meus dados at os Como os dados atmicos me ajudam?


menores pedaos possveis?
^ t Eles lhe ajudam a garantir que os dados da sua
K-. No necessariamente. Tomar os seus dados tabela sejam precisos. Por exemplo, se voc tiver uma
atmicos significa dividi-los at os menores pedaos de coluna para o endereo de um avistamento de ETs, poder
que voc precisa para criar uma tabela eficiente, e no querer dividir o endereo em duas colunas: uma para a rua
at os menores pedaos possveis. e uma para o nmero. Ento, voc poder certificar-se de
registrar apenas nmeros na coluna referente ao nmero.
No dividia os seus dados mais do que realmente
precisar. Se no precisar de colunas extras, no as Os dados atmicos tambm lhe permitem executar
adicione toa. consultas de modo mais eficiente, porque as consultas
ficam mais fceis de escrever e rodam em menos tempo,
o que eficiente quando voc tem uma quantidade muito
grande de dados armazenados.

voc est aqui 463


normalize a banco de dados do mismatch

0 banco de dados do Mismatch est precisando ser normalizado, para resolver


o problema de nomes de categorias duplicados. Dada a estrutura existente do
banco, esboce um projeto modificado que resolva esse problema, eliminando
o risco de erros na insero dos dados. Escreva comentrios no projeto,
explicando como ele funciona.

user id
username
password
join_date
first name
last name
gender illlliiljjjd ;j*j|
ri I ^ QjtjJS
birthdate response id v w
" topic id ^ i
city response name
state
MW i l ) ^ category
picture
tooic iri
controle seus dados, controle seu mundo

existem
TWgutitis idiotas
1 Como eu fao para aplicar o terceiro passo de normalizao ao Mismatch, para
consertar o problema hipottico com a cidade/estado/CEP?

A soluo colocar os dados de localizao do usurio em uma tabela prpria, e


ento conectar a tabela mismatch_user nova tabela por meio de uma chave estrangeira.
Assim, voc poderia criar uma tabela chamada mismatchJocation, com uma chave
primria locationjd, junto com colunas para armazenar a cidade e o estado do usurio,
por exemplo. Ento, as colunas city ("cidade") e state ("esad") so removidas de
mismatch_user e substitudas por uma chave estrangeira locationjd. Problema resolvido!
O que faz esse design funcionar que a coluna locationjd na verdade usa o CEP como
chave primria, eliminando o problema de dependncia de colunas que no sejam chaves.

? Caramba, isso parece um monte de trabalho s para atender a um


requerimento de projeto exigente. Isso realmente necessrio?

Sim e no. Os dois primeiros passos da normalizao so obrigatrios, porque


os dados atmicos e as chaves primrias so essenciais para qualquer bom projeto de
bancos de dados. no terceiro passo que voc passa a ter que pesar a atratividade
de um projeto perfeito, por um iado; contra as realidades prticas do que a aplicao
realmente precisa, por outro. No caso do problema com cidade/estado/CEP do Mismatch,
provavelmente vale a pena aplicar esse requerimento, pela simplicidade que ele
proporciona. Essa no uma deciso a ser tomada sem pensar bem, e muitos puristas
defendem que voc deve aderir estritamente a todos trs passos. A boa notcia que a
coluna com o CEP puramente hipottica, e no faz parte realmente da tabela mismatch_
user, portanto no precisamos realmente nos preocupar com ela.

Mesmo sem uma coluna para o CEP, no seria necessrio mover city ("cidade")
e state ("estado") para as suas prprias tabelas, para atender ao terceiro passo?

^ Possivelmente. Sem dvida voc acabar tendo dados duplicados, referentes a


cidades e estados, na tabela mismatch_user. O problema em separar cidade e estado numa
tabela prpria, sem uso do CEP, que voc teria de preencher essas tabelas com todas as
cidades e estados existentes. Caso contrrio, os usurios sem dvida escreveriam alguns
nomes de cidades com erros ortogrficos, e ainda acabaria tendo dados problemticos.
Este um bom exemplo de caso em que voc tem que pesar seriamente o benefcio da
normalizao estrita contra a realidade de uma aplicao real.Uma interessante soluo
possvel para todos os problemas usar o CEP na tabela mismatch_user, em vez de cidade
e estado, e ento procurar a cidade e o estado em uma tabela esttica ou em algum servio
web, conforme necessrio. Isso mais complexidade do que precisamos no momento,
portanto vamos ficar com as colunas city (cidade) e state (estado).

voc est aqui 467


a base de dados mismatchagora normalizada!

0 banco de dados do Mismatch est precisando ser normalizado, para resolver o


problema de nomes de categorias duplicados. Dada a estrutura existente do banco,
esboce um projeto modificado que resolva esse problema, eliminando o risco de erros
na insero dos dados. Escreva comentrios no projeto, explicando como ele funciona.
SoLuSo h nova ta b e la p a ra as
d a te y w ia s arm azena os
nomes d as d a t e r a s
separados dos topidos,
0 r e s ta n te do eliminando os dados
Alismatdh no redundantes.
userjd t a e t a d o pelas
username modi-fidaoes has
d a t e r a s e nos
password
tpidos.
dategory__id rf
join_date
first name
name
last name
gender Ihliftatcfrtopic
birthdate to p ic jd 0 "jr
city name
state ^gategery:
picture >. tife ja ry jd
;
Lembre-se, mismatch_ Em vez. d e a rm a z e n a r o nome d a C ada linha de dateg o ria na
response e wm "tabela
d ateg o ria em dada linHa de tpido, tem uma relaao de
nova ta b e la
de ju n ja o <\ue donedta ag o ra ns arm azenam os apenas uma ump a ra muitos dom os topidoS
re e re n d ia (ft>) linha, na ta b e la
os usurios s respostas
cyuC derm 3os topidos. d a ta b e la mismatdK__topid-
das dategorias.

tfGl
nb eXS
perguntas idiotas
I * Como exatamente a nova tabela mismatch, T * - Ento isso significa que mismatch_category tem
category resolve o problema de dados duplicados? apenas cinco linhas, uma para cada categoria?

Sim, isso mesmo: ro is m a t c h _ c a t e g o r y

liiP P
A nova tabela separa os nomes das categorias
da tabela mismatchJopic, permitindo que eles sejam Skliii J d y
armazenados isoladamente. Com as categorias
armazenadas em tabela prpria, no mais necessrio
mm Appearance
1
duplicar os seus nomes - voc tem uma linha para 0 nome d e dada 2 --- >
- Entertainment
cada categoria, e essas linhas so ento referenciadas d ateg o ria s Food
e armazenado
3
por linhas da tabela mismatchJopic. Isso significa que People
4
as linhas de categorias da tabela mismatch_category um vez/ Activities
5
tm uma relao de um-para-muitos com as linhas de
tpicos da tabela mismatchjopic.
controle seus dados, controle seu mundo

Alterando o banco de dados do Mismatch


Para tirar proveito do novo schema, o banco de dados do Mismatch requer algumas
modificaes estruturais. Mais especificamente, ns precisamos criar uma tabela mismatch_
category, e depois conect-la a uma nova chave estrangeira na tabela mismatch_topic.
E uma vez que a velha coluna category da tabela mismatch_topic, contendo os dados
duplicados, no mais necessria, podemos apag-la.
C rie a nova -tabela ^ue ir
rm az ^ n a r os nore$ ds
dateg o rias isoladamente-

c a t e g o r y _ i d INT N O T N U L L A U T O _ I NCREMENT, ratea o rv jd


name VARCHAR(48) NOT NULL, a a n ti5a doluna name
ta te g o ry j u a vez.
PRI M A R Y K EY (category id) ag o ra irewos re-(-erend3r as
ta te g o ria s a p a r t i r de
ta b e la prpri-
A L T E R TABLE m i s m a t c h topic
Edition ua
dKave e s tra n g e ira
d a te g o ry _ jd , p ara
d o n ed tar dada topido
ALTER TABLE mismatch_topic
a u a d ateg c ria da
^ l i S H i i l i i INT not null nova tabela-

A nova tabela mismatch_category precisa ser preenchida


m ism atch to p ic com os dados referentes s categorias, o que feito atravs
de algumas instrues INSERT.
INSERT INTO mismatch_category (name) VALUES
(Appe a r a n c e '}
8 Horror movies 2
INSERT INTO mismatch_category (name) VALUES
Easy listening 2
9 ('Entertainment1)
music

10 The opera 2 INSERT INTO mismatch_category (name)VALUES ('Food')

11 Sushi 3
INSERT INTO mismatch_category (name)VALUES ('People')
12 Spam 3
INSERT INTO mismatch_category (name)VALUES
13 Spicy food 3
('Activities')
peanut butter 3
14
& banana
sandwiches A nova coluna category_id precisa, ento, ser preenchida
15 Martinis com dados para ligar corretamente cada tpico sua
16 Howard Stern 4 categoria apropriada da tabela mismatch_category.
Bill Gates 4
17
4 UPDATE mismatch_topic SET category id = 3
18 Barbara
Streisand WHERE name = 'Martinis' E s ta (V deve se r a nscsm ID
u to in d rem en td \ue a d ateg o ria
- 4 -
t e na ta b e la isr*atdh__dategory.
voc est aqui 469
test drive as tabelas normalizadas mismatch

O R fV e
C rie e p re e n c h a a nova ta b e la m is m a tc h _ c a te g o ry .
Usando alguma ferramenta MySQL, execute o comando SQL CREATE TABLE da pgina
anterior para adicionar uma nova tabela, chamada mismatch_category, ao banco de dados
do Mismatch. Em seguida, emita instrues INSERT para preencher a tabela com dados
referentes s categorias. Agora, execute as duas instrues ALTER para modificar a tabela
mismatch_topic para que ela tenha uma coluna category_id. Finalmente, use UPDATE em
cada linha da tabela mismatch_topic, para que as suas colunas category_id apontem para a
categoria correta na tabela mismatch_category.
Agora execute um SELECT em cada uma das tabelas, s para certificar-se de que est tudo certo.

Ento, o Mismatch realmente normal?


Sim. Se voc aplicar as trs regras principais O sejam
da normalidade a cada uma das tabelas do Certifique-se de que a s su a s colunas
atmicas.
Mismatch, ver que ele passa no teste com louvor.
Mas mesmo se no passasse, nem tudo estaria e D a cada tabela a sua prpria chave

perdido. Assim como nas pessoas, existem graus primria.

de normalidade no que se refere aos bancos de e Certifique-se de a s colunas que no


dados. O importante tentar elaborar bancos so chaves no sejam dependentes
que sejam completamente normais, s aceitando um as d as outras.

menos que isso quando houver um motivo muito


bom para burlar as regras. Todas as tabelas tem
dhave primria
wumvia; para ^ara^tir
Em to d o o ba*do de a uhiidde-
dados, os homes so
| user_id 0 n3 sua
username _____o\rma mais atomida,
password f so rep etid o s
join.date *ais d e uma doluna.

first_name

iiiiSimftlliSili
last name
gender
birth date f j responsejd " 8^
city
state
I O response
------ id
/ picture
topic id

Sem a bipottid depe*de*dia o CEP, as doUas <^*e se reerem


a lofiaiizado do usurio ao tem mais probiemas de dependerias.
controle seus dados, controle seu mundo

O novo projeto
das tabelas do Mismatch no
afeta as consultas que esto
sendo feitas no cdigo do
O
script do questionrio?

i i MHR891
category id O""-)*
name

// Obtm os dados de resposta do banco para gerar o formulrio


$query = "SELECT response_id, topic_id, response FROM mismatch_response
"WHERE user_d = . $_SESSION['user_id'] . " ;
$data = mysql_query($dbc, $query);
$responses = array 0;
while ($row = mysqli_fetch_array($data)) {
// Verifica o nome do tpico correspondente resposta na tabela dos tpicos
$query2 = "SELECT name, category FROM mismatch_top:LC "
"WHERE topic_id = . $ r o w [[topic_id'] . ";
$data2 = mysqli_query($dbc, $query2);
if (mysqli_num_rows($data2) ==. 1) {
$row2 = mysqli_fetch_array($data2);
$row[1topic_name'3 = $row2['name'];
$row['category^name1] = $row2[1category'];
array_push($responses, $rowj;

questionnaire.php

Sim. De fato, a m aioria das m odificaes estru tu rais em


bancos de dados exige que ns ajustem os quaisquer
consultas que envolvam as tab elas afetadas.
Neste caso, modificar o projeto do banco para adicionar a tabela mismatch_
category afeta qualquer consulta envolvendo a tabela mismatch_topic. Isso
ocorre porque o projeto anterior tinha as categorias armazenadas diretamente
na tabela mismatch_topic. Aps colocarmos as categorias na sua prpria tabela,
o que ns agora sabemos que uma tima ideia graas normalizao, torna-
se necessrio rever as consultas e program-las para trabalhar com uma nova
tabela (mismatch_category).

voc est aqui 471


usando rotao com pontos

Ligue com pontos


Uma vez que os joins envolvem mais de uma tabela,
importante ser claro sobre cada coluna referenciada A nptap com
em um join. Mais especificamente, voc deve identificar p o n t S lfee p e O T ite
a tabela de cada coluna, para no haver nenhuma
confuso - diferentes tabelas frequentemente tm te e e n c a t 3. tabela.
colunas com os mesmos nomes, principalmente no que - j u E a c o lu n a
se refere s chaves. Basta prefixar o nome da coluna com
o nome da tabela e um ponto. Por exemplo, eis aqui a perte nce , detiti'O d e
consulta INNERJOIN anterior, que cria um conjunto de
resultados de IDs de tpicos e nomes de categorias: um join.
E s te e o M we d doiuna d e n tr o da
s t e o nome 0 ponto/ ta b e la , sep arad o do nome d a ta b e la
da tabela- por um ponto-
isijiiij
SELECT
1 IS wfcra reieren d ia
FROM mismatch__topic ^ _ ta b ila/o iw n a usando a

INNER JOIN mismatch_category


notta a o to* ponto-

a^wi <\ue o uso do ponto realm ente Sozinho, o nome da


dompensa - os nomes ds doiunas so doiuna r o nos d2- nada
identidos^ resultando em ambiguidade total sobre a ^ual tabela ele
se vote nao espediidar os nomes das tabelas. pertende-

Sem a capacidade de especificar as tabelas


associadas com as colunas, nesta consulta, ns
teramos uma ambiguidade problemtica. Na Pentro de uma
verdade, seria impossvel entender a parte ON da Consulta OlK, o
consulta, porque ela estaria verificando se a coluna nome d e sta doiuna
category_id igual a ela mesma, presumivelmente lid a ab<
dentro da tabela mismatch_topic. Por esse motivo,
sempre uma boa ideia ser bastante explcito
na hora de identificar as tabelas associadas com n a o se esquea
colunas, ao criar consultas JOIN. do ponto/

n u .s m a tc h _ to p ic . c a te g o ry id
i_category
m ism atch to p ic (d e n tiiid a r
lis ll^ fc is ii
a tabela
resulta em uma 1 l;-= A p p ^ flc e ' ':
2 K t-e c t^ ir^ jtiV .
donsulta J lK
3 i fo&p ' .. 1
mais expifdta.
... ilr'i-'-;"--

474 Captulo 8
controle seus dados, controle seu mundo

Certamente podemos fazer mais com os inner joins


Os inner joins no servem apenas para combinar dados de duas Um
tabelas. Uma vez que um inner join , em ltima instncia, apenas T Q jf ^ COOlLull
uma consulta, voc ainda pode usar construtos normais de
consultas para controlar ainda mais os resultados. Por exemplo, linhas d e duas
caso queira obter uma linha especfica do conjunto de resultados
unidos, voc pode colocar uma instruo WHERE na consulta tabelas usando
INNER JOIN para isolar apenas essa linha. o p e ta d o te s d e
SELECT m i s m a t c h _ t o p i c . t o p i c _ i d , m i s m a t c h _ c a t e g o r y . name
c o m p a r a o e If l
FROM m is m a tc h _ _ to p ic
uma condiap.
INNER J O IN m is m a tc h c a t e g o r y

ON ( m is m a tc h _ to p ic . c a t e g o r y _ id = m is m a tc h _ c a te g o r y . c a te g o r y _ id )
IsIIlimillflfI4HrHfllifHlili
Esta fioluna reina
Ento, o que que esta consulta retorna, exatamente? os (resultados,
Lembre-se, primeiramente, que a clusula WHERE serve iowo parte de
como um refinamento da consulta anterior. Em outras ur*a instrudao Estas duas
palavras, ela restringe o nmero de linhas retornadas pela WHR. ' dolunas
consulta INNERJOIN original. Para recapitulao, eis aqui os dofttvola* a
resultados do inner join sem a clusula WHERE: jun-o entre as
duas tabelas.
1
2
Appearance
Appearance
\
3 Appearance

M IDs dos 4 Appearance

tpidos sao 5 Appearance

e*tradas da 6 O i homes das


Entertainment

tabela mis^atdK 7 datejoras sao


Entertainment

topi- 8 Entertainment retirados da


tabela mismatch
category. II ,
A clusula WEHERE tem o efeito de diminuir este conjunto cateqorvJd ^
de resultados a uma nica linha, aquela cujo tpico tenha nam e
o nome igual a 'Horror movies' ("Filmes de terror"). Ns
temos de olhar novamente na tabela mismatch_topic para
ver qual essa linha.
mi sma tc h _ to p ic 0 donjunto de resultados da
Esta linha IKKEK JOIN original e reduzido
f l i i l l i iillp I H p a esta linha so litaria, devido a
bate to m I lf t M

a dlausula t a R K iiiM j rt1iilili ifKif rfriJ


.
dliusuia WHERE-
HMERE. 7 Professional 2
wrestling

C 8 Horror movies $ (lausula tfttERE restringe ^


9 Easy listening music 2
os resultados da juno a
apenas uma linha-
voc est aqui 475
reescrevendo a consulta com os jons

O s joins s9
Joins, ao trabalho!
mais ecentes
Assim, osjoins possibilitam envolver mais de uma tabela em uma
consulta, na prtica retirando dados de mais de um lugar e colocando-
se em uma nica tabela de resultados. A consulta do Mismatch que IQeTlPS C-Qcll^P
cria um array de respostas um candidato perfeito para joins, uma vez j j.
que ela contm nada menos do que trs consultas aninhadas para lidar X ~
com vrias tabelas. Vamos comear com o cdigo original:
// Obtm os dados de resposta do banco, para gerar o formulrio
$query = "SELECT response_id, topic_id, response FROM mismatch__response "
"WHERE user_id = '" $_SESSION[1use r _ i d '] .
uas ultims
donsultas do ddi^o so
$data = mysqli__query ($dbc, $query);
$responses = array ();
while ($row = mysqli_fetch_array($data)) { responsveis por obter
// Verifica o nome do tpico correspondente resposta, na tabela dos os now>s do topido e
tpicos
.................... l i l da date^ora das suas
respectivas tabelas
$data2 = mysqli_query($dbc, $query2); uma dotwlta por tabela.
if (mysqli_num_rows($data2) == 1) {
$row2 = mysqli_fetch_array($data2);
$ r o w ['topic name'] = $row2[J

// Verifica o nome da categoria correspondente ao tpico,


tabela das categorias

ip IiS ilS iL
$data3 = mysqli_query($dbc, $query3);
if (mysqli_num_rows($data3) = = 1 ) {
$row3 - mysqli_fetch_array($data3);
$ r o w ['category_name'] = $ r o w 3 [

C om utwjoin, t possvel obter


array_push($responses, $row);
}
tato o notme d o topido ^wanto o
d dategorsa, em uma so donsilta-
E aqui vai a nova verso do cdigo, usando uma junao:
// Obtm os dados de resposta do banco, para gerar o formulrio
$query = "SELECT response_id, topic_id, response FROM mismatch^response " .
"WHERE user_id = . $ _ S E SSION['user_id'] . "
$data = mysqli_query($dbc, $query);
^responses = array ();
while ($row = mysqli_fetch_array($data)) {
// Verifica os nomes do tpico e da categoria correspondentes resposta,
respectivas tabelas
Sl
l l l i .. .
llff | ao usados aliases
h p raajudar a
$data2 = mysqli_query($dbc, $query2); sW plm dar o
if (mysqli_num_rows($data2) = = 1 )
$row2 = mysqli dodigo.
^ fetch array($data2);
f,p \ %\ ?,Sm
Srow [1topic_name '] = $row2 [ui
A ID do tpido t usado doTMo
base para s donsulta prindipal,
$ r o w [1category_name] = $row
array p u s h ($responses, $row);
a s a |D da d ate^ o ra don tro la o
prprio join.
47R Cantulo 8
controle seus dados, controle seu mundo

No entendo, ainda
temos uma consulta extra que
procura o nome da categoria. Se
os joins continuam to bons, por
que ainda precisamos de duas
consultas?

Ns no precisam os de duas consultas, pelo menos


no se usarm os todo o potencial dos joins.
E possvel unir mais de duas tabelas, que o que realmente
precisamos fazer no cdigo do array de respostas do Mismatch.
Precisamos de uma nica consulta que realize trs coisas: obter
todas as respostas para o usurio, obter o nome do tpico para
cada resposta, e finalmente obter o nome da categoria para cada
resposta. O novo e melhorado cdigo da pgina anterior realiza
as duas ltimas em uma s consulta, que envolve um join entre
as tabelas mismatch_topic e mismatch_category. O ideal que
tivssemos uma nica consulta, com dois joins, para acertar os trs
coelhos com apenas uma cajadada em forma de join.

Segue algum cdigo capaz de obter dados de resposta do banco com apenas uma
consulta, graas ao uso inteligente dos joins. Seja inteligente e escreva a consulta
RCCIO SQL que far a juno entre as tabelas mismatch_response, mismatchjopic e
mismatch_category.

// Obtm os dados de resposta do banco, para gerar o formulrio


Squery -

Sdata = mysqli_query($dbc, $query);


$responses = a r r a y ();
while ($row = mysqli_fetch_array($data)) {
a r r a y _ p u s h ($responses, $row);
>

voc est aqui > 479


hora de brincar mismatch

0 \uestiortfirio
de Sidney e st
preendHido,
an z n d o e
p ro n to pava
ser usado ao
AliSnrvtdV

O M ism atch agora se lem bra das respostas dos usurios,


m as ainda no est fazendo o que gostaram os com
elas... com o por exem plo fo rm ar pares!
O conjunto dos dados dos usurios s nos leva at metade do caminho
para formarmos pares imperfeitos. A aplicao Mismatch ainda
precisa de um mecanismo para disparar a flecha de Cupido no banco
de dados para encontrar conexes amorosas. Para isso, precisamos
examinar de alguma forma as respostas de todos os usurios no banco,
para ver quais formam pares imperfeitos ideais.

482 CsDtuio 8
controle seus dados, controle seu mundo

Encontrar um par imperfeito ideal


parece bem complicado, com todas
aquelas categorias, tpicos e respostas.
Tem certeza que possvel fazer isso?

C ertam en te; ns s precisam os de um a form a


consistente de ca lc u la r quantos tpicos dois
usurios quaisquer tm com respostas opostas.
Se elaborarmos uma forma razoavelmente simples de calcular
quantos tpicos respondidos de forma oposta dois usurios
quaisquer tm, toma-se possvel fazer um loop atravs do
banco de dados, comparando usurios. A pessoa com o maior
nmero de opinies contrrias a um determinado usurio o
par imperfeito ideal para esse usurio!

= Par imperfeito!

Escreva abaixo como voc faria para calcular a 'desencoutrabilidade " de


dois usurios, usando dados armazenados no banco do Mismatch:
a lgica do mismatch

0 amor um jogo de nmeros


Como voc dever se lembrar, as respostas do Mismatch so
armazenadas na tabela mismatch_ response na forma de nmeros,
com 0, 1 e 2 tendo significados especiais em relao a uma
determinada resposta. response^

Adoro=
0
Odeio = 2
response

user_id

Esses so os dados usados para se calcular a topicJ d


desencontrabilidade entre dois usurios, e o que estamos
procurando especificamente uma combinao de adoro A segunda Coluna destas
com odeio ou de odeio com adoro. Em outras palavras, iinbas c resfosa, ^ue pode
estamos procurando por linhas de resposta em que sev O (ndo respondido), /
response um 1 em oposio a um 2 ou vice-versa. (adoro) ou 2 (odeio).

28 r? > i ' I I
278 r< ; ii 3
29 4 | 279 i* i n i, j __ j.
Um a 1ff 11 I 5J
30 5 I 280
c o m b in a o _J-----
31
.T O * 1 J
281 11 5
5 I

Uma vesposta a d o ro 0 ) Combinada dom uma


odeio ( X ) p ara o mesmo tpi t o fre a lity shows)
'resulta e uma dombinatao posrtiva-

Ainda nos falta uma forma de determinar, atravs de cdigo PHP, os momentos
em que ocorre uma combinao entre duas respostas. Certamente poderamos
escrever algumas declaraes if-else para verificar se h um 1 e um 2 ou ento
um 2 e um 1, mas a soluo pode ser mais elegante do que isso. Em qualquer
um dos cenrios, adicionar os valores das duas respostas resulta no valor
3. Assim, podemos usar uma simples equao para detectar a combinao
desejada entre duas respostas quaisquer.
S e i l e s p P s t a A + l e s p P s t a B = 3 , t e m p s u m a c o m b in a o !
Assim, achar uma conexo amorosa acaba sendo mesmo uma simples questo
de matemtica. Isso basta no que se refere a comparar as combinaes
individuais, mas no atende ao problema maior de como realmente criar o
script Meu Par Imperfeito.
controle seus dados, controle seu mundo

Cinco passos para um desencontro com sucesso


Encontrar o par imperfeito ideal para algum no apenas uma questo de
comparar linhas de respostas. O script Meu Par Imperfeito tem de seguir uma srie
de passos cuidadosamente orquestrados para formarmos pares com sucesso. Estes
passos so a chaves para finalmente satisfazermos os usurios e usarmos de forma
significativa as respostas que eles deram ao questionrio.

A O bter as respostas do usurio na ta b ela


T m ism atch response, certificando -se de ju n ta r
I os nom es dos tpicos aos resultados.

In ic ia liza r os resultados de busca do


M ism atch, incluindo as variveis que
reg istram o m elhor par im perfeito".

0 Fazer um loop atravs da tab ela dos usurios,


com parando as respostas dos dem ais s do usurio
em questo. Para isso, com parar as respostas
de cad a pessoa no banco de dados s respostas
correspondentes do usurio em questo. Um "placar"
m antm registro de quantas respostas opostas o
usurio tem em re lao a cad a pessoa.

i | Aps cad a ciclo do loop, a n a lisar se o par


y im perfeito atu al m elhor do que o m elhor par
encontrado a t agora. Em caso afirm ativo,
arm azen-lo com o o novo "m elhor p ar im perfeito",
certificando -se d e arm azen ar tam bm os tpicos
em oposio.

C ertificar-se de que um "m elhor par im perfeito"


foi encontrado, e en to fazer consulta para o bter
m ais inform aes sobre o usurio considerado
com o o m elhor par, e m ostrar os resultados.

voc est aqui 485


introduzindo o logo for

Tudo o que precisamos um loop FOR


O PHP oferece outro tipo de loop que tem exatamente a funcionalidade
de que precisamos para as comparaes de respostas no Mismatch. Chama-
se loop for, e timo para repetir algo uma determinada quantidade de
vezes. Por exemplo, os loops for so timos para tarefas de contagem, como
contar regressivamente at zero ou contar progressivamente at algum valor.
Eis a estrutura de um loop for, que revela o modo como o loop pode ser
estruturado para atravessar um array usando uma varivel para contar ($i).

Condio de te s te
//nidializa o
doirfcador do Inicializao S realiza outro ciclo do loop se A tualizao
loop Com um o teste avaliar como true, ou seja, Atualiza o contador,
deteirmihddo Comea o loop se $i for menor do que o nmero
valor, h-ts com o contador, de respostas dos usurios. adicionando 1 a $i.
de o prodesso $i, em 0.
domedar.

A -funo dountO retorna Atualiza No dontador


$u!<^uer d dijo dolodado uma dofttay do numero de adidionando I a ele
d e n tr o d as dhaves e elementos do 3rr3y> o <^ue - isto e o mesmo <^ue
e* ed u ta d o em dada serve domo parte da dondidao dizer fi =. /, + J.
teraao do loop. de teste do loop.

0 Passo 3 do script Meu Par Imperfeito faz a comparao de dois usurios atravs
de um loop atravs de cada uma das suas respostas, calculando uma "pontuao"
com base em quantas respostas so opostas. Com os pedaos de dados a seguir,
termine de escrever o loop for que calcular essa pontuao.

$mi sma tch_responses


E o array com as
$score
$user__responses
respostas do usurio que A pontuao a ser
o array com as respostas o par potencial sendo calculada dentro
do usurio. considerado. do loop.
fo r <$i = 0; $i < c o u n t( $ u s e r_ re s p o n s e s ) ; $ i+ + ) {

if ( + )

a rra y _ p u s h ( $ t o p ic s , $ u s e r _ _ r e s p o n s e s [ $ i ] [ ' t o p i c _ n a m e 1] } ;

}
}
AQQ
controle seus dados, controle seu mundo

no existem
perguntas idiotas
1 Por que no simplesmente usamos um loop foreach para
calcular a pontuao, em vez do loop for?

Embora um loop foreach funcionasse perfeitamente para fazermos


o loop atravs de todas as respostas, ele no nos forneceria um ndice
(i$) em qualquer iterao do loop. Esse ndice importante porque o
cdigo est usando tanto para acessar o array das respostas do usurio
A quanto o das respostas do usurio B, Um loop foreach eliminaria a
necessidade de um ndice para um dos dois arrays, mas no ambos.
Assim, precisamos de um loop for regular, com um ndice que possa ser
usado para se acessar elementos semelhantes de cada array.

* Qual o propsito de se armazenar as repostas do usurio B


em um array prprio?

0 array com as respostas do usurio B importante para que


os usurios saibam exatamente como eles se comparam com os seus
pares ideais. No suficiente simplesmente dizermos a identidade da
pessoa que o par imperfeito ideal - melhor do que isso dizer em
que tpicos especficos o usurio tem respostas diferentes das dessa
pessoa. Isso ajuda a dar um pouco mais de contexto ao resultado, e
permite que os usurios saibam um pouco mais sobre por que esta
pessoa em particular seria um par imperfeito to bom.

No Passo 5 do script, como seria possvel no haver um


melhor par para o usurio em questo?

Embora improvvel, voc tem de considerar o cenrio em que


haja apenas um usurio no sistema inteiro, em cujo caso no haveria
ningum com quem comparar esse usurio.

voc est aqui 489


exerccio soluo

0 Passo 3 do script Meu Par Imperfeito faz a comparao de dois usurios atravs de
um loop atravs de cada uma das suas respostas, calculando uma "pontuao" com
base em quantas respostas so opostas. Com os pedaos de dados a seguir, termine
de escrever o loop for que calcular essa pontuao.
SOLUO
^mismatch sponses
$user responses
76 1 1 Love
Hate Tattoos Tattoos
1 1
77 2 Love
Gold chains Gold chains
2 2 Hate
3 Love
Body piercings Body pierdnqs
3 3 Hate
4 Love
Cowboy boots Cowboy boots
4 Love
5 Love
Long hair Long hair
5 Love
6 Hate
Love Reality TV Reality TV
6
7 Love
Professional Professional
7 Hate
wrestling wrestJ/nq

8 8 Hate Horror movies U - 8 j Love Horror movies


!------- -

$ varivel f sto re adaba


rx -faixa de O (nenKu
p a r e n d o n trad o ) a te o
numero to t a l de topidos
(desen d o n tro p ereito )-

$ pontuaca e Lembre-se, o numero de


mdrementada a dada usurio o mesmo
a p o s t a s do
resposta oposta lue o numero U ii de tpidos,
endontrada* un vez. nue as respostas
d ire to do questionrio.
fo r ($ i = 0; $i < c o u n t($ u s e r_ re s p o n s e s ); $ i+ + ) {

i f ( fuser_responsesCfi3Ctr^sponse>3 + ?mismatdh__responsesfi3rresponse,J
fsdore + Jj
a rra y

p u s h ($ to p ic s
/ fu s e r r e s p o n s e s [ $ i] ; ' to p ic _ n a m e 1] )

;
C ada topido dom respostas opostas
Uma dombi3ao positiva
\ e adidionado a um a r r a y , p a ra que
donsiste d e um a d o ro
0 d o n ta d o r do loop e ( j) dombinado a um
possa se r exibido ao usurio quando
usado para se passar o sistem a !Ke ap re se n ta o p a r odeio (X i, de modo que
a tra v s de dada im p ereito endontrado- adidionar os dois sempre
resposta d o usurio- re s u lta em um valor 3,
daso h aja a dombinaao
Fazer um loop atravs <fa ta b e la dos produrada-
usurios, com parando as respostas
dos dem ais s do usurio em questo.
controle seus dados, controle seu mundo

Finalizando o desencontro B-six S dript Qntomhrd o p ar


im perito p ara o usurio^
O loop que acabamos de criar para calcular a pontuao de
desencontro faz parte de um script maior (mymismatch.php), o qual
cuida de encontrar o par imperfeito ideal para o usurio, e depois
exibir as informaes.

mymismatch.php

// S procura pelo par se o usurio tiver respostas armazenadas

$query = "SELECT * FROM mismatch_response WHERE user__id = '" . $ _ S E SSION['user_


id'] .
So possvel adKar um p a r para o usuarto
$data = mysqli_query($dbc, $query};
" tiv e r respondido o Questionrio-
if (mysqli num rows($data) != 0) {

// Primeiro, obtm as respostas do usurio a partir da respectiva tabela (JOIN


para obter o nome do tpico)

$query = "SELECT rar.response_id, mr.topic_id, mr.response, mt.name AS topic_


name " .
familiar \)0fH e usado
p ara se o b te r o home do
"FROM mismatch_response AS mr " .

"INNER JOIN mismatch_topic AS mt " . topi to, so se seledionar as


respostas do usurio.
"USING (topic_id) " .

"WHERE mr.user_id = '" . $_SESSION['user_id']

$data = mysqli__query ($dbc, $query);

$user_responses = array 0 ;

while ($row = mysqli_fetch_array{$data) ) {

a r r a y _ p u s h ($user_responses, $row);

} 0 a r r a y fuser__responses arm azena


to d a s as respostas do usurio-

Il Inicializa os resultados da busca

$mismatch_score = 0;
E sta s variveis mantem
$mismatch__user_id = -1;
re g istro d a busda do
$mismatch_topics = a r r a y () Mismatch, a medida Que o
prodesso odorre-

A guente -firme> ainda


te m muito mis virc
a pagina/

voc est aqui 491


faa um par imperfeito!

__ __ T fe S T O r iv e

Encontre o seu par im perfeito ideal!


Modifique o Mismatch para que ele use o novo script Meu Par Imperfeito (ou
baixe a aplicao no site da Alta Books, em www.altabooks.com.br). Ser preciso
criar um novo script mymismatch.php, bem como adicionar um item de menu
Meu Par Imperfeito" ao script navmenu.php, para que os usurios possam
acess-lo.
Envie os scripts ao seu servidor web e depois abra a pgina principal do
Mismatch (index.php) em um navegador web. Certifique-se de que est logado
e que j respondeu o questionrio, e ento clique no item de menu "Meu Par
Imperfeito" para encontrar o seu par.

I Si

A p%*a
Meu Par
jw.pere'fbo
de JoHa*
revela *\ue
SidUey e o
seu oposto
per-ferfco.

AQA f^ a n tu n S
controle seus dados, controle seu mundo

Imas de Geladeira do Scfcema d Banco


de Dados
Lembra-se da aplicao Guitar Wars, de sculos atrs? A sua tarefa estudar o banco
de dados do Guitar Wars, o qual poderia se aproveitar de um pouco de normalizao,
e criar um schema melhor. Use todos os imas abaixo para completar os nomes das
tabelas e colunas, e identifique tambm as chaves primria e estrangeira.
0 bando de dados
d't'rw,^ a exibio
dai pontuades a
pgina prwdpal do
jui-tar Wars.

Eis o bando de
dados original do
g u ita r Wars, o
^al armana
pohtua^ocs
subm cilds pelos
usurios.

voc est aqui 495


ms do schma do banco de dados soluo

Imas de Geladeira d scfcema do Bancp de


Dados - Soluo 0 bando de
dados determ in a
Lembra-se da aplicao Guitar Wars, de sculos atrs? A sua tarefa
a exibidao das
estudar o banco de dados do Guitar Wars, o qual poderia se aproveitar
de um pouco de normalizao, e criar um schema melhor. Use todos os
pOnt^dOCS *a
imas abaixo para completar os nom es das tabelas e colunas, e identifique pgind prindipal
tambm as chaves primria e estrangeira. do g u ita r Wars.

A tabela
predisa de
uma dhave
prim aria, Que
e uma p a r te
importante
de QuaQuer
Uma v e r Que o mesmo usurio
bando de
fo d e p o sta r diversas pontuadoes;
dados
normlizado-
a doluna ame re su lta em dados 0 nome de dada
re d u n d a n te s - nada bom^ jo g a d o r agora
dividido em
A nova doiuna A ta b e la sdore primeiro nome e
sdore_id serve domo re-ferendia os jo g ad o res sobrenome, p ara
uma dbave prim aria a tra v s d e uma nova ser mais atomido,
muito nedessaria p ara dhave estrangeira- e s e arm azenado
a ta b e la sdore. uma vez., nao
p o rta n d o
O - Quantas
pohtuadoes o
\oftador envie--

>
As tabelas T A redundndia nos dados
a^ora IXma relaya dc V dos nomes dos usurios e
tem novos umpara-'***' resolvida d ria n d o -se uma
nomes, uma e n tr e jo g ad o res ova ta b e la p ara arm azen ar
vez. Que e pontu^oesj os nomes dos jo g ad o res, a
servem a Qual se doneda a tab e la
propsitos sdore a tra v s de uma dHave-
mais 0 bando de dados do
espedfidos- ju ita r Wars no tinHa
nenKum problema de
^ Certifique-se de que a s su a s colunas sejam atm icas
dependnda nas dolunas.
0 D a cada tabela a sua prpria chave primria. Bis aQui as re g ra s mais uma vez,
K . 3fe*as^para assegurarm os Que
0 Certrfique-se de a s colunas que no so chaves
vode nao as esQuedeu^
no sejam dependentes um as d as outras.
Ar\r> o
controle seus dados, controle seu mundo

r^aVras-CtuzacUis ? B P & M / S q L
Est preocupado sobre se o seu par imperfeito ideal ainda
est por a esperando para ser encontrado? Tire esse
pensamento da cabea completando estas palavras cruzadas.

Horizontais Verticais
I. Uma representao de todas as estruturas, como 1. Uma juno possibilita nos livrarmos de joins.
tabelas e colunas, do seu banco de dados, junto com o 2. Uma coluna, em uma tabela, que referencia a chave
modo como elas se conectam. primria de outra (em ingls).
4. Isto acontece quando mltiplas linhas de uma tabela 3. Quando um formulrio gerado a partir de um banco de
relacionam-se com mltiplas linhas de outra. dados, ele considerado...........
5. Isto lhe permite converter entre diferentes tipos de 6. No nuclear, apenas dados no menor tamanho
dados PH P. apropriado para um determinado banco de dados.
7. Use isto para combinar resultados de uma tabela com 8. Linhas de duas tabelas tm esta relao quando h
os resultados de outra, em uma consulta. exatamente uma linha em uma tabela para cada linha
10.0 processo de se eliminar redundncias e outros da outra.
problemas de design em um banco de dados. 9. Um destes pode ajudar enormemente a se entender o
II. Voc pode abreviar algumas instrues if-else com projeto de uma tabela.
este til operador. 13. Um nome temporrio usado para se referenciar uma
12. Quando uma linha de uma tabela relaciona-se comdeterminada informao, em uma consulta.
mltiplas linhas de outra
voc est aqui 497
palavras-cruzadas php&m ysql solugo

TalaVras-Cruzaclas fH F & M y S Q L
O

ylOA ft
controle seus dados, controle seu mundo

Sua Caixa de Ferramentas do PHP M ySftl

CAFTOLO 8
Um bom nm ero de novas tcn icas
para bancos de dados MySQL foi
apresentado neste cap tulo, sem
m encionar alguns novos truques
com o PHP. Vam os fazer um a rapida
recapitulao.

. ,t:' ;.!
U** s^a* e
riskyjobs precisa de uma ferramenta de busca em seu site

Um bom trabalho arriscado difcil de encontrar


O novo site Riskyjobs.biz tem como misso ajudar as empresas a
encontrar as pessoas certas para os trabalhos mais arriscados oferecidos
por elas. O modelo de negcios simples: para cada candidato que
conseguirmos achar para um emprego arriscado recebemos uma
comisso. Quanto mais combinaes de candidatos e em pregos
conseguirmos, maior o nosso lucro.
O Riskyjobs precisa de ajuda para melhorar a sua funcionalidade de ste -Pormulario
busca por vagas. Do jeito como est agora, ha um banco de dados cheio de busca simples
de empregos arriscados s esperando para serem descobertos pelas dhama um sdript
pessoas certas. Vamos dar uma olhada no formulrio de busca do Risky que -Paz. a busca na
Jobs e no banco de dados subjacente, que contm as vagas disponveis. "tabela riskyjobs.

0 orm ulH o de
busCa ddiOh um3
Corsulta na ta b e la
riskyjobs, a qual
produra f o r empregos
que batam dom o
d rite ro d e busca-
A tabela riskyjobs
Contem ttulos
e descries de
em prejos, ju n to
Com m-formaoes
sobre a
localizao ae
data d o anundio-

[i i l i i i i i l l i I lililM * ! ..p,ny.=' -
1 Matador Bustling dairy farm... Rutland VT 05701 Mad A bout Milk 2008-03-11 10:51:24
Dairies
2 Paparazzo Top celebrity... Beverly Hills CA 90210 Diva Pursuit, LLC 2008-03-24 10:51:24
3 Shark Trainer Training sharks to Orlando FL 32801 SharkBait, Inc. 2008-04-28 03:12:45
do...
4 Firefighter The City o f Dataville OH 45490 City o f Dataville 2008-05-22 12:34:17
Data vi lie...
5 Voltage Checker You'll be out in the... Durham NC 27701 Shock Systems, LLC 2008-06-28 11:16:30
6 Crocodile Dentist Do you love Everglades FL 34139 Ravenous Reptiles 2008-07-14 10:51:24
animals... City
7 Custard Walker We need people... Albuquerque NM 87101 Pie Technologies 2008-07-24 10:54:05
8 Electric Bull Hank's HonkyTonk... Hoboken NJ 07030 Hank's HonkyTonk 2008-07-27 11:22:28
Repairer
A
, Cada
> t identificado
m dividuaU ente a tra s e s M ostra os resultados
da cKave prim aria job_id-
^ d a busca!

502 Captulo 9
stings e funes personalizadas

Ernest, nosso t t^ o W eivo,


esta ^ar-^ado pov-^ue sua Wsta
ao e sta p r o d u z id o 'resultados.

ponte seu lpis


Q uando o formulrio do Risky Jobs submetido, a string de busca
armazenada na varivel $user_search, que colocada na consulta
SQL abaixo para ser feita a busca propriamente dita. Escreva aqui
quantas linhas do banco de dados riskyjobs da pgina anterior
sero encontradas com o resultado da busca de Ernesto.

M
$search_query = "S E L E C T job_id, title, State, description FROM r i s k y j o b s

"WHERE t i t l e = 1 $user_search'

$result = mysqli_query($dbc, $search_query);

Esdrev sua vesposta a\uif

voc est aqui 503


riskyjobs code setup

Tempo! T ire um m om ento para se fa m ilia rizar com o banco de dados


do Risky Jobs... e exp erim ente fazer algum as buscas.
Baixe o arquivo riskyjobs.sql, da aplicao Riskyjobs, no site da Alta Books em www.
altabooks.com.br. Esse arquivo contm as instrues SQSL para criar e preencher a
tabela riskyjobs com dados de exemplo.
Aps ter executado as instrues de riskyjobs.sql em alguma ferramenta MySQL,
experimente fazer algumas consultas para simular as buscas dos usurios. Eis alguns
exemplos:
SELECT * FROM r i s k y j o b s ^

S E LECT j o b _ i d , title , d e s c r ip tio n FI

^ Sa
Bull pi^Kiev ft/lstia d a r.
SELEC T j o b _ i d , title , d e s c r ip tio n FROM r i s k y j o b s

WHERE d e s c r i p t i o n L IK E '% a n im a ls % '

O cdigo-fonte completo da aplicao Riskyjobs


est disponvel para download no site da Alta Books:
www. a lt a b o o k s . c o m .b r

506 Caoitulo 9
stings e funes personalizadas

Imos de Geladeira da Clusula LKp


Temos um monte de clusulas LIKE bagunadas pela mesa. Voc
capaz de ligar as clusulas com os seus resultados? Quais imas no
sero encontrados por nenhum a destas clusulas LIKE?
Algumas fderao i t r
mais de wm <rsposta.

LIKE '%test %'


LIKE '%Tipper Cow%'

T eam M a s c o t C l f f D iv e r
(M a s c o te ) (M e rg u lh a d o r d e J ? e n h a s c o s )
Rodeo C lo w n
( P a lh a o d e R o d e io ) C ra s h T e s te Dummy
(B o n e c o de T e s te s de Im p a c to )
H um an C a n n o n b a l C at Herder
( B a la H um ana) (Pastor d e G a t o s )
( E n c a n ta d o r de S e rp e n te s )
....... - r
(P e t Food T s te r)
E x p e r im e n ta d o r de R aes p a ra A n im a is ( V ir a d o r de V acas)

( T o u r e ir o ) P o litic ia n 1
(C a a d o r d e T u b a r e s )

voc est aqui 507


stings e funes personalizadas

M
T f c S T O R f v e ___________________

Leve o form ulrio de busca do Risky Jobs para d ar uma volta.


Baixe a aplicao Risky Jobs no site da Alta Books, em www.altabooks.com.br. O
script search.php contm o cdigo para a gerao das consultas, no qual voc
acabou de trabalhar, e usado para processar os dados de busca digitados no
formulrio da pgina search.html.
Envie o script e os outros arquivos do Riskyjobs para o seu servidor web, e
depois abra o formulrio de busca (search.html) em um navegador. Faa
algumas busca para ver como o seu cdigo gerador de consultas se comporta.
No se esquea de testar a busca Buli Fighter Matador de Ernesto, que um
bom teste para o novo cdigo com implode().

Danger! Your dream job is out there.


Do you have the guts to go find It?

Risky Jobs - Search Results


Job Title Description
Ptc fighter Up and coifiiBg super fly goat wight boxer aa
opponent to kelp buils his winning neeas'd. Sk
sloppy hands, and a glass jaw sibpreferred. No
experience requited. TWs is not a fellt!nss sois
position. Well meet you m the alley behind the
to shape, the pons. Let Roc King make you a
championship fighter.orat ieast Mp you lose to
net
Toreador Lovely bovines waitingforyearsuperiorjsoe-
violefit c&pewavingskills.Must pass basicbull
fightiBg aptitude test.
Hicks Hoaky Task needs aft experienced elestac
Electric Bull
Repairer btdi ropakcrj Ficc ndcs Rafteryou fix it) ssd halfofif
hot wusgs are sonse of the benefits.
&

Eirnes-f ho enor>-rou
media^a^chie o seu iv-abalho
avmdado perei-U as cie
de+iiiivairr,hc esi -farchdo
pro^vesso, agora <^uc o siHpt
de busfia pv-outra pov- ada
ia-me mdividuaUenie.
podemos m elhorara busca?

SeUa, equilibrista de
tordas bawbas,
est ie*<Ao multa sor-te 0 S " t e r m o s d a r a m e n 'f c e m o s t r m
dom o -formulrio de uma busa por va^as para
busias do Risky Jobs- equilibristas de dordas bambas
de dirdo, mas os resui'tados no
sao e/aameri-te apropriados.

Danger! Vourdream;ob is out (her.


Doyouhave the guts to go findIt?

Risky Jobs. Search Results


JobTifie Description Stale Date Posted
M a ste r C a t Ju g g ler Are yt a practitioner of the Jost art of cat jnggjing?
Bsnaed in forty cotrntries, only the Jim Ruiz Circus
AZ 2008-11-14
21:13:35
bas tefiaed cat juggling for the sophisticated tastes of
the modem audience. Ply yourtrade with premiers cat
jugglers at our circus, tie only place an et) to master
sywdinmized cat juggling. It's fnie, juggling than ii
even hauler teas herdiEg item. We a m aa equal
ppafttt&ity employer, and look ibrward to addiag you
to our team. Please be prepared to ondsi^o a thorough
battery of tests to prove your deft haadling o f felirses.
Only ttse crean of tbe crop will be accepted iato our
Master Cat Juggler program, ier que o
Tightrope Tester I f th e th o u g h t o f d a n g lin g & w h o u rs o h e n d 6 o m g re z t
h e ig b t s is y o u r id e a o f a g o o d tim e , th e n th is jo b ju s t
M T
2008-11-14 iroblem a so
21:17:16
m a y b e f o r y o u . E y & iy o r * o f o u r r i g b b o p e s g o
th r o u g h n g o w o s a 4 3 p o ie t t e a , c u ln a tta tin g i s a zea l
|os term o s
l iv e fc u jn a a h a n g in g f e f a p r o lo n g e d p e r io d o f tim e .
T h a t c o u ld b e y a a i W e d o p ro v id e safety n e ts b u t le busca, ou
yu*U n e e d t o b a n g y o u r o w e h e lm e t a n d g lo v e s. H ens
s t o a r m a n u fa c to ria g a n tearin g fa c ility in B ig T o p , Irealm en te
M o n tan a * w e o ffe r a c ic c ie d ib ie e m p lo y m e n t p a c k a g e
w itk fceoefits ra n g in g fio m B rin g Y o u r P e t to W ork no h
W eek a n d F w m a l F rid ay s. W e w fll n e e d flu ee
re feren ces, in c lu d in g y o u r v e rifie d s a x im u i b a n g vagas para
tim e a n d n u m b e r o f p a st fails. W e re th e c iic tti b e h in d
tis e c u c a s ! [equilibristas?
stings e funes personalizadas

aponte seu lpfs---------- ---------------- -------------------


Escreva abaixo a consulta SQL gerada quando Selma digita
"tightrope, walker, circus" ("corda bamba", "caminhante", "circo")
como a sua busca, e depois escreva quaisquer problemas que voc
acha que podero ocorrer.

voc est aqui 517


prprocessando a string de busca
ponte seu lpis
Soluo Escreva abaixo a consulta SQL gerada quando Selma digita
"tightrope, walker, circus" como a sua busca, e depois escreva
quaisquer problemas que voc acha que podero ocorrer.

SELECT * FROM nskyjobs


IfVttRE description L\Kfc^K-tvopc,%# OR description Lf^E '%ydlkev% OR
description L|E 'Vofcirdus'Jo
A un3 /\s vrgulas sao Consideradas tomo
e*plodeO usa parte dos -termos de busta, e nao
espaos too Como serradores entre os -termos.
delimitadores,
ms no pega as
vrgulas. unido termo de busda
^ue esta realmente
sendo usado e Cirdusw,
porque ele no tem uma
virgula acidentalmente
libada a ele-

Nao vejo qual o problema. Basta chamar a


funo explode() duas vezes - uma para se livrar
dos espaos e a outra para se livrar das vrgulas.

A funo explode() lhe perm ite dividir uma string em


substrings, mas neste caso ns j temos substrings.
A primeira chamada funo explode() nos deixa com vrias
strings armazenadas em um array, portanto no existe mais uma
nica string a ser explodida. E tentar explodir cada uma das strings
do array provavelmente s criaria mais problemas. Em vez de
tentar resolver o problema do delimitador com vrias chamadas a
explode (), o que ns precisamos pr-processar a string de busca,
para reduzi-la a um nico delimitador antes de sequer fazermos a
chamada a explode (). Ento, essa funo poder fazer o que faz
melhor - dividir a string usando um delimitador.
stings e funes personalizadas

Pr-processe a string de busca 0 p t - p r P oesscin} e tifc o


Ns queremos passar funo explode () uma string que p e r m i t e <ue
ela possa dividir sem problemas, de uma s vez. Como
fazemos isso? Certificando-nos de que explode() s precise n p s liV re m o g
se preocupar com um delimitador, por exemplo um
caracter espao. Isso significa que temos de pr-processar a d e O c|3:ctctetes
string de busca, de modo que cada termo seja separado por
um espao, mesmo que o usurio tenha digitado vrgulas. n J e s e jtlJ o s e ^U e
iP tn e n iP s o s d a d p s
Predisamos trans-formar
isto-.. m a is e e is d e
p r p o e s s c j-

...nisto-

para cxplodeO
nos --ornea isto/
tightrope walker circus

er* vir^uias/

$search words
nQ e x is te m
-p e rg u n ta s Id lo ta s -

Podemos usar mais de um caracter como Q ? Podemos simplesmente apagar as vrgulas,


delimitador, ao explodirmos a string de busca? em vez de transform-las em espaos?

J ^ Z Sim, voc pode especificar qualquer nmero


de caracteres para servir como o seu delimitador,
A: Isso S funcionar se os usurios separarem os
seus termos de busca com uma vrgula e um espao,
mas isso no o mesmo que especificar diferentes e no podemos confiar que ser sempre assim. Se
delimitadores, e no resolver o nosso problema aqui. apagssemos as vrgulas, correramos o risco de
Se usssemos explode(',$user_search) para dividir transformar "tightrope,walker" em "tightropewalker", o
a nossa string, isso usaria uma vrgula e um espao que provavelmente no encontraria nada no banco de
combinados como o delimitador e funcionaria se o dados do Risky Jobs.
usurio digitasse tightrope, walker, circus". Mas
falharia se ele digitasse tightrope walker circus.
Nesse caso, acabaramos tendo apenas uma longa
string - nada bom.

voc est aqui > 519


php funo str_replaceQ

Substitua caracteres de busca mdesejados


Se voc pensar bem, o pr-processamento da string de busca no Risky Jobs
funciona de modo bastante parecido com o recurso de localizar e substituir de
um processador de texto. No nosso caso, queremos encontrar vrgulas e substitu-
las por espaos. A funo str_replace() do PHP lhe permite fazer exatamente
isso, usando trs parmetros: o texto que voc quer encontrar, o texto que deseja
colocar no lugar do primeiro e a string na qual voc quer realizar a operao de
localizar e substituir. Eis um exemplo de str_replace() em ao: e esta e a string a sr
t
Esta a substring \ue
ofoada no lugar da

te pVi**<V-

$clean search =*
vo deseja substrtuir

('milhares
r
1centenas',
Ganhe milhares de reais logo no primeiro ms.
Candidate-selagora!');
V 0 iccteW o parmetro t a string <y*e ser
modificada- A^ui, estamos adtonando um
poudo de verdade ao anundto substituindo
MmKaresMpor ^entends*.
Mas, e quanto s vrgulas na string de busca? A funo str_replace ()
trabalha igualmente bem na substituio de caracteres individuais:
Lembre-se, esta a substring e esta a string
*V*e vode esta substituindo...

$clean_search = str_replace(' ,', ' ', 1tightrope,


<r substituta-

walker, circus);
Sempre <\ue aparefier uma vrgula nesta __
string, ela sera substituda por um espado.

Depois que este cdigo for executado, a varivel $clean_stiing


conter a string tightrope walker circus.

Voc v algo suspeito nos resultados da funo


str_jeplace()? Voc acha que a substituio das
vrgulas por espaos ir funcionar da maneira que
queremos?
stings e funes personalizadas

Dado o cdigo PHP abaixo, mostre qual seria o output do array $search_words
para cada uma das seguintes strings de busca. Certifique-se de escrever dados
para os elementos apropriados do array e risque os elementos que sobrarem
caso o array $search_words acabe contendo menos elementos.

$ c lea n _ se a rc h = s t r _ r e p la c e ( ', ', '', $ u s e r_ s e a rc h );


$search_w ords = e x p lo d e (' ', $ c le a n _ s e a rc h );

bull,matador cape

$search words

3 cspatos;
buli matador cape

$search words

$search words

voc est aqui 521


exerccio soluo

Dado o cdigo PHP abaixo, mostre qual seria o output do array $search_words
para cada uma das seguintes strings de busca. Certifique-se de escrever
^ dados para os elementos apropriados do array, e risque os elementos que
ftCIClO sobrarem caso o array $search_words acabe contendo menos elementos..
SoLuao

$clean_search = str_replace (', ', 1 1, $user_search) ; Este array tem


$search_words = expl o d e (' $clean search) ; fc a tres elementos

bull,matador cape

Estes dois elementos do array a $search words


verdade esta vadios, por ausa
da<\weles dois espaos entras entre
fttador e tft na string de Ws3
3 espatosf
buli matador cape

$search words

bull , matador cape

Nova>ehte, dois elementos


vazios, porque a vrgula e
substituda por uim espado.
X espatos'

buli,matador, cape

$search words
stings e funes personalizadas

Ahn, no. O pr-processam ento nos livra de ca ra c te re s


indesejados, m as, infelizm ente, no resulta em um a rray
contendo apenas term o s de busca teis.
Lembre-se, o nosso objetivo ter uma string em que cada termo de
busca seja separado exatamente pelo mesmo delimitador, um espao.
D outra olhada no que aconteceu nos trs ltimos exemplos da
pgina anterior. Alguns dos elementos do array $search_words esto
vazios. Se tentarmos criar a nossa clusula WHERE com os elementos
vazios, poderamos acabar com algo parecido com isto:
SELECT * FROM riskyjobs
WHERE description LIKE '%bull%' OR
description LIKE '%matador% 1 OR
'% %' OR
description LIKE 1% % 1 OR
description LIKE '%cape% 1
B-sfs espaos irdo
Cht0h"tV"3V*fid CSpo
steja jjvesen-fce em tad
dSri^o dc fig s
sa um problema t nbo.

Errado! Eles vo encon


Se houver um nico espao, <
descrio de um emprego (e
menos um ), esta consulta o e
como resultado. Assim, todos
dados do Riskyjobs sero en<
por esta consulta. Precisamos
vazios no array antes de pode
SQL para tomar o script de t

voc est aqui 523


tirando itens vazios da busca

A consulta precisa de termos de busca legtimos


A boa notcia que no muito difcil consertar os nossos termos de busca antes de us-
los em uma consulta. Teremos de criar um novo array que contenha apenas os termos de
busca reais. Para isso, copiarem os todos os elementos no vazios do nosso array original
para um segundo array, e ento usaremos este ltimo para construir a consulta SELECT.
Para construir o novo array, podemos usar um loop foreach para realizar ciclos atravs
de cada elemento do array original, e depois usar uma declarao if para encontrar os
elementos no vazios. Sempre que encontrarmos um elemento no vazio, basta adicion-
lo ao novo array. O processo se d mais ou menos desta forma:

Eis o array original


dontm os -termos dc busda e
os elementos vazios Asados
feios espaos extras.

Ns precisam os adicionar
Estes dois elementos
vazios predism ser algum cdigo ao nosso script
eliminados^ para c ria r um novo array,
contendo apenas os term os
de busca no vazios.

0 novo array c menor,


porque ele dontem apenas
termos de bus ^eais
nada de elementos vazios.
$final search words
stings e funes personalizadas

Copie elementos no vazios para um novo array


Agora, vamos dar uma olhada no cdigo que copia os elementos no vazios
do nosso array Ssearch words para o novo array $final_search_words.

$search_query = "SELECT * FROM r i s k y j o b s " :

// Extrai as palavras-chaves de busca e as coloca em um array


$clean_search = str_replace(1,', T ', ?user_search);
$search_words = explode(' $clean_search); / espaos usdndo
strjreplateO.

Faz. m loop atravs de fiada


elemento do array ?searfih_jord.
Se o elemento nao estiver vazio,

J fiolofia-o no array fikaado ?f ina!_


searfih words.

Aps verificar que h pelo menos um termo de busca no array $search_words, o loop
foreach percorre o array, procurando por elementos no vazios. Quando encontra um,
usa o operador [] para adicionar o elemento ao final do array $final_ search_words. E
assim que o novo array criado.
E depois? Bem, ns geramos a consulta SELECT da mesma forma que antes, exceto
pelo fato de que agora usamos o array $final_search__words em vez de $search_words:
// Gera uma clusula WHERE usando todas as palavras-chaves
de busca
$where_list = array{); ,
if (count (^fina'L-_search_ l i ) > ) { Este o mesmo tdiy><\ue ja
foreach as -$word) { -=r* ^ a firiar a filusula
$where_list [] = "description LIKE '%$word%'"; vVttERE da f i o n s u l t a de bust,
mas desta vez- ele usa o novo
array ^i'maljsearfiK.jMords, <\ue
$where_clause = implode(' OR ', $where_list);
*ao tonte** nenhum elemento
// Adiciona a clusula WHERE consulta de busca, vazio.
if (!empty{$where_clause)) {
$search_query .= " WHERE $where_clause";

Esse cdigo nos fornece uma consulta de busca que


no possui mais nenhum elemento vazio. Eis a nova
consulta para a busca buli, matador, cape ("touro,
toureiro, capa"):
SELECT * FROM riskyjobs
WHERE description LIKE 1%bull%' OR
description LIKE '%matador%' OR
description LIKE '%cape%'
voc est aqui 525
teste search.php

T tE JS T O R f V e
A tu alize o scrip t S earch para que e le pr-processe a string de
busca do usurio.
Atualize o script search.php de modo que ele use as funes explode () e
implodeO para pr-processar a string de busca do usurio e gerar uma
consulta SELECT mais robusta. Depois, envie o script para o seu servidor web e
experimente fazer algumas buscas.

Danger! Your dream Job is out there,


Do you have the guts to g d find it?

Risky Jobs - Search Results


Job Title Description State Date Posted
Tightrope Walker Fledgling big top looking fcrtkiee-riikg profess* an al TX 2008*11-14
with 1-3 years o f experieace to pesfcim tightropes 21:16:19
acrobatics, with pudgy elephant. Willingness to sweep
excrement a big piss. Exeslleat fceueSti iccluding
mcdical aad dental pirns* 4G1 (k), stack ownmhip
and discount purchase plan, prescription coverage,
merchandise discount,shczt acd long term disability
insurance, life and business travel insuraae, vkkm
discount p5aa*attis> and home jDsinance discounts*
medical care and dependent care eeiHfeniseEaeiiti
educational ahtance, paid vacation aad holidays,
and adaption assistance. Flexible starting salaries ^ W i i t S tk a
based ob skilU aod abilities, experience aud
geographic market. Proraorioa opportunities based on
f- "^Wlro,*, a ii^
pezfonnaace. The only thing stopping you from the a9- p j f t
highest wine in the big tent is your desire and work
Cstr ttotombrvdo
a^tios ais relevtes
ethicaisd youx balance1Other duties mclude
planning 4korganizing wiias,handling minor elephaat
admici statio n , processing consnsexst cards from /
children. Leading by example (dca't tall!), showing
mitialiva and a sease o f urgency and being results-
drivexs help acispfeatic professionals become successful.
If yon want to be challenged and your talent needs
meatoriag and opportunity. Bicgliag Brothers can
fieryou a fast track to success?
Master Cat Juggler Are yon a prartitinuercf ths lost art o f cat juggling? AZ 200S-U-H
Banned in Sbrty conn tries, only the Jim R1112 Circus 2 1 : 1 3 :3 5
has refined cat juggling for the sophisticated tastes of
the modem auditnce.PIy your trade with premiere, cat
jugglere at our circus, the only place on earth to inaster
synchronised cat juggling. Its true,juggling them is
even harder than herding them. We axe. an equal
opportunity employer, and look fonvaid to adding you
to our team. Haase he prepared to undergo a thorough
battery o f tests to prove your deft handling of felines..
Only the cream o f the crop will be accepted icto our
Master Cat Juggler program.
Tightrope Tester If the thought o f dangling for boms on end from great MT 2008-1144
heights is your idea of a good time, thee this job just 2 1 : 1 7 :1 6
may be for you. Every oee of our tightropes goes
through rigorous a 4-3 poiat test, culminating la a real
stings e funes personalizadas

Estou obtendo anncios de emprego, mas


estou recebendo descries enormes para cada
anncio. Nao preciso de todas essas informaes.
Talvez seja melhor eu tentar em hazardpays.com,
onde eles mostram apenas parte da descrio, e eu
posso ver mais anncios por pgina.

Embora o Risky Jobs es te ja fazendo um trabalho


m uito m elhor para ach ar anncios, as enorm es
descries deles so um exagero.
O que realmente est irritando Selma que para ver mais
anncios, em seu navegador, ela tem de passar por vrias telas.
No necessrio mostrar a descrio inteira de cada emprego
nos resultados de busca. O ideal mostrarmos apenas parte da
descrio de cada anncio, talvez apenas as primeiras frases.

Escreva abaixo como ns poderamos diminuir as descries dos


anncios, de modo que eles no fiquem to grandes nos resultados
da busca:
a funo php substQ
s vezes voc s precisa de parte de uma string
Uma vez que a extenso das descries de empregos no banco A imp FHP
de dados do Riskyjobs varia bastante, algumas delas sendo muito 1 ,v ,
longas, ns poderamos melhorar os resultados de busca reduzindo S u d S u \ J
as descries a um tamanho melhor. E para no confundirmos os Po
usurios, podemos colocar reticncias (...) ao final de cada uma, para P mTh
deixar claro que eles esto vendo apenas parte de cada descrio
e -x tra n -m o s
Voc passa funo a string original e dois nmeros inteiros. O
primeiro o ndice de onde voc deseja comear a substring, e o p c ttte d e u m a
segundo a sua extenso, em caracteres. A sintaxe a seguinte:
s trin g .
s u b s t r ( s tr in g , in c io , e x te n s o )
5 t *
tavae-teres a sevem
3 s u b s t r eeKefar 1 rcorndos-

No que diz respeito funo substr(), voc pode pensar na string


como sendo um array em que cada caracter um elemento
diferente. Considere a seguinte string::
$job_desc = 'Are you a practioner of the lost art of cat juggling? 1;

De forma semelhante a elementos de um array, cada caracter desta


string possui um ndice, comeando e 0 e indo at o final da string.
>ractioner of the lost art of cat juggljjir^
3 4 5 6 7 8 9... 50 51 52

Podemos usar esses ndices com a funo substr () para obter


partes da string:
Cowete o ,__ "r. substr ($job_desc, 4, 3) you
4*) re-tovifte 3
tairatteres
jpr substr($job_desc, 49) ing?
ComcCe m t,Wlna
vez. <\ue nao espediiiamos
o SeWUfido substr($job_desc, 0, 3) Are
siyitca <\ue a -U^ao deve
seguir ate o -Pinal da sfcring.
substr($job_desc, 0, 9) Are you a
stings e funes personalizadas

Extraia substrings do incio ou do fim


A funo substr() no se limita a obter substrings a partir do incio de
uma string. Voc pode tambm extrair caracteres comeando do final
da string. A extrao ainda correr da esquerda para a direita; voc
apenas usa um ndice negativo para identificar o incio da substring.

A^^ou^a^practitioner of the lost art of cat juggljjijj?


-53 -52 -51 -50 ... ... -3 -2 -1

Eis alguns exemplos:


Comete * ^ ^substr ($job_descf -53, 7)
vc'bo'T'^c "7 t'rt'tc'rcs-
Co*M s u b s t r ($ jo b _ d e s c , - 9 )
h*do 3 paHir d it

ponte seu lpis


Segue abaixo algum cdigo PHP para gerar uma tabela HTML
para os resultados de busca do Risky Jobs. Termine o cdigo,
cuja tarefa lim itar a descrio dos anncios a 100 caracteres, e
tam bm reduza o texto referente data do anncio de modo que
ele mostre apenas o ms, o dia e o ano.

echo '<table border="0" cellpadding="2">';

echo '<td>Job Title</td><td>Description</tdXtd>State</td><td>Date


Posted</td>';

while ($row = mysqli_fetch_array($result)) {

echo '<tr class=,,r e s u l t s ;

echo '<td valign="top"width=''20%"> 1.$row [1title ] . '</td>';

echo '<td valign~"top"width="50%">'................................ .


...</td>1;

echo <td valign="top"width="10%">'.$row[1state'] . '</td>';

echo '<td valign="top"width="20%">1...... ...........................


. f</td>1;

echo '</tr>';

echo '</table>';

voc est aqui 529


aponte o seu lpis soluo

^ A p o rte seu
0 1
lpis Segue
--------- ----------- ------------
abaixo algum cdigo PHP para gerar uma tabela HTML
\> 0 lU p c l0 para os resultados de busca do Risky Jobs. Termine o cdigo,
cuja tarefa lim itar a descrio dos anncios a 100 caracteres, e
tam bm reduza o texto referente data do anncio de modo
que ele mostre apenas o ms, o dia e o ano.
echo 'ctable border="0" cellpadding="2">';

echo ,<td>Ttulo</td><td>Descrio</td><td>Estado</td><td>Data do Anncio</td>';


, .n Coloque veiido^tias do i*al,
while $row = mysqli fetch array($result)) { . .l f
- pava mdidar <\ue sto c
echo '<tr class = ''results">'; afends pairfce d desi-^iao

echo '<td valgn="top" width="20%">' . $row['title1] . '</td>1; 1

echo 1<td valign="top" width="50%"> T


...</td> '}

echo '<td valign="top" width="10%">' . $row['State] . '</td>';

echo '<td vaiign="top" width="2 0 % " 1 0 ) ....


. '</td>';
echo ' < / t r > ' ; Todos os dados dt d it _
fosted domeam tom M M -
} D D - M A A , o ^ue odufa
e*taeinie f tav-atfceves.
echo '</table>';

nao existem
jvjptl Geek p e r g im ta s i d i o t a

* Substr{) trabalha com valores numricos?


possvel dispensar a funo PHP substr() e
lim ita r os dados da descrio na prpria consulta No, ela funciona apenas com strings.
SQL. Para isso, usa-se uma funo MySQL m uito Porm, se voc tiver um nmero armazenado
semelhante, chamada SUBSTRINGO, a qual aceita como CHAR, VARCHAR ou TEXT, ao obt-lo
os mesmos argumentos que substr{). A nica atravs de SQL, esse nmero tratado pelo PHP
diferena que o ndice comea em 1, em vez de como uma string, e no um nmero, de modo que
0. Assim, para obter o 100 primeiros caracteres voc pode usar a funo substr() nele.
da descrio, usamos isto:

SELECT SUBSTRING(job_description, 1, " P E se o valor referente extenso for


100) maior do que a string? Ser retomada uma
FROM riskyjobs; string com espaos depois dela, para atender
ao valor da extenso?
A vantagem de usarmos a funo PHP que
teremos tanto a descrio parcial quanto a
descrio inteira disponveis para nosso uso. Se Ser retornada a string inteira. Mas a
usarmos o MySQL, s teremos a descrio parcial, funo no insere espaos depois da string para
e teramos de criar outra consulta para obter a mudar-lhe a extenso. Por exemplo, o seguinte
descrio completa. cdigo retorna a string 'dog': substr('dog', 0,10).
stings e funes personalizadas

T e js t O R v e

A juste o script Search de modo a lim ita r o texto exibido para


descries e datas dos anncios.
Modifique o script search.php de modo que ele passe a usar a funo PHP substr()
para reduzir os textos de descrio e a data dos anncios retornados pela busca.
Depois, envie o script paira o seu servidor web e teste-o com algumas buscas.
Selma esia tonixnixi
por<\ue cia yodc Vy os resul-fcados
da sua busta se* iev- de passar
pelas en ojes desoiSes dos
ahundtos.

O angerl Y o u f job is out there


D o yo u h ave th s g u ts to go fin d It?

Risky Jobs - Search Results


Job Title Description State
Tightrope Walker top lc o k b g fb r P " 1 ^
w tb 1-3-uiaaTt
years,nfofffKoeneiscc-
expetisRcs tQ tQperform
performtsga.tr,..
tigktr
AZ 20084144
Master Cat Juggler Are you a practitioner p f* e l !
B &owed in forty cauatnes., oaly the Jim Ruiz...
Tightrope Tester If the t h o ^ t dasrfiM for hem s oa r i * g *at fcTF
jbs& tb*.

Eu realmente gostaria de
ver os resultados classificados pela
data dos anncios ou talvez por estado.
A data do anundio iambem
u fo u o r*ais dil de lev,
Eu realmente gostaria de achar um
o u

agcra ^ue ostva apenas a daia


emprego de toureiro em Vermont. e k3o a hora de pos-kagew.

Como ns poderamos mudar o layout da pgina


e a consulta para podermos classificar os
resultados pr data, estado ou ttuio?

voc est aqui 531


adicionando classificao busca dos resultados

Podemos classificar nossos resuHados com mltiplas consultas


Para permitirmos que os visitantes classifiquem os resultados das suas buscas,
preciso que eles possam identificar como querem os resultados ordenados. Talvez um
formulrio... ou um boto? Na verdade, bem mais simples que isso. Podemos usar
HTML para transformar cada cabealho de coluna, na tabela de resultados, em links.
Os usurios podero ento clicar no link para indicar por qual coluna eles querem
classificar os resultados.

OS
terias audios dlassi-Pidando os
*3is &di!mcic
resultados atravs desks dabedalhos.
Danger! Yout dream job t* out there. Podemos -b-ansfovmav os dabedalhos er*
Do you have the girts to go find It? links ^ue permi-fcam 3os usuirios dlidar
hfilcs para ordenar os anundtos.
Risky Jobs - Search Result^ sLState \ Date Posted
lob Title Description an MO 2008-11-14
Up and coming suj. ~4 c------ ~ r
Prizefighter
opponent to help fetald Som t..
Lovely b o v m e s w a itm g f c r y o w s u i^ r ^ - Y ir f m t ID 2008-11-14
Toreador
cape waving skills. Must pass basic bull fight*...
NJ 2008-1144
Electric Bull Haflk'i Honky T e a t needs an experienced elactiic
bull repaker. Free rides is fe ry c * fi* ad hal.-.
it)
Repairer

Ns podemos usar esses links para recarregar o mesmo script Search, porm com
uma consulta que classifique os resultados de acordo com o link clicado. J sabemos
como usar ORDER BY para estruturar uma consulta com resultados classificados. Se
criarmos diferentes consultas SQL para classificar atravs de cada coluna individual,
permitiremos que o usurio ordene os resultados alfabeticamente por ttulo, descrio
ou estado, ou cronologicamente por data do anncio.
Eis a consulta SQL para classificar os resultados alfabeticamente, pela descrio:

SELECT * FROM riskyjobs


WHERE description LIKE '%Bull%' OR description LIKE '%Fighter%' OR
description LIKE %Matador%'

domando dlassi-Pida os
resul-tados da donsul'fca pelas
desdries dos empregos, cm
ordem alabtida dresdenie-
stings e funes personalizadas

voc est aqui 533


ORDER BY ordena o resultado da consulta

[ %Aponte seu lpis


^ 8^ OaIiiaSa do
OUIUyttU Escreva
Rjskytrs
Jobsconsultas
deacordodiferentes quedo
comottulo classifiquem
anncio, oosestado
resultados
ea
data. Assumaqueousuriotenhadigitadoastringde busca
"window, washer, skyscraper"("janela, lavador, arranha-cus").
SELECT*
WHEREdescription L|^E '%window7e>ORdescription L|^E '^wasHe^1 OR
description L|E '%skysCraper%>
^ -^RPER Byjb_title
ORPERBVt ..SELECT.ff.FRO/ytxkltyjefc.......................................................
0 padro de

ASCcndcnte WHEREdescription LjKE'%wi?d?;w%OR.description L[^E.'.^Y?h,)PR.


(fcresiente)^ desdriptiwi L|^E ^^C raper% '
O mCSm *\ViC
ORPER jo b j tl* ... ORDER BY.state
ASC.
SELECT ff FROM risk^jobs
WHERE description L(^E '%Y/ihdovi%J OR description L|^E '%yiasher%i OR
description L|^E t%sk^scraper%i

Comopoderamosreescreveressasconsultassevocquisesseverosttuloseosestados
emordeminversa?Esequisesseterosannciosmaisnovosaparecendoprimeiro?
/SELECT FROM risk^jobs
WHERE desription Lj^E t%window%> OR desCription L(^E t%y/asKer%>OR
description Ll^E '%sleyscraper%*
Poder mos ORPER B V jo b ^ tle .P E S C
^ r estes, caso
J tnhamos ff FROM riskyjobs
classilicad por
uma ds CouhsT description LlJ^E '^^Ssher^ OR
c entao o description L(xE ^skysCrape^*
usurio clica
nela novamente
pra inverter a
ordem. .* r i st o > k
WHERE description L|E ^v/indov^ OR description L^E '%y/asKer%) OR
description Lj^E ^skysCrape^*
^ ORPER BV date_posted PESC

534 C antitin Q
stings e funes personalizadas

Parece que vamos


precisar de um monte de
cdigo redundante para gerar todas essas
consultas. Ser que no podemos evitar essa
situao de ter o mesmo cdigo repetido
trs, ou at mesmo seis vezes?
Sim. Embora seja verdade que precisaremos
executar uma consulta diferente sem pre que o
usurio clicar em um link diferente, possvel
construir uma nica consulta baseada no link clicado,
Na primeira vez que os resultados so exibidos, nenhum link
foi clicado ainda, portanto no temos de nos preocupar com a
classificao. Podemos simplesmente pegar as palavras-chaves
submetidas no nosso formulrio e construir uma consulta sem
ORDER BY Os resultados so exibidos com cabealhos clicveis,
cada um dos quais com um link de volta para o script, mas com uma
ordem de classificao diferente. Assim, cada link consiste de uma
URL com as palavras-chaves originais e um parmetro chamado sort,
que indica a ordem na qual os resultados devem aparecer.
O que realmente nos ajudaria aqui seria criar a nossa prpria
funo personalizada, a qual possa pegar informaes sobre o
modo de classificar os dados e retomar uma string com a clusula
WHERE e ORDER BY nos seus devidos lugares. A nossa nova
funo personalizada consulta o parmetro sort para descobrir
como classificar os resultados da busca. Eis aqui os passos que a
funo tem de seguir:
Pr-processar as palavras-chaves da busca, e armazen-las em um array.
O Opcionalmente, usar um parmetro sort que diz funao qual coluna
usar para a classificao.
Livrar-se de quaisquer palavras-chaves vazias.
Criar uma clusula WHERE contendo todas as palavras-chaves de busca.
O Verificar se o parmetro sort tem um valor. Se tiver, anexar uma clusula
ORDER BY.
Retomar a consulta recm-formada.

Isso pode parecer muito trabalho, mas j temos a maior parte do cdigo escrito.
S precisamos transform-lo em uma funo. Mas antes de fazermos isso,
vamos dar uma olhada no modo de escrever funes personalizadas...
voc est aqui 535
escrevendo funes php personalizadas

As fimpes lhe permitem reutilizar cdigo A s u n s & s


Uma funo um bloco de cdigo separado do resto do seu p e r s o n a l i z a d a s ljie
cdigo, o qual voc pode executar em qualquer ponto do seu
cdigo que quiser. At agora, tem usado funes internas que p e r m i t e m o r g a n i z a r
o PHP j criou p a ra voc. ex p lo d e (), substr() e mysqli__query()
so funes pr-definidas pelo PHP, e podem ser usadas em u m p e c la ^ c[e
qualquer script. c d ig o "P H P p p f
Mas voc pode tambm escrever as suas prprias funes
personalizadas, para implementar recursos no fornecidos n o m e , d e m o d o <jUe
pela linguagem. Criando uma funo personalizada, voc
pode usar o seu prprio cdigo vrias vezes, sem ter de repeti- V c e p o s s a lr e u tlllz -
lo no seu script. Em vez disso, basta chamar a funo pelo
nome, quando quiser rodar o seu cdigo. lo fa c ilm e n te .

Segue um exemplo de funo personalizada chamada


replace_commas(), a qual substitui vrgulas por espaos, em
uma string: Um domunto de parenteses vem
j / ' ^ / .A
o nome da sua depois do nome da -rwnao- vode
W a e vode tem pode enviar um ou mais valores
Para driar uma &runtao liberdade para esdolher o para a sua -fundo na orma de
personalizada, vode
.A
a inicia nome quiser adao ar^umehtos, dada um separado
dom a palavra "lunctien o ais descritivo possfvel- por vrgula - este daso, s Ha um
ar^umento-
/
function replace_commas($str) {
As dhaves indicam
onde estar o Codigo
uhao, da mesma
$new_str = str_replace(',', 1 1, $str)
orm domo em um oop
return $new_str; ou uma mstrudao.
} Uma undo capaz, de retomar
um valor o dod^o <^ue a dlnmou -
neste daso, os retomamos a string
alterada.
Quando estiver pronto para usar uma funo personalizada, basta cham-
la pelo nome e digitar, entre parnteses, quaisquer valores que ela espere
receber. Se a funo tiver sido elaborada para retomar um valor, voc
pode atribu-la a uma nova varivel, desta forma:
/s/s passamos uma string
"tigKtrope, Vialker, dirdus'.

$clean_search = replace_coimnas('tightrope, walker, circus');

A -fundo retoma uma


nova string dom as vrgulas
substitudas por espaos.
stings e funes personalizadas

Construa uma consulta com uma funo personalizada


Ns j escrevemos a maior parte do cdigo de que precisamos para criar
a funo personalizada que ir gerar as consultas de busca no Risky Jobs.
S o que falta colocar o cdigo dentro de um esqueleto de funo
PHP. Eis a funo personalizada build_query(): tstamos passando pava a unao
o array fuser__seardh <^uc driamos
a partir dos dados diytados no
formulrio.

// Extrai as palavras-chaves de busca e as coloca em um array


$clean_search = str_replace(',T, ' $user_search);
$search_words = explode(' $clean_search);
$final_search_words = array();
if (count($search_words) > 0) {
foreach ($search_words as $word) {
if (!empty($word) ) {
$final_search_words[] = $word;
}
} Kada de
}
ovo dentro
// Gera uma clusula WHERE usando todas as palavras-chaves da luho/
de busca
$where_list = arrayO;
if (count($final_search_words) > ) {
foreach($final_search_words as $word) {
$where__list [] = "description LIKE '%$word%'";
}
}
$where clause = implode{1 OR $where list);

// Adiciona a clusula WHERE consulta de busca


if (!empty ($where__clause) ) {
$search_query .= " WHERE $where_clause";
____ /*
JJ Ka verdade, isto a^ui e novo- a\w
e\ye retornamos a nova donsulta,
para \ue o dodjo ^ue dHamou a
fundo possa utiliza-la

A funo build_query() retoma uma consulta SQL completa, baseada na string de busca
passada a ela atravs do argumento de $user_search. Para usar a funo, ns simplesmente
repassamos a ela os dados de busca digitados pelo usurio, e ento armazenamos o
resultado em uma nova string, que chamaremos de $search_query:
searchjquery = build_query($user_search)
ste e o valor submetido pelo
Isto nos permite dapturar o valor usurio atravs do -formulrio.
V e^ue nossa -funo retorna, neste
daso, a nossa nova donsult-
voc est aqui > 537
entrevista com a funo funo personalizada

F u n d e s F e r s o n a llz a d a s E x p o s ta s
Na entrevista desta semana:
Funes personalizadas: o quo personaliza
das elas realmente so?

Use a Cabea: Olhe, ns estamos todos Use a Cabea: Eu tenho que admitir que
curiosos sobre uma coisa: o que h de to isso bem interessante. Mas ainda no vejo
errado com cdigo redundante? Quer dizer, por que eu deveria me dar ao trabalho de
ele fcil de criar, basta copiar e colar e usar voc. Quer dizer, voc bem limitado,
pronto. no ? Voc s consegue usar strings.
Funo Personalizada: Ah, nem me fale Funo Personalizada: Ei, espere um
de cdigo redundante. Ele simplesmente minuto a, amigo! Eu posso usar qualquer
feio e torna o seu cdigo mais difcil de ler. tipo de dados que voc me enviar. Desde
Isso j ruim o suficiente. Mas existe um que o meu cdigo lide com eles da forma
motivo ainda muito mais importante para correta, eu posso usar quaisquer dados.
se evitar cdigo redundante. Caramba, eu usei at um array no ldmo
Use a Cabea: Que ...? exemplo. Eu diria que isso bem sofisticado.
Funo Personalizada: Bem, e se algo se Use a Cabea: Mas voc retornou uma
modificar no seu cdigo? Isso acontece com string.
bastante frequncia. Funo Personalizada: Eu posso retornar
Use a Cabea: E da? As coisas mudam qualquer coisa que voc quiser. A questo
o tempo todo. Voc simplesmente vai l e aproveitar ao mximo o que eu posso
conserta. realizar, e me utilizar corretamente.
Funo Personalizada: Mas e se a coisa Use a Cabea: Essa outra questo.
que se modificou estava no seu cdigo Voc muito exigente. Voc sempre quer
redundante? E ela estava em cinco, ou receber dados.
talvez dez, lugares diferentes espalhados Funo Personalizada: De onde voc est
pela sua aplicao? tirando essas ideias malucas? Voc pode me
Use a Cabea: No vejo qual o chamar sem nenhuma varivel, se quiser, e
problema. Basta achar todas as ocorrncias, se eu estiver configurada dessa maneira. Se
consert-las e pronto. voc no quiser me enviar dados, s no
escrever nenhuma varivel nos parnteses
Funo Personalizada: Ok, tudo bem. juntos ao meu nome, quando me criar.
Mas e se voc se esquecer de consertar uma Embora eu no consiga pensar em muitos
das ocorrncias? Vocs, programadores, so motivos pelos quais voc no queira me
humanos. Se cometer um erro, poder ser enviar dados, nem receb-los de volta com
muito difcil achar a fonte do problema. uma instruo de retorno.
Use a Cabea: Sim, claro que isso pode Use a Cabea: Acabou o nosso tempo.
acontecer. Mas como que voc ajuda? Muito obrigado pela entrevista.
Funo Personalizada: Ah, a est a Funo Personalizada: No h de qu.
beleza de ser eu. Se esse cdigo estivesse em Eu vivo para servir. Ou ser que sirvo para
uma funo, voc s precisaria modific-lo viver? Ou vivo e sirvo? Sei l, alguma dessas
uma vez. Uma vez, e pronto. coisas.
stings e funes personalizadas

T te ST D r iv e

M odifique o script Search para que e le use a funo build_query().


Crie a nova funo builcLqueryO no script search.php, certificando-se de substituir o
cdigo original por uma chamada nova funo. Envie o script para o seu servidor
web e experimente fazer uma busca no navegador, para certificar-se de que est tudo
funcionando bem.

Essa nova funao personalizada build_query()


legal, mas ea ainda no esta classificando os
resultados da busca. Ser que ns poderamos
adicionar outro parmetro para fazer isso?

Sem problem as. Ns podemos passar dois parm etros


funo build_query()) em vez de um s.
Ns j estamos passando funo o argumento $user_search, que
contm os termos de busca do usurio. Agora ns precisamos de
outro argumento, $sort, que indica como classificar os dados. O novo
argumento $sort precisa controlar a ordem dos dados retomados
pela consulta nas seis maneiras que estabelecemos anteriormente:
classificando pelas colunas job_title, state e date_posted da tabela
riskyjobs, tanto em ordem crescente quanto em decrescente. 'V
Ns poderamos armazenar as strings de ORDER BY em $sort para \
indicar a ordem de classificao. Ou poderamos usar os nmeros de 1 a\
6 para representar cada ordem, desta forma: *f2L VftUrto j
sort == 1 ORDER BY job_title sentido classificar
feia descrito dos
$sort == 2 m ORDER BY job_title DESC
empregos, ua
$sort == 3 ORDER BY state vez. <^ue a orde
alfabtica no
$sort == 4 rn ORDER BY state DESC
significa uita Coisa
fVos esColhemos $sort == 5 ORDER BY date_posted na descrco.
arbitrariamente $sort == 6 ORDER BY date_posted DESC
Csses nm eros c os
seus significados. Mas os nmeros no so ainda mais crpticos quando algum est lendo
t o e*isU> regras o seu cdigo? Sem comentrios para ajudar, sim, mas h um motivo mais
especiais sobre issoj importante para usarmos nmeros aqui. Se usssemos strings ORDER BY,
fora usar as sus os nossos dados apareceriam na URL do script como parte do link de cada
esdoihas de for cabealho. Isso inadvertidamente revelaria os nomes das nossas colunas, o
donsistente- que algo que voc no quer tomar pblico por motivo de segurana.
voc est aqui 539
Permitindo ao usurio escolher a ordenao

Ok, eu entendi como o novo


argumento $sort funciona, mas como saber qual
valor de $sort ns devemos passar para a nossa funo?
No precisamos obter essa informao com o
^usurio?
Sim, o usurio precisa e s p ecificar o modo de classificar os
resultados, da m esm a form a com o ele esp ecifica os prprios
term o s de busca.
A boa notcia que j sabemos como queremos implementar essa funcionalidade:
ns vamos transformar os cabealhos das colunas na nossa pgina de resultados
em links. Quando o usurio clica em um determinado cabealho, como por
exemplo, "Estado", ns repassaremos funo build_query() o nmero referente
classificao por estado.
Mas ainda precisamos fazer com que a ordem de classificao v do link at
o script. Podemos fazer isso quando estivermos gerando os links para os
cabealhos, anexando um parmetro sort URL:
Queremos redarregar esta pgin \uando
0 s resultados da busda so gerados os usurios ditarem no dabealho de uma
como parte de uma tabela ttTWL, e . td w * ?*ra tlassif idar os resultados, ^
por isso t^ue temos uma tag <td> a^ui. f portanto, temos de driar este formulrio
V
$ s o r t _ lin k s .= ' < t d X a h r e f = " ' . $_SERVER [ ' PHPjSELF' ] .

' ?u sersearch = . $ u ser_ sea rch . ' & s o r t = 3 " > S t a t e < /a X /t d > , ;
A nossa funao build_<^ueryO
predisa das palavv-as-dhavcs \ Ns repassamos dados para indidar a
de busda do usurio para dlassifidao desejada para a busda- Uma
exibir resultados, portanto, vz. *\ue este o tink para a dlassifidado
fornedemos essas informdoes por estado, wsort e igual a 3.
atravs da URL.
Quando a pgina dos resultados gerada, cada link (exceto Descrio") tem a sua
prpria URL personalizada, incluindo um valor sort para definir como os resultados
devem ser classificados.
<a W f ~ Kseardh-php?userseardh-bull fighter matador&sort^/H>

Classif idar pela desdro


Danger! Your dream job Sa out there. nao Sria muito informativo,
D o yo u have i t g u ts to g o find it ? portanto, nao ha motivo para
transformar esse dabedalho
Risky Job - Search Results em um lihk-
LJob Title Description Date Posted

<a href^seardh.phpfuserseardhbull f ighter


matador&sort3W > 1
<a href'seardhphpfuserseardhbull fighter matador&sort15 >
stings e funes personalizadas

Hm. Entendi como esses


links funcionam nas trs primeiras
consultas, mas e quanto s outras trs
ORDER BYs que classificam por ordem
decrescente? Onde elas ficam?
O
Joe: Normalmente, o mesmo cabealho permitiria ao usurio classificar
em ordem crescente ou decrescente.
Jill: Correto. Cada vez que o usurio clica no cabealho, este apenas
inverte a ordem.
Frank: Isso no significa que ns agora precisamos de um jeito de
manter registro do estado dos cabealhos a cada vez que o usurio
clica neles, uma vez que o cabealho precisar apontar para um link
diferente do link para o qual ele aponta atualmente?
Joe: No entendi o que voc quis dizer.
Frank: Bem, os cabealhos no fazem sempre a mesma classificao.
Por exemplo, se voc clicar em "Ttulo'1e ele classificar o resultado
pelos ttulos dos anncios, em ordem crescente, ento o link precisar
se modificar pai a classificar pelos ttulos, mas em ordem decrescente,
na prxima vez que for clicado.
Jill: isso mesmo. Mas tenha em mente que cada tipo de classificao
tem um nmero na URL do link, para que o script saiba qual tipo de
ordenamento usar. E uma vez que ns estamos gerando esses links,
podemos controlar exatamente quais nmeros de sort colocamos em
cada link.
Joe: Entendo. Ento o nosso desafio estruturar de alguma forma o
nosso cdigo, de modo que ele possa gerar o link correto baseado no
estado atual da classificao, certo?
Frank: Ah, j sei! No podemos resolver isso com algumas declaraes
if? Quer dizer, para esse tipo de tomada de deciso que essas
declaraes servem, certo?
Joe: Sim, isso funcionaria, mas estamos falando de vrias decises
envolvendo exatamente os mesmos dados - o tipo de classificao. Seria
muito bom se consegussemos bolar uma forma melhor de tomar essas
decises, que no seja com um monte de declaraes if-else aninhadas.
Jill: Muito bem observado, e esta uma oportunidade perfeita para
testarmos uma nova declarao que eu descobri. A declarao switch
nos permite tomar mltiplas decises, muito mais do que duas, com
base em apenas um valor.
Frank: Parece bom. Vamos tentar.
Joe: Concordo. Qualquer coisa para evitar declaraes if-else
complicadas. Elas me do dor de cabea!
Jill: Sim, a mim tambm. Acho que a declarao switch pode ser
exatamente o que precisamos...
a declarao php switch

SWITCH toma muito mais decises do que IF


A declarao switch oferece uma forma eficiente de verificar TjU]3 cBclclJ*3co
um valor e executar um dentre vrios blocos de cdigo, rTT^Tr /
dependendo desse valor. Isso algo que iria exigir um O *VX I v j i CQ tlteU l
p eq u en o exrcito de d eclaraes if-else, p rin cip alm en te em Utllct S C tle d e
situaes envolvendo mesmo um nmero pequeno de opes. ,
Em vez de escrever declaraes if-else aninhadas para verificar CA. E
cada valor possvel, em vez disso, voc escreve uma declarao <Jue e x e c u ta m
switch com um rtulo case correspondente a cada valor
possvel. No final de cada rtulo case, voc coloca a declarao Q lie re ilte S
break;, que instrui o PHP a sair da declarao switch inteira e b lo c-o g d e COcIlP'O
no considerar quaisquer outros casos. Isso garante que o PHP , , , -
ir executar o cdigo em um e somente um caso. clep etlcletlclQ clP
Vamos dar uma olhada em um exemplo que usa switch: Val<?v d e u m a
^ _____ Este O valov <^ue 3 declarao V % -iaV el
switch ($benefit codeT^ swk* verificando - ele
controla toda a declarao.
case 1:

$benefits = Plano de sade, 10 dias de licena mdica';


break; A dctlaruS. Wtak <te ^ --- * * * ' j \ **kdo
ao PHP para sair da ^ " do e c
case 2 : instruo switch. ig u a la i-

$benefits = 'Apenas em caso de morte e esquartejamento, um ms


de licena remunerada';
break; Se voc precisar fazer 3 mesma Coisa
g __**- ' para dois cu mais valores, basta omitsr 5
case 3: declarao break ate chegar ao ultimo valor-.

case 4:

$benefits = 'Boa sorte!';


^uaisyer valores armazenados em
; fbeneit^Cade ^ue no sejam /, Z,
default: ^ u -rarao Com ^ue o cdigo
& padro seja executado.
$benefits = 'Nenhum. ';

>

echo 'Ns oferecemos(guatro)pacotes de benefcios';


echo 'O plano que voc^selecionou: ' . $benefits;
Hso exatamente- S existem tres pacotes,
uma vez. ^ue ^ e 4 sao a mesma Coisa,
devido ao fato de 3 no ter um break
stings e funes personalizadas

0 Risky Jobs tem uma nova funo chamada generate_sort_links() que permite aos
usurios classificar os resultados de busca clicando nos cabealhos dos resultados.
Infelizmente, esto faltando partes importantes do cdigo. Complete o cdigo da
funo. E no se esquea dos nmeros para cada tipo de busca:
1 = por ttulo, crescente; 2 = por ttulo, decrescente; 3 = por estado, crescente; 4 =
por estado, decrescente; 5 = por data de postagem, crescente; e 6 = por data de
postagem, decrescente.

generate_sort_links($user_search, $sort) {
$sort_links = '';

........ ($sort) {
case 1:
$sort_links .= '<td><a href = . $_SERVER['PHP_SELF1] . '?usersearch=' . $user_search .
'&sort=.... ">Ttulo</a></td><td>Description</td>';
$sort_links .= r<tdXa href - . $_SERVER ['PHP_J5ELF1] . '?usersearch=' . $user__search .
1&sort=.... ">Estado</aX/td>',*
$sort_links .= '<td><a href = "1 . $__SERVR[PHP_SELF'] . '?usersearch=' . $user_search .
'&sort=.... ">Data</aX/td>';

case 3:
$sort_links .= '<td><a href = " . $_SERVER[1PHP_SELF'] . 1?usersearch=' . $user_search .
'&sort= ....'^Job Title</a></td><td>Description</td>';
$sort_links .= <tdXa href = . $_SERVER['PHP_SELF] . '?usersearch=' . $user_search .
'&sort=.... ">State</ax/td>1;
$sort_links .= '<td><a href = ' . $_SERVER['PHPjSELF'] . '?usersearch=' . $user__search .
&sort= ">Date Posted</a></td>';

case 5:
$sort_links .= '<td><a href =" . $_SERVER['PHPJSELF'] .'?usersearch='.$user_search
'&sort=...... ">Job Title</aX/tdXtd>Description</td>1;
$sort_links .= '<td><a href = . $__SERVER[1PHP_SELF'] .?usersearch=.$user_search
'&sort=.... ">State</a></td>';
$sort_links .= '<td><a href = . $_SERVER[1PHP_SELF'] .1?usersearch='.$user_search
'&sort=.... ">Date Posted</a></td>';

$sort_links .= '<td><a href = "' . $_SERVER['PHP__SELF] . 1?usersearch=' $user search


'&sort= .... ">Job Title</aX/tdXtd>Description</td> ';
$sort__links <tdXa href = " . $_SERVER['PHP_SELF] '?usersearch=' . $user search
1&sort= . . ^ S t a t e C / a X / t d ^ ;
$ s o rt_ lin k s < t d X a href = "' . $__SERVER[ 'PHP__SELF] 1?usersearch= $user search
'&sort= ">Date Posted</aX/td>';
Este e o tonjuft-bo padra de
devera apreer caso
return o usurio ainda no tenHa esolVido
unv mcbodo de classiftca^o-

voc est aqui 543


a funo completa generatejsortJnksQ

0 Risky Jobs tem uma nova funo chamada generate_sort_lihks() que permite aos
usurios classificar os resultados de busca clicando nos cabealhos dos resultados.
Infelizmente, esto faltando partes importantes do cdigo. Complete o cdigo da func
cco E no se esquea dos nmeros para cada tipo de busca: 1 = por ttulo, crescente; 2 =
SoLu o por ttulo, decrescente; 3 = por estado, crescente; 4 = por estado, decrescente; 5 = por
data de postagem, crescente; e 6 = por data de postagem, decrescente.

generate_sort_lnks ($user_search, $sort) {


$sort_links ' '; ^ ^ d }; signifida <\ue j
switK ($sort) elassif iamos feio ttulo, portato> agora
predisamos redlassifidar em ordem dedresdente-
case 1:
$sort_links .= <td><a href = . $_SERVER[PHP_SELF'] . '?usersearch= $user_search
1&sort= .7r.__">Titulo</a></td><td>.Description</td>1;
$sort_links .= CtdXa href = . $_SERVER[PHP__SELF*] '?usersearch=' . $user_search
'6sort= .3.. ">Estado</ax/td> 1;
$sort_links .= '<tdXa href = . $_SERVER['PHP_SLF] '?usersearch= . $user search
'&sort= ^ .. ">Data</aX/td>';
break;......
case 3:
$sort_links .= '<tdXa href = . $_SERVER['PHP^SELF1] '?usersearch=' . $user search
'&sort= _ __ ">Job Title</aX/tdXtd>Description</td
$sort__links = '<tdXa href = $_SERVER['PHP_SELF'; 1?usersearch=' search
'&sort= . 4* ">State</a></td>;
$sort_links = <tdXa href = *'1 . $_SERVER [PHP__SELF'; ?usersearch=' $user search
&sort= .$ ">Date Posted</a></td>';
. break;........
case 5:
$sort_links .= ctdXa href - " ' . $_SERVER[rPHP_SELF'] . ?usersearch=' $user search
1&sort= .I ">Job Title</aX/tdXtd>Description</td>1;
$sort_links = <td><a href = . $_SERVER[PHP_SELF'] 1?usersearch=' $user search
&sort=, .. ">State</aX/td>';
$sort_links = '<tdXa href = . $_SERVER[PHPJ3ELF1] '?usersearch=' . $user search
&sort=,$ .. ">Date Posted</aX/td> ';
. break;......
default;
$sort_links .= CtdXa href = " . $_SERVER[PHP_SELF' '?usersearch=' . $user search
&sort= .... ">Job Title</aX/tdXtd>Description</,td>';
$sort_links .= '<td><a href = ' . $_3ERVER['PHP_5ELF'] . ?usersearch=1 $user search
'&sort= .. ">State</aX/td>1;
$sort_links .= '<td><a href = . $_SERVER['PHP_SELF'] . '?usersearch=' $user search
'&sort= .5.. ">Date Posted</aX/td>1;
^ Se /sort ainda no tiver sido definido
ou se for igual a Z, 4*ou ^ os temos de
return /so rt links exibir os links originais <\ue dlssifidm os
dados em ordem dresdente-
stings e funes personalizadas

H a build.queryO a capacidade de classificar


Agora ns temos duas funes para lidar com as buscas no RiskyJobs. build_query()
constri uma consulta SQL com base em termos de busca digitados pelo usurio, e
generate_sort_links() gera hyperlinks para os cabealhos do resultado da busca, os
quais permitem ao usurio classificar os resultados. Mas build_query() ainda no est
totalmente pronta, uma vez que a consulta gerada por essa funo ainda no faz a
classificao. A funo tem de adicionar uma clusula ORDER BY consulta. Mas precisa
ser a ORDER BY correta, conforme determinado por um novo argumento $sort:
Agora ns estados passado o
function build_query($user_search, |1|111 { argumento f sort para a nossa
$search_query'= "SELECT * FROM riskyjobs"; funo, ale* de fuser_search-

// Adiciona a clausula WHERE a consulta de busca


if (!empty($where_clause)) {
$search_query .= WHERE $where_clause";

Eis a^ui as adies ao cdig<


de build__^ueryO. Esta
dedaraao switch verifica
o valor de fsort e adiciona
a instruto ORDER B
Correspondente ao f inl da
Consulta de busca-

guando os usurios
carrega* a pagina de
resultados se clicar
Cm henKu cabealho,
fsort estar vazio,
portanto, ns no
classif icamos os
iS S lw iR B w il resultados por padro-

re tu rn $search_query; Kos retornados ?serCh__^uery Como htes, ms
desta vez. com u*a clusula ORDER B / ao f inal
voc est aqui 545
teste o scirp t revisado search.php

T fe s T O R tv e
Reelabore o script Search para que e le use as duas novas funes
personalizadas.
Crie a nova funo generate_sort_links() no script search.php e depois adicione o
novo cdigo funo bmld_query() , para que ele gere uma consulta com resultados
classificados. No se esquea de fazer a chamada a generate_sort_links() no script, no
lugar do cdigo que ecoa os cabealhos dos resultados.
Envie o script ao seu servidor web, abra a pgina search.html em um navegador e
experimente fazer uma busca. Agora clique nos cabealhos das colunas da pgina de
resultados para classificar os anncios com base nos diferentes tipos de informaes.
No se esquea de clicar no mesmo cabealho mais de uma vez, para alternar entre a
ordem crescente e a decrescente
A -Puno build_j\ueryO pega os -termos
de busca <\ie o usurio digitou, e*p!ode a
Consulta e* um array, remove yuis^uer
sfcrings vazias do rray, e Cria uma
Consulta Com os termos e uma
ORPBR 2>i Correspondente ao valor de
Risky Jobs *S classificao; se Houver
Findyottrriskyjoj
i Buli n g h w Majador

Oangsrl Yourdream
DoyouHave megirtjoltogooatfindthere.
it?
Risky Jobs - Search Results
A funao
generate__sort_ Job Title Description State Date Posted
Matador Bustling dairy mn lookisg for part-tkae matador a/ VT 26084)3-11
linksO gera entertain spirited bull with nald caje of ADO.
os cabealhos Firefighter The City ofDataville is lurk";; iiiefjglitBiv No OH 2003^5-22
experienced required - you will be traised, Nor cmo
clicveis, mcluindo Eleciric Bull Hank's Hcmlry Toni needs an experienced eketric XI 2008-11-14
Repairer bidJ ropaiiBr. Free ndes (afteryou fix it;.'irif ael..
o empacotamento
das opes de
classi-Hcaao na Agora
URL- de cada link. eu consigo ver os anncios
mais antigos, aqueles em que os
empregadores estao f icando realmente O
desesperados para achar um toureiro
em Vermont.
stings e funes personalizadas

Mas s vezes eu tento


fazer uma busca mais
ampla, e os resultados O o
so muitos.

It

Danger! Your frw m


job U out
there,
Do you D w e the 9 to 8 Ow* *t ?

Risky Jobs - Search Results


Job Title Description State Date Posted
We need people willing to test the theory that you can MM 2008-07-24
Custard Walker
walk do CBSffiid- WcVe going to fill a sm..<
Training sharks to do cate- tricks for the audjsece* at oat FL 2008-04-28
Sharis Trainer
new tvatartben parit, Youil spead tils...
WUagcChecker ool be out in tise field citEckiug a x , aad djc, foliages XC 2008436-28
io tbs jcasge of 3 to 250 or more volts. Y...
Aclencifcitalcr Yol'II he iartaODg mtcnr.zs m Q&eriuetaic FL 2008-09-04
broadcast ieevBg squipaieat ctoth loois. of Miami
Eicpkaji'. ProctoiogUr N&Kfcd: experienced proctologist -wiM'sag to -swsi with CA 200840729
1st t urn lajge aaiaiiik. Efepfeacts at our zoo (in San Fr.
bo&ddo de Akplans Engine Set airplanes ceeding engine deseed. fa seed ccieac- TX 2008-08-17

anncios Clearer
Matador
naaited individuals wiHieg to baisdle rnsi aa...
Buntijag daiiy fami ookiag for jrart-tiaja matnder lo VT 2008-03-1 j
pair uma s entertain spirited, bull with mild c of ADD. ...

Pssoa lev* dc Ppnraszo Top celebrity photography fera looidag Sir seasoned CA
-------*- llrwcvrtrine
2008433-24

u>| SO Tigbtroc Waite- * o - I---------


with i -3 jfeafs of experience to perform tlghtr...
2008-11-14

CwsdieDentil Do you kffte animals and huts plaque? Well, then tfeii PL 2008-07-14

.Mime
might be the job for you! Our crocodik feno.,
WBueedsiBiitEshnewa8s.Rjllhaa5kE&n&Ece NY 200S-1-02
and shits pads provided. Must tove kids....
Pet Fooc Tester Wa pride ourselves os bow good our pt food tastes. MO 2008-11439
New you can help mshx our products even better.
Toreador Lovely isovines waiting for your superior oon-viclect ID 2002.1144
cape ivaviug skills. Must pas* basic ball figfeti...
Electric Bull Rjepaiter Hack's Hanky Took aeedi an experienced electric buli HJ 2008-07.27
iw . fiee rides tafter you fix it) and bal..
CityofDatavillekhiring firefigbtejvNo OB 2008-05-22
. tf0a <yiu be rraBad. Nba^ano.
<1* r
2008-11-!
R E S R Q
B k * juggling? A2 200S-1-4

Como ser que os outros sites 2008*13-14

evitam ter muitos resultados em "


uma mesma pgina?
use paginao para m ostrar os resultados

Podemos paginar os nossos resultados


Atualmente, ns estamos exibindo todos os nossos resultados
em uma s pgina, o que um problema quando uma busca
encontra muitos anncios. Em vez de forar os usurios a irem Cada tnosfor iindo
de cima a baixo em uma pgina enorme para ver todos os resul-fcados jwvio on links para
resultados, podemos usar uma tcnica chamada paginao para se essar as ou-brd* pgins de
exibi-los. Quando voc pagina os resultados, divide o conjunto resul-fcados. Os usurios pode
de resultados em grupos, e ento, exibe cada grupo em uma Taiiin*evke dlidar para adessar
pgina web separada, desta forma: cada pagina, sem predisar ifiar
subindo e destcndo tom o mouse-

TminLBg srta
our aewwnti Job Title
VoJiage Checker You'll be on A n d jK ta ,
intbenmga Ctamer
Anlcarta Iisstalier Y o u llb c is Matador
broadcastn
Etephmt Rroctologisl Needed:ex P a p a m ^ Risky Jobs - S earch Results
largeaiiiis
<-12 34 -> m Dsscnpon
Tigbtnppc Wa&jei pfc, JbTe
will Mime We need some fresh ecw Fall beallfe msBcasoe
Crocodile Dentist Don I shin pas pravltieiLMust love kids
Pet fvscni Tester We ptidC: rmjTWjlvci as howgood carpet foo4tastes,
< -1 2 3 4 > you. can kelp aafag oar products even better....
Toreador Loveiy bovines nom-v'iolca' ID
cape Tiiricg sldiJa-M ustpassbawibtill figitj...
stes links Electric Bull Rcpiijct: ilaalcft ffenky Tdnk needs ao expcrisoced eleetfiis boil NT
spssra, Free fitter you fix it) and fcsL.
ferm iicm <^uc T " "
A farina aiual
FLnsfiglsieT of Dstavlei
expetijecedreqi
os usurios A f <-12 3 4->
naveguem
YO C urn
Isso timo, mas como ns dividimos
airaves de link - esta e a
os nossos resultados em grupos? A nossa
varias paginas.
se^unda pag'ma
consulta SQL retorna todos os resultados
de resul'tados.
encontrados pela string de busca.
A pogii
in a a p

d !V id e o g Ns precisam os de um a consufta que


reto rn e apenas um subconjunto dos
re s u lta d o s e m resultados, e no todos eles.
g ru p o s, e e x ib e Afortunadamente, o SQL j nos oferece uma
forma de fazer isso: a clusula LIMIT. Vamos
ca d a g ru p o em rever LIMIT e aprender como podemos us-la
para dividir os nossos resultados em grupos de
uma pgfna cinco...
Web prppria.
stings e funes personalizadas

Obtenha apenas as linhas de que voc precisa com UMIT


A chave para controlar quais linhas ns iremos exibir em uma dada pgina adicionar
mais uma clusula nossa consulta de busca, a clusula LIMIT. Para obter um mximo
de cinco linhas, ns adicionamos LIMIT 5 ao final da nossa consulta, desta forma:
SELECT * FROM riskyjobs Sc Ufo dttSul
Csta donsulta retorn
ORDER BY job_title _os os anundios do L J M rr
bando de dados, o ^ e e c o n s o l a < ju as
equivaleu-te a produrar sen*
nenhum te'rvno dc bwsda- e q u a n ta s
o retorna os dindo primeiros
resultados, nao importando ln h a s s
quantos tenham sido reaImente re to rn a d a s
endontrados.
Se voc se lembrar, ns usamos a funo personalizada build_query() u m a c o n s u l t a
para criar a nossa consulta no Riskyjobs. Para for-la a exibir apenas S Q L ,
os cinco primeiros resultados, ns simplesmente adicionamos LIMIT
5 ao final da string da consulta, aps esta ter sido criada:
$query = build_query($user_search, $sort);

/^didionar uma -lusul i~|A1|T o inl dc


um donsulta limita Onumero de Imhas
retornadas por ela, neste taso a dindo.

Isso funciona bem para se obter as cinco primeiras linhas dos


resultados, mas e quanto s cinco linhas seguintes, e s cinco
linhas depois dessas? Para obter linhas posteriores no conjunto
de resultados, temos de modificar um pouco o nosso LIMIT. Mas
como? LIMIT 10 obteria as 10 primeiras linhas, portanto isso no
funcionaria. Ns precisamos obter as linhas 6 a 10, e para isso ns
usamos LIMIT com uma sintaxe diferente. Quando voc fornece
dois argumentos a LIMIT, o primeiro controla o nmero de
linhas que quer pular, e o segundo controla o nmero de linhas
que voc recebe. Por exemplo, eis o modo de obter as linhas de
11a 25, o que seria a terceira pginas dos resultados:
$query = build_que3ry ($user_search,

$query = $query

0 primeiro argumento secundo argumento


di2. a L~\/V\\T quantas dontroia quntas linhas
linhas pular - as dez. so retornadas dindo,
primeiras. o mesmo que antes.
voc est aqui 549
use LIMIT para ajudar nos resultados de paginao

Controle os links das pginas com LIMIT


Uma tarefa importante da paginao fornecer links que permitam ao
usurio navegar entre as diferentes pginas de resultados. Ns podemos usar
a clusula LIMIT para definir os links de navegao na parte de baixo de
cada pgina. Por exemplo, os links "prximo" e "anterior" podem ter, cada
um, o seu LIMIT. O mesmo se aplica aos links numricos que permitem ao
usurio pular diretamente para uma pgina especfica dos resultados.
Eis as clusulas LIMIT para as trs primeiras pginas dos resultados, junto
com LIMITs para alguns dos links:

LIMIT 0, 5 / LIMIT 5, 5 LIMIT 10, 5

LIMIT 5, 5 LIMIT 15, 5 LIMIT 5, 5

Sem problemas. Ns s precisamos


escrever um monte de consultas,
com um LIMIT dif erente para cada
uma, certo?

Mais ou menos isso. Ns precisam os de um LIM IT


diferente dependendo da pgina e do link, mas
podemos ger-lo em vez de escrever vrias consultas.
Tudo o que precisamos fazer modificar um pouco mais a nossa
funo build_query(), para adicionar o LIMIT correto ao final da
consulta que ela constri.
stngs e funes personalizadas

Mantenha registro dos dados da paginapo


Para adicionar a nova funcionalidade de paginao a build_query(),
ns precisamos configurar e manter registro de algumas variveis que
determinem quais resultados devemos consultar e mostrar em uma dada
pgina. Essas variveis so importantes tambm para determinar como os
links de navegao na parte de baixo da pgina sero gerados.

$cur_page
Obtm a pgina atual, $cur_page, a partir da URL
do script via $_GET. Se no houver nenhuma
pgina atual para ser passada atravs da URL, define
$cur_page como a primeira pgina (1),

$resul ts_j>er_j?age
Este e o numero de resultados por pgina, que voc
pode escolher para melhor se adequar aparncia
da pgina, colocando a quantidade de resultados que
caibam bem no layout da sua pgina. daqui que vem o
segundo argumento para a clusula LIMIT.
flflRRWiii

$skip
Calcula o nmero de linhas a serem puladas antes de comear
a exibir as linhas da pgina atual. Esta varivel o que controla
onde cada pgina comea, em termos de resultados, fornecendo o
primeiro argumento para a clusula LIMIT.

$total
Executa uma consulta que obtm todas as linhas,
sem nenhum LIMIT, e depois conta os resultados e
armazena o resultado em $total. Em outras palavras,
este o nmero total de resultados da busca.

$num__pages
Calcula o n m ero de pginas, $num_pages, usando $total dividido
por $results_per_page. Assim, para cada busca, existe uma
quantidade $total de linhas de resultados, mas estas so exibidas
uma pgina por vez, com cada pgina contendo um nmero
$results_per_page de combinaes. Existem $num_pages pginas,
e a pgina atual identificada por $cur_page.
definindo varveis necessrias para paginao

Pefma as variveis da paginapo


A maioria das variveis de paginao pode ser definida puramente atravs
de informaes fornecidas pela URL, que fica acessvel por meio da
superglobal $__GET. Por exemplo, as variveis $sort, $user__search e $cur_
page surgem todas diretamente a partir de dados GET. Ns podemos ento
usar essas variveis para calcular quantas linhas devem ser puladas para
chegarmos primeira linha de dados, $skip. A varivel $results_per_page
um pouco diferente, no sentido de que ns simplesmente a definimos
com o nmero de resultados que queremos ter em cada pgina, o que
mais uma questo de gosto pessoal, levando-se em considerao o layout da
pgina de resultados.
Obtm ordem t
elassiido
um mime*- inteiro
>btem a S '* t! 3 * '
jagina atual, ^ Obtm a configurao de classificao e as palavras-
^ chaves de busca a partir da URL, usando GET
partir da URL f Obtem a dc
via SET. Se $sort = $_GET [' sort ']; bu^a que o usuino
no houver uma u se r se a rc h = $ g e t [ 'u s e rs e a rc h ' ]; ^ digitou no -Pormuiario.
pagina atuai, - _ ^
. f. ' Se o nu*ero
de+me fur ^.
da pa<yna nao
pay torno I. I J c -
// Calcula as informaes de paginao s- estiver fle-rmiGo,
o padrao a
$cur_page = isset {$_GET [1page']) ? $_GET ['page '] : 1; pagina.

$results__per_page = 5; // nmero de resultados por pgina

$skip = (($cur_page - 1) * $results_per_page);


Pefine JK
nmero de j ^ ^ Este W \o resulta em 0
resultados Caidula o nmero da primeira para a pagi*a I, 5 para a
por pagina- linha da pgina, /skip. pagina 1 , 10 para a pgina
\ e it

Ainda faltam duas importantes variveis: $total e $num_pages. Essas


variveis s podem ser definidas aps realizarmos uma consulta iniciai
para descobrir quantos resultados foram encontrados no banco. Uma
vez que saibamos quantos resultados ns temos, possvel definir essas
variveis e ento usar LIMIT nos resultados...
stings e funes personalizadas

Revise a consulta para ter resultados paginados


Agora que ns temos nossas variveis definidas, precisamos revisar o script Search para que
ele, em vez de fazer consultas para todos os resultados, faa-as apenas para o subconjunto
de resultados de que precisamos para a pgina que o usurio est visualizando no momento.
Para isso, primeiramente fazemos uma consulta para que a varivel $total possa ser definida,
e a varivel $num_pages possa ser calculada. Em seguida, fazemos uma segunda consulta que
usa $skip e $i'esults_per_page para gerar uma clusula LIMIT, que adicionamos ao final da
consulta. Eis a seo do script search.php revisada, com essas adies salientadas:
retorna uma
dont3<jem de quantas linhas -foram
re i ornadas peia donsulta.
Esta donsuita obtew
todas as linhas, ser* A un^o
nenhum LiMT. rowsO retorna o nmero
// Confeulta para obter o total de res ados linhas
Calfiwla o nmero t painas,
$query = build_query $sort);
dividindo o numero total
$result = mysql_que ($dbc, $query) ; de linhas pelo nmero de
resultados por p^n, depois
arredondando o resultado-

A -fundo dei 10 arredonda


um numero ate o inteiro
ais prximo o wtetow.
// Consulta novamente,.para obter somente o subconjunto dos resultados

$result = mysqli_query{$dbc, $query); Pua este e retorna este


while ($row - mysqlijfetch_array($result)) { numero de nmero de linhas-
linhas
echo <tr class="reaults',> 1;

echo 1<td valign="tpp" width="20%"> 1 $row['title'] . '</td>';

echo '<td valign="t} op width="50%">' substr($row['description'], 0,


100) . '...</td>';

echo '<td valign="tpp" width="10%"> $row['state'] . '</td>';

echo 1<td valign="tp" width="20%">' substr($row['date posted']/ 0,


10) . *</td> '; \ _ ,
pmite uma sejunda Consulta, as
echo 1</tr> '; desta vez. limitndo os resultados
para a pagina atual-
echo </table>';

voc est aqui 553


criando os links de navegao

(rere os links de navegao da pgina


Ento, ns definimos algumas variveis e construmos uma nova consulta SQL que retorna
um subconjunto de resultados para a pgina. S o que ainda precisamos fazer gerar os
links de navegao da parte de baixo da pgina de resultados: o link "previous ("pgina
anterior), links numricos para cada pgina de resultados, e o link "next" ("pgina
seguinte"). Ns j temos todas as informaes de que precisamos para criar os links. Vamos
rev-las para nos certificarmos de que est claro o modo como elas sero usadas.

$user search
Cada link ainda precisa saber o que o $cur_page
usurio est realmente procurando, Os links de navegao dependem
portanto ns temos que passar os termos inteiramente da pgina atual, de forma que
de busca na URL de cada link. muito importante que essa informao seja
empacotada na URL de cada link.
$num_pages
$sort
Ns precisamos saber quantas pginas A ordem de classificao tambm influi
existem, para podermos gerar links para sobre os links de paginao, porque a
cada uma delas. ordem precisa ser mantida ou ento a
paginao inteira no faria muito sentido.

Ok, ns sabemos quais so as informaes de que precisamos para gerar os links


de navegao, portanto, estamos prontos para escrever o cdigo PHP necessrio.
Esse cdigo poderia simplesmente ser colocado no script search.php, mas que
tal se o colocssemos na sua prpria funo personalizada? Dessa forma, o
cdigo principal do script que gera os resultados da busca pode permanecer
muito mais simples, exigindo apenas uma linha de cdigo para gerar os links
das pginas - uma chamada a esta nova funo, que chamaremos de generate_
page_links().
O nico seno que ns no queremos que esta funo seja chamada se
houver apenas uma pgina de resultados. Assim, precisamos verificar o
nmero de pginas antes de chamar a nova funo generate__page_links().
Eis o modo como podemos realizar a verificao e chamar a funo,
sem nos esquecermos de enviar as informaes necessrias na forma de
argumentos para a funo:
if ($num__pages >1) {

FVimciramCft-U) veviique se e*iste


mdis de Uim de V'CSul'fcdoSj tdSO Ehvie a stHhj de busda; a orde* de
don-h-avio, ro 0crc os l'mks- dlassilidada, a pagina atua! e o numro
tatal de pajihas a sever* usadas a
dvnado dos links.
stings e funes personalizadas

Im as de Geladeira dp F B F
A funo generate_page_links() est quase pronta, mas esto faltando alguns pedaos
de cdigo. Use os imas para preencher o cdigo que est faltando e dar ao Risky Jobs a
capacidade de gerar links de navegao para as pginas.

function generate_page_links($user_search, $sortf $cur_page,


$num_pages) {
$page_links = '' ;

// Se esta pgina no for a primeira, gera o link "previous"

if (...................... ) {

$page_links .= '<a href= '... $_SERVER ['PHP_SELF ] .


' ?usersearch=1 . $user_search .
&sort=' . $sort .

'&page=' . (-- .......... ) . '"><-</a>

} link Previous VYttLt N urw


tomo
else {
IM w
$page_links .= '<- seta para 3 esquerda, < -
}
// Faz um loop atravs das pginas, gerando os links com os
nmeros das pginas
for($i = 1; $i <= $num_pages; $i++) {

if {.. ....................) {

$page_links . $i;
}
$cur_page else {
$page__links .= ' <a href=" ' - $_SERVER['PHP_SELF'] .
1?usersearch=' . $user_search .
'&sort=' . $sort .
'&page=' . $i . '"> ' . $i . '</a>';
}
/ / S e esta pgina no for a ltima, gera o link "next
if (.............................. ) {

$page_links .= ' <a href=r" . $JSERVER[1PHP_SELF1] .


'?usersearch=' . $user_search .
1&sort= . $sort .
'&page=' . ($cur page + 1) . T">-x/a>';
}
else {
$page_lmks .= - j> '; Q imk next" aparete tomo uma
$num_pages V seta para a direita,
return $page links;

voc est aqui 555


a funo completa generate_page jinks()

i
In ic tS d e G e l a d e t c t d 9 F H P & M / S Q L - S o l u o
A funo generate_page_links() est quase pronta, mas esto faltando alguns pedaos
de cdigo. Use os imas para preencher o cdigo que est faltando e dar ao Risky Jobs a
capacidade de gerar links de navegao para as pginas.

function generate_page_links ($user__search, $sort, $cur_page, $num__pages)


$page_links = ;

// Se esta pgina no for a primeira, gera o link "previous"

if ( $cur_page
PT ) {
mmm. Ns ainda pvedisamos
$page_links .= '<a href="' . $_SERVER[PHP_SELF' caviar os dados da busda
'?usersearch=' . $user search .
^ do usurio, bem domo a
1&sort=1 $sort .
ordem de dlassi-fidaeo,
&page=1 $cur_page
1
else { 0 link ^previous aparede tomo
$page_links .= ' o T; uma seta para a esquerda, < -
}
// Faz um loop atravs das pginas, gerando os links com os nmeros das
pginas
for ($i = 1; $i <= $num_pages; $i++) {

$cur_page I = I $ i ii)
Cerii-Pi^ue-se de <\ue dada link
if (
S aponte de volta para o mesmo
$page_links .= ' ' . $i; sdript - hs estamos apenas
} enviando um numero de pagina
else { diferente dom dada link.
$page_links .= 1 <a href="' $_ SERVER['PHP SELF] .
?usersearch=1 . $user_search .
'&sort=' . sort .
'&page=' . $i . . $i . '</a>'; 0 liwk para uma pagina
} esped-fida simplesmente
} o numero da pagina.

// Se esta pgina no for a ltima, gera o link "next"

i f ( j $cur_page j < | $num_pages {


$page__links .= ' <a href="' . $_SERVER['PHP_SELF]
1?usersearch=1 . $user_search .
'&sort=' . $sort .
'&page=' . ($cur_page + 1) . '>-></a>';

else {
$page links .:
/
0 link next" aparede domo uma
seta para a direita,
return $page links;
stings e funes personalizadas

Montando o script Search completo


E finalmente ns chegamos ao script Search completo do Riskyjobs, que
exibe os resultados apropriados coin base nos termos de busca do usurio,
gera cabealhos clicveis para a classificao dos resultados, faz a paginao
desses resultados e gera links de navegao na parte de baixo de cada pgina.
<?php
// Esta funo cria uma consulta de busca a partir das palavras-chaves
de busca e da configurao de classificao
function build_query($user_search, $sort) {
Mos j criamos estas -funoes,
porianio 3o e pvediso \retolodar
dada liHa do todjo delas a\w-

// base na configuraao de classificao


es
fu user_searchf $sort) {

// lavegao, com base na pgina atual e no


n

fu user_search, $sort, $cur_page, $num_pages)

return $page_links;

cao e as palavras-chaves de busca a

$user search = $ GET['usersearch'];

// Calcula as informaes de paginao. nStr os it*


$cur_page = isset($_GET['page']) ? $_GET['page'] : 1;
$results_per_page = 5 ; // nmero de resultados por pgina
$skip = {($cur_page - 1) * $results_per_page);
Chama a -Puno genera^&jsoH^

// Gera os cabealhos dos resultados depois os exibe-


echo 1<tr class="heading">';
echo generate_sort_links{$user_search, $sort);
echo '</tr>'; i

voc est aqui 557


o final search.php

0 script Search completo, continua...


// Conecta-se ao banco de dados
require_once(1connectvars.php');
$dbc = mysqli connect(DB HOST, DB USER, DB PASSWORD, DB NAME);

// Consulta para obter o total de resultados


$query = build__query ($user_search, $sort) ; Chama bv*ld_^uevyO pava dviav
$result - mysqli_query ($dbc, $query) ; .
_ a donsulia SQL pava a busda.
$total = mysqli_num_rows($result) ;
$num_pages = ceil($total / $results_perjpage);

// Consulta novamente, para obter somente o subconjunto dos resultados


query = $query . " LIMIT $skip, $results per page'; . k i . hait
* i +- - mysqli_query($dbc,
n a*\ui a dlusula L W T
result $query) ; l
while ($row = mysqli_fetch_array ($result) ) busd apenas os
echo '<tr c l a s s = " r e s u l t s ; subdonjunios do vesuliado
echo '<td valign="top" width=;"20%">' . ?row['title1] . ,</td>';
echo <td valign="top" width="50%">1 .^substr($row['description'], 0,
100) . ' . . . </td>';
echo <td valign=,,top" width="10%">1 .l$row[Tstate'] . '</td>';
echo '<td valign="top" width=',20%">, .\substr ($row ['date_posted '], 0,
10) . *</td>;
echo </tr>; a\ui vai o dod^o <^ue esdvevemos pava
} reduziv a desdviao e a da-b de postagem
echo '</table>; dos 3hindios; wsando a -fun^ao subyfcrO.

// Gera links de navegao, se tivermos mais de uma pgina


if($num_pages > 1) {
echo generate_page_links($user_sarch, $sort, $cur_page, $num_pages);
Chama a -fundo genevate__page_
mysqli_close($dbc) ; linksO para gev-av os links das
pginas, e depois os exibe-
Mantem a dasa awumada,
redhando a donexo dom o
bando de dados.
nap exstem
P e rg u n ta s id io ta s
Ns realmente precisamos enviar as I - Ok, e quanto a ecoar dados? Por que generate.
informaes de busca, classificao e paginao pageJinksO simplesmente no faz echo dos links?
para generate_page_links()?
l:o mesmo problema. Ao ecoar dados para o
H: Sim. E o motivo para isso tem a ver com o fato
de as funes, quando bem elaboradas, no devem
navegador, a funo estaria, na prtica, dando um passo
maior que as pernas, ao fazer uma modificao em
manipular dados fora do seu prprio cdigo. Assim, algum outro lugar. muito mais difcil realizar debug e
uma funo s deve acessar dados enviados a ela em manuteno quando no est claro quais dados a funo
um argumento, e s fazer modificaes em dados que est modificando. A soluo fazer sempre a funo
ela retornar. retornar os dados que est afetando, e a ento voc
pode fazer o que quiser com eles, mas fora da funo.
stings e funes personalizadas

T te ST O R fv e
Finalize o script Search do Risky Jobs.
Adicione a nova funo generate_page_lmks() ao script search.php, certificando-se de
adicionar tambm o cdigo que chama essa funo aps verificar se existe mais de uma
pgina de resultados. Alm disso, crie e inicialize as variveis usadas como argumentos
para a funo. E no se esquea de atualizar o cdigo da consulta para que ela use LIMIT
para obter o subconjunto correto de resultados para cada pgina.
Quando estiver tudo pronto, envie o novo script search.php para o seu servidor web, e
depois abra a pgina search.html em um navegador. Experimente fazer algumas buscas,
e no se esquea de procurar por alguns termos que voc saiba que vo gerar muitos
resultados, para ver as novas funcionalidades de paginao em ao. Para obter o mximo
de pginas, faa uma busca sem digitar nenhum termo no formulrio.

1
Danger) Your dre*m job out there
Do you have the g u t* to go find It?

Risky Jobs - Search Results


BusiUng daily farm looking for part iisie matador to VT
entertain spirited bull vitb m id cast of ADO. -
Top celebrity photography firm looking fer seasoned CA 2
paparazzo U> stalk feniperaiitfiilal lip-syjCEg ?I;P-.
ft
EL ' 2G8-G4-28
Shark Trainer Training shades to do cate tricks for the audiences at
our new water theme park. YouT3 spend tim...
Firefighter The City of Datavilfe is hiring {kefiglteis. No OH 20O8-OS.22
experienced reqniiEd - yon wilS be taiissd. Nog-stck>._
Voltage Checker YouH be out ia the field checking ax;, and djc. voltages NC 2008-06-25
in the range of 3 to 250 or more vol's. Y.
<-1 234^>

Ernesto endohxrou um
emprego dom d ^ iid ad e
per+eia de rsdo/

No se esquea: o cdigo-fonte completo da aplicao


Riskyjobs est disponvel para download no site da
Alta Books:
www.altabooks.com.br

voc est aqui 559


caixa de ferramentas do php & m ysql

L Sua Caixa de Ferramentas do PHP - MySQL


r O script Search do Risky Jobs exigiu uma
boa quantidade de novas tcn icas de PHP
9

e MySQL. Vam os reca p itu lar algum as das


m ais im portantes.
captulo
10 Exprsses Regulares

Rgras Para Substituio

As funes string so adorveis. Mas, ao mesmo tempo, so


limitadas. Certamente elas podem realizar tarefas como lhe dizer a extenso da sua string,
truncar a string, trocar certos caracteres por outros. Mas s vezes voc precisa de liberdade para
lidar com manipulaes de texto mais complexas. aqui que as expresses regulares podem

ajudar. Elas podem modificar strings de forma precisa, com base em um conjunto de regras, em

vez de um s critrio.

este um novo capitulo 561


risky jo b s tem dados ruins
Risky Jobs permite que os usurios submetam currculos
O site riskyjobs.biz cresceu. A empresa agora permite que os usurios digitem os seus currculos
e informaes de contato em um formulrio web, para que os empregadores que usam o Risky
Jobs possam encontr-los mais facilmente. O formulrio se parece com o seguinte:
0 novo ormulario de registro do
Risky Jobs permite ^ue os usurios
digite m-forma^oes pessoais, de modo
Al das S Pcrk n^ * s empregadores possa
. r ~ i -**1 e*do*tra-!os.
m+or^aoes de
ontato normais, o
usurio deve digitar
o seu eprego
desejado, be torno
o seu durrdJo.

Nome; Four Fingers


As informaes dos nossos usurios que esto 5brenome:McGraw
procurando emprego ficam armazenadas
em uma tabela que pode ser consultada por Telefone: 555-098
T p S :fol @9regs''istnet

empregadores, recrutadores e headhunters demfacT DeSejad Ma,aba^a


para identificarem potenciais novos contratados.
Mas h um problema... os dados digitados no
formulrio aparentemente no so confiveis!

Primeiro eu queria contratar um ninja e no


consegui, porque o nmero de telefone dele estava
faltando. Agora, o meu email para este malabarista
voltou. Estou cheio desses dados invlidos do
b a n c o de currculos do Risky Jobs.
O
Nome: Jimmy

?mprengoDeseiado:Ninja

0s empregadores pode a ^ r buss no


bao de dados do Risky Jobs e ehtao
e*trar em dontato tor* as pessos para,
possivelmente, dontrata-ias... desde <^ue
as ijvfWmaoes su-fidichtes de dontato
su+idientes tenha sido digitadas/
expresses regulares

Segue abaixo parte do cdigo do script registration, php, que exibe e processa os
dados digitados pelo usurio no formulrio para se cadastrar. Escreva o que voc
acha que h de errado com o cdigo, e como ele poderia ser modificado para
resolver o problema dos dados invlidos.

<?php
if (is set ($_POST ['submit']) ) {
$first_name = $_POST[Tfirstname1];
$last_name = $_POST['lastname'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$job - $_POST['job'];
$resume = $_POST['resume'];
$output_form = 'no';

if (empty($first_name)) {
//$first_name est em branco

echo T<p class="error">Voc se esqueceu de digitar seu nome.</p>';


$output_form = 'yes';
}
if (empty($last_name)) { .
// $last_name est em branco
echo '<p class=error>Voc se esqueceu de digitar seu sobrenome.</
P>';
$output_form = 'yes';
}
if {empty($email)) {
// $email est em branco
echo '<p class="error">Voc se esqueceu de digitar seu endereo de
email.</p>';
$output_form = 'yes *;
}
if (empty($phone)) {
// $phone est em branco
echo '<p class="error">Voc se esqueceu de digitar seu nmero de
telefone.</p>';
$output_form = 'yes';
}
Coh'tmU3 validav os dmpos no
} vazios ire-Pev'Cn^
V2-ZO& ire-feircnies So Cttfrej.
else { desejado e 3o t 1.
$output_form = 'yes';
}
if ($output_form == 'yes) {
?>
yz --------o iovmuiario-
voc est aqui 563
exerccio soluo

Segue abaixo parte do cdigo do script registration.php, que exibe e processa os


dados digitados pelo usurio no formulrio para se cadastrar. Escreva o que voc

ftccio acha que h de errado com o cdigo e como ele poderia ser modificado para
resolver o problema dos dados invlidos.
olu k>
<?php
if (isset($_POST['submit'])) {
$first_name = $_POST[1firstname'];
$last_name = $_POST[1lastname']; 0 stript veri-fida se Ka dampos em
$email = $_POST[Temail']; brando no formulrio, o <\ue e bom,
phone = $_POST['phone']; mas alguns dos dampos te** dados
$job = $_POST[job'J; mais espedializados <^ue predisam
$resume - $_POST[1resume'] ;
adcv-iv a um dctev-*y<inado ormato-
$output form = 'no';

if {empty{$first_name)) {
// $first_name est em branco
echo '<p class="error">Voc se esqueceu de digitar seu nome.</p>';
$output_form = 'yes'; r
} N*0 ba muito Mis cjue possamos veri-fidar
no <\ue diz. respeito a nome e sobrenome,
if (empty ($last_jiame) ) { portanto este ddijo esta ok.
// $last_name est em branco
echo '<p class="error">Voc se esqueceu de digitar seu sobrenome</p>';
} $outPu t_f = 1y es'; Mm
erte^ c t ewa-| ^ ^
bastante espedfido, \ue ns devemos
if (empty ($email)) { ^ veriidar antes de adeitar os dados
// $email est em branco -fornedidos pelo usurio.
echo T<p class="error">Voc se esqueceu de digitar seu endereo de
email.</p>';
$output_form ='yes '; rour Finjer Md^raw se es^ueCeu de
} dolodar um ponto perto do inaldo seu
endereo de email o -formulrio predisa
if (empty {$phone)) { dapturr esse tipo de erro/
// $phone est em branco
echo '<p class="error">Voc se esqueceu de digitar seu nmero de
telefone,</p>'; fc*. a * * j-
'\ mesma doisa dom o numero de
$output_form = 'yes;
} tele-fone o -formulrio nao deve
ser atero a no ser <\ue tenhamos
Continua a validar os campos no
vazios re-ferehtes ao emprego derteza de <\ue o tele-fone esta ho
} desejado e ao durrdulo. formato dorreto-
else { Jimmy Swi-ft nao
$output_form = 'yes'; 0 ^ue ns realmente predisamos c de
} -fornedeu o DDP
dom o seu numero uma -forma de veri-fidar endereos
____ o_ ^ue
de tele-fone, de email e nmeros telefonidos, os
if ($output form == 'yes') {
?> o -formulrio deveria doxtempx do -formulrio <\ue tem
*ibe o formulrio ter e^ido- ** fara os
demais dmposj basta veri-fidar se
eles nao estao vazios-
expresses regulares

Por que ns no usamos algumas


funes string para consertar os
dados invlidos? No poderamos ter usado str_
replaceQ para adicionar os dados que esto
faltando?

V oc pode c o n serta r alguns dados com funes string,


m as elas no ajudam m uito quando os dados precisam
aten d er a um padro b as tan te especfico.
As funes stxings so adequadas para operaes de localizar-e-
substituir simples. Por exemplo, se os usurios estiverem submetendo
os seus nmeros telefnicos usando pontos para separar os blocos de
dgitos, em vez de hfens, ns poderamos facilmente escrever algum
cdigo com str_replace() para substituir os pontos pelos hfens.
Porm, para qualquer coisa que no podemos prever, como por
exemplo, o DDD do nmero de Jimmy Swift, precisamos pedir
pessoa que est submetendo o formulrio para ser mais clara. E
a nica maneira que temos de saber que est faltando o DDD
entendendo o padro exato de um nmero telefnico. O que ns
realmente precisamos de uma validao mais avanada, para
garantir que coisas como nmeros telefnicos e endereos de email
sejam digitados da forma correta.

Ok, mas ainda assim, no


podemos usar funes string
para fazer essa validao?

As funes string no so realm en te teis para validao


de dados, a no ser que a validao seja m uito prim itiva.
Pense na forma como tentaria validar um endereo de email usando
funes string. O PHP tem uma funo chamada strlen(), a qual lhe diz
quantos caracteres existem em uma string. Mas no existe uma quantidade
de caracteres pr-definida para coisas como endereos de email. E claro
que essa funo poderia ajudar no caso dos nmeros telefnicos, porque
eles frequentemente contm uma quantidade consistente de nmeros, mas
voc ainda poder ter de lidar com pontos, hfens e parnteses.
Voltando aos endereos de email, o formato deles simplesmente
complexo demais para que as funes strings sejam teis. O que ns
estamos realmente procurando aqui por padres especficos de dados,
o que requer uma estratgia de validao que possa checar os dados
do usurio em relao a um padro, para ver se os dados so vlidos.
Modelar padres para os seus dados o cerne desse tipo de validao.
voc est aqui 565
decida como dever ser a aparncia dos seus dados

Pecida conto dever ser a aparncia dos seus dados


O nosso desafio especificar, clara e exatamente, qual deve ser a aparncia
de uma determinada informao, nos mnimos detalhes. Considere o
nmero telefnico de Jimmy. E bem bvio, para um observador humano,
que est faltando o DDD nesse nmero. Mas a validao de formulrios
no feita por humanos; ela executada por cdigo PHP. Isso significa
que ns temos de ensinar o nosso cdigo como procurar por uma string Por que
de dados digitados pelo usurio, e determinar se os dados atendem ao ningum est
padro estabelecido para os nmeros telefnicos. ligando?
Elaborar um padro desses pode ser um desafio, que exige pensar bem
sobre a gama de possibilidades para o tipo de informao. Os nmeros
telefnicos so relativamente simples, uma vez que eles possuem, nos
Estados Unidos, 10 dgitos com delimitadores opcionais. Os endereos
de email so outra histria, mas iremos nos ocupar deles mais adiante
neste captulo.
First Name: Jimmy
P r u m s e r h u m a n o , c -f c il Last Name: Swift
vcr Jimwiy $c es<^teu de Email: JS@sim-u-duck.com
Phone: 636 4652
folotr o SC* m<3s ,3o
Desired Job: Ninja
e i o simples ssifft -fazer essa
mesma observao pariir de
Cadimo P H P .
exM em
P e r g u n t a s id io t a s -
uncioriam, nao poaernos imediatamente, quando eles
Ainda no sei se entendi por submeterem o formulrio. Dessa
simplesmente ter algum para
que no posso simplesmente usar maneira, voc poder exibir uma
verificar os dados depois de eles
isset() e emptyO para a validao mensagem de erro e pedir que eles
serem colocados no banco?
do nosso formulrio. preencham o formulrio novamente.

Voc pode, mas a essa altura


Essas duas funes lhe Mas ento como decidimos
frequentemente j tarde demais
dizem se o usurio que submeteu se os dados digitados so vlidos
para consertar os dados invlidos. Se
o formulrio colocou ou no dados ou no?
estiver faltando o DDD em um nmero
em um campo de texto, mas eles
telefnico, ns teremos de pedir ao
no lhe dizem nada sobre os dados
usurio que esclarea as coisas, R : Isso depende do tipo
propriamente ditos. No que diz
submetendo novamente os dados dos dados. Diferentes tipos de
respeito funo empty(), no
desse campo. informaes tm diferentes regras
existe absolutamente nenhuma
Se esperar para verificar os dados s que precisam seguir: qual tipo de
diferena entre o usurio digitar
depois que eles j estiverem no banco, caracteres elas contm, quantos
*{707) 827-700* ou *4FG8SXY12*
talvez voc no tenha como contatar caracteres, em qual ordem esses
no campo de telefone do nosso
o usurio para lhe dizer que alguns caracteres devem estar. Assim, voc
formulrio. Isso seria um grande
dos seus dados estavam invlidos. E precisa comunicar essas regras ao
problema para sites como o Risky
uma vez que o usurio provavelmente seu cdigo PHP. Vamos dar uma
Jobs, que depende de dados
no vai perceber que cometeu um olhada com mais detalhes nas
confiveis para entrar em contato
engano, possvel que ele jamais regras que governam os nmeros
com os candidatos a empregos.
fique sabendo que h algo de errado. telefnicos...
Assim, o melhor plano de ao
Se isset() e empty() no validar os dados dos usurios
expresses regulares

- ^j^jottfeseu lpis------------------------------------------------
Escreva abaixo todas as formas de representar um nmero
telefnico que voc conseguir se lembrar.

Quais so algumas regras que razovel esperar que os seus usurios sigam ao
preencher o formulrio? Por exemplo, nmeros telefnicos no devem conter
letras.

Eis uma re^ra,


tomo exemplo.
Ms poderamos e*<$ir regras domo-' somente dgitos pode ser
usados neste tampo.

voc est aqui 567


i f*Aponte seu lpis
Escreva abaixo todas as formas de representar um nmero
Solupo telefnico que voc conseguir se lembrar.

95<5

(<595)^-4*52-
Espaos, brados, .....................
parnteses, e as vezs
pontos podem apareder t**
nmeros te!eonsdos
4*6Z
E possvel ate mesmo indluir letras
em um nmero tele-Ponido, mas isso
z
ja estaria perto de ultrapassar fc^&^&Z
os limites do <^ue ns devemos
donsiderar domo um numero valido-
^j"^Z
955 ME KIKJA
Eis uma Quais so algumas regras que razovel esperar que os seus usurios sigam ao
regra, _ preencher o formulrio? Por exemplo, nmeros telefnicos no devem conter letras.
domo
Mos poderamos exigir regras domo- somente dgitos podem ser
exemplo.
usados neste dampo-

Ns .poderamos dividir o nmero emtres dampos do formulrio, um para o


.PPP.>..W. pr.^.?.s. .i*!*? primeiros dgitos, e. um para os quatro ltimos dgitos.-.
Ou ns poderamos inomar s pessos ^ue o nmero de teleone dlas
deve seguir o -formato . ( f N o s fazemos as regras.

Existem tantos padres


possveis. Como poderemos
criar regras para dar conta
de todos eles?
Existem algum as coisas que sabem os com
c e rte za sobre nm eros telefnicos, e podemos
usar essas coisas para cria r as regras.
Primeiramente, eles no podem comear com 1 (cdigo de
interurbano) nem 0 (telefonista). Em segundo lugar, deve
haver 10 dgitos. E mesmo que algumas pessoas possam ter
maneiras inteligentes de representar os seus nmeros com
letras, os nmeros telefnicos so essencialmente nmeros -
10 dgitos quando inclumos o DDD.
568 Canr
expresses regulares

Formule um padro para nmeros telefnicos


Para ir alm da validao bsica, como a de empty() e isset(), ns precisamos adotar um
padro para os nossos dados. No caso do nmero telefnico, isso significa que temos de optar
por apenas um formato que esperamos receber do campo telefone de nosso formulrio. Uma
vez que decidamos por um padro/formato para o telefone, podemos validar esses dados.
Segue o que provavelmente o formato de telefone mais comum em uso hoje em dia, pelo
menos para nmeros dos EUA. Usar este formato significa que, se os dados que os usurios
digitarem no se conformarem a ele, o script PHP ir rejeitar o formulrio e exibir uma
mensagem de erro.
Ns optados l fytos,
###-###-#### 1AFKhcf)
h e* c e*tao os 4" dfyto*

r
555-636-46521
e -miS'
636-46521
JK
* .
n^UI esta O
v ^altando dgitos,
fc&hs e o He*
*V*e existe parede
. , 7 estar -fora do
dgito 3 r>asf| fcte bate
5556364652
Este ho peretaehte Com o
ffm KtehS. nosso padrao.
np existem
p e r g u n ta s id io ta s -

Eu tenho que usar Voc poderia fazer isso r Ok, eu no poderia ento
exatamente esse padro para os e seria suficiente se esse fosse usar trs campos de texto
nmeros telefnicos? o padro esperado pelos seus para o nmero: um para o DDD,
usurios. Infelizmente, na realidade depois trs dgitos no segundo,
Esse o que estamos usando esse no um padro muito bom, e finalmente os ltimos quatro
para o Risky Jobs porque ele porque a maioria das pessoas dgitos no terceiro. A ento eu
basicamente o padro, mas ao no escreve os seus nmeros poderia usar as funes string
elaborar os seus prprios formulrios telefnicos com os nmeros todos do PHP.
voc deve escolher um que faa juntos desse jeito. um pouco fora
sentido para voc. Apenas tenha em do padro, o que significa que os Sim, voc poderia, e alguns
mente que, quanto mais comum o usurios no estaro acostumados sites fazem isso. Mas usar os
padro for, maior a probabilidade de com ele, e ser menos provvel que padres lhe d mais flexibilidade.
os usurios o seguirem. iro segui-lo. E os padres so teis para muito

p Ns no poderamos P: E da? 0 padro meu, eu


posso fazer o que quiser; certo?
mais coisas do que apenas verificar
se o usurio digitou o nmero de
telefone corretamente, como voc
simplesmente dizer aos usurios
para digitar um padro como ver mais adiante neste captulo..
e depois usar as funes Claro, mas ao mesmo tempo
string do PHP para nos certificarmos voc quer que os seus usurios
de que os dados contenham 10 tenham uma boa experincia. Caso
caracteres numricos? contrrio, eles no voltaro ao seu site.

voc est aqui > 569


introduzindo expresses regulares

Confira padres com relapo a expresses regulares


O PHP oferece uma maneira poderosa de criar e verificar padres em um texto. Voc
pode criai' regras que lhe permitem procurar por padres em strings de texto. Essas regras
so conhecidas como expresses regulares ou simplesmente regex. Uma expresso regular
representa ura padro de caracteres a encontrar. Com a ajuda das expresses regulares,
voc pode descrever no seu cdigo as regras que deseja impor as suas strings.
Como exemplo, eis uma expresso regular que procura por 10 dgitos seguidos. Este
padro s ir coincidir com a uma string que consista de um nmero com 10 dgitos. Se
a string for maior ou menor do que isso, no ir checar. Se a string contiver qualquer
coisa que no seja um nmero, no ir coincidir. Vamos aos detalhes,

/A\d \d \d \d \d \d \d \d \d \d $ /

Q tir-unlexo
\d dgito- 0 .e tA um destes siy-ida
a Atftar do infcio frimeisre t&rCcr da $trmg a mesma eosar pv-odurar for
da ser um dfito- OMtsro \0 no total-

Existe tambm uma forma mais concisa de escrever esta


mesma expresso regular, utilizando chaves. As chaves so
usadas para indicar repetio:

u sa d a s p a r a c o n c d r

padres em uma <?u

570 fiantsiln ift


expresses regulares

Sim, as expresses
regulares so clarssimas.
Claras como lama.

verdade, as expresses regulares so


enigm ticas e freq u en tem en te difceis de ler... m as
so bastan te poderosas.
O poder frequentemente tem um custo; no caso das expresses
regulares, esse custo aprender a sintaxe enigmticas que elas
usam. Voc no vai se tomar um mestre das expresses regulares
da noite pro dia, mas a boa notcia que voc no precisa se
tomar um. E possvel fazer algumas coisas impressionantemente
poderosas e teis com as expresses regulares, principalmente
no que diz respeito validao de campos de formulrio, com
um conhecimento bastante bsico dessas expresses. Alm disso,
quanto mais voc trabalhar com elas e quanto mais prtica tiver
em analis-las em detalhes, mais fceis de entender elas sero.

voc est aqui 571


metacaracteres regex comuns

Crie padres usando metacaracteres Os metacaracteres


Poder checar dgitos em uma string de texto usando \d bem ii9s permitem
legal, mas se isso fosse tudo o que as expresses regulares
possibilitassem, o seu uso seria tremendamente limitado. Apenas desci-eVet padres
checar dgitos no suficiente nem para a validao de nmeros
telefnicos no Riskyjobs, uma vez que precisaremos checar c e i e X t d e n t r e
caracteres como espaos, hfens e at mesmo letras.
Felizmente, a funcionalidade regex do PHP lhe permite usar de uma expressp
expresses mais especiais, como VI, para checar essas coisas. Essas
expresses so chamadas de metacaracteres. Vamos dar uma olhada regular.
em alguns dos metacaracteres regex usados mais frequentemente.
\w
\d Procura por qualquer caracter alfanumrico
Como voc viu na pgina anterior, este ! em outras palavras, ou uma letra ou
metacaracter procura por um dgito. um numero. Encontra um dos seguintes
Qualquer nmero de 0 9 - em outras caracteres: a - z e A - 2 (tanto maisculas
palavras, se voc quisesse encontrar um quanto minsculas), bem como 0-9 (assim
nmero com dois dgitos, teria de usar como\d) ..
W ou\d{2}.
Ns tambm vimos o metacaracter
\s circunflexo na pgina anterior. Ele procura
Procura por espao em branco. Isso no pelo comeo da string, de modo que voc
significa apenas o caracter espao que voc pode us-lo para indicar que precisa haver
obtem na tela ao digitar a barra de espao* uma combinao no incio de uma string
V tambem encontra caracteres tab, ou um' de texto, e no em qualquer lugar da string.
newlme ou caniage return. Novamente, Por exemplo, a regex / A\d{3}/ encontrar a
lembre-se que \s s encontra um desses string "300 cadastros", mas no a string "Ns
caracteres por vez. Se voc quiser encontrar recebemos 300 cadastros".
exatamente dois caracteres espaos
seguidos, precisa usar^V ouV(2}.
Procura pelo final de uma string.
Voc pode usar este metacaracter
O metacaracter ponto final encontra com A para marcar o incio e o fim da
qualquer outro caracter, exceto um sua string, especificando exatamente
newline. Encontra letras ou dgitos, onde ela comea e onde termina.
assim como\w, bem como espaos ou Por exemplo / A\w{5J\s\d{3}$/ ir
tabs, com oV encontrar Nanny 411, mas no
Nanny 411 tima nem Ligue para
Nanny 411.

Esses metacaracteres so legais, mas e se voc quisesse ter um caracter especfico na


sua regex? Basta usar esse caracter na expresso. Por exemplo, se quisesse encontrar
o nmero de telefone 707-827-7000 exato, voc usaria a regex /707-827-7000/.
rs /
expresses regulares

* +

WfUlf.- fSkf # IMi


Ligue cada expresso regular ao nmero telefnico a que ela
corresponde.

KegeX Sttn^ ^ue ela encpiitta

5556364652
//v\d{ 3} \s\d{7} $/

555 636 4 65 2
/A\d{3}\s\d{3}\s\d{4}$/

/A\d{3}\d{3}-\d{4}$/ 555 63 6 -4 6 5 2

/A\d{3}-\d{3}~\d{4}$/ 555 ME N IN JA

/A\d{3}\s\w\w\s\w{5}$/ 555 6 3 6 4 6 5 2

555 -6 36-4652

voc est aqui 573


quem faz o que soluo

Ligue cada expresso regular ao nmero telefnico a que


ela corresponde.

/A\d{3}\s\d{7}$/ 55 5 6 3 6 4 6 5 2

/~\d{3}\s\d{3}\s\d{4}$/ 555 636 4 6 5 2

/A\d{3}\d{3}-\d{4}$/ 555 636-465 2


Este e o fdro <^ue o Risky Jobs usa
pava endontrar numros de tele-fones
no formto

/A\d{3}-\d{3}-\d{4}$/ 555 ME N IN JA

5 555 6 3 6 4 6 5 2
/A\d{3}\s\w\w\s\w{5}$/

Os meiatavatteves \*
neste fadro endontvarw
letras.

/A\d{10}$/ 555-6 36-4652


Este fadrao e doynpost totalmente
for ditos, de modo *^ue ele s donsegue
endontrar um hmero tele-fnido <^ue no
tenha esfados nem hfens.

*57A
expresses regulares

S iN T A -S E co m o u m a
E xp resso R e g u la r

Suatarea Interpretai- o papel da expressb regular,


e aceitar pu rejeitar nmeros telePicos
ds usuro s dp Rsky Jol->s. Marque
ps nm eros ^ue- Vpce considerar
Vlidps, e deixe 9S demais em brancP. a expresso
EsoreVa ppr <jue ps nnieros mvaldps reguiar para o
sp xnV^Jides* ___nwmero lele-fonito -
eja ela/

/ A\ d { 3 } - \ d { 3 } - \ d { 4 } $ /

(555) 935-2659 (555)672 -09 53 555 -3 43-8263

Surf pode sev Vtm


atividade be arrisdada>
principalmente guando
vode trabalha de ista
profissional para tubares/

555 -4 41-9005 5 5 5 .9 0 3 .6 3 8 6 555-612-8527 -87 24

voc est aqui 575


seja expresso regular soluo

!n 1 T A -S E oorno urna E x p r essa 0

R e g u la i: S o lu ?
Sua -area Interpretar o papel da expressa? regular,
e aceitar QU rejeitar nmeros tele-pnicPs cIps usurios
d9 Risky Jobs. Marque os nmel-9S
<jne Voce considerar Vlidos e deixe
s demais em Wancp. EscreVa pet <jue
95 nmeros invlidos sp inValdps.
Esta e a expresso
regular para o
nmero tele-fnico -
seja ela/
/ A\ d { 3 } - \ d { 3 } - \ d { 4 } $ /

Parnteses ao
so permitidos e
espaos tambm
n3o->

(555) (555 )6 7 2 -0 9 5 3 555 -343-8263

Sem parenteses, por


-Pavor.

Bi, tem quatro


^s nossas expresses nmeros a mais a^ui.
regulares requerem Isso e uma extenso
Kfens e nao pontos. Cm um esritorio?

555-4 41-9005 5 5 5 .9 0 3 .6 3 8 6 5 55 -6 12-8527(-8724

5 7 fi ran fn/rt <n


expresses regulares

As vezes as pessoas
colocam dgitos a mais nos seus nmeros
telefnicos, como por exemplo, uma
extenso de quatro dgitos no final.
Existe alguma maneira de encontrarmos
esses padres tambm?
Sim, m as a chave e s p ecificar esse tipo de padro
com o opcional, na sua expresso regular.
Se modificssemos a nossa regex para / Ad{3f\d{3}-\d{4}-d{4}$/,
estaramos exigindo que a nossa string tivesse uma extenso de quatro
dgitos no final, e no conseguiramos mais encontrar nmeros como
555-636-4652. Mas podemos usar expresses regulares para indicar
que partes da string so opcionais. As regexes tm suporte a um recurso
chamado quantificadores, que lhe permitem especificar quantas vezes
os caracteres ou metacaracteres devem aparecer em um padro. Na
verdade, voc j viu os quantificadores em ao, em regexes como esta:
W V** d'2**- Uo dfyto deve
/ \ a i XU iO ve^es sendas"

Aqui, as chaves agem como quantificador, para dizer quantas vezes o dgito precedente deve
aparecer. Vamos dar uma olhada em alguns outros quantificadores frequentemente usados.

{min,max} O caracter ou
Quando h dois nmeros metacaracter precedente
dentro das chaves, separados por deve aparecer uma ou
vrgula, isso indica uma faixa de mais vezes.
possveis vezes que o caracter ou
metacaracter deve ser repetido.
Aqui, estamos dizendo que ele dc O caracter ou
aparecer 2,3 ou 4 vezes seguidas.! O caracter ou metacaracter metacaracter precedente
pode aparecer uma ou mais deve aparecer uma vez
veies... ou no aparecer [ou ento no aparecer
nenhuma vez. inenhuma vez.

0 Assim, se quisssemos encontrar aqueles dgitos opcionais no final do


S p C llC a nmero telefnico, poderamos usar o seguinte padro:
<juWrfsVezes / A\ d { 3 } - \ d { 3 } - \ d { 4 } ( - \ d { 4 } ) ? $ /
um metacaracter Coloque entire
parnteses a sedo 0 ponto de mterrega faz.
d e V e a p r e c e i'. ^a! o ^uftti--idado*- se dor* ^*e o Sfen e os quatro
aplida. ltimos dgitos seja opdionis-
voc est aqui 577
usando classes de caracteres

Voc se
esqueceu de uma coisa. Os
nmeros telefnicos nos EUA no
podem comear com 0 nem 1.

Voc tem toda razo. 0 o nmero para cham ar uma


telefonista e 1 o cdigo para interurbanos nos EUA.
Ns queremos simplesmente o cdigo DDD e o nmero.
Precisamos nos certificar que o primeiro dgito no seja 1 nem 0.
E para isso, precisamos de uma classe de caracteres.
As classes de caracteres lhe permitem encontrar caracteres a partir
de um conjunto especfico de valores. Com uma classe de caracteres,
voc pode procurar por uma faixa de dgitos, e pode tambm
procurar por um conjunto de valores. E voc pode adicionar um
circunflexo para procurar por tudo que no esteja no conjunto.
Para indicar que alguns caracteres ou metacaracteres pertencem
a uma classe de caracteres, tudo o que voc precisa fazer
coloc-los entre colchetes, []. Vejamos alguns exemplos de
classes de caracteres em ao:

Em um itasse de
davtevcs, o A signilidd
[0- 2 ]
Isto encontrar uma faixa de
[Ab - f ]
nmeros, especificamente 0, 1 ou 2. Este circunflexo tem um significado diferente
quando usado dentro de uma classe de
caracteres. Em vez de dizer "as strings devem
[A-D] comear com..., o circunflexo significa
encontrar tudo exceto...
Isto encontrar A, B, C ou D.
Isto encontrar tudo exceto b, c, d, e ou f.
Uma classe de
c a ra c te re s e u m
conjunto de regrais Escreva aqui uma expresso regular que encontre
nmeros telefnicos internacionais:
para se encontrar
u m c a ra c te r.
expresses regulares

Ajuste os padres com classes de caracteres


Com a ajuda das classes de caracteres, podemos refinar a nossa expresso
regular para nmeros de telefone, de modo tal que ela no encontre
combinaes invlidas de dgitos. Dessa forma, se algum acidentalmente
digitar um DDD que comece com 0 ou 1, podemos exibir uma mensagem de
erro. Eis como seria a nossa nora e melhorada regex: A c f espedVfita <\ue
nossa re^e* deve dobrir
/ toda a de -fce^fco

/ A[ 2 - 9 ] \ d { 2 } - \ d { 3 } - \ d { 4 } $ /
^e esa**os domparndo-
Bw o^-b-as palavras, a
string pode donter
t
..eVi^osestamos V
nenbum outro daradter *^ue
^ dlasse de darafcteves na pertenda ao numero
seguidos de tele-ronido-
diz- v'oSSO j>rodurando por mais dois mais ires ....e um h$e* e ais os
tavattev- deve ser v & y * * dyt>s ^ue podem ser
dyfco t 2 - i % c^a^er valor entre 0
dgitos....
ultmOS dtyW
e * n e x is te m
-------------------Fel-gurttas lcll>tis
uma vez, com uma classe de caracteres? Por exemplo,
p Ento as classes de caracteres permitem que voc
uma ou mais vogais consecutivas?.
especifique uma faixa de caracteres para comparar com
a string de texto?
Bastei adicionar um quantificador depois da classe de
caracteres. A expresso /[aeiouAE10U]+/ encontrar uma ou mais
^ ! Sim, a classe de caracteres lhe permite especificar, na
vogais seguidas.
sua expresso regular, que qualquer membro de um conjunto
de caracteres especificado poder ser usado para se encontrar
^ - E u pensei que os quantificadores s se aplicassem
a string de texto, em vez de apenas um caracter.
Por exemplo, a classe [aeiou] encontrar uma instncia de ao caracter imediatamente antes deles.
qualquer vogal minscula, e a classe [m-zM-Z] encontrar uma
instncia de qualquer letra da segunda metade do alfabeto, Geralmente assim, mas se o quantificador vier logo
seja minscula ou maiscula. depois de uma classe de caracteres, ele se aplica classe
E a classe [0-9] equivalente ao metacaracter \d, que na inteira. E se voc quiser fazer com que o quantificador se
verdade apenas uma forma abreviada de dizer a mesma aplique a toda uma srie de caracteres que no estejam
coisa. em uma classe, poder colocar esses caracteres entre
parnteses, para indicar que eles devem ficar agrupados.
: No preciso colocar espaos ou vrgulas entre Como exemplo, a expresso regular /(hello)+/ encontrar
os caracteres ou faixas que eu especificar nas classes uma ou mais ocorrncias consecutivas da palavra "hello"
de caracteres? em uma string de texto.

No. Se voc fizer isso, esses caracteres extras E se eu quisesse encontrar uma palavra escrita de
sero interpretados como parte do conjunto de caracteres a duas formas diferentes, como "ketchup" ou "catsup"?
serem comparados com a string de texto.
Por exemplo, a classe H: Voc pode usar a barra vertical (|) nas suas
expresses regulares para indicar um conjunto de opes.
[m-z, M-Z] Assim, a expresso regular/(ketchup|catsup|catchup)/
encontrar qualquer uma das trs grafias mais comuns para
encontraria no apenas as letras minsculas e maisculas essa palavra.
de m at z, mas tambm uma vrgula ou um espao, o que
provavelmente no o que voc quer.

voc est aqui 579


P : a niiicicco encontrar um caracter mais de
escapando caracteres reservados

Se quiser usar c a ra c te re s reservados na sua expresso


regular, voc precisa fazer escape deles.
Na sintaxe das expresses regulares, h um pequeno conjunto de
caracteres que recebem significados especiais, porque so usados para
indicar coisas como metacaracteres, quantificadores e classes de caracteres.
Entre eles esto o ponto final {.), o ponto de interrogao (?), o sinal de
mais (+), o colchete de abertura ([), os parnteses, o acento circunflexo
(A), o cifro ($), a barra vertical (]), a barra invertida (\), a barra normal
(/) e o asterisco (*).
Se quiser usar esses caracteres na sua expresso regular, com o
significado deles, em vez dos metacaracteres ou quantificadores que eles
normalmente representam, voc precisa "escap-los", colocando uma
barra invertida antes deles.
Por exemplo, se quiser encontrar parnteses em um nmero telefnico,
voc no poderia fazer s isto:

stcs sero si^lesevte


tratadas tomo u yufo.
(55 5 )6 3 6 -4 6 5 2 / A<\d3}) \d 3 } -\d { 4 } $ /

Em vez disso, os parnteses, tanto o de abertura quanto o de


fechamento, tm de ser precedidos por barras invertidas para indicar
que eles devem ser interpretados realmente como parnteses:
Agora o PttP sabe <\ue e*ts sao
parnteses literais-
(5 5 5 )636 -46 52

RAn Ar%
expresses regulres

Crie uma string que bata com cada padro mostrado abaixo.

/ A[ 3 - 6 ] { 4 } / / A( [ A - Z ] \ d ) { 2 } $ /

Suponha que queiramos aprimorar o esquema de validao do Risky Jobs para nmeros
telefnicos, com o objetivo de permitir que os usurios submetam os seus nmeros em mais
alguns formatos. Escreva uma nica expresso regular que corresponda a TODAS as strings
de texto abaixo, e que no permita um 0 ou 1 como o primeiro dgito. O seu padro s deve
permitir dgitos, parnteses, espaos e hfens.

555 -6 36-4652 555 636-4652


(555)-636-4652 (555) 636-4652

voc est aqui 581


exerccio soluo

Crie uma string que. bata com cada padro mostrado abaixo.

ftcco
SOLUO
A string
A string deve deve to rn t^ r ^ 3 j ^
t um
domedar tom. . dom... \ misduj- duas e entao
t repetir essa dlasse
\ l a dtto... ves.. adaba--
ro vezes.
de daradteres
I l C
/ A( [ A - Z ] \ d ) { 2 } $ /
V \. ^ <\uat
/ a[3-6]{4}/
$ual<^uer string ^ue domee tom quatro dgitos na <5ual\uer string \ue domede dom uma letra
ai*a de 3 d ^ ir dorresponder a esta expresso, maisdula e depois um dgito, seguido de
ldds estas strings dorresponderao= outra letra maisdula, um dgito e s;
*& & > t um numero. " B scr, fttp z*

Suponha que queiramos aprimorar o esquema de validao do Risky Jobs para nmeros telefnicos,
com o objetivo de permitir que os usurios submetam os seus nmeros em mais alguns formatos.
Escreva uma nica expresso regular que corresponda a TODAS as strings de texto abaixo, e que no
permita um 0 ou 1 como o primeiro dgito. 0 seu padro s deve permitir dgitos, parnteses, espaos
e hfens.
5 55 -636-4652 555 636 -4 652
(555)-6 36-4652 (555) 636 -4 652

A string
deve domedar duas . e uw' digito,
dom... %a % veaes... uw w* espao- <\iA^ ro 'iez* s -

^ \j ^ nrers
/ '"i(? c i- u \d { i} \m -\ j \d { }) -\ d {+ )/ /
T / T '~ r ^
a , e um ftaw.iv.4-j* i e entao

o p X ti, * & * > v r * acsU

O ou | vez...
expresses regulares

voc est aqui > 583


a funo the php pregjnatchQ

Verifique os padres com preg^matchO


Ns no vimos desenvolvendo padres s porque divertido. Voc pode usar
esses padres com a funo preg_match() do PHP. Esta funo toma um padro
regex, igual queles que vimos construindo, e uma string de texto. Retorna false
se no houver uma correspondncia, e true se houver.
p r e g _ m a t c h ($ r e g e x , $ m y _ s tr in g )
Coloque d sua rey * a<\ui. A uno y ^
espera redeber uma string o \uc * string ^ue vode esta
signi--ida <\uc a rege* deve --idar entre domparando -fida a<\ui..
aspas simples-
Eis um exemplo da funo preg_match() em ao, usando uma
regex que procura, em uma string de texto, por um padro de
quatro caracteres de letras maisculas e dgitos alternando-se:

$wa*do rege*es so passadas para preg_


matdh0, elas dever ser doiodadas entre aspas

p re g _ m a tc h (1 /A\d { 3}- \d { 2}- \d { 4}$/ '5 5 5 -0 2 -9 9 8 3 ')


} ,
Retorna um numero inte*ro;
tV Vode pode dolodar o padro sta string bate dom a rege*,
I daso a string bata dom o dentro da 4ndo desta Wra, e a uno retomar 1.
padro e 0 daso dontrario. pas em geral, e melhor armazena
o em uma varivel. A unao preg__matdK0
fida alinhada dentro
Podemos tirar proveito da funo preg_match() para habilitar da dondi^ao, portanto
uma funcionalidade de validao mais sofisticada nos scripts PHP, o seu resultado
colocando uma declarao if em tomo do valor de retomo. determina \ual ddigo
ser exedutado-

echo Nmero de seguro social vlido';


} else {
echo Esse nmero de seguro social no vlido!;

Se no odorrer dorrespondndia, Se houver dorrespondendia, preg^matdhO


pveg__mtdH0 retorna -false, o \ue retoma true, o indida para o PffP
32.a dondio avaliar tomo -false- <\ue a dondidao verdadeira. Portanto,
Portanto, este dodigo e e*edutado. este ddigo e exedutado.
expresses regulares

Reescreva a parte salientada do script PHP do Risky Jobs que verifica os


dados de registro abaixo para validar o texto digitado no campo phone, usando
pregjnatch() em vez de emptyQ. Use a regex que voc criou anteriormente na
funo preg_match().

if (empty($phone)) {
// $phone est em branco
echo '<p class="error">0 seu nmero de telefone no
vlido.</p>!;
$output_form = 'yes';
}

voc est aqui 585


exerccio soluo

Reescreva a parte salientada do script PHP do Risky Jobs que verifica os


dados de registro abaixo para validar o texto digitado no campo phone,
9
IIClO usando preg_match() em vez de empty(). Use a regex que voc criou
0L u 0 anteriormente na funo pregjnatchQ.
if (empty($phone)) {
// $phone est em branco
echo '<p class=nerror">0 seu nmero de telefone no
vlido.</p>1;
$output_form = 'yes;
}
fcm vez. de emptyO, nos usamos uma
rej^maidh para validar O numero de

(ft
tele-fone- Hos olo3mos wtes dela o
operador HOT porque queremos
exibir um et*o sempre *\ue os dados A expresso regular ja
digrados HhO baterem tom o padro- vimos anteriormente.

.f. sw
o um poufio, uma
ffhwc . . valido...................... vez. ^ue nao esimos apenas
verificando se dados
'<p lj! ! = V w > c wMWo tft Uk<**..mvl|<io</p> ';............... ^ s<

J v k x U x r.'yo; * b^f"*" >* p**-S


*\ue estabeiedemos para os
nuw>eros tele-foniios.
Colomos foutput
domo yestsim), ^uai
antes
expresses regulares

T te s T O R fv e *30 apegas se o usurio


di^rbou o nwmCVol

Verifique se os nm eros telefn ico s so vlidos no script de registro do


Risky Jobs.
Baixe o script registration.php no site da Alta Books, era www.altabooks.com.br, junto
com a folha de estilo do Risky Jobs (style.css) e as imagens (riskyjobs_titie.gif e riskyjobs_
fireman.png). Em seguida, modifique o script registration.php para que ele use a funo
preg_match() para validar os nmeros telefnicos em relao expresso regular.
Certifique-se de ajustar a mensagem de erro para que os usurios saibam que o nmero
telefnico no vlido, e no apenas que est em branco.
Envie o script modificado para o seu servidor web e ento, abra-o em um navegador.
Experimente digitar alguns nmeros telefnicos com diversos formatos, e observe como o
script captura os erros.

0 sdvtfl a^ora
exibe uma e^sa^em
de erro guando
o *ero de
'telefone e
md.rre-taeirrbe>
nesttf tso, tom
pontos e* vez. de
hfens.

voc est aqui 587


a funo the php preg_replace()

Hmm. Se a nossa regex usa vrios padres


para o nmero telefnico, o texto no ter
vrios formatos diferentes no nosso banco de
dados? Isso no bom. Acho que precisamos
padronizar isso a.

S porque voc est perm itindo que os dados


sejam inseridos em vrios form atos diferentes, no
significa n ec essariam ente que voc queira esses
dados arm azenados em todos esses form atos.
Afortunadamente, existe outra funo regex que nos permir
pegar os nmeros telefnicos vlidos submeddos pelos usurios
do Riskyjobs e faz-los todos se conformarem a apenas um
padro consistente, em vez de quatro.
A funo preg_replace() vai um degrau alm de preg_match(),
ao fazer a comparao de padres usando expresses regulares.
Alm de determinar se um dado padro bate com uma dada
string de texto, ela lhe permite especificar um padro para ser
colocado na string, no lugar do texto encontrado. Funciona de
modo bastante semelhante com a funo str_replace() que j
usamos, exceto pelo fato de que ela faz a comparao usando
uma expresso regular, e no uma string.
preg__replace($padro, $substituio, $minha_string)

* / f
Ks predisamos e^ontrar ' $uhdo ehdontrmos string ohde estaImos
A _
esses daradteres t r c itr indesejado, Queremos -fzehd a operao de
mdesejados- *V*e ele seja transformado isto. ^^^^-c-substitui*^
Eis um exemplo da funo preg_replace() em ao:

$ano novo = preg replaceC^OOtO-S]/, 2010' Estamos em 2009.')

o n sd U io ds -fuBS. / t
guando uma
Esta r e y * diz- a p dorrespondendia t
< a nossa string de Cada vez. <^ue um ano
texto revisd depois repiate para produrar
uma dorrespondendia \ue
endontrada, ela t
substituda por ZOlO.
de ZOOO-ZOO*}
de teita a operado de for endontrado na
seja um numero entre
nossa string, ele ser
2 0 0 0 1 100%
+ica arnicnac(0 em substitudo por ZOiO.
fano novo.

KQQ . .
expresses regulares

Padronize os dados de nmeros telefnicos digitados no formulrio do Risky


Jobs, escrevendo cada um dos seguintes nmeros na coluna phone da tabela
RCCO abaixo. Certifique-se de usar um formato que armazene o mnimo de dados
possvel para representar cada nmero de telefone.

(555) 935 -2 659


Dangers You job is there.
B o y o u fiay e th e g u ts S*>,,n<1 lt?
(555)672 -09 53
Risky Jobs - Registration
Register wife Sisley Jobs* and pest yooi resume-.
555-343-8263

555-4 41-9005

5 5 5 .9 0 3 .6 3 8 6

555-6 12-8527 -87 24

voc est aqui 589


exerccio soluo

Padronize os dados de nmeros telefnicos digitados no formulrio do Risky


Jobs, escrevendo cada um dos seguintes nmeros na coluna phone da tabela
abaixo' Certifique-se de usar um formato que armazene o mnimo de dados
.RC|C|0 possvel para representar cada nmero de telefone.
g o L u o

(555) 935 -2 659

(555)672 -09 53

555 -3 43-8263

555-4 41-9005

5 5 5 .9 0 3 .6 3 8 6

5 55 -6 12-8527 -87 24

A -fo*rr*3 wnis
rpida de armaz**ar
Wefnido
e retirar iudo,
exteio os dfyW
expresses regulares

Padronize os dados dos nmeros de telefone


Da forma como est. agora, o Risky Jobs est usando a seguinte expresso regular para
validar os nmeros telefnicos fornecidos pelos usurios no formulrio de registro:
/ A\ ( ? [ 2 - 9 ] \ d { 2 } \ ) ? [ - \ s ] \ d { 3 } - \ d { 4 } $ /

Isto encontrar nmeros que recaiam em um destes quatros padres:


###-###-####
## # # # # .# # # #
Ns querem os transform ar
nossos dados d esta form a...
(###) # ##-####
Embora esses formatos sejam facilmente interpretados pelas pessoas,
eles dificultam o trabalho das consultas SQL, de classificar os resultados
da forma como queremos. Os parnteses muito provavelmente iro
atrapalhar as nossas tentativas de agrupar os nmeros por DDD, por
exemplo, o que poderia ser importante para o Risky Jobs caso ns
queiramos analisar quantos dos usurios do site so de uma determinada
localizao geogrfica.
Para tomar esses tipos de consultas possveis, precisamos padronizar os ...para esta.
nmeros em um s formato, usando preg 1 - - - - J ~
INSERT para colocar os dados no banco,
livrarmos de todos os caracteres, exceto o
simplesmente armazenamos 10 dgitos x i

outro caracter. Queremos que os nossos r


desta forma, na tabela:
##########
Isto nos deixa com quatro caracteres para localizar e substituir. Ns
queremos achar e remover parnteses, espaos e hfens. E queremos
encontrar esses caracteres independentemente de onde eles estejam
na string, portanto, no precisamos do circunflexo (A) e nem do cifro
($). Ns sabemos que estamos procurando por qualquer caracter de
seus dados lie
um tipo especfico, logo, podem os usar uma classe de caracteres. A
ordem da busca no importa. Eis a regex que podemos usar:
d melipves
resultados em
c o n s u lta s S > L .

voc est aqui 591


removendo caracteres com preg_replace()

livre-se dos caracteres indesejados


Agora que temos o nosso padro para encontrar esses caracteres indesejados, podemos
aplic-lo aos nmeros telefnicos para ajust-los antes de os armazenarmos no banco.
Mas como? E a que a funo preg_replace() realmente vem em nosso auxlio. A
questo aqui que no queremos substituir os caracteres indesejados, queremos
apenas nos livrar deles. Assim, ns simplesmente enviamos uma string vazia para
preg_replace() como o valor de substituio. Eis um exemplo que encontra caracteres
indesejados nos nmeros telefnicos e os substitui por strings vazias, na prtica
eliminando-os:
KS rm3ZttmCS OS resultados
da ttoss operaao ioaliz1! e Realize esta substituio na
substituir nesta varivel. stHhg de te*fct> de fpkone.

1
$new_phone = preg_replace ('/[\(\)\-\s]/', '', $phone) ;

tndontre estes
darafiteres.... -e os substitua por
uma string vazia...
###-###-####
# # # ###-####
(###)-###-####
(###) ###-####
C.

preg replace()

Tdos os telefones sao padronizados


neste -formato, para ^ue todos
seja armazenados o bando o
mesmo -formato-
expresses regulares

No sei no, isso parece muito trabalho


apenas para termos strings de 10 dgitos
no nosso banco de dados. No poderamos
simplesmente exigir que os usurios digitassem
logo desse jeito, no formulrio de registro?

C e rta m e n te , m as Isso a c a b a ria cau san d o


p ro b lem as d ep o is , um a vez que as c o n s u lta s
com nm eros te le f n ic o s no fu n c io n a ria m
com o e s p e ra d o .
A maioria dos usurios est acostumada a digitar nmeros
telefnicos com alguma combinao de hfens, parnteses e
espaos, de modo que tentar forar o uso de apenas dgitos
nos telefones poderia no funcionar como esperado. E muito
melhor tentar alcanar algum equilbrio, dando aos usurios
opes razoavelmente flexveis para a insero dos dados, ao
mesmo tempo nos certificando de que os dados armazenados
sejam o mais consistentes possvel.
Alm disso, s preciso uma chamada a preg_replace()
para resolver o problema, o que no grande coisa. Mas
se estivssemos falando em escrever algum tipo de funo
personalizada com um monte de cdigo, seria outra histria.
Mas melhorar a usabilidade e a integridade dos dados com uma
nica linha de cdigo no tem nenhuma dificuldade!
teste registration.php

T fe S T O R fv e

A juste os nm eros de telefo n e no script de registro.


Modifique o script registration.php para ajustar os nmeros de telefone,
adicionando as seguintes linhas de cdigo ao script, logo depois da linha que
agradece ao usurio por se registrar com o Risky Jobs:
$pattern = / [\{\)\-\s]/';

$replacement = '';

$new_phone = preg_replace($pattern, $replacement, $phone);

echo 'Seu nmero telefnico foi registrado como 1 . $new_phone . '.</p>';

Envie o script para o seu servidor web e depois abra-o em um navegador.


Preencha o formulrio, sem se esquecer de colocar um nmero telefnico com
caracteres extra, como por exemplo, (707) 827-7000. Submeta o formulrio e
verifique os resultados.

3 0 hun*cro
f fcclc-wiido c
I reduzido apenas
j dgitos -
Voubro tra-Uy-l

Experimente colocar algumas outras variantes do nmero, como: 707- 827-7000,


(707)-827-7000, 707 827 7000. Repare em como a expresso regular e preg_
replace () se livram dos caracteres extras.
expresses regulares

O email que mandei para este


equilibrista acabou de voltar. No acredito que
esse formulrio estpido est deixando as pessoas
digitarem endereos de email que nem funcionam!

fir* ame;Fur Fingers


Last Name:McGraw
Email: four@gregs-|jstnet
Phone: 555-098 K ist
Desired Job: Knife JuggST faltando
ponto
no t n d t r t t o
d t email!

Da m esm a form a que os nm eros telefnicos, os endereos


de em ail tm um form ato esp ecfico o su ficien te para que
possamos valid-los, verificando m ais do que sim plesm ente
se os usurios os digitaram .
Assim como na validao dos nmeros telefnicos, primeiro ns temos
de determinar as regras que os endereos de email vlidos tm de seguir.
Ento poderemos formaliz-las como uma expresso regular, e implement-
las no nosso script PHP. Assim, vamos primeiro dar uma olhada do que
exatamente se compe um endereo email.
KSs sabemos <\we os cnderedos
d t emii devew tontev eskts
stf dois darateres
NomeLocal@PrefxoDoDomno 7SufixoDoDomnio
^ poder Kavev daradteres ^ jsto geraWnte
al+anu^erifios, onde KoeLodai te no se eo^poe dt
miMo .taradter e lWi*oP!Wni 3 daradteres
te no mm** dois darafiteres. atfa*w**to**

Veja se voc consegue bolar uma


expresso regular flexvel o suficiente
para encontrar os endereos de email
direita. Escreva-a abaixo:

voc est aqui 595


uma regex para endereos de emall

Conferir endereos de email pode ser complicado


Parece que deveria ser bem simples encontrar endereos de email porque,
primeira vista, no parece haver tantas restries sobre os caracteres que voc pode
usar quanto h para os nmeros telefnicos.
Por exemplo, no parece ser grande dificuldade encontrar a parte NomeLocal
de um endereo de email (tudo que vem antes do sinal @). Uma vez que ela
composta de caracteres alfanumricos, deveremos poder usar o seguinte padro:

/ A \w + /
' M mais taratteres
Comea dom... a lW r i* -

Isso permitiria qualquer caracter alfanumrico no nome local,


mas, infelizmente, ele no incluiria caracteres que tambm so
permitidos em endereos de email. Todw te* ta r a W
Acredite se quiser, mas endereos de email vlidos podem conter poder aparecer *>a
qualquer um destes caracteres na parte NomeLocal, embora parte HomcL-otat de
alguns deles no possam ser usados como o primeiro caracter: endweo de <'

Se quisermos permitir que os usurios registrem endereos de email com esses


caracteres, realmente precisamos de uma regex parecida com essa:
/ A[a -z A -Z O - 9 ] [a -z A -Z 0 - 9 \. \ - & f ? = # ]* /
I1 K Os dedais daratteres , . f
0 wsmYo pode ser suaisoiuer 2 podemos ter zjsvo ou
u ld e * '* '^ "ais delts

Isso no encontrar absolutamente todo


NomeLocal vlido, uma vez que ainda estamos
pulando alguns dos caracteres realmente obscuros,
mas bastante prtico de usar e, de qualquer
forma, ainda dever encontrar os endereos de
email da maioria dos usurios do Riskyjobs.
expresses regulares

Esse negcio dos emails fcil.


Basta usarmos o mesmo padro que
usamos para o nome local para validar o
nome do domnio... nada demais!

Isso funcionaria para


um a p a rte do domnio, o prefixo,
m as no para o sufixo.
Enquanto o prefixo do domnio pode conter praticamente qualquer
combinao de alfanumricos e alguns caracteres especiais, como o
NomLocal, as restries sobre os sufixos dos domnios so maiores.
A maioria dos endereos de email terminam em algum sufixo de
domnio comum: .com, .edu, .org, .gov e assim por diante. Ns
precisamos nos certificar de que os endereos de email terminem em
um sufixo de domnio vlido tambm.

na? existem
TWgimtas Idiotas
P E se eu quiser permitir absolutamente todos os
endereos de email possveis?
* Mas as pessoas no vo ficar irritadas se
elas tiverem um endereo de email que eu me
recuse a validar?
Voc pode, e se for o ideal para o seu site,
certamente deve. Mas s vezes melhor usar formatos possvel, mas a maioria das pessoas no ter
comumente aceitos, e no necessariamente aceitar endereos de email malucos. A maioria dos servios
qualquer variao possvel. Voc precisa decidir qual de email online tem as suas prprias restries que
ser o formato dos emails de 99.9% dos seus usurio, impedem os usurios de criarem endereos de email
e precisa estar disposto a no validar o .1% restante loucos, embora vlidos, como:
simplesmente porque isso lhe permitir escrever um "_eu sou louco@gregs~list.net.
cdigo melhor. A validao , na realidade, um equilbrio
entre o que permitido e o que prtico aceitar.Se quiser
implementar uma validao de emails mais robusta
no seu site, voc poder encontrar alguns excelentes
A V<ll1d^ te<Jiienternertte
cdigos PHP open source (ou seja, gratuitos) aqui: http:// e u m e<ju!lt>iP e n t r e 9
code.google.com/p/php-email-address-validation/.
< j u e e p e t m i t c t e e- 9 e

p r tic o c ic e lta r.

voc est aqui 597


coincidir sufixos de domnio

Sufixos de domnios esto por toda a parte


Alm dos ultracomuns sufixos de domnios que voc v frequentemente, como
.com e .org, existem muitos, muitos outros sufixos vlidos para uso em endereos
de email. Outros sufixos reconhecidos como vlidos pelo Sistema de Nomes
de D om nios (Domain Name System, ou DNS) que voc pode j ter visto
incluem ,biz e .info. Alm desses h uma srie de sufixos que correspondem aos
diferentes pases, como .ca para o Canad e .tj para o Tadjiquisto.
Eis uma lista com apenas alguns dos sufixos de domnios existentes. Estes
no so todos os que existem.

jNPtcl Geek

0 Sistema de Nomes de
Poderam os fazer isso, e Domnios um servio
funcionaria. de dados distribudo que

Mas h um jeito mais fcil. Em vez de fornece um diretrio


mundai de domnios
manter registro de todos os domnios e os seus endereos IP.
possveis e ter de modificar nosso cdigo Ele torna possvel o uso
caso um novo domnio seja adicionado, de nomes de domnio.
podemos verificar a parte do domnio Sem o DNS, teramos de
de um endereo de email usando a dig ita r 208.201.239.36
funo checkdnsrr() do PHP. Esta em vez de oreilly.com.
funo se conecta ao DNS e verifica a
expresses regulares

Use PHP para verificar o domnio


O PHP fornece a funo checkdnsrr() para verificarmos se um domnio vlido ou
no. Esse mtodo ainda melhor do que usar expresses regulares para encontrar o
padro de um endereo email, porque em vez de apenas verificar se uma string de
texto poderia ser um domnio vlido, essa funo na verdade consulta os registros
do DNS e descobre se o domnio realmente est registrado. Assim, por exemplo,
enquanto que uma expresso regular poderia lhe dizer que gzsdjlkdfsalkjaf.com
vlido, checkdnsrr() pode dar um passo adiante e lhe dizer que, na verdade, esse
domnio no est registrado, e que ns provavelmente deveramos rejeit-lo caso ele
seja digitado no nosso formulrio de registro.
A sintaxe de checkdnsrr() bem simples:
eHetkdvvsrrO espera receber
ufe s-tr'm<\ dotvfcendo ur*
orne de doimmio. Esse (nome

c h e c k d n s r r ( ' h e a d f i r s t l a b s . c o m ')
isto s e ia problema se
o seu servidor web us^y
Windows. Caso esteja
usando u*i doiwputador
Se voc estiver rodando o PHP em um u servidor UN|;</Lmux,
servidor W indows, esse com ando no
eK-fcao no seva prble**a-
funcionar para voc.
Em vez dele , voc pode usar este cdigo: te tocando cMt ^arw
function win_checkdnsrr($domain,$recType=11 ^ p r ^ r m a e * U irn o , *
voda no servider, para
if (iempty($domain)) {
if ($recType 1') $recType="MX";
exec("nslookup -type=$recType $doraain",$output);
foreach($output as $line) {
if (preg_match. ("/A$domain/,
return true;

Server^ .fll-M**! W<Wress<


return false;
autVjori'tsti'1aws'wer-
return false; ov*elly-tow wail e*cbawyr
2-0
oreilley--ow-

voc est aqui 599


validao do email em 5 passos

Validapo de email: montando o quadro


Agora ns sabemos como validar tanto a parte NomeLocal de um
endereo de email, usando expresses regulares, quanto a parte
de domnio do endereo, usando checkdnsrr(). Vejamos o passo a
passo de como podemos juntar essas duas partes para adicionar uma
validao completa de endereos de email ao formulrio de registro
do Risky Jobs: Rc?ve
*ao ba nenbum
tirao no (mal
desta re^e*, wa
Use preg_match() para determinar se a parte NomeLocal do nosso vez. ^ue bavera
endereo de email contm um padro de caracteres vlido. caracteres apos

Podemos usar a seguinte regex para fazer isso:


/* [a-zA -ZO -9] [a -z A -Z 0 -9 \ t ?- # ] *@/
i l j n u i je' Slr <>m*> sratier Desa <, a>b> mk
r* e dio pode Conter produrar por um smbolo arroba

3 1 i teres especiais.
>o^endereo de email fiote
" i > ntes
esse smbolo 1 . Jdommio-
- I . . do ___

Se a validao do NomeLocal falhar, ecoe uma mensagem de erro para


o usurio e recarregue o formulrio.

Se a validao do NomeLocal tiver sucesso, envie a checkdnsrr() parte


da string de texto submetida pelo usurio referente ao domnio.

Se c h e c k d n srr () retornar 0, ento o domnio no est registrado,


portanto, ns ecoamos uma mensagem de erro para o usurio e
recarregamos o formulrio.

Se c h e c k d n srr () retomar 1, ento o domnio est registrado, e


podemos ter razovel confiana de que teremos um endereo de
email vlido. Podemos prosseguir com a validao do restante dos
campos do formulrio.

600 Cantnin ifl


expresses regulares

Segue abaixo o novo cdigo PHP para validar os endereos de email dos
usurios, mas alguns pedaos desapareceram. Preencha os espaos em
branco para completar o cdigo.

if {!preg_match(' .................................... $email)) {

// $emal invlido porque NomeLocal incorreto

echo 'Seu endereo de email no vlido.<br />';

$output_form = 'yes';

}
else {

// Retira tudo do email, exceto o .dominio

$domain = preg_replace('..................... ............. , ..... );

// Agora verifica se $domain est registrado

if {.................. ) {
echo 'Seu endereo de email invlido. <br />';

$output_form = 'yes';

}
1

voc est aqui > 601


exerccio souo

Segue abaixo o novo cdigo PHP para validar os endereos de email dos
^# usurios, mas alguns pedaos desapareceram. Preencha os espaos em
RCIClO branco para completar o cdigo.
SoLu o Esta c a nossa re^e* fava entontv-ar a parte
KomcL-oda! do cndcvco de email; terminando tom
y um sinal @-
if (Ipreg match (' C a - z ^ i '' $email)) {

// $email invlido porque NomeLocal incorreto

echo 'Seu endereo de email no vlido.<br />';

$output_form - yes ; ^ Q NoBeUial e o W .


} #, 3 stnrq vazia ^ to"
stvi*3 de substituiro-
01S0 { *
// Retira tudo do email, exceto o dominio.
u
domain = preg__replace {1 /^a-z^-Z ^-^X a-zA -Z ^-^ , , femail
) M
j! Agora verifica se ^domain est registrado s
..... R eal a*W rt*> no
N. valor de fenai(
echo 'Seu endereoSe^email invlido. <br />';
$output form = 'yes '; ^ estivev usando um servidor
H etk * ^ > W * a W o esni

rejisbaao- ha-loMw.

PONTOS DE BALA

preg__match () localiza Voc pode especificar um conjunto de


correspondncias para padres em strings. caracteres a serem permitidos no seu
preg_replace () modifica strings
padro, usando uma classe de caracteres.
encontradas.. No seu padro, \ d , \w e \ s significam
Quantificadores (Quantifiers) lhe permitem dgitos, caracteres alfanumricos e espao
controlar quantas vezes um caracter ou em branco, respectivamente.
conjunto de caracteres pode aparecer checkdnsrr () verifica a validade de
seguidamente. nomes de domnio.

fin?
expresses regulares

T b& T O R fV G
Adicione validao de em ails ao scrip t de registro do Risky Jobs.
Use o cdigo da pgina anterior para adicionar a validao de emails ao script
registration.php. Depois envie o script para o seu servidor web, e abra-o em um
navegador. Tente submeter um endereo de email invlido, e perceba como o
cdigo da nova expresso regular rejeita a submisso do formulrio e exibe uma
mensagem de erro para explicar o que aconteceu.

Danger! Yourdreamjob 1*outere.


you Save *hguts to go tind It?

Risky Jobs - Registration


J.
Your asial addressJsimalid. Uma mensagem
^ T
Excelente! Eu igster with Risky Jobs, and post your resale. Idc Oto in-forma
cumpri a minha cota de p*e o chderco
contrataes para empregos ic Cmil do
arriscados. Nao preciso fazer av-io no t

mais nada, alm de contar todo |alido (e\e tcm


* o dinheiro que ganhei Desired Job:
espao otide
rveria haver
bole @).

Com a ajuda da validaao no


-formulrio de registro do Risky Jobs,
ew-fcrar e fiontato tom dawfcdatos
promissores ao e mais um problema,
e possvel -fazer as Coh-fcrataes
em -tempo reorde-

voc est aqui 603


caixa de ferramentas do php & m ysql

Soa Caixa de Ferramentas do PHP S- MySQL

C/til
11 ViSUclllzUlcIo seus Dclclos... e]V[cl!s!

Desenhando Grficos
Dinmicos

claro que todos ns conhecemos o poder de uma boa consulta


e OS Consequentes resultados satisfatrios. Mas os resultados de consultas
nem sempre falam por si mesmos. As vezes til apresentar os dados de uma forma diferente,
uma forma mais visual. O PHP possibilita o fornecimento de uma representao grfica dos
dados: grficos pizza, grficos em barra, diagramas de Venn, desenhos Rorschach, qualquer
coisa. Vale de tudo para ajudar os usurios a compreender os dados que fluem atravs da sua
aplicao. Mas nem todos os grficos teis, em aplicaes PHP, se originam do seu banco de
dados. Por exemplo, voc sabia que possvel evitar ataques de spam de preenchimento de

formulrio robotizado com imagens geradas dinamicamente?

este um novo captulo 605


yque dos robs

(ruitar Wars Reloaded: A


T o c lo s
Vinganpa das Mquinas
O futuro j chegou. Os robs foram soltos no mundo virtual e orniulrfos
Web tem o tscp
no h muito que se possa fazer para impedi-los, exceto usar
alguma vigilncia atravs de cdigo PHP. Esses robs so os
spam bots, os quais infestam a Web procurando por formulrios de ctta^ues cie
de input que os permitam publicar anncios s centenas. Esses
spam lx>ts
robs so incrivelmente eficientes e no esto nem a para o que
deveria ser o uso legtimo dos formulrios que atacam. O seu
nico objetivo substituir o seu contedo pelo deles, em uma
tentativa desenfreada de conseguir receitas publicitrias para os
seus mestres. Infelizmente, a aplicao de pontuaes do Guitar
Wars acabou caindo vtima dos bots.

No c nada pessoal; os bots


apenas querem ates^ao dos seus
usurios, para aumentar as refiitas
publiefcirias dos seus iwestres.

Os bots de spam so excelentes para repetio


burra, neste caso preenchendo e submetendo
um formulrio do Guitar Wars atrs do outro,
com dados que na verdade contm anncios,
em vez de pontuaes.
visualizando seus dados... e mais!

Nenhum formulrio de input est a salvo


Felizmente para o Guitar Wars, os ataques dos bots de spam ficam invisveis
para o usurio final, graas ao recurso de moderao humana adicionado l
no Captulo 6. No entanto, o moderador agora est completamente soterrado
pelo enorme volume de posts dos bots de spam, o que lhe dificulta a tarefa
de "peneirar" e aprovar as pontuaes legtimas. A moderao humana um
excelente recurso, mas os humanos ficam em desvantagem ao se depararem
com um adversrio automatizado que nunca se cansa.
0 nosso destemido
Isto ridculo. moderador do
No consigo moderar juitar VVrs se
todos estes posts, a maioria enfioK-bra em umd
dos quais parecem ser falsos. di-fic.il batalha
Guitar Wars - High Scores Administratfc Eu nem sequer sei o que um to Y ikri bots

Belowisa lis! of ali Guiiar Wars hgh. scorcs. Use t e page to remove
frowney! *^ue Kuta se
needed- asam de postar
Date Score Aetkm poht**ates falsas,,
rwvr^assbatesxom 2008-06-23 45:15 999999999 Kemove l ggQS
Nauae
2008-06-23 .:44:56 999999999 E&gass >tPSH <^ue va verdade
2008-06-23 45.;
sao spam.
wwv.ciasshates.coin
jtoiroeyceBtrtlxoin 2008-06-231 :AS>t
-trvmrowneyceofcraLwB 2008-06-23 :46:<X 999999999 f Appism
)
v w ^ v w iK rc n itn U 20084)6-23 ,:46:19 999999999 S s m m t g p S
wwJro-WBeyeeatraLcflm 2008-06-23 .:47:26 999999999 >&$$$&
-.47:42 999999999 SffiSSg!
wwwJieaiilHitlatw^oin 2008-06-23 i;47:55 999999999 E m
KyarwAewitefiateJ<HP 2008-06*23: lMAZ999999999M&mt&m&&
2008-06-23 si
wwJwadiastlfito^w 2008-06-23 1.52:20 999999999 Regove t AjffflK
2008-06-23 t 52:32 999999999 AjaawS
yrvn Jicadlastlabs-com

Est claro que a moderao humana dos posts no o


suficiente. O que ns precisamos de uma forma de evitar
que os robs consigam submeter as pontuaes - cortar o
acesso logo no incio, por assim dizer. Mas para isso ser
preciso distinguir, de alguma forma, entre um software
automatizado e um ser humano com um crebro real...
um problema difcil, mas que pode ser solucionado.

Escreva abaixo trs perguntas que voc poderia fazer para distinguir
entre um ser humano real e o crebro artificial de um rob:

voc est aqui 607


^ifta r wass: apenas para humanos

Precisamos separar os humanos das mquinas


Para descobrir como detectar se h um ser humano real no outro lado da
pgina Adicionar Pontuao do Guitar Wars, voc precisa primeiramente
avaliar o que exatamente o bot de spam est fazendo quando ele preenche
formulrio com dados falsos.
Para um bot de spam, e a dds
mis taij do mundo bombtrdMtr

uc:r*s,
____
c tC. mesmo milhares

0 banto de dados,
do juitar Wars esta
sendo inundado 6om
pontuaes mvlids
porque os bots estao 0 formulrio Adidionar
se aproveitando do rontuio nao te*
-formulrio Adicionar nada para distinguir
Pon^tuaac entre um post de um
sev*
Humano real e um post

0 formulrio
teito automaticamente
por um robo.
A di Cl911a t Y ^Iltua? O problema com o formulrio Adicionar Pontuao que ele no
frecisa d e UUl I1Cm/o '^az nac^a Para impedir submisses automatizadas, significando que
1 ~ qualquer programador habilidoso poder criar um bot que preencha
campp c[ue exja com anncios e submeta o formulrio repetidas vezes. claro que
a confirmao de recurso esse spam nunca chega pgina principal do Guitar Wars, graas ao
c[e o usutfe um aspectos,deporque moderao, mas ele toma a moderao intil em muitos
o moderador acaba perdendo tempo removendo
ser fcumaxio, antes manualmente centenas de posts falsos que contm anncios.
d e p e tm l: Jue O formulrio precisa de um novo campo de verificao que
precise
uma ppntuaao seja submetida. ser informado com sucesso para que a pontuao seja
E a verificao especfica desse campo precisa ser algo
subm etida. fcil para um ser humano real, mas difcil para uma mquina.
cno
visualizando seus dados ... e mais!

Seguem abaixo algumas ideias de campos para o formulrio que poderiam ser
usados para impedir que bots de spam submetam posts. Circule os campos
RCCIO que achar que poderiam, de forma simples e eficaz, permitir que apenas seres
humanos submetam posts, e no se esquea de escrever por qu.

Voc um rob? Q im O No

Qual era o prato favorito de Elvis?

Scaneam ento de retina:

Digite as letras m ostradas: jkdyqmc

Quanto 7 + 5?

Que tipo de anim al este?

D igite as letras m ostradas:

voc est aqui 609


exerccio soluo

Seguem abaixo algumas ideias de campos para o formulrio que poderiam ser
usados para impedir que.bots de spam submetam posts. Circule os campos
que achar que poderiam, de forma simples e eficaz, permitir que apenas seres
gLugo humanos submetam posts, e no se esquea de escrever por qu.
/Vlutio fdil de Ceria^enie difdil para os robos,
adivinhar - esmo mas poiendiaimenie difdil para
t<m
sudesso t ^ O k r A
Voc um rob? O
w
O
w
No alguns seres humanes iambm. Nem
iodo mundo sabe <^ue Elvis adorava
base do dhuiomeiro, sandudhes de pasta de amendoim dom
vode ainda adabaria banana- Seria tambm prediso usar um
tendo de apagar grande bando de dados doniendo as
toneladas de posts diversas pergunias e respostas.
falsos.
^__ }
Qual era o prato favorito de Elvis??

Scaneam ento de retina: O lhe para a s u a w *


xdelenie para
impedir os bois,
------ m3s igtnidamenie
Digite as letras m ostradas: kdyqmc difdil e daro de
Na e ma ideia, assumindo-se implementar.
*V*e as ietras a serem digitadas Simples e efidienie, ^ois
3redm tom o uma imagem, e a mioria dos bois nao e
ro tomo iext, as ainda t speria o sufidienie para
Quanto 7 + 5?
possvel de ser quebrada por bois onsegur inierpreiar jue
inteligentes o sufid ienie para esta sendo pedido o resultado
usarem o redonhedimenio ptido de uma expresso maiemtda
de daradteres (OCR)- - s temos de iorder para
^ue a maioria dos seres
Que tipo de anim al este? humanos o donsigamf

Bastan-te efidienie - os bots tem


Lembra-se d> dif iduldade em inierpreiar o donieudo
Fang, o to de imagens. /Vias ser prediso um bando
foi abduzido de dados doniendo as imagens e as
por aliengenas respediivas respostas Wm inieressanie
no domeo aprimoramento do
deste livro? idador dom leiras
aleatrias; a<^ui, as
(Digite
S as letras mostradas: leiras so obsduredidas
dom linhas e pontos,
tfo io problemtido
para donfundir os bois
quanto a verif ida^ao <\ue ienham OCR.
de reiina, mas ainda
exige hardware e
sobnre espediais. ^ ^
Scaneam ento de impresso digital:
visualizando seus dados,,. e mais!

Podemos vencer a automapo usando a automao


O teste usado para se verificar se a criatura do outro lado do
formulrio uma pessoa real conhecido como CAPTCHA,
do termo ingls Completely Automated Public Turing Test
to Tell Computers and Humans Apart ("Teste Turing Pblico Um C A FT C H A
Completamente Automatizado para Diferenciar Computadores e
Humanos"). Isso uma forma meio prolixa de se referir a qualquer um programa
"teste", em um formulrio, em que apenas seres humanos podem
passar. J foram inventados diversos CAPTCHAs interessantes, mas <Jue protege um
um dos mais populares envolve a gerao de uma senha aleatria,
que o usurio precisa ento digitar. Para ajudar a impedir que s!te cotxtra
bots com reconhecimento ptico de caracteres (OCR) consigam a u tp m a tS z a d p s ,
vencer o sistema, as letras da senha so distorcidas ou parcialmente
obscurecidas com linhas e pontos aleatrios. u s a n d p a lg u m
Urna vet o|ue as irbras da senb sa gradas tpP deteste.
aleatoriamente, a senka c d i W i e a cada
vez. <\ue o Wn'ut'r e exibido*

Digite as letras exibidas:

Um tampo de test LmKas e foh-os aleatrios ajudam a


normal usado para ob^urecer te*t apcn3s 0
permitir *\we o usurio fara impedir redonheCimeni? ptido dc
digite a senba CAPTCHA- caracteres, mas a mesmo tempo permitinde
seres Humanos o possam ier.
Um campo CAPTCHA igual a qualquer outro campo do formulrio,
exceto pelo fato de que o seu propsito impedir que o formulrio
seja submetido se o teste no tiver sido completado com sucesso.
Assim, ao contrrio de outros campos, que geralmente enviam
dados ao servidor no momento da submisso, o campo CAPTCHA
verificado e usado para controlar todo o processo de submisso.
Uma vez. <\ue o boi de spa
nao t capaz, de identiidar a E rra d o !
senHa, a unida doisa \ue ele \
pode zr i tentar adivinhar- ______ _ ^
D igite as letras exibidas: | gwerty?

Para um ser Humano


real e -fdil identi-fidar Co rre to !
a senha.

D igite as letras exibidas: owdysq

muito importante que a senha CAPTCHA seja exibida no


formulrio como uma imagem, e no apenas como texto; caso
contrrio, seria muito mais fcil para os bots identificar as letras.
voc est aqui 611
no existem perguntas idiotas: edio captcha
nsb exSstem
p e r g u n t a s d !o tc lS
respectivas respostas. Existem servios que oferecem CAPTCHAs
P - Aquele CAPTCHA grfico com a imagem do cachorro
flexveis, que utilizam tanto vdeo quanto udio, como por exemplo
bem legal. Eu poderia us-lo em vez deste com senha?
www.captcha.net. Tais servios so excelentes para oferecer as
tecnologias mais atuais, mas em geral eles no se integram to
J l - Perfeitamente. Apenas tenha em mente que voc ter de bem sua aplicao web quanto um CAPTCHA personalizado
manter um banco de dados com imagens e descries do que feito especificamente para ela
elas so, porque uma das chaves para o sucesso de qualquer
CAPTCHA a variedade. Um bom CAPTCHA precisa ter um
repositrio de contedo amplo o suficiente para que o formulrio
P'- Mas h tambm pessoas com pouca acuidade visual, e
pessoas com deficincia auditiva. E quanto a elas?
raramente mostre o mesmo teste duas vezes. Esse o beneficio
do CAPTCHA com senha: uma vez que a senha gerada a
partir de letras aleatrias, muito improvvel que o mesmo teste R : No fim das contas, voc precisar pesara convenincia
aparea duas vezes para um mesmo usurio, mesmo com muitas de impedir os ataques dos bots contra o risco de alienar
tentativas repetidas. alguns usurios. De forma semelhante ao que ocorre entre
vrus e softwares antivrus, os bots de spam e os CAPTCHAs

P Como o CAPTCHA funciona para os deficientes provavelmente continuaro nesse jogo de gato e rato, em que bots
so criados para vencer um determinado CAPTCHA, o que far
visuais? E se eles no conseguirem passar no teste visual?
surgir um CAPTCHA mais sofisticado, e assim por diante. Pegos
no fogo cruzado esto os usurios que podero acabar excludos
R : Os CAPTCHAs visuais obviamente no so a melhor soluo por causa da acessibilidade limitada de alguns CAPTCHAs. Fica
para os usurios com deficincia visual. Uma soluo ideal a cargo de cada desenvolvedor web pesar os riscos de um ataque
poderia induir uma alternativa sonora aos CAPTCHAs visuais. de bots contra a potencial perda de usurios que podero no
Por exemplo, existe um CAPTCHA de udio no qual uma srie de conseguir acessar partes do site. Se servir de consolo, tenha em
nmeros lida em voz alta, aps o que o usurio precisa digit-los mente que os bots mais sofisticados geralmente miram nos alvos
para passar no teste. Mas ainda h o problema de bots inteligentes mais grados, onde podero obter um bom retomo em termos de
usarem reconhecimento de voz para fraudar o teste, que o receita publicitria, o que significa que voc poder no encontrar
motivo pelo qual algumas dessas solues usam udio altamente um bot realmente malfico at que o seu site cresa ao ponto de
distorcido, que faz a voz soar um pouco macabra. Os CAPTCHAs se tomar um alvo grande o suficiente para os bots mais poderosos.
de udio so tecnicamente semelhantes aos visuais, no sentido
de requerem um banco de dados com cfipes de udio e as suas

OK, entoo a senha do


CAPTCH A precisa ser exibida como uma imagem,
com linhas e pontos aleatrios. Tudo bem, mas como
isso pode ser criado com o PHP? O PHP s capaz de
v . _____ _ gerar cdigo HTML, certo? _______

O
o O PHP possui cap acid ades grficas que podem gerar
im agens dinamicamente, a s quais voc pode ento exibir
usando cdigo HTML.
Com a ajuda de uma biblioteca de grficos chamada GD (Graphics Draw), os
nossos scripts PHP so capazes de gerar imagens dinamicamente em formatos
populares, tais como GIF, JPEG e PNG, e ou retom-las a um navegador para
serem exibidas ou escrev-las em um arquivo no servidor. Esse recurso do PHP
extremamente importante, porque no existe a possibilidade de se "desenhar"
em uma pgina web usando unicamente HTML. O PHP lhe permite "desenhar"
em uma parte da pgina, realizando operaes grficas em uma imagem e
depois exibindo essa imagem na pgina com a familiar tag <mg>.
visualizando seus dados,., e mais!

(rere o texto da senha de CAPTCHA


Antes de sequer podermos pensar no aspecto grfico de um CAPTCHA com
senha, precisamos descobrir como gerar a prpria senha aleatria, que comea
como uma sequncia de caracteres de texto. A senha pode ter qualquer nmero
de caracteres, mas algo entre seis e oito caracteres em geral o suficiente,
Podemos usar uma constante para a extenso da senha, o que nos permite
modificar facilmente o nmero de caracteres posteriormente, se for preciso.
Um senh CAPTCHA
define (CAPTCHAJJUMCHARS ', 6) ; ^ scis
provaveUenie suitiene ^
para impedir os b<yb sc'n*
atrapalhar os Wma*cs.

Ento como exatamente ns vamos gerar uma string aleatria de texto


com seis caracteres? aqui que duas funes internas do PHP entram
em cena: rand() e chr(). A funo rand() retoma um nmero aleatrio $pass_phrase
na faixa especificada pelos seus dois argumentos, enquanto que chr()
converte um cdigo de caracter ASCII numrico em um caracter
propriamente dito. O ASCII (American Standard Code for Information
Interchange ou Cdigo Padro Americano para Intercmbio de
Informaes) uma codificao de caracteres padro, que representa os
caracteres atravs de nmeros. Ns s precisamos dos cdigos ASCII na
faixa de 97-122, que representam as letras minsculas a-z. Se gerarmos
um cdigo nessa faixa seis vezes, iremos obter uma senha de seis
caracteres aleatrios, todos os quais sendo letras minsculas.
// Gera a senhaaleatria
Mm loop para cada taraticr
$pass_phrase =
for ($i = 0; $i < CAPTCHAJxUMCHARS; $i++) {
da sertHa.
$pass__phrase .= chr (rand (97, 122))
A senha e tonslrwda um
1 r ^ - taratier aletort de
Alais adiajvfce, este tada vez.
ddijo sera Coletado em
um sdript reuiilizivel
prprio, fip&ha php. chr ()
Esta funo interna converte um nmero
rand() no seu caracter ASCII equivalente. Como
Esta funo interna retorna um nmero exemplo, o nmero 97 o cdigo ASCII
para a letra 'a' minscula. Assim, chamar
inteiro aleatrio ou dentro de uma faixa chr(97) retorna o caracter 'a'.
especificada ou entre 0 e a constante
interna RAND_MAX (dependente do
servidor). Para obter um nmero aleatrio
dentro de uma determinada faixa, basta
A un&> tqndO vetwia um
enviar os limites inferior e superior da faixa nmetp inteira dentre
como argumentos para rand().
de uma determinada faixa.
voc est aqui 613
desenhando um captcha

Visualizando a imagem CAPTCHA


Pata se desenia
Criada a senha aleatria, ns podemos passar para a tarefa de gerar uma
uma Imagem
imagem consistindo do texto da senha juntamente com linhas e pontos
aleatrios, para ajudar a obscurecer o texto. Mas por onde comear?
dinmica em
A primeira coisa a fazer decidir qual ser o tamanho da imagem P H F , ptcGlSO
CAPTCHA. Sabendo que essa imagem ser exibida em ura formulrio,
ao lado de um campo de input, faz sentido mant-la relativamente u sa r unpes d a
pequena. Vamos tentar 100x25 e vamos colocar esses valores ein
constantes, para que o tamanho da imagem seja definido em apenas um
lugar e, portanto, seja fcil de modificar depois, se necessrio.
biblioteca <3D
, 1

0 -fcamanHo da Wa$em CAPTCHA -fr^a


define (CAPTCHAJIDTH 100) ; armax^ado em tostarrUs, para <\t seja
define ( 'CAPTCHft_HEIGHT ' , 25) ; ^ ^ a<rcis, a i o r ywtiso

Para se desenhar a imagem CAPTCHA, preciso chamar algumas funes


da biblioteca GD, todas as quais operam sobre uma imagem carregada na
memria. Em outras palavras, voc cria uma imagem na memria e ento
desenha em cima dela; depois, quando tiver terminado, voc a envia para
o navegador para ser exibida.
// Cria a imagem
iodtop)
Cria dores para
// Define um fundo branco com texto preto .e grficos cinza serem usadas
$bg_color= magecolorallocate($img, 255, 255, 255); // branco' por outras
$text_color = magecolorallocate($img, 0,
$graphic_color = magecolorallocate($img,
0, 0);
64, 64, 64);
// preto TUhoes
// cinza escuro

// Preenche o fundo
i

// Faz output da imagem como PNG, usando um cabealho


heN SI ||fUl/
image
m M S m s i s 'ihllJ

CA A
visualizando seus dados... e mais!

Servidor w eb

As imajens vecm-driadas domeam


dom um -hmdo preto vaso.

PrediSmos de um -undo
Wando onde desenhar os
CAPTCHA-

FVuneiramente,
desenhe algumas
linhas aleatrias.

Adidione alguns pontos


aleatrios pava uma
*textura espedial
Uma vez. <\ue o nave^sdor
redebe a ima^e, ele pode
exibi-b usando uma ta^
Desenhe o texto dom HTML- ^i**3> normal- ^
uma Cor mais -foV-te,
rn dima das linhas e vt
dos pontos.
-

Finalmente, retorne
im^em, na N avegador
ora de PN 4 3o w eb do clien te
navegador

voc est aqui 615


funes grficas GD

Por dentro das fuwpes grficas GP


A mgica por trs da criao de imagens CAPTCHA possibilitada pela biblioteca de
grficos GD, que, como voc j aprendeu, oferece funes para se desenhar grficos
dinamicamente usando-se cdigo PHP. Vamos examinar algumas dessas funes com mais
detalhes e ver como elas se relacionam gerao da imagem CAPTCHA.^
magens sao
imagecreatetruecolor() driadas inidialmente
Esta funo cria uma imagem em branco na memria, dom -funcos pretos.
pronta para ser editada por outras funes GD. Os
dois argumentos de im a g e c re a te tru e c o lo r () so largura
a largura e a altura da imagem. A imagem no incio
apenas um fundo preto, de modo que geralmente
voc vai querer preench-la com uma cor de fundo, altura
por exemplo, branco, antes de desenhar qualquer
coisa. Isso pode ser feito chamando-se a funo
im agef i lle d r e c ta n g le (). O valor de retorno de
im a g e c re a te tru e c o lo r () um identificador de
imagem, o qual a maioria das funes GD requerem
como primeiro argumento para a identificao da A largura da nova
A liura da
imagem que est sendo desenhada. imagem, em pixels.
imagem.

$img = imagecreatetruecolor (CAPTCHAJWIDTH, CAPTCHA_HEIGHT) ;


f
^ dodigo dra uma )ma$em tom tamanho
A -funo retorna um de-Finido r>as nossas donstantes.
1 0 0 x2 5 ,
iden-titodor para a \ma$cm, o
<\ual e referido pelas^ outras ^
unde* para \ue vode possa usa- imagecolorallocate{)
las para desenhar a)^0 na i ^ e - Use esta funo para alocar uma cor a ser usada em
Vermelho^ (1$%, 0 , O), outras funes de desenho. O primeiro argumento
o identificador da imagem, seguido de trs
l/erde dlaro- argumentos representando os trs componentes
(o, m , O). numricos do cdigo RGB (do ingls Red-Green-
Blue, ou Vermelho-Verde-Azul). Cada um desses
valores pode ir de 0 a 255. O valor de retomo
um identificador da cor, o qual pode ser usado
para identific-lo em outras funes de desenho,
A**l: (0, O, V&>- frequentemente como o ltimo argumento.
* i , . , $text color = imagecolorallocate($img
0 valor de retomo A
ideniiidador da dor, o ^ualy 0 sdenti&dador y Oi domponentes
voCe pode usar cm outras da imagem na vermelho, vevde e
'kn^oes de desenho para e^ual a dor ira aaul da dor, neste
deierwiihar a dor a ser usada, ser usada- daso preta-
tomo por exemplo, a dor do
W o CAPTCHA-
visualizando seus dados... e mais!

imagesetpixel () q,0 >0 sistema de toordenadas


Lsta funo desenha um nico pixel em uma vara a w>aiora das
coordenada especificada, dentro da imagem. j thamadas a unes
As coordenadas comeam em 0,0 para o X#y | 6jf) iorr.t nO tnto
canto esquerdo superior da imagem, e vo j esquerdo swperior da
aumentando at chegar ao canto direito inferior. j imagem, e va* aumentando
Como na maioria das funes GD, o pixel j nas direes para a
desenhado usando-se a cor que foi passada como direita e pa^a ba*o-
o ltimo argumento para a funo. largura, altura
imagesetpixel ($img, rand() % CAPTCHA_WIDTH, rand() % CAPTCHAJHEIGHT, $graphic_color) ;

A imagem , . i L-
A toordenada y H d ?*>> relativa ao
^ t o c identi-fitador)
^ ?ix(
fidenti-Pitador) onde danto esquerdo superior da imagem, *^ue
o pixel est sendo
neste tas ataba sendo uma local&a^a
desenhado. aleatria dentro da magem CAPTCHA-
imageline ()
Chame esta funo para desenhar uma linha entre
xvVi duas coordenadas (xl,yl e x2,y2). As coordenadas so
especificadas relativamente ao canto esquerdo superior
da imagem, e a linha desenhada na cor que foi
r passada como o ltimo argumento para a funo.
2

As Coordenadas x / do intio da linha, neste taso no


tanto esquerdo da imagem CAPTCHA-

image1ine{$irag, 0, rand() % CAPTCHAJHEIGHT,


CAPTCHA_WIDTH, rand() % CAPTCHAJHEIGHT, $graphic_color);
0 ponto inal XY d linha, <\ue neste taso, lotaliza-
se na borda direita da imgem CAPTCHA-
imagerectangle <)
Desenha um retngulo comeando em um ponto (xl,yl) e
terminando em outro (x2,y2), com uma cor especificada. *2>y2
Os dois pontos e a cor so fornecidos como argumentos,
do segundo at o sexto, para a funo, vindo logo aps o
argumento com o identificador da imagem. imagefilledrectangle()
A -(-uno x y ^ Semelhante a im a g e re c ta n g le (),
esta funo desenha um retngulo
wsa Je*atamente
I I os : =r
imaaerettanftleO
cujo interior preenchido com a cor
mesmos argumentos \ue especificada.
i*ageilledreitangle) *2>y
imagefilledrectangle($img, 0, 0, CAPTCHA_WTDTH, CAPTCHA_HEIGHT, $bg_color);

As toordends XY dos pontos


initiai e -finai - a\ui, a imagem
CAPTCHA inteira preenthida.
voc est aqui 617
use funes grficas: parte dois

Continuando as funpes grficas <rP


imageellipse()
Usada para se desenhar crculos e elipses, largura
esta funo aceita um po n to central, uma
largura e uma altura. Um crculo perfeito
apenas uma elipse com largura e altura
iguais. A cor da elipse ou crculo passada
como o ltimo argumento para a funo.
imagefilledellipse()
Precisa de uma elipse preenchida? Basta
chamar im a g e f ille d e llip s e (),
que funciona da mesma forma que
tlipSCS *30 im a g e e llip s e () exceto pelo fato de
usds n3 m3gem que a cor especificada usada para se
CAPTCM i* w
preencher a elipse, em vez de contom-la.
md assim cias sa
bastante wte'!!
^ ^ imagefilledellipse($img, ^0^ 0 ^ 320, 240, $color) ;

Tant imageellipseO
quanto imagefilledellipseO
aceita os mesmos
A largura c a altura da elipse J
defina estes tem o mesmo ACoordenada XV
nmero para desenhar um do Centro da elipse-
argumentos.
crculo perfeito-
imagepng()
Quando tiver terminado de desenhar A imagem pode ser enviada
em uma imagem, voc pode envi-la diretamente para o navegador,
diretamente ao navegador do cliente, u entao para um arquivo no
servidor.
ou ento, para um arquivo no servidor
chamando esta funo. De um jeito ou
de outro, o resultado final uma imagem
que pode ser usada com a tag HTML
<img> para exibio em uma pgina
web. Se preferir gerar uma imagem PNG
diretamente na memria (ou seja, sem myimage.png
um arquivo), ento voc precisar chamar
tambm a funo header() para que 0 identif icador de imagem

a imagem seja entregue ao navegador <^yc voCe vem usando nas


atravs de um cabealho. ^ outras funes de desenho-

. imagepng ($img) ;
n -run^a retorna true * Vote pode passar um nome de arquivo Como um
ou false dependendo de j jegundo argumento opcionl - sem ele, a fundo
se a imanei foi criada
M gera uma imagem na memria <^ue pode ser
Com suCesso ou no. enviada de volta ao navegador, em ur* cabealho.
visualizando seus dados,., e mais!

as suas imagenS imagedestry()


^n3 ndo elas nao sao mais O trabalho com imagens usando-se a
neiesssHas ua Wa ideia biblioteca GD consome recursos do sistema,
pav-a impede o desperdido de
e esta funo se encarrega de liber-
redwrsos do servidor- los depois que voc tiver terminado de
trabalhar com a imagem. Basta cham-la
depois de fazer o output com imagepngQ.

imagedestry ($img) 0 identifidador da imagem


Semelhante a imagepngO, A ^ue vode deseja destruir.
esta fuh retoma true se Ten-te sempre esdrever uma
a operaao -tiver sudesso, e v dhamada a esta fu*ao para
false, das dohtvirio. dada imagem ^ue vode driar,
L ib e r e s e m p re a s im agens para <\ue todas as imagens
sejam destrudas depois de
da memra, deps de usa- serem wsadas.
las, com magedesfrpyO

imagestring () 0 nmero a faixa de I a 5


define o tamanho da fonte
Esta funo desenha uma string de usada para se desenhar a
texto usando a fonte interna do string de texto, dom 5 sendo o
PHP, na cor especificada. Alm do maior tamanho.
identificador da imagem, voc passa x,y*. -----
.....
funo o tamanho da fonte (na ;Exemplo de texto j
forma de um nmero de 1 a 5) Junto
com as coordenadas para o canto f\ fonte interna e adequada
esquerdo superior da string, a prpria ^ara o desenho de texto
string, e finalmente, a cor. basido, ms e limitada em
termos de tamanho-
0 tamanho da fonte a ser
usado* na faixa de J a *5-

imagestring($img, 3, 75, 75, 'Exemplo de texto', $color);

A doordenada XY A
Esta e a string de
V A dor do
texto-
do danto esquerdo
texto a ser desenhada-
superior da string-
0 texto desenhado Com im a g e s tr in g u p ()
imagestrmgupO t girado
Semelhante a im a g e s trin g (), esta funo
em 10 grus no sentido
desenha uma string de texto usando a fonte
anti-horrio, para apareder
interna, mas o desenha verticalmente, como
na vertida!-
se ele fosse girado 90 graus no sentido
anti-horrio. A funo chamada com os
mesmos argumentos que im a g e strin g ().
voc est aqui 619
a funo imagettftxtO

Pesenhando texto cow uma fonte


A funo im agst r i n g () fcil de usar para desenhos, mas um tanto limitada
em termos do controle que voc tem sobre a aparncia do texto. Para conseguir uma
aparncia especfica, voc precisa usar a sua prpria fonte True Type. A imagem com
a senha GAPTCHA um bom exemplo dessa necessidade, uma vez que os caracteres
precisam ser desenhados em tamanho razoavelmente grande, e de preferncia em negrito.
Para conseguir esse look personalizado, voc precisa da syuda de mais uma funo. GD, que
desenha o texto usando uma fonte True Type que voc fornece no servidor.
imagettftext() pava se desenha** um texto
Para desenhar um texto realmente personalizado, al-UmCttie personalizado, c prediso
coloque uma fonte True Type no seu servidor web usav uma fonte True T\(pe e a
e depois chame esta funo. Voc no apenas pode funo imagettf textO.
usar qualquer fonte que quiser; como tambm obtm
mais flexibilidade quanto ao tamanho da fonte, e
mesmo quanto ao ngulo no qual o texto desenhado. i
#Exem plo de te x to
Diferentemente de im ages tring (), as coordenadas x,y
passadas a esta funo especificam o "ponto-base" do f
primeiro caracter do texto, que aproximadamente o ' Difev-chtcmch-b: dc
canto esquerdo inferior do primeiro caracter. 'agestiringO, as doordenadas
Esta funo requer que voc coloque um arquivo contendo usadas para se desenhar
uma fonte True Type no seu servidor, e depois especifique texto dom imagettf textO
esse arquivo como o ltimo argumento. Os arquivos de apontam para o danto
fontes True Type geralmente tm a extenso . ttf . esquerdo inferior do texto.
0 angulo da fonte, espedifidado
0 tawanbo da fonte, ** 5raws no sentido ant- As eoovdendas XV
geraUente espedifidado horav-io ( c o texto normal) do danto es\uevdo
em wpontosw- ^ infCrioT do texto-
imagettf text ($img, 18, 0, 5, CAPTCHA_HEIGHT - 5,1 $text_color,
Courier New Bold, ttf, $pass_phrase) ; 0 y e ts & se*d0
deschKado.
Vode pvedisa dolodar a fonte True
Type no scu servi dor **jeb, para <\ue
a biblioteda de graf idos possa ^
^ o ta G e e k endontr~!a- Courier New Bold.ttf
Use a uno
Se quiser tentar criar a sua prpria fonte
magettfext para
TrueType, para personalizar ainda mais o d e s e n t a r u rn t & x t v
seu CAPTCHA, d uma olhada em www.
fontstruct.com . Essa uma com unidade altamente perspnaJizadp,
online de criadores de fontes, incluindo
uma ferramenta web para que voc
com a sua prprla fonte
possa criar fontes personalizadas. True Typ<>e.
visualizando seus dados... e mais!
A -^
C l f l M F -------------------------------------
imagedoloralloeaiefi^g, J2.8, /ZS, 12.0);
Ligue cada bloco de cdigo PHP imagem grfica gerada por
ele. Assuma que a imagem ($img) e as cores ($ b la c k _ c o lo r,
-$ w h ite_ co lo r e $ g ray _ co lo r) j tenham sido criadas.
. , , wageeoiovaiSodteffs*^
'"'gcdolovalloacfiw^ O, O, O); U & } 2&?>,

image.filledrectangle{$img, .10, 10, 90, 90, $gray_color) ;


imagefilledellipse ($img, 50, 5.0,. 60, 60, $white_color) ;
imagef lledrectangle ($img, '40, 40, 60, 60, $black_color) ;

imageline($img,'15, 15, 50, 50,' $black_color) ;


imageline.($img, 15, 85, 50, 5.0, $black_color);
imageline ($img, 50, 50, 85, 50, $black_color) ;
imagefilledellipse($img, 15, 15, 20, 20, $gray_color) ;
imagefilledellipse($img, 15, 85, 20, 20, $gray_color);
imagefilledllipse($img, 50, 50, 20, 20, $gray_color);
imagef illedellipse- ($img, 85, 50, 20, 20, $gray_color) ;

imagefilldrectangle($img, 10, 10, 90, 60, $gray_color);


iinagesetpixel ($img, 30, 25, $black_color)-;
imagesetpixel ($img,; 70, 25, $black_color);
imageline($img, 35, 45, 65, 45, $black_color);
imagef lledrectangle ($img, 45, 5.0, 55, 90, $gray_color) ;

imageellipse($img, 45, 45, 70, 70, $black_color);


imagefilledellipse{$img, 75, 75, 30, 30, $gray_color);
imagesetpixel ($img, -10, '10, $black_color)
imagesetpixel($img, 80, 15, $black_color)
imagesetpixel($img, 2 0, 15, $black__color)
imagesetpixel($img, 90, 60, $black_color)
imagesetpixel($img, 20, 80, $black_color)
imagesetpixel($img, 45, 90, $black_color)

imageflledrectangle($img, 25, 35, 75, 90, $black_color)


imageline($img, 10, 50, 50, 10, $black_color);
imageline{$img, 50, 10, 90, 50, $black_color);
imagefilledrectangle($img, 45, 65, 55, 90, $white_color)
imageline($img, 0, 90, 100, 90, $black_color);

voc est aqui 621


quem desenha o que soluo

Ligue cada bloco de cdigo PHP imagem grfica gerada por ele.
Assuma que a imagem ($img) e as cores ($black_color, $white_
color e $gray_color) j tenham sido criadas.

imagefilledrectangle($img, 10, 10, 90, 90, $gray_color);


imagefilledellipse($img, 50, 50, 60, 60, $white_color); ,
imagefilledrectangle($img, 40, 40, .60, 60, $black_color)

imageline($img, 15, 15, 50, 50, $black_color);


imageline{$img, 15, 85, 50, 50, $black_color);
imageline($img, 50, 50, 85, 50, $black_color);
imagef illedellipse ($img, 15, 15, 20, 2 0.,$gray_color) ;
imagefilledellipse($img, 15, 85, 20, 20, $gray_color); ^
imagef illedellipse ($img, 50, 50, 20, 20, $gray_color.) ;
imagefilledellipse($img, 85, 50, 20, 20, $gray color);

imagefilledrectangle($img, 10, 10, 90, 60, $gray_color);


imagesetpixel($img, 30, 25, $black_color);
imagesetpixel($img, 70, 25, $black_color);
imageline($img, 35, 45, 65, 45, $black_color);
imagefilledrectangle($img, 45, 50, 55, 90, $gray color);

imageellipse{$img, 45, 45, 70, 70, $black_color);


imagef illedellipse ($img, 75, 75, 30, 30, $gray__color) ;
imagesetpixel($img, 10, 10, $black_color);
imagesetpixel($img, 80, 15, $black_color);
imagesetpixel($img, 20, 15, $black_color);
imagesetpixel($img, 90, 60, $black_color);
imagesetpixel($img, 20, 80, $black_color);
imagesetpixel($img, 45, 90, $black color);

imagefilledrectangle($img, 25, 35, 75, 90, $black_color)


imageline($img, 10, 50, 50, 10, $black_color);
imageline($img, 50, 10, 90, 50, $black_color);
imagefilledrectangle($img, 45, 65, 55, 90, $white_color);
imageline($img, 0, 90, 100, 90, $black_color);
visualizando seus dados... e mais!
(rere uma imagem CAPTCHA aleatria
dompletamente \t{r>0m0
Agora, ns juntamos todo o cdigo CAPTCHA em um script - vode pode abri-lo no seu
captcha.php, o qual se encarrega de gerar uma senha aleatria rvcgador c ver a imagem
e depois retomar uma imagem PNG para o navegador. <\ue ele gera.

<?php Crie Constantes para armazenar o numero de


session start(); daradteres no CAPTCHA e defina a altura e
largura da imagem.
// Define algumas constantes importantes
define('CAPTCHA_NUMCHARS', 6); // nmero de caracteres na senha
define(CAPTCHA_WIDTH, 100); // largura da imagem
define{CAPTCHA_HEIGHT1, 25); //altura da imagem Embora vode possa armazenar a senha
drptografada no bando de dados,
// Gera a senha aleatria mais simples dolodi-la apenas em uma
$pass_phrase =
for ($i = 0 ; $i< CAPTCHA_NUMCHARS; $i++) {
varivel de sesso ns predisamos
$pass_phrase .= chr(rand(97, 122)); arm2h~la em algum lugar para ^ue
o sdript Adidionar Pontuao possa
te r adesso a ela-
// Armazena a senha criptografada em uma varivel de sesso
$_SESSI0N['pass_phrase'] = shal($pass_phrase);

// Cria a imagem
$img = imagecreatetruecolor (CAPTCHA__WIDTH, CAPTCHA_HEIGHT);

// Define um fundo branco com texto preto e grficos cinza


$bg_color= imagecolorallocate{$img, 255, 255, 255); //branco
$text_color= imagecolorallocate($img, 0, 0, 0); //preto
$graphic_color = imagecolorallocate.($img, 64, 64, 64); // cinza escuro

// Preenche o fundo
imagefilledrectangle($img, 0, 0, CAPTCHAJWIDTH, CAPTCHA_HE1GHT, $bg_color);

// Desenha algumas linhas aleatrias


for ($i = 0; $i < 5; $i++) {
imageline ($img, 0, rand() % CAPTCHA__HEIGHT, CAPTCHA_WIDTH, rand() % CAPTCHA__HEIGHT,
$graphic_color);
}
// Insere alguns pontos aleatrios
for ($i 0; $i<50; $i++) {
imagesetpixel($img, rand() % CAPTCHAJrtIDTH, randO % CAPTCHA_HEIGHT, $graphic_
color);

// Desenha a string da senha


imagettftext($img, 18, 0, 5, CAPTCHA_HEIGHT - 5, $text_color, Courier New Bold.ttf",
$pass_phrase); ^Algumas versSes da
// Faz output da imagem como PNG, usando um cabealho btblioteda Querem
6jZ>
header("Content-type: image/png");
*\uc use ui-, arftinHo
imagepng ($img) jere uma imagem PNf A imagem PKj relaiivo at o arquivo da
// Apaga a imagem
dontendo tudo o *^ue foi enviada ao *one, temo "./Courier
imagedestroy($img) desenhado navegador atravs Ntw B oid-ttf;J.
?> 4: de um dabedalho

rmli^ando, apague a imagem da


memria feia ainda e enviada ao
captcha.php
navegador, atravs do dbedalho).
voc est aqui 623
teste captcha.php

^ ip p K P
T E JST O R f V e ------------------
C rie o s c r ip t C A P T C H A e te ste-o.
Crie um arquivo de texto chamado captcha.php, e digite nele o cdigo para o
script CAPTCHA mostrado na pgina anterior (ou baixe o script no site da Alta
Books em www.altabooks.com.br).
Envie o script para o seu servidor web, e depois abra-o em um navegador. Voc
ver imediatamente a imagem CAPTCHA com a senha aleatria no navegador.
Para gerar uma nova senha, recarregue o navegador.

Cada imagem CAPTCHA gerada


Consiste de seis caracteres
aleatrios, Com algumas jinhas e
pontos adicionados para criar
rudo de fundow.

Recarregar o script
CAPTCHA resulta a
gerado de uma nova
imagem, Contendo uma nova
senha aleatria-
visualizando seus dados... e mais!

Esses robos esto


me deixando louco!
Preciso de ajuda
para par-los agora!

A sanidade retorna ao G-uitar Wars


Agora que ns j trouxemos tona o seu artista PHP interior,
com algumas funes GD e uma imagem CAPTCHA, hora
de usarmos essa imagem para salvar o moderador do Guitar
Wars do ataque dos bots. Na verdade, ser preciso seguir
alguns passos para resolver o problema. A boa notcia e que
j realizamos dois deles: gerar a senha aleatria e desenhar a
imagem CAPTCHA. Vamos eliminar os passos restantes para
tornar o Guitar Wars oficialmente livre de bots!
0 oderdor do Quitar
Wars est -to estressado
i^ue j est dow>e$3ndo a
tentar bater em robos
imaginrios ~ ele pretisa de
uma soluo ja

Feito!
Q Go ra r um a senha a leat ria


Desenho pronto^
De se nha r uma im agem C APTC HA.usando a sonha

0 Exibir a im agem CAPTCHA no form ulrio


A dicionar Pontuao do G uitar W ars e pedir ao
usurio que digite a senha.

0 V e rifica r a senha em relao ao input do usurio.

Complete o Passo 3 do CAPTCHA do Guitar Wars, escrevendo o cdigo HTML


para um novo campo de input de texto chamado Verificao, o qual pedir
# ao usurio para digitar a senha do CAPTCHA. Certifique-se de dar a esse
RCIClO campo um rtulo, e ponha uma tag <img> depois dele para exibir a imagem
CAPTCHA gerada pelo script captcha.php.
exerccio soiuo

Complete o Passo 3 do CAPTCHAdo Guitar Wars, escrevendo o cdigo


HTML para um novo campo de input de texto chamado Verificao, o qual
|C|0 pedir ao usurio para digitar a senha do CAPTCHA. Certifique-se de dar
O Mg a esse campo um rtulo, e ponha uma tag <img> depois dele para exibir a
dOLu3 0 imagem CAPTCHA gerada pelo script captcha.php.

Uma tag <labei> t usada ste de te*to


para se ro tu la r o novo e ode o wurio ira
tampo texto Verif icado- digitar a senha revelada
imagem CAPTCHA-
<label f<^^MyrifyM>yerif \tatgoi- </label> y

.!^3e^l'yerifyw yalue^'Enter. the. pa^-phrase. />

^^g ?rc ^ wcaptchaphpw alt^Veri-Pication .pssphrase />

f\ wagem
CAPTCHA e
A >,fofttew da image e o nome do e^ibida no
formulrio, ao lado
script PHP <^ue gera dinamicamente de um campo de
imagem CAPTCHA- Isso fu*Cio*a
forque o script captchaphp retorna inpvt de te*k>-
uma imagem diretamente para o
navegador, atravs de imagepngO e aKas-sP!
um cabealho. Guitar Wars - Add Your High core

fW ! Si rfis w. f** f*-


- ^ - Exibir a im a gom CAPT C H A 4 t fe rm ul rio Adic ionar
visuaizanao seus dados
visualizando dadt ... e mais!

Adicione CAPTCHA ao script Adicionar Pontuao


Cn: T nOVO CamP de * Xto
porm, a nova declarao if no scodc/wi * -o modlflcaao mais importante,
verifica se a senha d g1i ^ pelo
D e usurio
! ^ t bate
^ com Pontu^ o (Passo 4 ) , que
a de CAPTCHA
<?php
sessionjstart () ;
?>
<html>
<head>
~Q - Vertfrear
<title>Guitar Wars - Adicione o seu Recorde</title>
clink rel="stylesheet" type=rtex.t/css" href=style.css" />
</head> 'fte-ao
<body> -in p u t do-
<h2>Guitar Wars - Adicione o seu Recorde</h2>
-usurio.
<?php
require_once{appvars.php');
require_once(connectvars-php');

if (isset($_POST[1submit'])) { Tudo fro n ta l


// Conecta-se ao banco de dados
$dbc =mysqli_connect (DB_HOST, DB__USER, DB_PASSWORD, DBJNAME)

// Pega os dados em POST


name = mysql_real_escape_string($dbc, trim($_POST[1name']));
$5core = mysqli_real_escape_stri.ng ($dbcf trim ($__POST ['score'1));
$screenshot = mysqli_real_escape_string($dbc, trim($_FILES['screenshot] [1name]));
$screenshot_type = $_FILES [screenshot] ['type1]; 6 ^ 3 senha
$ s c r e e n s h o t _ s i z e - $_FILES t >s c r e e n s h o t ] [ ' s i z e ' 1; lU *J*&
S / V e r i f i c a a s e n h a CAPTCfiA ~ ~ vvivct ^
{ $user_passjphrase = shal($_POST['verify']); \ vara ^ sc o usuivto
if ($ SESSION ['pass phrase'] == $user pass phrase) { \ / verK < . .
\ 3
else { --- "
echo <p class="error">Por favor, digite o cdigo de verificao exatamente como
lostrado </p>';

}
?>
<hr />
<form enctype="multipart/form-data" method="post'' action="<?php echo $_SERVER ['PHP_
SELF' ]; ?>">
<input type="hidden'' name="MAX_FILE_SIZE" value="<?php echo GW_MAXFILESIZE; ?>" />
<label for=,'name'I>Nome: </label>
<input type="text" id="namen name="name" value="<?php if (!empty ($name) ) echo $name; ?>"
/><br />
<label for="score">Pontuapao: </label>
<input type="text" id="score" name="score" value="<?php if t!empty ($score)) echo
$score; ?>" /><br />
<label for="screenshot">Captura de tela: </label>
<input type="file id=''screenshot" name="screenshot" /><br />
<label for=verify">Verificagao: </label>
<input tvpe*=teyt-. irj=,*vf>r.-ifv" name="verify" value="Enter the pass-phrase." />
<imCT/rc="captcha.php^>lt=,fVerification pass-phrasQ. /> a
<hr /> ^ ________ ______________ a<\w s*riptCrw IUfin
<input type="submit" value="Add" name=submit" /> sivipt Adiiont"

</body>
</html> Swlt n i*3yw CA>*
sr e*fotda n pgjn-
Mi m mm
addscore.php
teste drive addscore.php com a funcionaiidade captcha

T& s t O R tv e
M odifique o script A dicionar Pontuao para im p lem en tar o suporte a
CAPTCHA.
Modifique o script a d d sco re . php de modo que ele passe a ter um campo Verificao,
bem como a usar o script c a p tc h a . php para exibir uma imagem CAPTCHA. Adicione
tambm o cdigo para verificar se o usurio digitou a senha correta antes de adicionar a
pontuao.
Envie ambos os scripts ao seu servidor web, e depois, abra ad d sco re .php em um
navegador. Tente adicionar uma nova pontuao sem digitar a senha CAPTCHA. Depois
tente novamente, agora digitando a senha mostrada na imagem CAPTCHA.

0osso moderador humano


inataen-be -be ?*** graa*

W^a ha CAPTCHA nuc se


Kodiida o * sb n W n -fce diiiCui,
aos bcts a tav-e-Pa de --azer spam
no -rormulario do juitr Wfrs.
visualizando seus dados... e mais!
n9 existem
perguntas idiotas
gerar a imagem com transparncia, chame
[ * Posso usar as funes GD para * por isso que eu consigo colocar
imagegi f () ou imagepng (); voc
criar imagens em outros formatos alm o nome do script CAPTCHA diretamente
nopodeusar imagejpegO porque
de PNG? no atributo src de uma tag <img>?
as imagens JPEG no tm suporte ao
recurso de transparncia.
Sim. As funes imagegif () Correto. Referenciar um script
eimagejpegO funcionam de modo PHP no atributo src de uma tag <img>,
T * Quando usamos im a g e p n g ()
bastante semelhante a imagepng (), como fizemos no script captcha.php para
para enviar uma imagem PNG
mas criam imagens GIF e JPEG, o Guitar Wars, resulta na imagem ser
diretamente ao navegador do cliente,
respectivamente. entregue diretamente pelo script. Isso
onde o arquivo .png da imagem
diferente do modo normal como a tag
y.
1 As funes de criao de
armazenado, e qual o seu nome? <img> funciona, onde o nome de um
arquivo grfico especificado no atributo
imagens podem criar imagens com No h nenhum arquivo .png para src. Uma vez que o script est enviando
transparncia? a imagem, pelo simples motivo que ela a imagem diretamente para o navegador
no armazenada em um arquivo. Em atravs de um cabealho (por meio da
vez disso, a funo imagepng() gera uma funo imagepng ()), no se usa um
Sim! Existe uma funo chamada arquivo. E o navegador sabe que deve
imagem PNG binria na memria, no
imagecolortransparent() que conectar a imagem do cabealho tag
servidor, e ento a envia diretamente ao
define uma cor para ser a cor transparente <img> porque o script est especificado
navegador atravs de um cabealho. Uma
dentro de uma imagem. Essa precisa no atributo s r c .
vez que os dados da imagem so criados
ser uma cor que voc j tenha criado
e enviados diretamente para o navegador,
com a funo imagecolorallocateQ. Aps
defini-la como transparente, qualquer no preciso armazen-la em um arquivo.
coisa desenhada nessa cor ser
considerada como transparente. Para

Todo formulrio web corre o risco de ser AfunO GD createtruecolorimage ()


atacado por bots de spam, mas todo bot de usada para se criar uma imagem em branco.
spam est a merc de ser combatido por
programadores PHP inteligentes, que usam Para enviar uma imagem PNG ao navegador
tcnicas como CAPTCHA para derrot-los. ou a um arquivo no servidor, chame a funo
GD imagepng ().
GD uma biblioteca de grficos padro do Ao terminar de trabalhar com uma imagem,
PHP, que lhe permite criar dinamicamente chame imagedestroyO para apag~la
imagens e desenhar todo tipo de grficos ou da memria.
textos nelas.
visualizando dados do mismatch

Cinco graus de oposipo 0 c o n c e it^ d e


Uma vez que o Mismatch uma comunidade de usurios " c in c o g r a u s d e
(humanos!) registrados, bots de spam no tm sido problema.
Porm, os usurios querem um pouco mais do recurso de o p o s i o d o
en co n trar pares im p erfeito s do site, p rin cip alm en te o con ceito
de "cinco graus de oposio" de que tm ouvido falar. Os M i s m a t c h e n V p lV e
usurios do Mismatch querem mais do que apenas uma lista de
tpicos do seu par imperfeito ideal - eles querem algum tipo a aValla
de contextualizao visual de como esses tpicos se relacionam
com cada categoria principal de "desencontrabilidade" d p s t p ic o s
d e s e n c o n tra d o s p o r
Eu vejo um monte de tpicos, mas c a te g p r ia .
realmente nao sei exatamente como ns nos
desencontramos nas diferentes categorias. Eu
gosto do conceito de "cinco graus de oposio",
mas no consigo ver como isso se relaciona ao
meu par imperfeito. E agora?

0 Beli-b c uma fesso


0 visual,t \uer ver
o mau do \ue acenas
uma lista de -toftos
0 reeren ^ s ao seu fr
^ 'm>eYeVfco ideal

/>r>A
visualizando seus dados... e mais!
Fondo a desencontrabilidade m tabela
Como voc deve se lembrar, o Mismatch inclui um questionrio categorizado, onde
os usurios selecionam as opes Adoro ou Odeio para uma srie de tpicos. So
essas respostas que determinam os tpicos que compem um par imperfeito ideal. Ao
apresentar o par imperfeito ideal para o usurio, o script My Mismatch exibe uma lista
de tpicos desencontrados, que ele cria como um array a partir do banco de dados
do Mismatch. Mas os usurios agora querem mais do que uma lista de tpicos... eles
querem uma representao visual categorizada das suas "desencontrabilidades", talvez
em forma de grfico.

Desenhe um grfico de barras,


usando os dados do Mismatch, que
mostre visualmente os "cinco graus
de oposio" para Belita e Jason.
Escreva o que as informaes do
grfico significam.

FVedisamos fcrns-tarmaVf
dealj^um modo, esta lista
dc tpidos en. um gtriido

Reality TV
Horror movies
Easy listening music
The opera
Sushi______
Spicy food
Peanut butter &
banana sandwiches
Martinis
Bill Gates

Yoga
W eightlifting
Cub e puzzles
Karaoke

voc est aqui 631


gravando dados grficos no array

Desenhe um grfico de barras, usando os dados do Mismatch, que


mostre visualmente os "cinco graus de oposio" para Belita e
Jason. Escreva o que as informaes do grfico significam.
e -j, Embora haja muitas W a s diferentes de representar
viswaUe^ oS dados do Mismatdb, ur* ojr&to debarras
t . *o uma rn opdo, uma vCzl ^ue as dateaorias tem, ta d a j ^ --------^
. /alores uma> nUero iftual de tpidos. </ \
de um 3raido de . .--------------- ----------------------------------------- I Cada barra
ba' do
barras estabelece cyr-fido -tem
os valores possveis um -trtulo e um
para dada barra. valor - o valor
desta a<\ui e 5.
Faixa 3

Cada barra representa o altura de uma barra


wmero de desendontros reflete a magnitude
cm uma dada daey>ria de do valor para um
tpidos. determinado ttulo.

Armazenando dados do grfico de barras


No fim das contas, os dados por trs de ura grfico de barras so talvez
mais importantes do que os grficos. Sabendo que esse tipo de grfico
na verdade apenas um conjunto de ttulos e valores, podemos visualizar
os dados de um grfico de barras com um array bidimensional, em
que o array principal armazena as barras, enquanto que cada sub-array
armazena o par ttulo/valor para cada barra.
Cada sub-array armazena
o ttulo e o valor pr um
dada barra do grado.

/
$graph data = array(
array! "Heading-'.!/. .$vaue|||,
array("Heading 2", $value2),
array("Heading 3", $value3)
m ir

Cada i-tem do array prmdipal


dorresponde a uma barra-
visualizando seus dados... e mais!
nap existem
P e rg u n ta s Id io ta s
no entendeu realmente o problema". Neste caso, o
9 } 0 grfico de barras precisa ser alimentado a problema achar a melhor forma de armazenar os
partir de um array bidimensional? dados a serem injetados em um grfico de barras, e
uma soluo que funciona bem o array bidimensional.
A: No, no necessariamente. Mas tenha em mente claro que o desafio ainda como exatamente criar
que cada barra do grfico geralmente envolve duas esse array bidimensional com dados das categorias do
informaes: um ttulo e um valor. E cada grfico contm Mismatch. 0 primeiro passo isolar quais dados do
vrias barras, de modo que um array bidimensional banco entram na soluo.
uma forma lgica e eficiente de se armazenar dados
usados para preencher um grfico de barras. Como diz
o ditado, "se voc s consegue ver uma soluo, voc

O esquema do banco de dados da aplicao Mismatch mostrado abaixo.


Circule todos os dados que precisam ser usados para a gerao dinmica do
grfico de barras "cinco graus de oposio, e no se esquea de escrever
RCClO como eles so usados para se criar o grfico

111
user id v v
username
rateaory_id 0 ,
password
name
join_date
first name
last name
gender
birth date response id topic id 0 'ft
city response name
state
1 icpr i r i ^ H r _ category id
picture
tnpic id ^

voc est aqui 633


'exerccio soluo

U esquema do banco de dados da aplicaao Mismatch e mostrado


abaixo. Circule todos os dados que precisam ser usados para a
gerao dinmica do grfico de barras "cinco graus de oposio", e
RCCO no se esquea de escrever como eles so usados para se criar o
SoL u ao
grfico..
A doluna user_Jd usada
para sc donsultar respostas
do Questionrio, para Que se A doluna response_id e usada para se
possa deerminar o melhor par dombinar as respostas de dois usurios,
mperteito para um usurio. para determinar se elas esta definidas
dom valores opostos um desendohtrof.
A doluna dategoryjid usada
para se assobiar uma dategoria
tom um tpido, o Que leva a uma
---- resposta desendontrada- 0 nome
_id o da dategoria e impoirtan-te porque
username ele Que formede os -tftulos para
o jjrfido de barras.
password
join_date
first_name
iast_name
gender Tjri
birthdate
' (^topic id
city
state
picture

Adoluna topid_id serve


domo in-termedirio para as
dategorias e as respostas, Que t
o Que permite a vode desdobrir
0 grfido de barras reQuer,
a dategoria de dada resposta em l-tima instndia, uma
desendon-trada- dontagem de Quantos
desendontros existem para
dada dtegora; a don-tagem
o valor para dada barra,
enQuanto Q^C o nome da
dategoria t o seu -ttulo.

CO A
visualizando seus dados... e mais!

Gtflco de Battas Exp^stP


Na entrevista desta semana:
Lendo entre as linhas com o senhor
dos grficos

Use a Cabea: Ento voc o cara que as No caso do Grfico Torta, quanto mais coisas
pessoas chamam quando elas precisam de uma voc adiciona, menores as fatias ficam. Chega
representao visual de alguns dados. E isso um ponto em que as partes ficam difceis de
mesmo? visualizar. No meu caso, tudo o que importa
que as barras tm valores que podem ser
Grfico de Barras: Exato. Eu sou expert
mostrados na mesma escala.
em todos os tipos de visualizao de dados,
principalmente no tipo retangular. Use a Cabea!: O que isso significa?
Use a Cabea!: Ento as suas capacidades de Grfico de Barras: Bem, eu tenho dificuldades
desenho se limitam principalmente a retngulos em mostrar coisas que tenham valores altamente
diferentes - a no ser, claro, que voc no se
Grfico de Barras: Acho que "se limitam"
importe que as barras sejam altamente diferentes.
uma expresso forte neste caso. E uma daquelas
O meu ponto forte mostrar a diferena entre
situaes em que quanto mais simples, melhor
valores que estejam dentro da mesma faixa. Por
- as pessoas simplesmente parecem mais
exemplo, talvez voc queira que eu mostre o
acostumadas com as barras, talvez porque elas
preo da gasolina ao longo de um perodo de
estejam acostumadas a ver as coisas medidas dessa
um ano, em cujo caso, todos os valores estariam
forma. E como aquela barrinha nos celulares
dentro de uma faixa razoavelmente restrita, por
que lhe diz o quo forte est o sinal. "Est
exemplo, com apenas alguns reais de diferena
conseguindo me ouvir agora?" Eu adoro isso.
uns para os outros.
Use a Cabea!: Certo. Mas eu j vi alguns
grficos redondos bem eficientes. Me lembram
Use a Cabea!: Tem certeza disso?
de coisas boas... como torta de ma, entende o Grfico de Barras: Eu sei, o preo da gasolina
que eu quero dizer? parece ser um valor que varia sem limites, mas
na verdade no to ilimitado assim, dentro do
Grfico de Barras: Entendi o que voc est
tipo de situaes com que eu lido.
insinuando, e conheo o Grfico Torta. Veja, so
duas maneiras diferentes de se pensar sobre a Use a Cabea!: Ento voc est acostumado a
mesma coisa. O Grfico Torta v o mundo em ver coisas bem esquisitas, no?
curvas; eu vejo um pouco mais reto, s isso.
Grfico de Barras: Voc no acreditaria.
Use a Cabea!: Ma as pessoas no se Uma vez, um cara criou uma aplicao web
relacionam inerentemente melhor com uma que mantinha registro de quantas milhas ele
torta do que com um monte de barras? arrastava o seu mouse por ms. Ele tinha at um
blog sobre isso, e me usava para representar as
Grfico de Barras: No, a no ser que elas
suas "viagens" em forma de grfico. Bem louco,
estejam com fome. Veja, o Grfico Torta
mas as pessoas adoram esse tipo de coisa.
realmente bom para mostrar as partes que
compem o todo, onde os dados compem Use a Cabea!: Ento esse o seu campo de
algo que realmente importa: 100% , 32 times, 50 atuao - fornecer representaes visuais dos
estados. So 50 estados nos EUA, certo? dados das pessoas?
Use a Cabea!: Sim. Bem, assumindo-se que Grfico de Barras: Sim, creio que sim. Sempre
voc conte Washington, D.C. como "distrito que eu posso ser colocado em uma pgina para
federal" e lugares como Porto Rico e Guam fornecer um visual extra para dados que, sem
como "territrios''. Mas, de qualquer forma, mim, ficariam um pouco chatos e difceis de
entendo o que voc est dizendo sobre o Grfico entender, considero meu trabalho feito.
Torta ser mais adequado para revelar partes de
Use a Cabea!: Fico feliz de ouvi-lo. Obrigado
um todo, mas voc no faz a mesma coisa? por conversar conosco, espero que possamos
Grfico de Barras: Sim, mas tenha em mente que fazer isto novamente.
eu sou muito mais flexvel do que o Grfico Torta.
Grfico de Barras: O prazer foi todo meu. E no
Voc pode me adicionar quantas barras quiser, e eu
se preocupe, voc continuar me vendo por a.
no terei problema nenhuma para exibi-las.
voc est aqui V 635
construindo um array para categorias

Pe uw array para outro


Da ltima vez que vimos o Mismatch, tnhamos uma lista de tpicos que
correspondiam a desencontros entre dois usurios. Mais especificamente, ns Um alias wado
tnhamos na verdade um array de tpicos. O problema que o grfico de barras para sc eliminar
que estamos tentando desenhar no exatamente sobre os tpicos - sobre ' AN
a do^TUSO ao
as categorias associadas com os tpicos. Assim, estamos separados em um nvel referir dolt*n
dos dados que realmente precisamos. Parece que precisamos de mais algumas name da iabela
consultas SQL. No apenas precisamos do array de tpicos desencontrados, mismatdb_d*tegory.
mas precisamos tambm de um array paralelo semelhante, de categorias
desencontradas.
Um join ml-tiplo
dohedta a "tabela das $<:uery = "SELECT mr.response idf mr.topic id, mr .response,
dategorias tabela mt.name as topic_nam e, f|||p||f
das respostas, de "FROM msmatch_response AS mr " ..
modo Que o nome d a \\. T," JOIN mismatch topic AS mt ^USING (topic id)

e^dc. ^ w
O join adicional nessa consulta faz o nome da categoria
correspondente a cada tpico de resposta ser anexado aos
dados do resultado, acabando no array $user_responses. Nos ainda predisamos de
um novo array, dontendo
Mas lembre-se, ns s precisamos das categorias
desencontradas, e no de todas as categorias. Precisamos apenas as dategorias
criar outro array, contendo apenas as categorias desendon-tradas para este
desencontradas para as respostas. par de usurios.
A ova Hdoluna de
topiename category^naire dados de resultado
Appearance armazena o nome da
Appearance dategoria de dada
Appearance resposta -
Appearance
Appearance
Entertainment
Entertainment
Nos predisamos y,
Entertainment extrair apenas os f
Entertainment nomes das dategorias
i~a no Capitule Entertainment
referen-tes a respostas
o array Food
desendontradas, e
bidimensional Food
i lAserjresponses Food
doloda-los em um array.
-foi driado e Food
preendbido dom
Food
dados de resultade
people
dorrespondenies
People Mas ainda no estamos atingindo
as respostas do
People o nosso objetivo de criar um array
usurio atual-
People de categorias desencontradas. Para
fazer isso, precisamos revisitar o
cdigo que cria o array de tpicos
$user_responses
desencontrados...
visualizando seus dados ... e mais!

T teS T O R 1 V E
T este a nova consulta para obter tpicos e categ o rias desencontrados.
Usando uma ferramenta MySQL, emita a seguinte consulta para selecionar tpicos e
categorias desencontrados para um determinado usurio. Certifique-se de especificar
a ID de um usurio que no s exista no banco de dados, mas que tenha tambm
preenchido o questionrio do Mismatch:
SELECT m r .response_id, m r .topic_id, mr.response,
m t .name AS topic_name, me.name AS category_name
FROM msmatch_response AS mr
INNER JOIN mismatch_topic AS mt USING (topic_id)
INNER JOIN mismatch_category AS me USING (category_id)
WHERE mr.user_id = J3;

A (D deve str a de w*
usurio vlido, Que
respondido o Questiono do

q i > c.fc,LECT mr . r e s p Q n s e _ i'd .,. m r . o p c _ i d , s i r v r a s a q n s e ,


t . n a m e AS r .c p i c _ n a r n e , _mc.na.ms AS c a t q .c A r y An'ain'e
ROM m i sm s r, c r.__r e s c c a s e. .AS. mr .. . ''
NAA.S o rr.isn g i:ci'.._ t p r^ c.. AS -.mt U S IN Q A ix Q p i'c id )
NNER JO IN : n i s n a t : c h _ c a - e o . r y AS inc USING ' ( C t e g o r y _ i d )
HERE n r . u s e r 'A td .' = . 3-;A. A A ' . A -A.-- A

i a } - r e s p o n s e :i ^ c p i c ; .cirri; ! c a t e g o r y r.ami
.+ ----------------- ------
.. ! .1' 1 T a x tc c s
, A ppearance
!.. 2 .' ' G o id c h a i : ; A p p e a r a n c e
' i l . 1 E ody- p i e r i .^jc'p s tri "c <3. n c ^
: i;' 2 Ai i' C o ^ ' o vbei ! A p p e a r a n c e

Long h a r \ A ppearancea
... i. : ; ; R e a ^ i t y . T\
1 ..E n t c.r t a i r. me n t
! i P r q f e s s io r w r e s tim c i E n te r 'iia in .T ie n t
A A - :: A Ai F .o r r c r no-,
i E n te r ta in m e n t
sy l i s t e n i n q m u s ic ' i E n t e r t a i n m e n t

Repava Que os resul-fcdos desta tonsui'fca


av-v-ay E sennpv-e ua bod ideia
r
b te t o * o ?usev_jrespo*ses da
e
pgina airrbeviov, Que o Que *os Queremos. testar as donsui-fcas em ua
-fe^rameh-ta My$L antes de
doioia-las ko ddijo PUP.

voc est aqui > 637


Construindo um arry p o r tpicos

Crie um array de tpicos desencontrados


Agora ns temos uma consulta que realiza um join mltiplo para obter a categoria de cada
resposta, alm do tpico, que ento colocada no array $user_responses. Lembre-se que
outra consulta, parecida com esta, tambm est obtendo dados para cada outro usurio do
banco, para que as comparaes de desencontrabilidade possam ser feitas. Assim, $user_
responses armazena os dados de resposta para o usurio logado no Mismatch, enquanto que
$mismatch_responses armazena um dos outros usurios do sistema. Isso nos permite fazer
um loop atravs de todos os usurios, e atualizar $mismatch_responses em cada comparao.
Ns j estamos usando esses dois arrays para encontrar pares imperfeitos e para criar um
array de tpicos desencontrados. Agora, podemos adicionar uma nova linha de cdigo
para construir tambm um array de categorias desencontradas - este array conter a
categoria de cada tpico desencontrado entre dois usurios.
Este i o mesmo dod'150 da verso anterior do Mismtdh,
f e*deto feio +<3rfco de Que a$ora ele dria um array de
y , tate^oras desencontradas, alem do array de tpidos.
categories = array{);
for ($i = 0; $i < count($user_responses); $i++) {
if ($user_responses[$i] [response 1] + $mismatch_responses[$i] ['response']
== 3) {
?score -+= 1;
array push($topics, $user responses[$i] ['topic_name']);

Um array de dategorias
' Este cdigo t em um
, resulta Ko im das dontas, o array desendontradas driado
/date^ories dontem uma dtegoria
array toniendo apenas as armazenando-se a dategoria
pra dada desendontro. assodiada dom dada resposta
eatejorias desencontradas.
desendontrad-
na existam
perguntas Idiotas
Estou um pouco confuso. Qual a diferena entre I * Mas ns ainda precisamos contar quantas
um conjunto de resultados do MySQL e um array do PHP? vezes uma categoria foi desencontrada para
podermos gerar 0 grfico d barras, certo?
K: Uma grande diferena 0 acesso. Um conjunto
de resultados s disponibiliza uma linha de dados de Certo. Um array de categorias desencontradas
cada vez, enquanto que um array pode armazenar no suficiente. Lembre-se de que a ideia por trs
vrias "linhas" de dados, graas s mltiplas dimenses. do grfico de barras do Mismatch que cada barra
Colocar um conjunto de resultados em um array representa uma categoria desencontrada, e que a
bidimensional permite que nos movamos atravs das altura da barra representa quantas vezes a categoria
linhas de dados de forma eficiente, sem termos que foi desencontrada. Assim, precisamos de uma forma de
ficar voltando ao servidor do banco de dados para contar quantas vezes cada categoria foi desencontrada.
obter linhas vrias vezes. Isso no funciona com Mas provavelmente vale a pena dar um passo atrs,
conjuntos enormes de dados, uma vez que para isso para formularmos um plano geral de ataque....
voc precisaria criar arrays enormes; mas, no caso das
respostas do Mismatch, os arrays nunca so maiores do
que 0 nmero total de tpicos no sistema.
visualizando seus dados... e mais!

Formulando um plano para exeeupo dos grficos de barras


Com um array de categorias desencontradas e um monte de ideias sobre como us-las
para gerar um grfico de barras para a pgina My Mismatch, s o que nos falta um plano.
Como veremos logo abaixo, s so necessrios trs passos para se gerar dinamicamente o
grfico de barras, e j realizamos um deles.
Este passo nos or>eCe
a lista das categorias
desencontradas-
^ ConsnWdr o baco~c lr tfaKtoy ilo M is mat ch cm buocn dos
nomps d as c a togorias dese ncontradas
A lista de categorias
prcisa ser Convertida
O C alcu lar os to ta is de desencontros para e uma lista de totais.
cada catego ria.
Tendo os totais das categorias,
0 Desenhar o grfico de barras usando-se os ms podemos passar para
to ta is das catego rias. parte divertida, <\ue e
desejar o grico de barras
Para completar o Passo 2 do nosso plano, precisamos de Com un^oes
alguma forma de pegar o array de categorias desencontradas e
transform-lo em um conjunto de totais para as categorias, ou
seja, uma contagem de quantas vezes cada categoria aparece no
array. Como voc deve se lembrar, esse , precisamente, o tipo
de dados requeridos para se criar um grfico de barras, onde as
categorias so os ttulos e a contagem para cada categoria o
valor de cada barra. Um array bidimensional pode ser usado para
se combinar categorias e totais em uma nica estrutura de dados. 0lKar o ovo array
das categorias por Um
Appearance angulo diterente revela
IS Entertainment 4 Cor* de g usado para
JB Food 4 r n UY os fedos a
Jp people 2 gra+c de barras.
Activities 5

Este array Contm o


nome de cada categoria,
\uttto Com o total
i toi
de vezes <^ue ela c* Os novos dados das
Categorias desencontrada
desenCofttrada.
s3 cxdtdmente o \ue
precisados para o gra-fic
de barras.

Uma vez criado esse array de totais, estaremos prontos para seguirmos
para o Passo 3, onde usaremos algumas funes GD para gerar o visual do
grfico de barras.
voc est aqui 639
um pouco de matemtica de array

Amassando as categorias
O desafio agora totalizar o array de categorias e coloc-lo em um array
bidimensional de ttulos e valores. Ns temos um array de categorias
desencontradas armazenado em ^categories. Precisamos criar um novo
array ch am ad o $ c ate go ry_to tais, qu e ir con ter u m a entrada para cada
categoria, junto com o nmero de desencontros para cada uma.

Precisam os
p a rtir disto..
0 nmero -bvhl de
otorremttdsde uma dagovia
no asry fdaiejotries apaveCe
Orw umn toial hO SYYdy
f Ctegory^to-tals.

...e chegar a isto!


s.
Appearance
s j4 j
I Entertain m en t

Food 4

People 2

A ctivities 5

$category_totais

$categories

W K R C T R
C om o voc faria para totalizar as categorias
d esenco n trad as no array Scategories, p ara criar o
array bidim ensional $category_totals?
visualizando seus dados... e mais!

A matemtica das categorias


Passar de um array unidimensional de categorias desencontradas para um array
bidimensional de totais das categorias pode ser um pouco mais complicado do que voc
poderia pensar, primeira vista. Por esse motivo, til trabalhar na soluo atravs
de pseudocdigo antes de realmente escrever qualquer PHP. O pseudcdigo nos livra
dos detalhes sintticos e nos permite focalizar nas ideias centrais envolvidas em uma
determinada soluo de codificao.
Criar um novo array bidimensional para armazenar os totais das categorias,
certificando-se de inicializar o primeiro elemento com a primeira categoria
desencontrada e uma contagem 0.
Fazer loop atravs do array de categorias desencontradas. Para cada
categoria do array...
O ltimo elemento do array contendo o s totais de uma categoria
diferente do desencontro atual?

^ S i m ! Tem os uma nova categoria, portanto vam os adicion-


la ao array com os totais d a s categorias e inicializar a sua
contagem com o 0.

^ No. Esta apenas uma nova instncia da categoria atual,


portanto vam os incrementar a contagem do ltimo elemento
do array com o s totais das categorias.

O produto deste cdigo um array bidimensional de totais, no qual o


array principal armazena uma nica categoria, enquanto que cada sub-
array contm o nome da categoria e o seu valor.

Traduza o pseudocdigo para completar o cdigo PHP real que cria o array
bidimensional de dados de categorias do Mismatch, chamado $category_totals.

$category_totals = array{array{$mismatch_categories[0], 0));

foreach ($mismatch__categories as $category) {

}
voc est aqui 641
exerccio soluo

Traduza o pseudocdigo para completar o cdigo PHP real que cria o array
ibidimensional de dados de categorias do Mismatch, chamado $category_totals.
ttr r o arrays sao inde*ados a
partir do zero, portanto o
SoL uao ultimo elemento de um rray e
sempre Count^ *enos um.
$category_totals = array (array ($mismatch_categories [0], 0) );

foreach (Smismatch- categories as Scateaorv) l

i-P (fcategory^totaUtcountfcategory^totaU) - \3C03 / fcategory) {

,^!^.y(^kgory) ^ t a e uma nova categoria,


j ^ _______ ^ portanto vamos adiciona-la ao
..................................................................................................... array de totais, na -Por,a de um
ejse { sub-array Consistindo do nome
.....- ncn++;.... ' ie

....1................................................................................... ....^Tmr.. 0 ofwdov- de infiremen-t


^ C++) aplicado ao segundo
elemento do sub-array, <\ue e
$category__totals a dontage das categorias.

A varivel ?category_totais
/
Appearance 3
agora armazena precisamente os Entertainment 4
dados necessrios para se gerar 4
Food
um gra-fico de barras para as People 2
categorias desencontradas. 1 Activities 5

Este e o resultado
e
-Pina) deste cdigo-

mmm
4 ij_o
Agora nos podemos <900Hm
01" 'PI J&SSSXlisttk*
riscar este passo da
lista, o ^ue nos deixa i fC 3 .i t
apenas com a tareia de
desenhar o gric de
barras.

0 Calc ular os to ta is de
de s e ncontros para
-c a do catego ria------
visualizando seus dados... e mais!

no existem
iJotas
" P - 0 que acontece com o cdigo de totalizao se as categorias no estiverem em ordem no array
$mismatch_categories?

Grande problema. 0 cdigo inteiramente dependente das categorias estarem em ordem no array $mismatch_
categories, Isso se v no modo como o cdigo assume que qualquer modificao na categoria o incio de uma
nova categoria, o que funciona desde que as categorias estejam agrupadas. Felizmente, a consulta no script do
questionrio, que seleciona originalmente os tpicos para insero na tabela mismaicfwesponse, inteligente o
suficiente para ordenar as respostas por categoria.

SELECT topic_id FROM mismatch_topic ORDER BY category_id, topic_id


esta consulta que obtm primeiramente os tpicos do banco de dados, e depois os insere como respostas vazias
para um determinado usurio. Isso garante que as respostas do usurio sejam armazenadas no banco ordenadas
por categoria, o que permite que o cdigo totalizador das categorias funcione corretamente.

" P * Mas no arriscado escrever cdigo que dependa da ordem dos dados armazenados em uma tabela do
banco?

Sim e no. Lembre-se de que este banco de dados controlado inteiramente atravs de cdigo que voc escreve,
portanto a ordem dos dados na verdade s se modifica se voc escrever algum cdigo que a modifique. Mesmo assim,
certamente se poderia defender que uma boa ideia ordenar a consulta de join, no script My Mismatch, por categoria,
para termos certeza absoluta que a lista das categorias desencontradas estar na ordem certa.

voc est aqui 643


desenhando um grfico de barras

Fundamentos dos grficos de barras


Com um array bidimensional novinho, contendo os dados das categorias desencontradas,
hora de passarmos tarefa de desenhar o grfico de barras. Mas em vez de nos
concentrarmos nos detalhes de como desenhar o grfico do Mismatch, por que no
usarmos u m a abordagem mais genrica? Se voc elaborar e criar uma fu n o geral para
desenho de grficos de barra, possvel us-la para o Mismatch e t-la disposio para
qualquer necessidade futura de desenho de grficos. Em outras palavras, ela reutilizvel.
Esta nova funo ter de realizar uma srie de passos para gerar com sucesso o grfico de
barras a partir de um array de dados bidimensional.
Criar a imagem.

O Criar as cores que voc ir usar para desenhar os grficos e o texto.

Preencher o fundo com alguma cor.

O Desenhar as barras e os ttulos.

Desenhar um retngulo em torno do grfico de barras inteiro

0 Desenhar a faixa dos valores no lado esquerdo do grfico.


0 valor de cada
0 0 Escrever o grfico em um arquivo de imagem. barra pretisa
, ar dtnbro
Limpar a casa, apagando a imagem da memor.a do ^ * irrv0
cspetiidadoj ao
se chamar a
A M
-Vundao

Faixa

A lavoura de dada
barra e o espaamento
entre elas deve ser
calculados cor* base
nd largura do griCo 0 numero de barras t
inteiro, e *o nwero determinado pela extenso
de barras. do array dos dados.
mymismatchgraph.png
/ ^ visualizando seus dados,,, e mais!
10]LS d e G relctcleil-cl <Jo p j p
O script My Mismatch contm uma nova funo, draw_bar_graph(), que se encarrega de
desenhar um grfico de barras tendo uma largura, uma altura, um array bidimensional
contendo os dados para o grfico, um valor mximo para a faixa e um nome de arquivo
para a imagem PNG resultante. Use os ms para com pletar as chamadas s funes GD
de desenho que esto faltando.

function draw bar_graph($width, $height, $data, $max_value, $filename) {


// Cria a imagem vazia
0 $img = .............. .......... ($width, $height) ;
// Define um fundo branco com texto preto e grficos cinza
A $bg_color = ..................... ($img, 255, 255, 255); //branco
$text_color = ..................... ($img, 255, 255, 255); //branco
$bar_color= ...................... ($img, 0, 0, 0); //preto
$border_color = .......................($img, 192, 192, 192); //cinza claro

// Preenche o fundo
M .............. .......... ($img, 0, 0, $width, $height, $bg_color) ;

/ / D esenha a s b a r r a s
$ b a r _ w i d t h = $ w i d t h / ( ( c o u n t ( $ d a t a ) * 2) + 1) ;
O ;
f o r ( $ i = 0; $ i < c o u n t ( $ d a t a ) $ i ++) {
($imgf ($i * $bar_width* 2) + $bar_width, $height,
($i * $bar_width * 2) + ($bar_width * 2), $height - (($height / $max__value) *
$data[$i] [1]) , $bar_color);
................. ($img, 5, ($i * $bar_width * 2) + ($bar_width) , $height - 5,
$data[$i][0],
$text_color) ;
}
^ // Desenha um retngulo em torno da imagem inteira
_($img, 0, 0, $width - 1, $height - 1, $border_color);
// Desenha a faixa de valores no lado esquerdo do grfico
for ($i = 1; $i O $max_value; $i++) {
.......... ($img, 5, 0, $height - ($i * ($height / $max_value)), $i, $bar_
kcolor) ;
}
// Escreve a imagern.em um arquivo
($img, $filename, 5) ;
.............. ($img);

imagecreatetruecolor images tringup imagerectangld imagp>Ge>lorallocate

imagefilledrectangle
HW
ms do php solues

Ims de G eladeira d PB F Sluab


O script My Mismatch contm uma nova funo, draw_bar_graph(), que se encarrega de
desenhar um grfico de barras tendo uma largura, uma altura, um array bidimensional
contendo os dados para o grfico, um valor mximo para a faixa e um nome de arquivo
para a imagem PNG resultante. Use os ms para com pletar as chamadas s funes GD
de desenho que esto faltando.

function draw_bar_graph($width, $height, $data, $max_value, $filename) {


A // Cria 3.imagem vazia .. primeiro lu^ar^ drie
$img = I imagecreatetruecolor |j$widthf $height); <***5 em brand.
O // Define reto e grficos cinza

$bg_color imagecolorallocate 255, 255, 255); // branco \ Crie a!$uas dores


K \ a serem usadas
$text_color = ji$img, 255, 255, 255);
-m imagecoloral1ocate 255- 255- 2551 ' n branco > r* i as
$bar color = img, 0, 0, 0); // preto \P3rtes do ^raido.
imagecolorallocate
$border color = Tj=.m agecolorallocate m
^ i;
H$img, 192, 192, 192); //cinza claro)

Clareie o 4 d o, para deixa-lo pronto


// Preenche o funoo _ ___ -para
-ejai,L os desenhos no grito.
_____i 1
6$img, 0, 0, $width, $height, $bg_color) ;
imagefilledrectangle

$ b a 7 7 d tt^ F ^ ^ ($ d a ta ) * 2) + 1 ); D e se je a W rr3 tomo um


for ($i = 0; $i < counU$data) ; $i++) { _____ re^uo preendKido.
imagefilledrectangle * $bar_width * 2) + $bar_width, $height,

($i mmth * 2), $height - (($height / $max_value) * $data[$i] [1]),


$bar color);
imagestringup i|($img, 5/ ($i * $bar_width * 2) +- ($bar_width) , $height - 5, $data[$i]
0
[ ],
D e s e je o ttu lo da b arra tomo uma sir mg de
$text_color);
} texto orientada vertolmente-

// Desenha um retngulo em torno da imagem inteira


imagerectangle K($img, 0, 0, $width - 1, Sheight - 1, $border_color) ,
n " DesenHe um retnAulo e
J
//T5eseyma^T!a^ra^valores no lado esquerdo do grarico
for ($i = 1; $i <= $max_value; $i++) {
j
torno de to. d,o o ya-fido.
imagestring5, 0, |height - ($i * ($height / $max_value) }, $i, $bar_color) ;
t^esenHe a "faixa de calores n lado
--- - esquerdo
I* --- doJ-tjri
-. naio -Porma
r to,
Jna de
wc
././ Escreve a imagem em um arquivo strings dt texto normais, na Horizontal-
--- -------- y$img, $filename, 5);
imagepng I; k f are*a a * ** *
* v<f vo
^ ----- tsytitodo e o
...

| imagedestroy | \ PW| ^

wtfmori.
pasta do servidor onde o arquivo deve ser esdrito predisa estar liberada
para esdrit; dso dohtrrio esta -Pun^o nao podera operar dorretaente-
na existem visualizando seus dados.,, e mais!
? e tr untas idotas
funciona muito bem para cdigos que no faam nada que
% Por que a funo draw_bar_graph() escreve a manipule o navegador. Mas enviar um cabealho tem impacto
imagem do grfico de barras em um arquivo, em vez de sobre o output do script, o que pode ser problemtico para
retorn-lo diretamente para o navegador? cdigo includo. No que voc no possa enviar cabealhos
a partir de cdigo includo; na verdade, ns fizemos isso em
alguns exemplos anteriores. O problema que voc precisa
Porque a funo no fica contida em um script prprio,
ser extremamente cuidadoso, e em alguns casos, no seguro
que possa retomar a imagem para o navegador atravs de um
assumir que outros cabealhos j no tenham sido enviados.
cabealho. Lembre-se, a nica forma de retornar uma imagem
O script My Mismatch, por exemplo, no capaz de retornar
dinamicamente gerada diretamente para o navegador com
uma imagem ao navegador porque a sua tarefa fazer output
o script usando um cabealho, o que significa que o propsito
de cdigo HTML contendo resultados do Mismatch. Incluir
nico do script tem de ser a gerao da imagem.
algum cdigo que gere dinamicamente e retorne uma imagem
causaria um conflito de cabealhos.
% Ento por que a funo draw_bar_graph() no
colocada em um script prprio, para que possa retomar a
% Ok, ento eu posso apenas referenciar o cdigo do
imagem diretamente para o navegador usando um cabealho? grfico de barras, como o script captcha.php do Guitar
Wars. Ele funcionou bem sem usarmos um include, certo?
Embora seja uma boa ideia colocar a funo em um
script prprio, para torn-la reutilizvel, ainda h um probfema
Certo, e referenciou o script captcha.php diretamente a
quanto a se retornar uma imagem atravs de um cabealho. O
partir do atributo src de uma tag <img>. O problema aqui que
problema tem a ver com o modo como voc reutiliza cdigo.
temos um monte de dados que precisam ser passados para o
Quando algum cdigo includo em um script usando-se
cdigo do grfico de barras, e seria bastante bagunado tentar
include, include_once, require ou require_once, esse cdigo
faz-lo atravs de GET ou POST.
colocado no script como se ele existisse !, originalmente. Isso

Pesenhe e mostre a imagem do grfico de barras


A funo draw_bar_graph() torna possvel gerar dinamicamente
um grfico de barras, desde que voc fornea a ela as informaes
necessrias. No caso do grfico do Mismatch, preciso enviar 0 arquivo gra-Pido gerado
uma largura e uma altura que funcionem na pgina My Mismatch por esta dhamada a
(480x 240), o array bidimensional com os dados das categorias -ruhao redebe o nome
desencontradas, 5 como o valor mximo (nmero mximo de mymismatdh^i-apHpng, 11
tpicos desencontrados por categoria), e um caminho e nome armazenado no servidor
de arquivo adequados para o grfico de barras resultante. Aps no dminho identi-Pidado
chamarmos a funo, a imagem gerada e pode ser exibida for m _ u ? L o h v ? m .
usando-se uma tag HTML <img>.
echo <h4>Detalhes das categorias desencontradas:</h4>';

fcri|pl||M!11lp||||^|^lflll i
lilili
echo '<iirtg' ju: tc^^ate^r^.' !!
graph" /><br
Com a ajuda de uma -fundo reutilizvel, e possve:
^ 0 mesmo daminho t nome de
arquivo o espediidados no
driar um gr-Pido de barras, armazenado em um
atributo srd da tag <img>.
arquivo, a partir dos dados presentes no bando-

Appearance 3
Entertainment 4
Food 4
People I 2
Activities 5
mymismatchgraph.png

voc est aqui 647


teste o mismatch, agora com grficos de barras

O R f V e _______________________ __

Crie o script My M ism atch e teste-o.


Crie um arquivo de texto chamado mymismatch.php, e digite nele o cdigo para o
script My Mismatch (ou baixe o script no site da Alta Books em www.altabooks.com.br).
Alm disso, adicione um item de menu para My Mismatch ao script navmenu.php.
Envie os scripts para o seu servidor web, e depois abra a pgina principal do Mismatch
(index.php) em um navegador web. Faa login caso ainda no o tenha feito, e clique
em My Mismatch no menu de navegao principal. Parabns, voc encontrou seu par
imperfeito ideal!

Agora sim! A representao


visual das categorias tudo o que
Mismatch - My Mismatch
eu precisava para me convencer
de que Jasan a cara certo para
Profite1 mim!
Jason F2mington
Q
HollywoodCA
A . Os topitos ov-a
Yonaremmatcfatdoe thefeDowinfi 18 topics: rcorsmiados
Tattoos Cowboy toots
uma -tabela para
Honor movies Easy listening music Ti* opera Susti
Spicy food Peanut butter & banana sandwicSws Mamnas EiBGmts
dar espado pava
Hugh He&ec Yoga WtigWiftmg Cube pu2d* gr-Pido d barras.
Karaoke Hiking
Mismatched category breakdown;

0 yido se endai*a
per+eitaw>ente a
pagina My MisatdH,
junto dom a lista de
tpidos desendontrados.
- Q Pesonha r o g rafico do barras-usando-se
es to ta is das c a te g or ia s .--------
visualizando seus dados... e mais!

S por curiosidade, como que


conseguimos armazenar o grfico de
barras do My Mismatch em um arquivo,
sendo que uma imagem nica gerada
para cada usurio diferente?

Um pouco de so rte, na verdade.


verdade que s existe um grfico de barras de cada vez, no
importando quantos usurios existam. Isso poderia ser um problema
se dois usurios tentassem ver a pgina My Mismatch exatamente no
mesmo momento. Ns corremos o risco de gerar imagens separadas
para as duas pessoas, e depois escrev-las em um nico arquivo.
No mundo real, esse problema razoavelmente improvvel, mas
medida que o Mismatch crescer em popularidade e se expandir
para milhares e milhares de usurios, poderia se tornar significativo.
O fato de que cada usurio pensa no grfico de barras como sendo
unicamente seu sinal de que h um ponto fraco no design com
um s grfico de barras.
ncs filaraente teos
tres grtdos de brras
diferentes sendo visualizados,
mas sabemos <^ue apenas um
arquivo esta sendo usado
para armana-los.
mymismatchgraph.png

Um a m esm a im agem
con tinuam en te gerada e
re-gerada para o grfico
de barras de cad a usurio.

C om o voc m odificaria o
cdigo do M ism atch p ara
garantir que ja m a is dois
usurios com partilhem o
m esm o grfico de barras?

voc est aqui 649


um grfico de barras para cada usurio

Imagens individuais do grfico de barras para todos


A soluo para o problema dos grficos de barras compartilhados reside em se gerar
mltiplas imagens, na verdade uma para cada usurio. Mas ainda temos de garantir que
cada uma dessas imagens fique vinculada a exatamente um usurio, e no mais que um.
E a qu e um elem en to fam iliar dos projetos d e ban cos d e dados en tra em ao... a chave
primria! A chave primria da tabela mismatch_user, user_id, identifica individualmente
cada usurio, e portanto, nos fornece uma excelente maneira de nomear de forma nica
cada grfico de barras, alm de associ-lo com um usurio. Tudo o que temos de fazer
juntar as IDs dos usurios ao nome de arquivo dos seus grficos.
A &o\wn user_Jd serve domo
dKave primaria para a tabela
dos usuairios.

u mismatch_user
-lismatchgraph-1 lpliMH MiiuaiiJJf l i i ! ! 81
1 sidneyk 745c52...

N 2 nevilj 12a20b...

umd imagem do \ 3 alexc 676a66...

yr&ito de barras para J 4 sdaniels 1ff915...

K~S
todos os usurios no ethelh 53a56a...

Pundionara no uturo 6 oklugman dfOOfB...
1
7 belitac 7c19dd...
J
S jasonf 3da70c...
3 lymismatchgraph.png
9 dierdre 08447b...

10 baldpaul 230dcb...

11 jnettles e511d7...

rubyr 062e4a...
12

M theking
miltonj
b4f283...
c1a5e7... Ao --ornedermos a dada
14
mledbetter 04fc2a... usuiro o seu prcfrio
15
owenb | 36be76... $rido, eliminados o
pvoblema de ter apenas
uma imagem para toda a
aplidao.

^X^ymismatchgraph.png

0 valor da doluna userjd da


tabela dos usurios dolodado
no indio do nome do arquivo
para o ya-fido de dada usurio, smatchgraph.png

garantindo assim a unididade-


na9 existera visualizando seus dados... e mais!
p e rg u n ta s Id io ta s
Existe alguma vantagem em se fazer o output 1 - Existem problemas de armazenamento
de imagens geradas dinamicamente como PNG, em introduzidos pelo fato de estarmos gerando um
vez de GIFs ou JP E G s? grfico para cada usurio?

No, nenhuma alm dos motivos pelos quais Na verdade no. Essa questo tem um pouco
voc normalmente preferiria um formato a outro. Por a ver com a do nve de compresso acima, mas
exemplo, GIFs e PNGs so melhores para grficos improvvel que voc sobrecarregue seu servidor com
vetoriais, enquanto que JPEGs so melhores para arquivos demais ou arquivos grandes demais, a no ser
grficos foto-realsticos. No caso do Mismatch, estamos que realmente fique louco e saia gerando milhares de
lidando com grficos vetoriais, portanto PNG ou GIF arquivos grficos enormes. Como exemplo, considere
funcionariam bem. PNG um padro mais moderno, e que os grficos de barra do Mismatch tm uma mdia
por isso foi usado, mas GIF teria funcionado tambm. de 2 KB cada um, portanto, mesmo que o site estoure
Para fazer o output de uma imagem GD no formato GIF e passe a ter 50.000 usurios, estamos falando de um
ou JPEG, respectivamente, chame as funes imagegif() total de 100 MB em grficos de barras. claro que isso
ou imagejpegQ. uma boa quantia de espao em disco, mas um site
com 50.000 dever ser capaz de gerar receita mais que
Como eu sei qual nvel de compresso usar ao suficiente para pagar por esse tipo de armazenamento.
fazer o output de imagens PNG para um arquivo?

As configuraes de nvel de compresso para


imagepngO entram em cena ao se enviar uma imagem PNG
para um arquivo, e elas vo de 0 (nenhuma compresso)
at 9 (compresso mxima). No existem regras fixas sobre
quanta compresso usar, portanto, voc poder querer
experimentar diferentes valores. O Mismatch usa o nvel 5
para os grficos de barras, o que parece ser um equilbrio
razovel entre qualidade e eficincia.

Segue abaixo o cdigo do Mismatch que gera dinamicamente um grfico de


barras e o exibe na pgina. Reescreva o cdigo de modo que ele passe a gerar
uma imagem nica para cada usurio. Dica: use S_SESSION['user_id'] para criar
Rcco um nome de arquivo nico para cada usurio.

echo '<h4>Detalhes das categorias desencontradas :</h4>';

draw_bar__graph (480, 240, $category_totals, 5, MM__UPLOADPATH . 'mymismatchgraph.png');

echo '<img src=" 1 . MM__UPLOADPATH . 'mymismatchgraph.png" alt="Mismatch category graph"


/><br />;

voc est aqui 651


exerccio soluo

Segue abaixo o cdigo do Mismatch que gera dinamicamente um grfico de


barras e o exibe na pgina. Reescreva o cdigo de modo que ele passe a gerar
iftrri
* uma imagem nica para cada usurio. Dica: use S.SESSIONCuserJd'] para criar
gOLuaO um nome de arquivo nico para cada usurio
echo <h4>Detalhes das categorias desencontradas :</h4> ;

draw_bar_graph(480, 240, $category_totals, 5, MM_UPLOADPATH . 'mymismatchgraph.png');

echo '<img src=" ' . MM_UPLOADPATH . 'mymismatchgraph.png" alt="Mismatch category graph"


/><br /> ; K ,
I 0 dminKo padrao para upload
Certi"\ue~se dc esta dc arquivos ainda e usado para
pasta do sewidor esta garantir ^vc a image* seja
liberada ?ara o triU ^ *ra*ada o kjar d e s c id o , 0 ^ ^ ^ #<>
r e * ar-y.i"> fossa ser ^ X -^ is ^ h ^ a p h ^
y w d o Mia. mde x a |D do usu| rio

edbo <h^>/l/]isat.hed tategory bre3kdo\Am:<A4V;


drav^bar^rapKWG, 2-^"0 , fda^j^y^totals, 5,
. .-^yrsmaUhjrapbiP^');
etho '<inr>o^srdWi. MAI^JXPDP^Ttt . f^EJ) KC4ser^jd;3 . mymismatdhojraphprig
'altwMiswatdh tatc^ory graphH /><br /> } f

'' jm-t-x .. rr jyQmesmo


mesmo nw
hOmtCwtv
dc r^UIVO
Podemos usar a IP <\w j usado para se de mir o
temos arma*enada em uma ^ da ^ <iw9>
vanave! de sesso- i^respondeivfce ao grito de
barras, no .dJo ttTW^i

O R1VG

Modifique o script My Mismatch para que ele gere grficos de barras nicos.
Modifique o script My Mismatch para que ele gere um grfico de barras nico para cada
usurio. Envie o script mymismatch.php para o seu servidor web, e depois abra-o em um
navegador. A pgina no ter nenhuma diferena visvel, mas voc pode visualizar o cdigo*
fonte dela para verificar que o grfico de barras agora tem um nome de arquivo nico.
visualizando seus dados... e mais!

Os usurios do Mismatch esto gostando dos grficos de barras


Resolvido o problema dos grficos de barras compartilhados, voc Wer agora esta
ajudou a eliminar um potencial gargalo de desempenho no longo pratitand alguns
prazo, quando mais e mais usurios se juntarem ao Mismatch e
tirarem proveito do grfico de "cinco graus de oposio". Agora, ovos passos tie dana
cada usurio gera o seu prprio grfico de barras ao visualizar o seu para tompartilkar ton
par imperfeito ideal. Felizmente, esse conserto pode ser feito nos o seu par-
bastidores, sem que os usurios, que so realmente as pessoas tirando
proveito dos dados do Mismatch para encontrarem seus pares,
ficassem sabendo.

1 3-mymismatchgraph. png


0 graifco de barras de ada
usuiri agora e ar^az-e^ad
em um arquivo prprio.
5-mymismatchgraph.png &

Ethel iem aigumas


pequenas duvidas sobre
esse negdio de wos
opostos se atraem", as
esta disposta a -P<3zV 16-mymismatchgraph.png
vr*a tentativa.
Owen j mardou ui*
endontro tem o seu par
impereito ideal, e esta
se arrufando para w*3
noitada a fiidade-

voc est aqui 653


sua caixa de ferram entas do php & m ysql

j S u a Caixa de Ferramentas do PHP & MySQL


J B M a la Os g rfic o s dinm icos abrem
wT todo tip o de possib ilidades
cArTDio a

W F in te re s s a n te s no que diz
re s p e ito c ria o de scrip ts PHP
para c ria r im agens a u to m a tic a m e n te .
Vam os re c a p itu la r o que to rn a tudo
isso possvel.

mmM
visualizando seus dados,,, e mais!

PalaVras C racas YHY f$QL


Quando voc realmente precisa de um rob, no tem
nenhum por perto. Bem, de qualquer forma o seu crebro
analgico ser capaz de resolver estas palavras cruzadas.

Horizontais Verticais
I. Esta funo grfica do PHP desenha uma linha. 2. O nome da biblioteca de grficos do PHP.
6. A representao visual usada para mostrar como os 3. Chame esta funo para fazer o output de uma imagem
usurios do Mismatch comparam-se uns com os outros, como PNG.
em termos das respostas s categorias. 4 .0 nome do par imperfeito ideal de Owen.
7. Para gerarmos grficos de barras individuais para cada 5. O Mismatch usa um grfico de barras para comparar
usurio do Mismatch, esta informao usada como usurios com base no conceito de "cinco graus de
parte do nome do arquivo para a imagem.
8 .0 Mismatch usa este tipo de array para armazenar os 9. Um teste usado para se distinguir entre pessoas reais e
dados para o grfico de barras. bots de spam automatizados.
10. Fornea-lhe dois pontos e esta funo grfica 12. Quando o PHP faz output de uma imagem, esta o
desenhar um retngulo. enviada diretamente para o navegador cliente ou ento
II. Para desenhar texto com uma determinada fonte, armazenada em um ....
chame a funo image...text().
13. Sempre apague a imagem da memria aps terminar
de trabalhar com ela no PHP, chamando esta funo.
14. Chame esta funo grfica para criar uma nova imagem.

voc est aqui > 655


palavras cruzadas php & m ysql- soluo

?alavVas Ovuladas & M/SoL


Soluo
RepUDlcctsio e S e V o s W e b

Interfaces com o Mundo

Existe um grande mundo l fora, mundo esse que a sua


aplicao web no pode se dar ao luxo de ignorar, ou que talvez
seja mais, voc que no gostaria que o mundo ignorasse a sua aplicao. Uma
excelente maneira de fazer o mundo not~la tornar os seus dados disponveis para
republicao, o que significa que os usurios podero assinar o contedo do seu
site, em vez de ter que visit-lo diretamente para encontrar novas informaes. No
apenas isso, a sua aplicao pode fazer interfaces com outras aplicaes, atravs
dos servios web, e pode tirar proveito dos dados de outras pessoas para fornecer
uma experincia mais rica.

este um novo captulo 657


espalhando a palavra alm do website do owen
Owen precisa avisar ao mundo sobre Fang
Um dos grandes problemas com que qualquer site precisa se deparar como
fazer as pessoas continuarem voltando. Uma coisa atrair um visitante;
mas faz-lo voltar ao site depois j outra histria. At mesmo os sites
com o co n te d o m ais atraen te p o d e m a ca b a r sain do d a m en te do usurio,
simplesmente porque difcil se lembrar de visitar um site regularmente.
Sabendo disso, Owen deseja oferecer um meio alternativo de visualizar os
relatos de abduo aliengena - ele deseja enviar automaticamente os relatrios
para as pessoas (algo conhecido como tecnologia "push), para que elas no
precisem se lembrar de visitar o site regularmente.

Os relatos de
abdues esto
chegando, mas ainda
no encontrei o Fang!
Parede Fa*$ o
avistado algumas vezes, as
essas m-lrormdoes amda
o permitiram *^ue o
localizasse-

0 -formulrio Reiaiar wa AbuttedfonAm&*30^^-


Abduo e st W*o*a*do
A *, ! OvJtW AMucted for: Alien description: V
e r-v e i^ fc a ^ ^ ix ane t It was a big r.or.-nxyctibie shiny disc fail of what appeared to be musaoed hbcr mi
atKa o site predisa a t
mais publididade-

a
Desde ultima vez. ^ue
vimos Ova*, ele driou uma O'*** espera <\ue uma mier
pa^iha para a visualizadas publididade para o site aumente
dot relatos de abdudoes suas dhandes de endowbrr Fa^-
submetidos pelos usurios.
republicaes e servios web

Envie dados sobre abdupes aliengenas para as pessoas


Ao enviar o contedo sobre as abdues para os usurios,
Owen estar, na prtica, criando uma equipe virtual de EnVIar contedo
pessoas que podem ajud-lo a monitorar os relatos. Com
mais pessoas trabalhando no caso, aumentam as chances de Web pata Ps
identificar mais avistamentos de Fang, e possivelmente de
encontr-lo. usuatlps uma
e x c e l e n t e fc ttT a
de obter mais
publicidade pata
A lguns clientes de email tm suporte ao
contedo "push", permitindo que voc

um Site,
receba atualizaes do site da m esm a
forma que recebe m ensagens de email.

M uitos navegadores web


tambm lhe permitem
exam inar contedo "pu sh " que
revela rapidamente a s notcias
m ais recentes publicadas em
um determinado site.
Ovifn ainda ^3 sabe
e*aiame*-te tor*o enviar
tontedo fava os usurios,
mas gostou *wu'rto da ideia
At m esm o dispositivos
m veis provem a ce sso a
contedo "push", o qual
enviado autom aticam ente
quando algo se modifica no
site.

espera <^ue a sua


equipe *H*ai de a^ailsias
dt abdu&s aume^ie as suas
handes de e ^ -b -a r Far.

voc est aqui 659


use RSS para republicar seu site

0 RSS envia contedo web para as pessoas 0 H TM L


A ideia por trs do conceito de publicar contedo HTML na web
que esse contedo seja visto pelas pessoas que visitarem o site. Mas e setVe pata
se quisssemos que os usurios recebessem nosso contedo sem ter V is u a liz a r;
de requisit-lo? Isso possvel com o RSS, um formato de dados que
permite aos usurios descobrir contedos web sem ter que visitar o site.
O RSS funciona mais ou menos como o equivalente web de um
aparelho gravador de vdeo digital (digital video recorder ou DVR).
serVe para
Os DVRs lhe permitem "assinar" determinados programas de TV, n p ti l c a t.
automaticamente gravando cada episdio assim que ele vai ao ar.
Por que ficar zapeando pelos canais em busca do seu programa
favorito, quando pode simplesmente deixar que eles sejam gravados
e entregues a voc por meio do DVR? Embora o RSS na verdade no
grave nada, ele semelhante ao DVR, no sentido que traz o contedo U<* leitor de notcias
web para voc, em vez de voc ter que ir atrs desse contedo. permite <\ue voCe assine
Criando um feed ou transmisso, RSS para os seus dados referentes determinados newseeds,
s abdues, Owen deseja notificar os usurios sempre que novos os e^uais Conte** tens
relatos forem inseridos. Isso ajudar a garantir que as pessoas originrios do Contedo do
permaneam interessadas, resultando em mais gente analisando os seu site
dados. O legal que o mesmo banco de dados pode alimentar tanto
a pgina web quanto o feed RSS

A liens Abducted M e ANens Abducted Me - Newsieed


Wdtiamc, harc ycu to
Report ft towel
x with cxmmresoiak? Were yon abdncmJ' H a^yoa seen my sW
_ "P'BC?ilu0mM ,.wt"bu3s 's h> *>-
xrC
M ostr ii reported abdwsiot*

2008-06-2 1 : Bdita Ctev?

2008-05-11: Salty Jew


Abducted tor:: ASen dontpOna:


..-------- Raw^
DO" 0 u s ,,,, * * * * 1 M * tforrhtyg m ja o u s .... .. .... ..........
ldaf puaw rixTCcroles
idis
A]f N ad
2 9 6 M 7 -1 2 : AIT er
ader .................. ..... ............. .. . ........................ -

19914)9-14:DoQusyl* .... ..... ... ................. ........ ' ............... .......

UW-Ol-Zl: Rids ....


Ttey w creiay i IBmteDHS, and aw voy forgrjini

Embora a p^ma web seja gerada o leitor de notiCias


dinamicamente a partir de dados do interno do navegador
banco, vote precisa revisita-la para v se
Sa-fari esta sendo usado-
existem novos dados publicados.
O RSS oferece uma visualizao de dados web para os usurios automaticamente, logo que
algum novo contedo disponibilizado. Uma visualizao RSS sobre um determinado
conjunto de dados chama-se feed RSS ou newsfeed. Os usurios assinam o feed e recebem
novo contedo logo que este postado no site - no preciso visitar o site.
Para visualizar um feed RSS, a pessoa s precisa ter um leitor de notcias (newsread) RSS.
A maioria dos navegadores e clientes de email mais populares oferece o recurso de assinar
feeds RSS. Basta fornecer ao leitor de news a URL do feed, e ele faz o resto
republicaes e servios web

0 RSS na verdade XM L 0 IlSS uma


O RSS parecido com o HTML, no sentido que uma simples
linguagem de markup de texto, que usa tags e atributos para lin g u a g e m
descrever o contedo. O RSS baseado no XML, que uma matkup usada
linguagem de markup geral que pode ser usada para descrever
qualquer tipo de dados. O poder do XML advm da sua p a t a c e s c v e V e f
flexibilidade - ele no define tags nem atributos especficos;
apenas estabelece as regras para o modo como tags e atributos co n te d o W eb a
so criados e usados. Fica a cargo de linguagens especficas,
como o HTML e o RSS, estabelecer os detalhes referentes
quais tags e atributos podem ser usados, e como.
set nofllcado.
Para ser proficiente com o RSS, voc precisa primeiro entender
as regras fundamentais do XML. Essas regras se aplicam a todas
as linguagens baseadas no XML, incluindo o RSS e a verso
moderna do HTML, conhecida como XHTML. Essas regras
so simples, porm importantes - o seu cdigo XML (RSS) no Interveio! No ha
funcionar se voc as violar! A vo elas: "final wfnncto par.
ll
I V r Tags que possuam contedo precisam aparecer em pares.
< p > P h o n e h o m e !< /p >

Indorret! h a$ vazia prensa de wm


espado e uma brra antes do > ^ Correto.

Tags vazias (sem contedo) precisam ser


programadas com um espao e uma barra ao final, Correio.
<br />
antes do fechamento do comando.
torrct/ 0 atributo predisa
estar denhro de aspas dwplas.

pV ^ ni , Jir ..
| T o d o s os valores dos atributos precisam estar dentro de
aSpaS dUplaS. <mg i r e - " :e:'.. :.f " />

O X M L uma Ao dontrrio do PttP)


i0 -i K permte usar aspas dupias
lin g u a g e m m a tk u p ^ ?les
a maioria das
Correto-
7763- Tn itu^oes, O ''fyo 30
u sa d a p a ta ^ pa-mitir aspas duplas para

descieVet qualquer valtfrcs dos at)riktM'


tipo de dados.
voc est aqui 661
no existem perguntas idiotas sobre RSS

nb existam
perguntas idiotas
X Por que usar o R S S to melhor do que ter as pessoas
acessando o meu site?

Se as pessoas regularmente visitarem o seu site e procurarem


o contedo mais recente, ento usar o RSS no teria nenhum
benefcio adicional em relao simplesmente exibir o contedo no
site. Mas a maioria das pessoas se esquece dos sites, at mesmo
dos que elas gostam. Assim, o RSS fornece um meio eficiente de
levar o seu contedo diretamente s pessoas, em vez de exigir que
elas o procurem.

" P - O que significa a sigla R S S ?

Hoje em dia, RSS significa Reaiy Simple Syndication


("Republicao Realmente Simples"). Ao longo da sua histria, tem
havido diferentes verses para a sigla, mas a encarnao mais
recente do RSS (verso 2.0) significa "Republicao Realmente
Simples", que a nica coisa com que voc precisa se preocupar.

" P Do que consiste o R S S ?

O RSS um formato de dados. Assim como o HTML um


formato de dados que lhe permite descrever contedo web para
visualizao em um navegador, o RSS um formato de dados
que descreve um contedo que fica acessvel como um newsfeed.
Semelhante ao HTML, o formato de dados do RSS puro texto, e
consiste de tags e atributos usados para se descrever o contedo de
um newsfeed

~ P * Onde eu consigo um leitor de R S S ?

A maioria dos navegadores web tem um leitor de RSS interno.


Alguns clientes de email tambm incluem leitores de RSS, em cujo
caso os itens RSS aparecem como mensagens de email em uma
pasta especial para eles. Existem tambm leitores de RSS autnomos.
republicaes e servios web

Segue abaixo um cdigo RSS para o newsfeed Fui Abduzido porAliens.


Escreva comentrios para as partes marcadas do cdigo, explicando o que
fcccio voc acha que cada tag est fazendo.

<?xml version="l.0" encoding="utf-8"?>

Abduzido por Alies - Newsfeed!


ttp://aliensabductedme.com/;
elatos de abdues aliengenas em todo o mundo, cortesia
de Owen e seu co abduzido Fang.f

fBelita Chevy - Uns carinhas bem bagunados, sem rit...

IHfSU*. ...... -
Jfhttp ://www.aliensabductedme .com/index.php?abduction id=7ffi||lijfM|l|
Mmnrn
jii!s!iuil;ilsliJ|Sat, 21 Jun 2008 00:00:00 EST:

Tentaram me fazer tocar msica ruimJI

= Sally Jones - verdes com seis tentculos.. .sfPffcitle^


m w m *
^lljhttp://www. aliensabductedme.com/index .php? abduct ion_id=8|||2nk>
1|sun, 11 May 2008 00:00:00 ESTllffliSttlil1
lljlIlfU,Jos so, , , !L " l l i l i ^ l l l l i i
conversamos e brincamos com um caolpr
ft

voc est aqui 663


o cdigo RSS comentado

Segue abaixo um cdigo RSS para o newsfeed Fui Abduzido por Aliens.
Escreva comentrios para as partes marcadas do cdigo, explicando o que
voc acha que cada tag est fazendo.
^ eW cC O i j ? * ^ A a tag -
C ai T *!i ^ \ue indica <^e
0 (.u 3 O este do^umem-to Contem td igo )</V|L.
<?xml version=,'1.0" encoding="utf-8"?>
i s tr:r s i o n~" 2 ' Esta tag <title> aplica-se
/ do danai tomo um todo-
<hannei>
mmppi ^ ?ara 0 normal/e
<*ti't:Ie>Fui Abduzido por Alies - Newsfeed|||,|||||li^' aponta para o site *ieb
..:.p://aliensabductedme .c o m / | | S l i | l l l assoCiado tom o newseed
<link>h4

<desci;itliQ^iRelatos de abdues aliengenas em todo o mundo, cortesia

j,iiIp1|W|111!II11m|m;
de Owen e seu co abduzido Fang. Todo canal precisa de uma
abdueted dog Fang.|i|^|eg||||^tv! ^ _____ descrio ? T ,',Jr "V* bf0
f^anguage>en-us|lilpMI| *
de tontedo ele c e r e U -
Os news+eeds podem ser Criados
m di-ferentes Ifnguas - esta tag
estabe/ece a lngua do canal-
<title>e_i '_a Chevy - Uns carinhas bem bagunados, sem rit...
<.1ink>h
..t.p://www.aliensabductedme .com/index .php?abduction_id=7S|fp|:hk?>
liiiMl
t.e>Sat, 21 Jun 2008 00:00:00 EST</;piub:I^|||j lllltiiiS
lli:
<desorp^i . me fazer tocar msica rui
</item> 0 nome do abduzido e os dados re-ferentes
a descrio dos aliens sao combinados para
| itin> -formar o ttulo de cada item de notfciasN

<ti t :.e;>3ally Jones - verdes com seis tentculos./


^nki^http://www.aliensabductedme.com/index.php?abduction_id=
:;UHI,|
<pubDate>Sun, 11 May 2008 00:00:00 EST
........ ; tts
*\
<dfes'ci
ipt;i:
on>Ns s conversamos e brincamos\com ition>

Este dodumehto RSS Contem


apenas um canal) o <^ue e A data especiitada na 0 link para um /
perfeitamente aceitavel tag <pubPate> segue determinado item de
caso voce no precise dividir o ormto RFC2-2- notcias geralmente
os itens de notcias em para a data e bora, aponta para o
<yhaaiSSlf dierehtes categorias. yue e um padrao para
se representar essas
Contedo Completo
do item, presente no
</.rss>r ^Toda tag /ML- precisa
in-formoes Como site associado com o
ter uma abertura e um
te*to. news-feed-
-fechamento esta tag
de -fechamento -finaliza o
__ documento RS>-------------
republicaes s servios web

Ok, ento o RS5 na verdade XML,


o que significa que apenas um monte de
tags. Isso parece bem fcil. Ento tudo o
que temos de fazer para criar um newsfeed
apenas criar um arquivo XML, certo?

Sim, m ais ou m enos isso. Mas em geral no se


cria cdigo XM L m o, e freq u en tem en te esse
cdigo no arm azenado em arquivos.
E verdade que o XML pode e frequentem ente armazenado
em arquivos. Mas, no caso do RSS, estamos falando de dados
dinmicos que se modificam constantemente, portanto no faz
sentido armazen-los em arquivos - eles rapidamente ficariam
desatualizados e teramos de ficar sempre reescrevendo no
arquivo. Em vez disso, queremos um cdigo XML que seja
gerado automaticamente a partir de um banco de dados, que
o modo como a verso HTML da pgina Fui Abduzido
por Aliens j est funcionando. Assim, queremos usar o PHP
para gerar dinamicamente o cdigo RSS (XML), e envi-lo
diretam ente a um leitor de notcias RSS conforme desejado.

voc est aqui 665


explicando RSS news reders

Po banco de dados para o news reader A un? 49


Para fornecer ura newsfeed dos dados de abdues, Owen precisa
gerar dinamicamente o cdigo RSS a partir do seu banco de dados
ne\Vs readet
MySQL. Esse cdigo forma um documento RSS completo, pronto para
ser consumido pelos news readers (leitores de notcias). Assim, o PHP
flSS consumir
usado para traduzir os dados puros referentes s abdues para o
formato RSS, que ento pode ser processado pelos news readers (leitores 9s dados
de notcias) e disponibilizado para os usurios. A parte realmente legal d is p o n ib iliz a d o s
desse processo que, uma vez disponibilizado o newsfeed em formato
RSS, tudo o mais automtico - funo do news readers (leitores de
p p t um
notcias) mostrar os itens atualizados assim que eles aparecem.
a li e n s a b d u c tio n
n e W s e e d R S S .

Nader 200-07-12 a t least


Alt
12
O PHP usado
Quayie 1991-09-14 37 They looked like
donkeys made
para gerar um
seconds
o u t o f metal... documento
Rick Nixon 1969-01-21 nearly 4 R S S a partir de
years
um banco de
Clumsy little
dados MySQL.
Chevy 2008-06-21 alm ost
Belita buggers, had no
a w e ek
rhythm .

fo u r green w ith six W e ju st ta lked


Jones
<?xml version-"! . 0"encoding="utf-E
<rss version="2.0">
<chennel>
<title>AlienS Abducted Me - Kewsfegd</title>
ink>http://aliensabductedrce.com/</lin]t>
<descriPtion>Alien abduction repo-ta fromaroinH
aodacted dog Fang. </description> dhv.e wor^acourtesy of Owenand his
<language>en-us^/lanquacre>
O leitor
<iten>
sabe com o
interpretar
o s itens de
ri>Triedt09etmet0playbad^ slc-</descript.cn> .
notcias
individuais
no cdigo
XML, e com o 1:00
l:ooaw
mostr- 1:00AM
Cada item de notcias
los para o 1
individual te a sua
usurio.
prpria se^lo ho
doCumento RSS.
sfce lerbor de
wyfccias parte CV'.
integrante do ; Cada leitor d t noticias
aplicativo Mail japresenta os itens dt
; Tiew3etw1CttYl>
A/Jac 0S y.- Muitos ! yma ov-wa dvferent -
owtros aplicativos neste a^uij os itens sao
de email populares exibidos praticamente
tmbcm inclue da mesma om a <\ue
leitores de noticias. mensagens de email-
republicaes e servios web

Para se criar feeds RSS, preciso entender a linguagem RSS, e


para isso preciso conhecer as tags usadas para se descreverem
os itens de notcias. Ligue cada tag RSS sua descrio

<rss> Esta tag no tem nada a ver com o RSS. Mas pelo menos
ela seria um nome legal para algum item de dados!

A data de publicao uma informao importante para


<c|i3nne]>
qualquer item de notcias, e esta tag usada para especific-la.

Esta tag representa um canal em um feed RSS, e age como um


<c.rpnk!te> Container para dados descritivos e itens de news individuais.

Representa um item de notcias individual, ou histria, que


descrito com mais detalhes por elementos subordinados.

Esta tag sempre contm uma URL que serve como o link
<languae> para um canal ou item de notcias.

Delimita o feed RSS inteiro - todas as demais tags


<linlo precisam estar dentro desta.

Esta tag armazena o ttulo de um canal ou item de notcias, e


<descripton>
geralmente usada dentro das tags <channel> e <item>.

<pubDate> Usada para se fornecer uma breve descrio de um canal ou item


de notcias, aparecendo dentro das tags <channel> ou <item>.

Esta tag se ap lica a um can al, e especifica a lin gu agem u sad a p o r


ele, como por exemplo, en-us para o ingls americano.

voc est aqui 667


quem faz o que soluo

Todo eed RSS


Consiste de pelo Para se criar feeds RSS, preciso entender a linguagem RSS, e
menos um canaL para isso preciso conhecer as tags usadas para se descreverem
e^ue c basicamente os itens de notcias. Ligue cada tag RSS sua descrio
um grupo de
A tag <rss> a Vaiz. do documento RSS - todas
itens de notis
as outv-as tags pvecisam aparecer dentro dela-
relacionados.

<rss> Esta tag no tem nada a ver com o RSS. Mas


pelo menos ela seria um nom e legal para
algum item de dados!
A data de publicao uma informao
^anne)>
im portante para qualquer item de notcias, e
esta tag usada para especific-la.

Esta tag representa um canal em um feed RSS, e


<cronkite> age como um Container para dados descritivos e
itens de notcias individuais.

Representa um item de notcias individual ou


<ttle-> histria, que descrito com mais detalhes por
Esta tag elementos subordinados.
usada nos canais, -y
Esta tag sempre contm uma URL que serve
<lCLgUlge> como o link para um canal ou item de notcias.

Delimita o feed RSS inteiro - todas as demais


<l!nk> tags precisam estar dentro desta.

Esta tag armazena o ttulo de um canal ou item


cdescrffJtPTL de notcias, e geralmente usada dentro das
tags <channel> e <item>.
Esta tag s se aplica a
itens de news.
Usada para se fornecer uma breve descrio
<putDct:e>
de um canal ou item de notcias, aparecendo
dentro das tags <channel> ou <item>.

Esta tag se aplica a um canal, e especifica a


<jtelT3>
linguagem usada por ele, como por exemplo, en-
us para o ingls americano.
tags <titie>, <link>, <pubDate> e
<description> so usadas dentro de <item>
para descrever um item de notcias.
republicaes e servios web

m
Visualizando -XM t
Voc j aprendeu que o cdigo XML consiste de tags, s quais so tambm conhecidas
como elementos, que formam relacionamento pai - filho (parent - child), dentro do
contexto de um documento XML completo. E bastante til visualizar essa relao,
medida que voc trabalha com cdigo XML. Como um exemplo, o documento RSS da
pgina anterior pode ser visualizado como um a hierarquia de elementos, mais ou menos
como uma rvore genealgica dos dados do newsfeed, com os elementos "pais" no alto,
descendo at os elementos "filhos".
0 elemento do
topo e a raiz-
Os elementos de ttulo, Imk, Os elementos de
d documento,
descrio e idioma para um ca>*! titulo, link, daa
c^ue signiiC \ue
aparecem ao lado dos itens de de publicao
noticias, Como -Pilhos do elemento
ele e o pai de
descrio de uma
todos os outros
canal. notcia aparecem
elementos.
Coho -filhos de um
elemento item.

Segue abaixo um relato de abduo novinho em folha, que foi adicionado


ao banco de dados aliens_abduction. Escreva o cdigo XML para uma tag
<item> RSS para este relato, certificando-se de obedecer ao formato RSS para
RCCIO newsfeeds.

aliens abduction
r.i
abduction. how_
tong
illlliiililjlS flfISI ' 'V

14 Shill Watner 2008-07-05 2 horas no sei uma luz Eles me


brilhante no transportaram
cu... at um posto
de gasolina...

voc est aqui 669


exerccio soluo

Segue abaixo um relato de abduo novinho em folha, que foi adicionado ao banco de
# dados aliens_abduction. Escreva o cdigo XML para uma tag <item> RSS para este
!R C |C |0 reato, certificando-se de obedecer ao formato RSS para newsfeeds.

olu3 o
aliens abduction
iPPi
"liBiiliSf1PB' i;- - ny f l i t Sk IP
m
14 Shill Watner 2008-07-05 2 horas no sei Apareceu uma Eles me
luz brilhante no transportaram
cu.... at um posto
de gasolina....
A tag <item> delimita <pubDate> e <des.ripto*>

W W .r. Aparedeu uma luz- brilhante h tu. </title>


<!mk>h'tt^f//www.alicn^bl(^^dmc.<^/ttdc>i:php?abdw^ior^id=^h<:/li,rk A tag <pub>ate>
<pubPate>at, 05 Oul 1 0 0 9 0 0 :0 0 -0 0 ET</PubDatc> - e ----------
.................................................................................................. fiorn o miusduloj
<de^riptioh>Eles me t^wpo^y-am ate um posto de gasolma;. </desdnpti( portanto vote no pode
</rtem> esrever <pubdate>, nem
<PWBDAT>.

na? existem
Fergurttas I d io ta s

" P - 0 XML case-sensitive? T * * Um feed RSS pode conter imagens?

R : Sim, a linguagem XML case-sensitive, portanto faz K : Sim. Apenas tenha em mente que nem todo leitor de
diferena se o texto est em maisculas ou minsculas quando noticias capaz de exibi-las. Alm disso, no RSS 2.0, voc
voc especifica tags e atributos XML. Um bom exemplo a tag s pode adicionar imagens a um canal, e no a itens de
RSS <pubDate>, que precisa aparecer exatamente dessa forma, notcias individuais. Para isso, usa-se a tag <image>, que
com o D maisculo. A maioria das tags XML escrita totalmente precisa aparecer dentro da tag ^ h a n n e k Eis um exemplo:
em minsculas ou ento misturando minsculas com maisculas.
<image>
?: E quanto ao espao em branco? Como ele tratado <url>http://www.aliensabductedme.com/fang.
em XML?
jpg</url>
<title>My dog Fang</title>
<link>http://www.aliensabductedme.com</
H : Antes de mais nada, o espao em branco consiste,
link>
em XML, de carriage returns {\ r), newlines (\ n), tabs (\ t) e </image>
espaos ( " ) . A maioria dos espaos em branco em quase
todos os documentos XML serve apenas para melhor esttica, tecnicamente possvel incluir uma imagem em um item
como por exemplo, a indentao de tags subordinadas. Esse de notcias no RSS 2.0; o truque usar a tag HTML <img>
espao em branco "insignificante" ignorado pelas aplicaes dentro da descrio do item. Embora seja possvel, isso
que processam dados XML, tais como os leitores de notcias requer que voc codifique a tag HTML usando entidades
RSS. Porm, o espao em branco que aparea dentro de uma XML e, de muitas formas, vai contra a premissa dos itens
tag considerado significativo, e geralmente interpretado RSS serem contedo de puro texto.
exatamente como aparece. Isso permite que coisas como
poemas, onde existem espaos em branco significativos,
possam ser representados de forma precisa em XML.
republicaes e servios web
H S S iW e k J o

Na entrevista desta semana:


O que interessa a um comunicador

Use a Cabea: Fiquei sabendo que, quando consumido por leitores de notcias. Use-me
as pessoas procuram por notcias na web, elas para armazenar dados, e os leitores de notcias
consultam voc. Isso verdade? podero acess-los na forma de notciasfeeds.
RSS: Suponho que depende do que voc Use a Cabea: Ok, ento de que formas voc
considera como "notcias". A minha funo diferente do HTML?
principal empacotar informaes em um RSS: Bem, ambos somos formatos de dados
formato prontamente acessvel para os leitores em modo texto que se baseiam, em ltima
de notcias. Agora, se esse contedo qualifica anlise, no XM L, o que significa que ambos
como "notcias" ou no... algo fora do meu usamos tags e atributos para descrever dados.
controle. Fica a cargo das pessoas decidirem. Porm, enquanto que o HTM L foi elaborado
Use a Cabea: E quando se refere a "leitores especificamente para ser processado e
de notcias", voc est falando dos indivduos interpretado por navegadores web, eu fui
que lem o contedo, certo? criado para ser processado e interpretado por
RSS: No, eu me refiro a ferramentas de leitores de notcias. Voc poderia dizer que ns
software que entendem o que eu sou e oferecemos diferentes pontos de vista sobre os
como represento os dados. Por exemplo, mesmos dados.
vrios programas de email tm suporte ao Use a Cabea: Mas eu j vi alguns
meu formato, o que significa que voc pode navegadores web capazes de exibir
assinar um notciasfeed e receber atualizaes notciasfeeds. Como isso funciona?
praticamente da mesma forma como recebe RSS: Boa pergunta. Ocorre que alguns
mensagens de email. navegadores incluem leitores de notcias
Use a Cabea: Interessante. Mas ento de que internos, portanto, eles na verdade, so duas
formas voc diferente do email? ferramentas em uma s. Mas quando voc
RSS: Ah, eu sou muito diferente do email. Em visualiza um notciasfeed em um navegador, est
primeiro lugar, as mensagens de email so enviadas olhando para algo completamente diferente de
de pessoa para pessoa, e geralmente fazem parte de uma pgina HTML.
um dilogo bilateral. Assim, voc pode responder Use a Cabea: Mas a maioria dos notciasfeeds
a uma mensagem de email, receber uma resposta tem links para pginas HTML, certo?
a ela, etc. Eu apenas comunico unilateralmente, de RSS: E verdade. Portanto eu trabalho lado a
um site web para um indivduo. lado com o HTML para fornecer um melhor
Use a Cabea: Como isso tom a a acesso a contedos web. A ideia que voc pode
comunicao unilateral? me usar para saber mais sobre novos contedos
RSS: Bem, quando uma pessoa decide receber sem precisar ir at o site diretamente. Ento, se
um notciasfeed, assinando-o no seu software vir alguma coisa sobre a qual queira ler mais,
leitor de notcias, ela est dizendo basicamente voc clica para acessar a pgina propriamente
que deseja ser informada sobre novos dita. E por isso que cada item de notcias tem
contedos que sejam publicados em um dado um link.
site. Quando esse novo contedo publicado, Use a Cabea: Ento voc uma espcie de
eu me certifico de que ele seja traduzido para preview para pginas web.
um formato tal que o software leitor de notcias RSS: Sim, algo assim. Mas lembre-se de que eu
fique sabendo que ele existe, e o mostre para vou at voc, voc no precisa vir at mim. E
a pessoa. Mas essa pessoa no tem a chance de isso q u e as pessoas realm en te ap reciam a m eu
responder a um item de notcias, e por isso se respeito - eu lhes economizo o trabalho de ter
trata de uma comunicao unilateral, de um de revisitar os sites para se manterem informadas
site para um indivduo. sobre novos contedos.
Use a Cabea: Entendi. Ento o que voc Use a Cabea: Entendi. Isso realmente
exatamente? conveniente. Obrigado por nos esclarecer sobre
RSS: Na realidade sou apenas um formato o seu papel na Web.
de dados, uma forma de armazenar contedo RSS: O prazer foi meu. At mais.
de modo que ele possa ser reconhecido e
voc est aqui > 671
gerando RSS com PHP

(rere um feed RSS dinamicamente O new sfeed


resultante no
Entender o formato de dados do RSS muito bom, mas Owen arm azenado em um
ainda precisa de um newsfeed para levar os relatos de abdues arquivo, mas sim
aliengenas para as pessoas. E hora de colocar o PHP em ao e em um docum ento
gerar dinamicamente um newsfeed cheio de dados de abdues,
retirados do banco de dados MySQL de Owen. Isso pode ser XM L.
realizado atravs de uma srie de passos:

Q Definir o tipo de contedo do documento como XML.


<?php header('Content-Type: text/xml1); ?>

Nas temos de deihrv o tipo de


Cofieudo do dodumet RSS Como
XML-, usando um abealKo.

Gerar a diretiva XML para indicar que este um documento XML.

<?php echo '<?xml version="l.0" encoding="utf-8?>'; ?>

e Gerar o cdigo RSS esttico que no vem do banco de dados, como a


tag <rss> e as informaes do canal.

<rss version="2.0">
<channel> y ste tdiy> *#o e aetado pelo ba^o
<title> ... Z de dados - ele e sempre o mesmo para
<link>... este news-feed
<description>...
<language>...
Consultar o banco de dados a!iens_abduction para obter os dados.
Awtes de $err o
abdnction__id tod io RSS para itens
first_name laat- n ^ de nottis, prefiisamos
when_it_happened alien_descript.ion fio^sultr o bano
what_they did s Ih de dados My($L
para obter os dados
reeretes s abdues.
Fazer um loop atravs dos dados, gerando cdigo RSS para cada item
de notcias.
<item>
<titie>... i fcste fiodigo do*tem dados extrados
<iink> . . . do baneo, e portanto, ele prefiisa ser
<pubDate>...
elaborado uidadosamehte-
<description>...
</item>
Gerar o cdigo RSS esttico necessrio paro finalizar o documento,
incluindo as tags de fechamento </channel> e </rss>.
</channel>
</rss>
republicaes e servios web

im s d G eladeira do f H p & M /S q L (& X M L !)


O script de newsfeed RSS de Owen (newsfeed.php) ainda precisa de algumas partes
importantes do cdigo. Escolha com cuidado os ms apropriados para completar o
cdigo e gerar o newsfeed dinamicamente.

8
<?php header('Content-Type: text/xml1); ?>
<?php echo '<?xml version="l.0" encoding="utf-8"?>'; ?:
<rss version='2.0>

<title>Fui Abduzido por Alies - Newsfeed</title>


http://aliensabductedme.com/ newsfeed. p
<description>Relatos de abdues aliengenas em todo o mundo, cortesia de Owen e seu
co abduzido Fang.</description>

< ?php
require_once("connectvars-php');
// Conecta-se ao banco de dados
$dbc = mysqli_connect(DB_H0STf DB_USER, DB^PASSWORD, DB_NAME);
// Obtm os dados dos avistaxnentos de OWIs a partir do MySQL
$query = "SELECT abduction_id, first_name, last_name, " .
"DATEJFORMAT(when_it_happenedf%a, %d %b %Y IT1) AS when_it__happened__rfc, " .
alen_description, what_they__did " .
} "FROM alrens_abduction " .
"ORDER BY when__it_happened .......
$data = mysqli_query($dbc, $query) ;
// Faz um loop atravs do array dos dados dos avistamentos, formatando-os como RSS
while ($row = mysqli_fetch__array ($data) ) {
// Exibe cada linha como um item RSS
echo ...... ...';

0 echo 1 <title>' . $row[first_name'] . 1 ' , $row['last_name'] . ' - ' .


substr ($row['alien_description'] , 0, 32) . 1...</title>*;
echo ' <link>http://www.aliensabuctedme.com/index.php?abduction_id=' .
$row[ '] . '</link>';
echo '............ ' . $row['when_it__happened__rfcf] . r ' . date('T) . .....
echo 1 <description>' . $row['what_they_did'] . '</description>';
echo '</item>';
}
?>
</channel>

voc est aqui > 673


,ms do php & mysql & xmi Soluo

if l s cie G elad eira do P H ? & M /S Q L


(& X M L J ) - S p Ju ^ o

0 script de newsfeed RSS de Owen (newsfeed.php) ainda precisa de algumas partes


importantes do codigo. Escolha com cuidado os ms apropriados para completar o
codigo e gerar o newsfeed dinamicamente uub para completar o

<?php header('Content-Type: text/xml'); ?> D e -or**>a s c m c tK n ie a o


<?php echo <?xml version="l.0" encoding="utf-8" ?>'; ?> ^
<rss version="2.0"> e x e m p lo d o C A P T C H A f a v a
Caz^v , - t p pft
<channel> esie dabeaSHo -(W com ue
o o u p u t cio s c r i p t s e ja w
<tite>Fui Abduzido por Alies - Newsfeed</title> douienio XML.
|^<li|Qj^J|;http: //alensabductedme.com/ newsfeed P
<dscriptin>Relatos de abdues aliengenas Lundo, cortesia de Owen e seu
co abduzido Fang,</description>

<language> sa-ns.. . </langruage> I

<?php
require_once('connectvars.php');
//' Conecta-se ao banco de dados
$dbc = mysqli connect(DB_HOST/ DB_USER, DB_PASSWORD, DB__NAME) ;
// Obtm os dados dos avistamentos de OVNIs a partir do MySQL
$query = "SELECT abduction_id, first_name, last_name, " .
"DATEIFORMAT(when_it_happened,'%a, %d %b %Y %T) AS when_it_happened_rfc, " .
alien__description, what__they__did " .
"FROM aliens__abduction " .
"ORDER BY when^it^happened 1 DESC Kr ;
$data = mysqli_query($dbc, $queryj7^
// Faz um loop atravs do array dos dados dos avistamentos, formatando-os como RSS
while ($row = mysqli__fetch_array ($data) ) {
// Exibe cada linha como um item RSS
echo ' <item> K ;
echo ' ^ ^ ^ ^ W $row [first__name'] . ' ' . $row [1last_name1] . ' - ' .
substr($row['alien_descriptionT], 0, 32) . '...</title>1;
echo ' <link>http://www.aliensabductedme.com/index.php?abduction__id=' .

. '</link>;
row ['when_it_happened__rfc 1] . 1 1 date (

echo <description>1
echo </item>';

</channel>
republicaes e servios web

T fe S T O r v e

Adicione o script do N ew sfeed RSS pgina Fui Abduzido por Aliens.


Crie um arquivo de texto chamado newsfeed.php e digite o cdigo para o script de
Newsfeed RSS de Owen, que voc viu no exerccio dos Ims (ou baixe o script no site
da Alta Books, em www.altabooks.com.br) .
Envie o script para o seu servidor web, e ento abra-o em um leitor de news. A maioria
dos navegadores web e alguns clientes de email lhe permitem visualizar newsfeeds,
portanto voc pode tentar um deles primeiro, caso no tenha um aplicativo de leitura
de notcias (newsread) autnomo. O script Newsfeed dever mostrar as abdues mais
recentes, retiradas diretam ente do banco de dados. Se o seu
rtave^ador
ehdwtvav
di-Pidulddes
para visuliaar o
MeinhoEd Ressner - They w ere in a sh ip th e size o f ... Al1 1ft MS

Carted Tie T) She Bp oMiTKu^tain and dK.ppJd me off.


hews-Peed, enie
usar -Peed:/ / n
Mickey M ike* - Huge h **d a , * k in n y arm s and lags.
Read irystn d ,
URL, no uft3r de
S h ill W atner - There waa a b rig h t lig h t ire the ..
http://.
Tiey beamed not. viw.ira a gas station fcn dessrt
0 siHpi
B e lita Chevy - Clum sy tittle b ug gers, had iw rh..
Tr ee 23 get me KJ stay bad m use R sas fia ris..... news-feed-
S a lly Jones - green w llh s ix ten ia cle s..
pkp gera Mn
Vie ;ust talked m i pttyad with z og BfiSlBSSiu dodumehio de
A if Nader - it w as a b ig non-recycla bie s h in ... ", o s .-im m ews-feed RSS
lijn K a rs * * sky anS sn r J up w l- no warning. B a M ^ e pode ser
,ey looked lik e donkeys made d u ... 3s 14. i. r m m ^isuaizdo por
potato wfien -Zwoosh^, Site eam af light Jca* me away.
<\ual^uer lerfcor
de ho-bVis.

Basta coiocar um link para ele na hom e page.


No se esquea de que newsfeed.php um simples script
PHP. A nica diferena entre ele e a maioria dos outros
scripts PHP que voc viu ao longo deste livro que ele
gera um documento RSS, em vez de um documento
HTML. Mas voc ainda o acessa da mesma forma que
qualquer outro script PHP - basta especificar o nome dele
em uma URL. O que Owen ainda precisa de uma forma
de compartilhar essa URL com as pessoas que visitam o
seu site. Isso feito sem muito esforo, colocando-se um
link para o script news f e e d . php, no servidor de Owen.

voc est aqui 675


fornecendo um link rss

Crie um link para o feed RSS


E importante fornecer um link bem chamativo para o Existe um cone
0

newsfeed do seu site, porque muitos usurios iro apreciar


ilS S padro para
que voc esteja oferecendo esse tipo de servio. Para ajudar os
usurios a acharem facilmente o feed RSS do site, existe um
to r n a r m a is d a t p
cone padro que voc pode usar para chamar a ateno para
o feed. Podemos usar esse cone para criar um link newsfeed
na parte de baixo da home page (index.php) de Owen.
aPS seus usutlps
<Jue Voce oetece
um neWseed ilSS
ste tone esta disponvel
en> todos os -tipos de Para baixar (ma
tacanhos e -or*atos^
deledo de dones RSS
<yrios, ras a aparecia
de di-Perenies dores e
c sempre a wesa~
formados, acesse WWW.
-Peedions.om
rssicon.png

A URL do news-Peed apegas o sdrtpt


wrwseed php, <y*e s u*do*ar se o
sdrip-t estiver armazenado *a mesa
<p> pasta < \*t a pajina web principal
<a href="l
<img style="vertical-align:top; border:none" 0 link tt/vnx para
s r c = " " alt-"Syndicate alien abductions" />
o news-Peed idlui
Click to syndicate the abduction news feed.
um feohe RSS e um
</a> ^ --------
tex-bo desdritivo.
</p>

Aliens Abducted M e
___ w t o ,. .M i r t n i i Hume vnu seen my abductedjdog. Fang?
Wdonne,Ii^youhadnHicoiuawsiiiaOTBEjicsijais7WeieyoiiaDQuaeu
R eport it here!
M ost recent reported abdactions:

2 ( K ^ - 6 8 'ie : M e in h o ld R e ssn e r F a n s spotted*.


A bducted ta t-. Alien description:
3 houis They were in a ship the of a fiill n ay .
Y^d^MikBS.. iFang spotted:
Abducted for: A l u description: yes
45 minutes Huge heads, skincy arms gad legs
20GM7-<!5l Sliill Watner ;Fiui{apotted:
Mm lihk dhma-tivo) Ahducted for. Alien description: yes
l2Uoure TheKw^abogMJ^tinJhesky.&Howcdbyabfnkortwo.
a pajina Fui 2tM46-21: B eK ta Chevy........ .. Fafi spotted:
Abduzido por :Abduced for: Afiea d esafytten:
ialmosta w<*lc C toB syattebB ggH S,hadnoA ytiun.
Aliens oierede aos 2QGiM>5- n : Sally Joues Fans; spotted:
A bducted ta r . A lim description: y.....
visiianies um 1 day green with a x teotactes
-Porma rapida de O Click to syndics!* the ahdactsoa news feed.
adessar o news-feed
republicaes e servios web

T fe S T O r v e
Adicione o link newsfeed Home page do site Fui Abduzido por Aliens.
Modifique o script index.php do site Fui Abduzido por Aliens, de modo que ele passe a ter
um link para o newsfeed na parte de baixo da pgina. Baixe tambm a imagem rssicon.png,
como parte do cdigo para este captulo, no site da Alta Books em www.altabooks.com.br.
Envie o script index.php e a imagem rssicon.php para o seu servidor web, e depois abra o
script em um navegador. Clique no novo link para visualizar o newsfeed RSS.

Com todas essas


abdues acontecendo,
estou sempre atenta
para os O V N Is.

3 RSS
os novosvelatos
de abdues
enviados fav-a os
assinantes, se
yue eles -tenha
de visrtar o si-te
Fui Abduzido fOr
Aliens div-e-tae\ie-

; . r Catftm&hetoi?famourtananddflDpperaot.
v more...
: yl;;ltVfiJ^N\iy^
adicionando contedo do youtube no site do oween
Uma vdeo vale mais que milhes de palavras
Depois que uma assinante do newsfeed alertou Owen sobre um vdeo do YouTube com um
co parecido com Fang, Owen percebeu que uma boa ideia usar outras tecnologias para
ampliar a sua busca por Fang. Mas como? Se ele pudesse incorporar vdeos do YouTube
no seu prprio site, todos os seus usurios poderiam ficar de olho para tentar encontrar
Fang. E no apenas isso, mas ele realmente precisa bolar uma forma de no precisar ficar
fazendo buscas manuais no YouTube o tempo todo.

Embora e YouTube seja muito pvomiisov


para ajuda-lo em sua busea Por Fa^ 0wen
atualmente esta pvefiisando t32V um monte
de t^abalh manual fava donduav as buscas.
republicaes e servios web

E x p e r im e n te is t o j

^ fr

Visite os vdeos de Owen no YouTube, acessando www.youtube.com/user/


aliensabductedme.

Assista a alguns dos vdeos de abdues que Owen encontrou. Voc acha
que o cachorro nos vdeos Fang?

voc est aqui 679


obter contedo d ife re n te de enviar contedo

Obtendo contedo web de terceiros


A ideia central do newsfeed RSS que ele envia o seu contedo para outras pessoas, para
que elas no precisem ficar visitando o seu site constantemente, em busca de contedo
novo. Essa uma excelente forma de tornar as coisas mais convenientes para as pessoas
se m an terem em dia com o qu e aco n tece no seu site, co m o O wen j descobriu . Mas existe
outro lado nessa tecnologia de transmisso, que envolve obter contedo a partir de outro
site e coloc-lo no seu prprio. Dessa maneira, voc se torna o consumidor, e outro site age
como o provedor de contedo. No caso de Owen, que est colocando vdeos do YouTube
em seu site, o YouTube se torna o fornecedor.
O YouTube o
forneced or dos vdeos.
O site Fui Abduzido por Aliens PugAb&icfedByUFOI
o consum idor dos vdeos.

Aliens Abducted Me

R e p o r U ta * ! y ^ encounlcr wi* Weis you afidnaed? Have you seen B y abduced dog, Fang?

M a s recent reported abductions;

2 0 0 8 -0 8 -1 0 : M e in h o ld R e ssn e r
A bducted for: ABert description; ............................ .................................
3houn They'were ic & ship the size of a M l moon^
2WHWJ7-11; Mickey Mikens
A bdoclcd for: Altec description:
45 naiftutGs Huge heads, skinny nnm and legs
2008-07-05 ; Shill Watner .............................
Abducted for: ABen description: ..................
2hour5 ThcrewasabriEhtlightiniheatv.MiwirKdhyafeHVf.-ron
2008-06-21 : Bclita Chevy
Abducted for: ABai description:
Clumsy Itto buggers, had no rttythm.
2008-05-11 : Sally Jones
Abducted for: Alien description; C oio^U C pVCViCWS
1 day green with six tentacles

0 Click ta syndicate the abduction news feed.


ypr doS Videos
m

0 desiy da home fd^e do si-fce Fui Abduzido


pov "tev de se m odiitav li^eiiramew^c
ado^odr os \resul-fcados ds busda fov
vdeos.

importante entender que Owen no quer simplesmente


inserir um vdeo ou link para um vdeo, especfico do YouTube.
Isso fcil de fazer, bastando copiar e colar algum cdigo
0s vdeos \ue a fa ste*
HTML disponibilizado pelo prprio YouTube. O que ele too vesuifcdo de um3
quer realizar uma busca nos vdeos do YouTube e exibir os busda no YouTube sao
resultados dessa busca. Assim, o site Fui Abduzido por Aliens retornados pov esse si-te
precisa realizar um a consulta em tempo real aos dados do e dolodados na
YouTube, e depois exibir dinamicamente os resultados. Isso
frir fa l de Owe-
permite que Owen e seus assistentes na busca por Fang
estejam sempre atualizados sobre vdeos de abdues que
tenham sido postados no YouTube.
republicaes e servios web

Republicando vdeos do YouTube p a r a r e p u b lic a r

Para obter vdeos a partir do YouTube, ns precisamos aprender Vdeos do


exatamente como esse site disponibiliza os vdeos para serem
Y ouT ube,
republicados em outros lugares. O YouTube oferece os vdeos
atravs de um processo de requisio/resposta, onde voc
preciso etnitt
requisita determinados vdeos e ento recebe informaes
sobre eles em uma resposta dos servidores do YouTube. Voc fe^ ilslo es e
responsvel tanto por emitir a requisio no formato esperado
pelo YouTube quanto por m anipular a resposta, o que inclui manipular as
peneirar os dados da resposta para obter os dados especficos de
que voc precisa (ttulo do vdeo, imagem thumbnail, link, etc.). re s p o s ta s .
Seguem abaixo os passos necessrios para se obter vdeos do
YouTube e exibi-los:: sfca requisio
-re<\ueniew>en-te t eta
a leTw dc u*>a URL-
Q Criar uma requisio por vdeos do YouTube. Y0 YouTube usa )<A1L
pava responder a
Emitir a requisio do vdeo para o YouTube v-e^uisioes for vfdeos.

Q Receber a resposta do YouTube, contendo informaes sobre os vdeos. l)

Q Processar os dados da resposta e format-los como cdigo HTML.


Servidor w eb
Navegador InidiaUente, o do YouTube
w eb clien te navegador pede a 0 sdript PHP pede os
pagina pvindipai ao dados dos vdeos ao
servidor web- servidor do YouTube-

A pagina web inal


eniregue ao navegador
HTML puro.

0 sdripi PHP prodessa


os dados dos vdeos e
retorna uma pagina web Ale de donsultar o bando de
Este dodumento )<ML
-formatada e HTML. dados My$L e* busea de dohte* in-Por^adoes
dados sobre abdues, o sdript.
detalhadas sobre os vdeos
PHP agor ta*bi prodessa requisitados.
s respostas do YouTube.

voc est aqui 681


introduzindo a requisio REST
m o eastern
Fazendo uma requisio de vdeo feigim as Idiotas
no Youube 0 que significa a sigla REST?

A operao de obter vdeos do YouTube e incorpor-los s suas prprias


pginas web comea com uma requisio. O YouTube espera que os vdeos Representational State
sejam consultados mediante o uso de uma requisio REST, que uma Transfer, ou "Transferncia de
Estado Representacional". Este
URL personalizada que leva a recursos especficos, tais como dados de
definitivamente um daqueles acrnimos
vdeos do YouTube. Voc constri uma URL identificando os vdeos que que soam muito mais chiques e mais
deseja receber, e ento o YouTube retoma informaes sobre eles atravs tcnicos do que realmente so. A ideia
de um documento XML. central do REST que os recursos
Os detalhes da URL para uma requisio ao YouTube so web devem ficar acessveis mediante
determinados por quais vdeos voc deseja acessar. Por exemplo, links nicos, o que significa que voc
deve poder acessar dados REST
voc pode requisitar os vdeos favoritos de um determinado usurio.
simplesmente criando uma URL para
No caso de Owen, a melhor abordagem provavelmente realizar
eles. Em termos do You Tube, isso
uma busca com palavras-chaves por todos os vdeos do YouTube. A significa que voc deve poder realizar
URL requerida para cada um desses tipos de requisies REST varia consultas sobre vdeos puramente
ligeiramente, mas a base dessa URL sempre comea desta forma: atravs de uma URL que contenha os
critrios de busca.
h ttp : // g d a ta . y o u tu b e. com /feeds/ a p i/ Esta URL-base e
usada para todas as
requisies REST ao
Requisitando vdeos por usurio YouTube- 0 nome de um usurio
Para se requisitar os vdeos favoritos de um determ inado usurio do do YouTube ornede
YouTube, preciso fazer algumas adies URLrbase, dentre as quais^o, os vides
nome do usurio no YouTube. avoritos desse
usurio.
h ttp : //g d a ta . youtube, com /f e e d s /a p i/u s e rs /u s e rn am e/f a v o ri te s
Para requisitar os vdeos favoritos do usurio elmerpriestley, use a seguinte URL:
h t t p : / / g d a t a . yo u tu b e . c o m /f e e d s /a p i / u s e r s / e lm e r p r i e s t l e y / f a v o r it e s
0 resultado desta^
Requisitando vdeos com uma busca por palavras-chaves ^isio R6ST MO
os vdeos avoritos do
Um tipo mais poderoso e frequentemente mais til de requisies usurio elmerpriestley
de vdeos no YouTube o que utiliza uma busca por palavras-chaves,
independentemente dos usurios. Voc pode usar mais de uma palavra-chave, Mltiplas
desde que as separe por meio de barras, no final da URL palavras-dKaves
podem ser
h ttp : //g d a ta .youtube. co m /feed s/ap i/v id e o s/- / k e y w o r d l / keyword.2/ . usadas em uma
A URL domea da mesma -forma que quando_ ^ ^ ^ busda por vdeosj
requisitamos vdeos de usurios, mas aqui esquea das separando-as
voieA usa* Mvideosw em vez. de usersw Q h,+ereh dom barras.
Para requisitar os vdeos correspondentes s palavras-chaves "elvis" e
Aqui, as palavras-
"imitador", use a seguinte URL:
dbaves de busda
*elvis e ^imitador
h ttp :/ / g d a t a .y o u tu b e. c o m /f e e d s /a p i/v id e o s /- /e lv is /im p e r s o n a to r sao usadas para
As palavrasdhaves sao daseinsensitive, de modo ^ se produrar por
que elvts, "Cl.,-.
pjvis . Ci I
Elvis e Elvfs retornam todas
i , , ---- y vdeos.
mesmo resultado.
republicaes e servios web

S jnJTA-SE como a Re^ulsip XouTube


Sua tarea entrar na mente- J y o u lu l^ e se t^tnar
um a te^ujsxap de Vdeo KESTTU se ps ms akaxx^ para
mpntar requisies ftEST~para es seguintes Vdeos d<?
y ouTube, e depofg feste-as n? seu naVegad9:

Todos os vdeos contendo a palavra-chave "Roswell:

Todos os vdeos contendo as palavras-chaves alien e abduction:

Todos os vdeos marcados como favoritos pelo usurio headfirstmork:

Todos os vdeos contendo as palavras-chaves ufo, sighting e dog:

Todos os vdeos marcados como favoritos pelo usurio aliensabductedme:

voc est aqui > 683


sinta-se como a requisio REST do youtube soluo

S n T A -S E com o ci i ^ e ^ i i l s l - o (B S 7 " < -I

Y QilTbe, oluP
S ua tfeicl entt-qr na merrte do yTube e se ttn at
uma tetjusio je vdeo RESTOUse- p s ms at*a?xp Vodc poderi te r usado
1. / N
para montar te^uispe-s f^EST'para >s seguintes Vc alftuns dos imas mais
y
dp ouXuke, e depofs teste-as n seu de uma vez.

naVegadpr:

A mesma URL-basc do
YouTube e usada para todas
as requisidoes REST. A paiavra-dhave aparede
por ultimo na URL.
X
Todos os vdeos contendo a palavra-chave Roswell:
1 / | - I ,| Roswell H
TfU . I
Cada uma das palavras-
dhaves de busta aprede no
final da URU separadas por
Todos os vdeos contendo as palavras-chaves alien e abduetion: barras t\i
http^Vgd^a^outub^com/^eed^/api/jjvideos 1 ; t i / 1 aiien m abduction

Todos os vdeos marcados como favoritos pelo usurio headfirstmork:


jjj/ | headfigstmork U / | favoritas
mm
A URL para os -favoritos de um usurio requer a
palavra wusers aqui, cm vez. de Videos
Todos os vdeos contendo as palavras-chaves ufo, sighting e dog5
http://gdata.youtube.com/feeds/api/ | videos || / | / | ufo |^/ j sighting | / ^ dog ||

A URL termina dom a


palavra favoritos."
Todos os vdeos marcados como favoritos pelo usurio aliensabduetedme:
ht^^/^at^youta^^^^OT/feeds/^iy^l^usiaM" "|i/ | "aliensabduetedme |[7~f favorites

Este ma nao -foi usado... Este o nome do usurio


e uma donspiraa^ dujos vdeos -favoritos
vod deseja adessar.
republicaes e servios web

n? existem
P e tg u t if c c is i d i o t a s

Q ? Em que o REST diferente, digamos, de uma requisio GET?

A-
J r \ r Efe no . Sempre que voc usa uma requisio GET, por exemplo,
ao simplesmente requisitar uma pgina web, est usando REST. Voc
pode pensar nas pginas web normais como um recurso REST, no
sentido de que ele pode ser acessado mediante uma URL, e GET
a "ao" REST usada para se acessar o recurso. 0 REST fica mais
interessante quando usado para criar consultas, por exemplo, as
requisies por vdeos do YouTube. Neste caso, voc ainda est lidando
com requisies REST, mas efas esto consultando o banco em busca
de dados, em vez de simplesmente pedirem uma pgina web esttica.

A ordem dos argumentos faz diferena, ao se realizar uma


busca por palavras-chaves no YouTube?

A- Sim. As primeiras palavras-chaves recebem prioridade em


relao s demais, portanto certifique-se de list-las em ordem
decrescente de importncia.

Q ? Quando so encontrados vrios resultados para uma busca,


como o YouTube determina quais vdeos sero retornados?

A-
-H L* As buscas no YouTube retornam vdeos com base na relevncia,
o que significa que voc obter os vdeos que melhor tiverem
correspondido s palavras-chaves, independentemente de quando
esses vdeos foram postados no YouTube.

voc est aqui 685


construindo uma requisio REST

O 0

Owcn est pronto para criar uwa requisipo REST


Uma vez que o objetivo de Owen procurar por vdeos de abdues aliengenas
nos quais Fang possa ter aparecido, uma busca por palavras-chaves o tipo
mais apropriado de requisio REST a ser submetida ao YouTube. H diversas
combinaes de palavras-chaves que poderiam ser usadas para se procurar
por possveis vdeos de Fang, mas uma em particular ajudar a obter vdeos
especificamente relacionados a ele:

http ://gdata.youtube.com/feeds/api/videos/-.

Embora voc provavelmente nunca fosse pensar em colocar


o ttulo de um a srie de livros ao executar uma busca por
vdeos no YouTube, isso um a boa ideia, neste caso em Estas duas rtimas palawas
particular. Digamos que, por coincidncia, muitos dos vdeos dhaves lhe ajudrao a
de abdues foram feitos por fs norte-americanos da srie tnto*i{,Yd/r os vfdeos de
Use a Cabea!, cujo ttulo em ingls Head First! Com a abdues vdadionados dom
URL da requisio REST em mos, Owen pode riscar o O'*** t Fanj/
Passo 1 da lista de tarefas para republicao de vdeos do
YouTube.

0 pvimeiiro passo ja
io') a URL dc
reqiMSto Y*Tube.

o Emitir a requisio do vdeo para o YouTube.

O Receber a resposta do YouTube,


contendo informaes sobre os vdeos.

Q Processar os dados da resposta e


format-los como cdigo HTML.
republicaes e servios web

^ g iiiiiP
T fe S T O R iv e _____________ _

Digite a URL da requisio de Owen em um navegador:


Digite a URL da requisio de Owen em um navegador:

http://gdata.youtube.com/feeds/api/videos/-/alien/abduction/head/first

O que o navegador mostra? Tente visualizar o cdigo-fonte da pgina para ver o


cdigo que foi retornado pelo YouTube.

UFO Spotted C ra sh in g Party at Gracels... aUsnaabdumdms Today, Af*j


In an unusual conspiratorial twist of a, a UFOwas spotted crashing a raucous party at QfaoeJand, the
home of the undisputed King of Rock 'n Roll, Article Length:
Read Head First PHP&M ySQL!
M^t^/Wwwjhadf)rs4ab3Xm Read mam...
Sort By:
A lien s Turn Face of Sp h in x Into a D o g l <uiBni>abrfuctedine Today, 12:4 AM ate
Watch as a UFO lasef chisels the face of the Sphinx into a Pug. Title
Reed Head Hist PHP &MySQL! Source -
New
http^vmwiieacffirstiatisjoom Read more..
Recent Artetes:
D o g R id e s in UFO Hovering Near Sarr... aii<msrfLicrerfm* i Q-m PH ah
This shocking video shows a pug taking a ride in a UK) as ft flies around neart* Golden Gate Bridge, Torfay
R&ad morfe... Y&rsy
Uurt'Sevah Days
TbisMcwuft
UFO S p o ile d Near Eiffel Tower] Ysstsntej'. ii&a PM LasiMonfli
Check out this video of a UFO rapping cats in Paris.
Read Head First PHP &MySQL? Source:
http^Avww.headfirstiabs.{m Read more... YouTube Vltfaos
Pu g Abducted By UFOt frMsritev, ;1 PM
Help! My dog was abducted by allem. Bead moca Updats few
' L ia if t i n s t i l T ftic I

0 a v ij d c r b 4 os d i d X M L
retornados pclo YouTube imo um
news-feed, * a di&ren <\ue, hesie
teso, td i-fce, c a vevdde u*
video-

voc est aqui > 687


fazendo requisio REST no scipt php

Esse negcio de requisitar vdeos do YouTube


digitando uma URL em um navegador legal e
tudo mais, mas o que isso tem a ver com o PHP?
Por que no podemos a c e ssa r os resultados a
p a rtir de um script?

A ex-tensao ^e otercCc a -Puno


si*pb^lJoad_fileO, >i adicionada ao PHP na
vcvsao 9, Assim, vereoes niric^es do PHP ro
te, swfovie inieirho ao prodessamerv de XA1L.

Ns podemos; s precisam os! de um a funo PHP que


nos perm ita subm eter um a requisio REST e receb er
a resposta. j
A funo s im p le x m l_ lo a d _ f i l e T do PHP nos permite submeter
requisies REST que resultam em respostas XML, como no caso
das requisies/respostas do YouTube. A funo, na verdade, carrega
um documento XML para dentro de um objeto PHP, que podemos
ento usar para acessar os dados XML e extrair qualquer informao
especfica que queiramos. Ento, como isso afeta a requisio de Owen
no YouTube? D uma olhada neste cdigo, que cria uma constante
para armazenar uma URL do YouTube e depois emite uma requisio
REST usando a funo simplexml__load__f i l e ():

define('YOUTUBE_URL', 'http://gdata.youtube.com/feeds/ap/videos/-/alien/
abduction/head/frst');

^ =WMM<YOm}JBE-mL);
tmbcv ftio seja esbrrUmesfste j
nedessino, yraWewke e wm W No se preocupe
ideia art*a*rr WRL-s estafots e* se voc no souber
tonsta^ies, fara ^ e *ott saiba onde o que um objeto,
principalmente no
odi .e-la, ta iss stj a ^ ss'r''
contexto do PHP.
Criar uma pcquicio-por vdeos do- VouTube.. Um objeto PHP um tipo especial
- 0 Cmitir o requisio do vdeo para o VouTube. de dados que permite que sejam
empacotados junto com funes em um
^ fceceber- a resposta do YouTubc; nico construto. Tudo o que precisa
contendo infortmigcfes subre us vdeos
saber por ora que muito mais fcil
0 Processar os dados da resposta e processar dados XML no PHP usando
format-los como cdigo HTML. objetos. Voc aprender mais sobre
Ja realiaas j como isso possvel logo mais adiante.
esies dois fssos/
republicaes e servios web

< ve r sic-n= ' 1 . 0 ' enodir.g= ' OTF-i ?>


<f ed xflilflSa ' h ttp : fw -*'3 0*9 U 0 0 5/Atom '
xjnlni : iJrc-L-htLp; //'w* , op-gis . fuet/gr.l 1
xm lns:c?ftfSarch- 'h t tp : / /a9 .c 7 '/-/$ te c/sp en se ar::h r3 s / 1 .0 / '

junlns;gor5 3= 'http: //wu-w .eor-ss .org/eotss


3un2/is::**idia' h ttp : / /se a rc h - yc'.'.z .e o r./ro rss/1
xjilns ifcatch* ' >.tt? : //s c h e c a s .o o o g le . ccro/g<feta/=at;?i1
xmlns ; y ' r.tt? ; // tf a t a . ycutube 3iu/ =;hcjnas/20071
amlns :gd- ' h tt? ; //schem as .google. c-Dm/-g/2C05 1>
i^httpt //gdta -yourube.tjri/eeds/api/u3rs/olic?/i3abduetedirie/favc:;itBr;</i,a>
updatcsSOCS-SS-DITZO : -2* s45. 792z</_pditeA>
c a te g o r y scheme'h t t p : //a h r ^ s ,g o o g le . ecrt. g/SC-C +kin d 1 le rm -'h ti : //g d a ta .youtube .com/scher<3s/20j7*vide31/>
<title tyye-1text>Favorires *lier.5bfiuctee</title>
< l0 0>htt;p i//w w . yc jtu b c. P5rn/ii/piC_yC'Jtl>BlpgO_123x3 - if < / g o >
c lin k r e l* 1r e la te d ty p e - application/atom -M m i h r e l - h t t p : / / d s t* . y o -tu e, jaro/reecSa/a p i. u s e rs / a l ler-sabdue-teci:. ', >
<1 ir.X te l =1a l t rr.ate 1 type= 1te x t .h tc rl1 h c e l - 1ht tp j / / wwvr. you tu b e -cofli/ ro r ile _ f a v s r i t c s ? - s e : - a lle r .s a i duc-te cime1/>
<lin k iel=h ttp : //a c h r e s , gc o le , cC/g/CiC-tfeed1 ty p e = '* p p lica tio n /a tc c> x m l1 href-* h ttp : // d a t s . ycutufcc. csr-./eeds/ap i/u jera /aliB n sa b d u tsd iu e/f.iv & iite s '
c lin k i d h ttp : //achem as. gcogl , ct//2 X 5 # ::atch 1 type1ap p lica tio n /itc c.+ w n lr ht f - ' h ttp : // d a t a . ypytuv. tom 'feeda/api/users/c.lisnA rtt^'JctsQ i
< iin k i e l - s e l f 1 ty p e ^ a ^ p lic a tio n /a to m -x m l h r e f = 1h*tp: //g d a ta .y o u tu b e , com/Ceets/ p i/u se rs/ali^n saW J.C te

c W f e c i =/a p i / ae r s / a lie n saM uetedme /- jr i >

< e e/ierator v e rsio n * 12 . C1 y r i " 1h ttp ://g d a te .y cu tu b e. c c - / 1>Voi7ube d o ta APK/e>srterdzsr>


se e o a^^uivo )(M L
<openSea r ch : to t a -Be? u 1 ts :9</ ser.Search : t= t s l
<open3eazct-.;$i:&',rxeey>2</opeSerc::
:s>
'rtbxrndo feta uno
<openScarC ; Sterna ?er?age>25</3?cnSdr:;h : item s?erpage>
<ntry>
< id > h ttp : //g d a ta .you t ->be .ccc:,/feeds Zap i/v id e o s /_i-Uibc;rDvtA</id> si^pleK^Uoad^iieO,
<pur lished>7 0D-D6-2OTC? :!?;05,00D-C" :CC/publ ished>
<updated>2COe-03-:nT09;l?: 58. D tt-O ^O O :/u p d a te <\*e dosiste dos dados
YouTube
<cateory scheme- h ttp ://g d a t a . yiutJOe . COT./schemas/2 CO7 /keywords, C it
-coteo*? scheme11h ttp : / /g d a ta .you t - be .con./scheraas/2C07/key-y>r<ls. c a t ' te rm ^ 'c a />
category scheroe=h ttp : '/g d a ta .youtube .cor./sdema$/2C0/keyw ords, c at,1 te r m ^ 'i l 1/>
ner.as/2007$vide3r/ X M L do
veeire*tes aos vfdeos
category sc fc e -'b ttp /.acherasj, .CDr./i'/2DC5*kicd1 tr<#=)sttp ;//g 'd g ta.y o u tu ;
c e tn g o r y scheirefc' h t t p : //g d * ta . youtube.com /schem as/2vC7/keyw ords, c a t 1 term =are a ' />
category ach. e-"* h t tp : //g d ^ ta . you tube . cop/ nhiM$/2C*/Keywords, c a t 1 te rm = 'a lie ;is 1/>
cctcgory EchK-A-h e tp ://g d ita - y o t- u b e . =cjn/ct,ierwi&/25C7/'keyvor== .c a t ' t e - r a - 'a li e n 1/>
<cat??5ory si'e-.*-^ttp:/-gicta.youtube. om/sc?iers/25C7/catc5ori.ai.. c^t1 term*'TraveJ, ' label" Travel
<.eitegory http: //d^ta. vou-ube- corn/==-c?rai-/2DC7/keyworda .cat t>?rni='califdrf.ia1/>
Eve^ia'
ve^uisiiados.
< catcg > s-*.e.r- h ttp : / /g d a ta . yg^tube. tom/s c le r a s /2DO"/keywords .c a t t e f t- 1nevada1j>
<categcxy s;ner>e*http://datA.voiiiie.;om/achem5s/20i7/k(l'Kads.caf teru;=1yfo1/>
< c a te iry sthejne= h ttp ; / / i a t a . v o jtu i e . ocm/53hep>s/2D07/lceywrd .c a t ' t e r n - 1s i ^ t iji 1/>
< t i t l e -yp<^ ' te x t ' >UfC ? ig f:tin g in -osemize nsaz Area 5 1 < /title >
<cw itent ty p e : X t >r W^nt an t r i p to Yosemite Fark. in ZC02. Y05nxte ?arK i s very slo a e to Th$ tc r d e i between
the evening, &n my Viay OVt of th e p 4rk, 1 vas dlrlvan dawr. a winding road, vher, - ^aw a sr-all i ^ l l O^ i h t r.igh up j
s?, ajtd a long tw irle d t t i i l . behind i t . 3 v id e ; tap ed i t fo r a few seconds, and, tiien I grapped mycamra
i t w ell encugh. U n io -tu n ately i t was tc>c dark o. th e photo camera, so th e p ic tu r e s d id n t i
phn
+imo... um problema ainda maior!
A *; rir.a c ss - a tc r ie v e r a l A jt Force ; e t s ap pealed -=r.d c i r c l e s Lt. th e sky wh^rr tl-e lig h t :-a
< ink r c l~ a l t'-a te ty p e- te x t/b tn J .1 h r e f - 'h ttfl- / /vww.youcube-com/watch?v-_6UitqfdvtiL' /:
O que que ns vamos fa z e r com
<2ink i e l * h ttp : //g d a ta -yput-jbe .ccct/schemas/2CC7iv jd e o - resp cn iea t i ^ e - a^pi-caticn/a-cun+H iil1
resp o n se s'/> todos esses dados X M L obscuros? No
<lin k r e l - h ttp : //gaita.you-ube.com/*<l*.eitAS/2:":7iv id e o .r e la te d ' zy?v -'i
<1 ink t e l - ' s e l f type=*3Fplictio^/atomTXJnl' h r e f = 'h ttp://eata-i^O -itui
possvel um script PHP entender isso
<name>gaspirtz</ r.ar
< u /i> h t t p : / /dat& . :
:/ai;thos>
c o m /fe e d s/ap i/u se rs/g asp n rtz < /u ri> a.
onedia: e i t l e ty p e - p l ^ n ' >l*F0 Sig^tin LA Yisen ; >ark near Are& 1 </m edia: ti t l e d
< m eaia:descipti.o" ty p e - p ja r . >1 v e n t on a t r i .0 Y*saJ.te E a ri in 20C2r YrjsemitC Pjsk : very cacse to the bctdftt i tw e e r,^ ^
.1 a f lig h t high s- p in th e :
(rro/idirig i t , arva * lor.g t w iti td t r a i l behir.a i t - .deo taped it f&E a few aeconds, arid tin = grapjfti UK
?azr* d id n 't c ap ture i t w ell enough, f n fo r tu - a t e ly : : be<otre and

. b r ig h tly v ia i]

A f#w l a t e r sev eral A ir Fore j e t s acneard and c irc le d in th e g v / where th e liQi"." ha,C d isa ppea red, </mec.i.a' de sc rip t.
<sedia:key^ords>31, a lie n , a lie n s ,
r/t : duratior. seepndA* &* 1/>
c ^ d ia :eateD ry l a k e l - rT ravel amp:
<.-dia :ie>ftter.t u r l 1 / / www.you!
yz ; f o tita t- ' b ' />
<r>di a: c o r.te -t u r l - 'r t s y : / / r t a p 5 .y9tube .ecc:./ChoLSK/'iSii:a3:5nCwSnbKX_K>IDiHFIer3CA / /C /0/video., 3g? e=1vide/3gpp1 ??ediufu=v id e ^ , e x p r e s s f _ ; 1 1 *
d u ic tiw i 5D y t c io r m a t - 'l1.^
<jnedia; co n ten t u i l * rtc p :// rt * p 2 .yc-ut'_be .cor./Ch5l.ZT'y75wi;2C!nvvSnaiKl_KMESARfi:SC|A*/0/C /0/v id c a . 3gp1 ty p e - 1video/2gpp ' ^ediurr^ 'v id o ' e x p re ssio n - f u li *
Curation50 y ; ; ; p r t A t - /^
<med : p la y er u 1 n ttp : / /w * , y:utw be. cim/ rfatch?v-_cUibff Jv^i,1/>
<meala: th-m bnail u r l * 1h ttp : //im g.youtuD e .c o m /v i/6tib g i v tA /2 ' r.eig n t- :
<media:th.aTfc-r>aii; . ://img.yout-jbB.CO/i/vi/_6Uifcq-0vt& /L.jpg' height-1? T w id th - T 301 tlm e'0C :00:-2 .5 0
<me3iA:th'jmtnail
; h t tp : / / img -you Ube - com /vi/_6uibqf O ^R / 3. j P3 ' he L g n t-157 * width 130 t ime*11 : 05:37. la
i,."-o://JJllg.yolItube.2Clm/vi/_6Ui^^CvCAy0.ipg, h e ig h t= '2 4 0 ' '.fielet';-' 321 tim e - 1CO :X :251/

Ah, possvel sim! O cdigo XM L retornado pelo


YouTube na verdade no t o obscuro quanto
parece... voc s precisa sab er onde procurar.

voc est aqui 689


a requisio retorna
o youiuU
0 Youtube fala X M l
resp on d e s
O vdeo que voc recebe na resposta do YouTube no
exatamente um DVD empacotado em uma caixinha de plstico te ^ u fs l p e s c o m
e entregue na sua porta. Ele , na verdade, um documento XML
contendo informaes detalhadas sobre os vdeos que voc d c td p s
requisitou, mas no contendo os vdeos propriam ente ditos.
<?xml verson='1.0' encoding='UTF-8 '?>
<feed xmlns=http://www.w3.org/20 05/Atom'
que descteVeifl
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 9S V id e o s .
xmlns:gml='http://www.opengis.net/gml
xmlns:georss='http://www.georss.org/georss1 mb<Xrd
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:batch='http://schemas.google.coro/gdata/batch' oisa este td\y>
xmlns:yt='http://gdata.youtube.com/schemas/2007' /(.ML-, (*. deialKe
xmlns:gd=1http://schemas.google,com/g/2005'> i >
<id>http://gdata.youtube.com/feeds/api/users/aliensabductedme/favorites</id> SC
<updated>2008-07-25T03:22:37.001Z</updated> pcv*dbc\r t tc
Ccategory scheme='http://schemas.google.com/g/2005#kind' vfde Prtfo Ar
term='http://gdata.youtube.com/schemas/2007#video1/> f ,
<title type= 'text'>Favorites of aliensabductedme</title> f 'tj <tftVry>

is,ve i
i'-: de

</gd commerts > ' 4i> ^ .rj..iv


</entry>
<entry>
<id>http://gdata.youtube.com/feeds/api/videos/XpNd-Dg6_zQ</id>
<published>2006-ll-19T16:44 :43.000-08:00</published>

< /en try > ~ 'f'3 Vd" '


</feed> t*bco os dados de rtsfoste **
republicaes e servios web

voc est aqui 691


aponte seu lpis soluo

ponte seu lpis


Solvpo Estude a parte do cdigo XML marcada, na pgina anterior, e
responda s seguintes perguntas. Voc poder j saber mais
sobre o formato XML do YouTube do que imagina!

<media: title type= plair/>UFO Sighting in Yosemite Park near Area 5^</media:title> |j

I.Qual e o titulo do video?........... UFO i* .Yoscr*,ite Park. near.

S g S i n g s yWrd^ ' al^ n , (AliensJ area, ca, califomia^nevad^


ufcx/media:keywords>

2. Cite trs palavras-chaves associadas com o vdeOv.^ ak^ ncvad

3. Qual a durao do vdeo, em segundos?. 50....[ <yt duration seconds=(5 o)/>


0 )<ML to\(ica
caracieres usando dodifjos
pediais, Como famf;, "N
reprcschia o taracie* (f). V*

<media:category latl='Travei &amp; Evjits'


scheme= http://gdataTyouLUlbe. uuin/iUemas/2007/categories.cat '>Travel</
media:category>

4. A qual categoria do YouTube o vdeo pertence? .Trave) .& yewtf

UU) <sso t u woi^te de


visualizaes ^asc 2-,5
milhes^

5. Quantas vezes o vdeo foi visto?

I <gd:rating m i ^ l' max='5 numRaters=' 1 6 0 2 ^ a v e r a g e ^ 4 a 7 ^ >

6. Qual a nota mdia que os usurios deram ao vdeo?


republicaes e servios web

Hm, estou um pouco confuso com


todas essas tags XM L que tm dois nomes
separados por dois-pontos. Isso algum tipo de
organizao das tags? E quanto quele cdigo
esquisito Aamp; na categoria do vdeo?

Este cdigo XM L incomum usa nam espaces e


entidades, que ajudam a organizar as tags e a
co d ificar c a ra c te re s especiais.
Quando voc vir uma tag XML com dois nomes separados
por dois-pontos est vendo um namespace, que uma
forma de organizar um conjunto de tags em um mesmo
grupo lgico. O propsito dos namespaces impedir que
tags com o mesmo nome entrem em conflito quando
mltiplos vocabulrios XML so usados no mesmo
documento. Como um exemplo, considere as duas
seguintes tags XML:

<title type-'text^Favorites of aliensabductedme</title>

:raedia: title type='plain' >UFO Sighting


[
Sem o namespace media na segunda tag <tide>, seria impossvel
ip grupos de tags diferenciar as duas tags caso elas aparecessem no mesmo cdigo
XML. Assim, voc pode pensar no namespace como uma espcie
IVL, en<juant9 de sobrenome para tags - ele ajuda a prevenir que um documento

je els entidades XML cheio de "primeiros nomes" entre em conflito, criando


um "sobrenome" para tags relacionadas. O cdigo de resposta do
ip i] sadas para YouTube usa vrios namespaces diferentes, o que significa que est

?dfrar caracteres usando diversas linguagens XML diferentes ao mesmo tempo - os


namespaces nos permitem diferenci-las claramente.
specials dentro de Para garantir a unicidade, cada namespace XML sempre
associado a uma URL. Por exemplo, o namespace media usado
p c u n ie n to s X M L . nos dados XML do YouTube estabelecido dentro da tag <feed>,
desta maneira:
Pode freter esfaranho sia URL n verdade nao e w*a pgina
ue un> namespate do web e apenas u*w tden-fc-fidadov unido
Yahoo/ apav-eda no ddiejo paira uw> na*v>espaee------------

isso
)</V)L- do YofcTke - **s xmlns:media='http://search.yahoo.com/mrss/'
<\uer distev apenas ____
c^ue o 'ykuTube defende -^ '^ T o u tra coisa"estranha no cdigo X M L do YouTube &amp;, que a
Pvdial mente de uw forma pela qual o X M L representa o caracter &. Essa u m a e n tid a d e
Jrc*-ao de ddos do X M L, uma forma simblica de representar um caracter especial,
dviado feio Yahoo! como &, < ou >, todos os quais tm significados especiais dentro do
cdigo XML. Seguem as cinco entidades XML pr-definidas que
voc provavelmente encontrar ao se aprofundar no cdigo XML:
antomia de uma resposta xm f do youtube

Pesconstruindo uma resposta X M l do YouTube


Uma vez que voc conhea a estrutura da resposta do YouTube, fica bem fcil extrair os
dados dos vdeos que voc precisa. Alm de entender quais tags e atributos armazenam
quais dados, importante tambm entender como as tags relacionam-se umas com as
outras. Como voc dever se lem brar do incio do captulo, quando analisamos o feed RSS,
um documento XML pode ser entendido como um a hierarquia de elementos. O mesmo
verdadeiro para os dados XML retom ados em uma resposta do YouTube. r
A ta<\ <-tVe> iofctct* o
<entry> tn 1 j M
<id>http://gdata.youtube.com/feeds/api/videos/_6Uibqf0vtA</id> UX.U10 do video
<published>2 006-06-20T07:49:05.00 0-07:00</published> como
neste td Neste i ,
<media:group> / kaa-se title
de e me
<media :description type=' plain>1 went on a trip to Yosmite Park in 2002. Yosemite Park is very A
x'
close to the border between California and Nevada, and close to Area 51.. .</media:descnption> ns i

1188
<media :content ur 1=1http ://www.youtube.com/v/_6UibqfOvtA1
shockwave-flash
medium=video isDefault=true1 expression='full duration='50 yt:format=
cmedia :content url= rtsp ://rtsp2 .youtube.com/ChoLENy73wIaEQnQvvSnbiKl_
xMYDSANFEgGDA==/0/0/0/video.3gp
type=video/3gpp1medium= 'video' expression='full' duration=150' yt :format='1'/>
<media :content url= 'rtsp: //rtsp2 .youtube.com/ChoLENy73wIaEQnQvvSnbiKl_
xMYESARFEgGDA==/0/0/0/video.3gp'
type=video/3gppmedium='video' expression=fullT duration^'50' yt:format='6'/>

lllliillilillllllllM
<media:thumbnail url='http://img.youtube.com/vi/_6Uibqf0vtA/l.jpff' height^' 971width=' 130'
time=' 00 :00 :12 .500 '/> \ Q )|(
<media: thumbnail url='http://img.youtube.eom/vi/_
time= '00:00:37.500'/> " \ 0v,<
<media:thumbnail url='http://img.youtube.com/vi/_6UibqfOvtA/O.jpg'neight^1240' width='3201Voul
time=' 00: 00: 25 ' / >
</media:group>
........... V ,,
tnumfcmau
is
(io
l vl J

m ..................... ' vdeo, fa^a \ue o usuano


i : .......... o possa pv-e-visualizair.
<gd:coniments>
<gd:feedLink href=Thttp://gdata.youtube.com/feeds/api/vid\os/_6UibqfO^fA/comments1
'7countHint=I44261/>
</gd: comments> / /s < j _
s i* v jt * f r , 0 numero de vez** *ue o
v/entry> Q hmespate gd si^i-fida google Data, ^ **dia dos vdeo -foi Vtsto-
e mdlu' ta^s de-fmidas pelo google para usua'r*os P^a o
representa*- vrios tipos de dados - o v,deo.
YouTube 2. part. do joo^le.
Uma dica im portante para o entendim ento dos dados de vdeos escondidos neste cdigo
XML so os diferentes namespaces sendo usados. O namespace media acompanha a
maioria das tags especificamente relacionadas com os dados dos vdeos, enquanto que
o namespace yt usado apenas com a tag <statistics>. Finalmente, os comentrios so
colocados dentro da tag <comments>, que pertencem ao namespace gd. Esses namespaces
sero muito importantes quando voc comear a escrever cdigo PHP para encontrar tags
especficas e os seus respectivos dados.
republicaes e servios web

Visualize os dados de vdeos X M l Um elemento e


Anteriormente neste captulo, quando trabalhamos com ctpetl^JS UUlcl
cdigo RSS, foi revelado que um documento XML pode ser *
entendido como uma hierarquia de elementos (tags) que tm d e Se
relacionamento pai-fllho. Essa relao se tom a cada vez mais
importante medida que voc comea a processar cdigos XML jjxHB t c l ^
e acessar os dados armazenados dentro deles. Na verdade, essa 1
habilidade de olhar um documento XML e imediatamente VlV/lT no Ia Io
visualizar as relaes entre os elementos pode ser preciosa. ^ Uh U - a
Apenas lembre-se de que qualquer elemento colocado dentro d e ^ r>orvf ' m
outro o filho, e o elemento que o contm o pai. Analisando- - U t e I I.
se o cdigo XML do YouTube, na pgina anterior, resulta na
seguinte visualizao:

Os dados XM L so organizados 0 elemento entry e *y*e esta no


em uma hierarquia de iofo deste par-fotular blodo de
elem entos (tags). ^ tdi^o >MU

jp""TY IMWWWIM'd r acategory [content


t ^ i i B P
;thuit:naiZ: ; thumbnail j feedUnk
: Ir L---------- ;----------- _

O significado desta hierarquia de elementos que voc pode navegar


a partir de qualquer elemento at chegar a qualquer outro, traando
o seu caminho desde o alto da hierarquia. Por exemplo, se quisesse
obter o ttulo do vdeo, poderia traar o seu caminho desta forma:
Para navegar ate UVA
elemento em um documento
vode -traa o daminho
desde o elemen-fco pai at o
filho sendo froiurado. no eXist&rn

perguntas idiotas
?: Por que eu preciso me preocupar com namespaces? ?: Como eu sei se uma tag faz parte de um namespace?
Porque o cdigo XML gerado por terceiros Embora seja possvel ter um namespace padro
frequentemente usa namespaces, o que afeta o modo que no aparea explicitamente no cdigo d uma tag,
como voc acessa os elementos XML programaticamente. na maioria dos casos ir ver o namespace junto ao
Como voc ir descobrir logo mais, o namespace nome da tag, que escrita como <media:title> em vez
associado com um elemento, afeta diretamente o modo de apenas <title>. 0 nome esquerda dos dois-pontos
como voc encontra o elemento, ao escrever seu cdigo sempre o namespace.
PHP para processar dados XML. Assim, o namespace
precisa ser evado em considerao ao se escrever cdigo
para tentar obter os dados de um determinado elemento.

voc est aqui 695


tudo sobre objetos php

Acesse os dados XM L com objetos Os .objetPS


Existem vrias formas diferentes de se trabalhar com dados XML um tipo de
dadPs especial
no PHP, e uma das melhores delas envolve os objetos. Um objeto
um tipo de dados especial do PHP, o qual combina dados e
funes em um nico construto. Mas o que isso tem a ver com o
XML? Toda a hierarquia de elementos de um documento XML d o P B F , % ue

combina dadPs
fica dentro de um a nica varivel - um objeto. Voc pode, ento,
usar o objeto para se aprofundar nos dados e acessar elementos
individuais. Os objetos tambm possuem mtodos, que so funes
vinculadas a eles, as quais nos permitem m anipular ainda mais os e unpes.
dados do objeto. No caso de um objeto que contenha dados XML,
os mtodos nos permitem acessar o conjunto de elementos filhos a
um pai, bem como os seus atributos. Q objeio PHP usado para
c;mrl>XNlLEIement < * - arw*awar e *anipuiar dados
Cada e um S,m P XML e o SpleXMLUe*t
dotuwc^io /M L pode
ser atessado tomo um 0 *picXMLle*eK
propriedade de uw possui meiodos <^ue lhe
objeto X^L- perwi-tew desdobrir ais
sobre os elee{s, tome
por exemplo, os seus
eleme^ios t airibu-fcos
ihos.

J vimos como criar este objeto XML para a busca de O w e n ^ ^ ^ es^ requer
no YouTube: ^ 0 ptfp versSo $ ou tm-
define(1YOUTUBEJJRL * ttp://gdata.youtube.com/feeds/api/videos/-/alien/
abduetion/head/f irst/1)
$xml - simplexml load file (YOUTUBE URL) sfca uwao dria w*
objeto PHP do ipo
Este cdigo resulta em uma varivel chamada $xml que contm todos StpleX/^LElee-t,
os dados XML da resposta do YouTube empacotados em um nico tonbtno W o s os
objeto PHP. Para acessar os dados, voc usa as propriedades do objeto, dados XML da
que so blocos individuais de dados armazenados dentro dele. Cada vesposia do YouTube-
propriedade corresponde a um elemento XML. D uma olhada no
seguinte exemplo, que acessa todos os elementos entry do documento:
$entries = $xml->entry; c ^spei-Pidando o nome do eiemewfco
t
0 operador > lhe perw>Vfce adessar
(en-bry), vote ode obier iodos os
ele^ehios erisentes *os dados XML.
uma propriedade de u obje-b>-
Tdas as en-fcradas dos vdeos sao_
Este cdigo acessa todos os elementos entry dos dados XML no array f e * W
usando uma propriedade. Uma vez que h muitos elementos
entry nos dados, a varivel Sentries armazena um array de
objetos que voc pode usar para acessar as entradas individuais
dos vdeos. E uma vez que agora estamos lidando com um array,
cada tag <entry> pode ser acessada indexando-se o array. Por
exemplo, a prim eira tag <entry> do documento o primeiro $entries
item do array, a segunda tag o segundo item e assim por diante.
republicaes e servios web

Pe elementos X M l para objetos PHP


No que se refere a dados XML e objetos PHP, voc na verdade est lidando
com um coleo (collection) de objetos. Lembra daquele negcio de visualizar
um documento XML como se fosse uma hierarquia de elementos? Bom, essa
mesma hierarquia realizada na forma de uma coleo de objetos, no PHP. D
uma olhada:

guando vista pela tida \


de Um objeto XML, 3 x
hierarquia de elementos v
X M L -tornase uma.
tocdo de objetos
aninhados.

0 objeto raiin^
e um objeto
filho do objeto
entry, porque a
ta<j <rati3> t
wna -filha
de a <entry>.

0 objeto duration e
-filho do objeto ^roupj
porque a ta$ <durati*>
e -filha de <group>.

A maior prte do iontedo


Esta hierarquia de elem entos/conjunto de objetos forma a base
mais interessante sobre
do entendimento sobre como "peneirar" os dados XML em PHP.
UM vdeo do YouTube -fida
Com a relao entre os diversos blocos de dados XML em mente, d e n tr o de objetos -filhos do
possvel escrever cdigo para navegar atravs dos dados. Ento,
objeto youp-
podemos isolar o contedo armazenado em uma determinada
tag ou atributo escondidos dentro de um documento XML.
voc est aqui 697
acessando dados do objeto

Penetre nos dados X M l com os objetos


Voltando ao Owen, nosso objetivo obter algumas informaes a partir dos vdeos
retornados como parte da resposta XML do YouTube. Ns sabemos como colocar
os dados XML em um objeto PHP usando a funo simplexml_load_file(), mas a
m a io r p a r te d o s d a d o s in te re s s a n te s se e n c o n tr a e m n v eis m ais p r o fu n d o s . Como ns
navegamos dentro da coleo de objetos? A resposta o operador ->, que usado para
referenciar uma propriedade ou mtodo de um objeto. No caso de um objeto XML, o
operador -> acessa cada um dos objetos filhos. Assim, o seguinte cdigo exibe o ttulo
de um vdeo, armazenado em uma varivel chamada $entry:

^ usado para abrir espao


echo $entry->group->title; dtrsvro dos objetos -Pilhos alinhados, para
adessarmos o objeto t*tlc-

Este cdigo altamente dependente da relao entre os objetos title,


group e entry, que formam o relacionamento pai-filho de um para o
seguinte.

0 objet ttlc e -filho


do objeto $rowp,
por sua vez. e -rilho do
objeto entry

O operador -> referencia um objeto filho a partir de um objeto principal. Assim, title
filho de group, que filho de entry. Lembre-se de que o operador -> pode ser usado
para se acessar tanto propriedades quanto mtodos. Um m todo particularmente til
attributes(), o qual capaz de obter o valor de um atributo XML de um dado elemento.

0 meiodo attributesO obtns


$attrs = $entry->group->duration->attributes () ; ^ ^ butoS ^
echo $attrs [1seconds ']; determinado objeto elemento)-

Esse cdigo vai at o elemento duration e ento obtm todos os


seus atributos, armazenando-os na varivel ftattrs, que um array q vj0v. atributo
de todos os atributos. O valor do atributo seconds ento obtido espedido pode ser obtido
a partir do array. usando-se o home do
atributo domo a dhave do
array-
republicaes e servios web

No sent um namespace! Os namespaces


H um pequeno problema com o cdigo da pgina anterior, tornam um
que acessa dados XML usando objetos, e isso tem a ver com os
namespaces. Como voc dever se lembrar, os namespaces agem poyco mais
como sobrenomes para as tags, organizando-as em colees
dicll P acessP a
elementPS dentP
significativos. Assim, em um a resposta do YouTube, a tag
<duration> na verdade codificada como <yt:duration> e o ttulo
do vdeo codificado como <media:title>, e no <title>. Quando
um elemento encontra-se associado a um namespace, voc no
pode referenci-lo apenas pelo nome da tag no seu cdigo PHP.
dPS dadPsXVL.
Em vez disso, precisa primeiramente isol-lo pelo seu namespace, 0 metodo dhildrenO
chamando o mtodo childrenQ no objeto principal. retoma um av-ray
doniendo iodos.
$media - $entry->| |{'http://search.yahoo.com/mrss/1)
os elementos
Esse cdigo obtm todos os objetos filhos da entrada cujo namespace filhos presentes
h ttp :// search.yahoo.com /m rss/. Mas essa a URL do namespace, e r>o namespade
no o prprio namespace. Essa URL se localiza dentro da tag < feed>, no itado
incio do documento XML. E a que voc encontrar todos os namespaces
sendo usados.
<feed xmlns='http://www.w3 .org/-2005/Atom'
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/l.0/' Todas as ta$s \ue domede
xmlns:gml=1http://www.opengis,net/gral' tom "<e<Aia''" pertendem a
xmlns:georss='http://www.georss.org/georss1 este namespade-

<-----
xmlns:batch=1h ttp : / / schemas. google. com/gdata/batch Este naespade e para
MMBiWmmmNmfflWBm as t a fluc domeda
,? ,Si >
xmlns:gd='http://schemas.google.com/g/2005'> dom <yt:
Esse cdigo revela como cada namespace se associa a um a URL. U se o mtpdp
Mais especificamente, ele mostra como os namespaces media e yt
so especificados para uso no documento. Isso tudo o que voc c}nldren() pata
precisa para encontrar tags relacionadas a esses dois namespaces. splar tPdPS
Uma vez que tenha isolado os elementos filhos de um dado
PS elementPS
asspcfadps
namespace, chamando o mtodo childrenQ no elemento pai, voc
poder continuar a acessar os objetos filhos com o operador ->.
Por exemplo, este cdigo obtm o ttulo do vdeo a partir da tag
com um dadp
namespace.
cmedia: group>:
A ta$ <titie> e
$ t it le = $media->group->title; ^ -filha da ta<J
<medta:3v-oup>-

r^poi
ponte seu lpis
Usando as informaes de namespace e o cdigo PHP acima,
complete o cdigo PHP que obtm a durao (em segundos)
de um clipe de vdeo.

$yt = $media->children(' )
$attrs = .......... ..
echo $attrs[' 1];

voc est aqui 699


no existem perguntas idiotas sobre objetos

%^Pw te seu lpis------------------- ------- -----------------


S o lU p O ^ 5an^ as inf rmaes de namespace e o cdigo PHP acima,
complete o cdigo PHP que obtm a durao (em segundos) de
um clipe de vdeo.
sa a WftL
paira o nan>spaic,
$yt = $media->children (' hity//d 3fayodfr\>Ctom/st\\tr*s/ZOl donorme listado
w ta<j <-"!id> do
$attrs =
tmio do dodumento-
echo $attrs[7 seconds ];
0 nome do atributo c usado Obtcn todo5 05 at^butos
I ' tomo a dhvc pava s acssv da ta<j <yt:dfc'rat*o*>
o array dos atributas-

n? existem
perguntas idlpfas
1 * Em que um objeto diferente de um array? Os arrays F Eu pensava que o operador servia para acessar
no armazenam tambm colees de dados? propriedades dos objetos. Como ele me ajuda a acessar
um objeto filhos?
Sim. Os arrays e os objetos na verdade so bem parecidos.
Mas uma grande diferena que os objetos podem ter cdigo A explicao que, quando se lida com objetos XML em
executvel vinculado a eles, na forma de mtodos. Os mtodos PHP, os objetos filhos na verdade so armazenados como
so praticamente o mesmo que as funes, exceto pelo fato de propriedades. Assim, quando voc usa o operador -> para
que ficam vinculados a um objeto, e geralmente so elaborados acessar um objeto filhos, na verdade est apenas acessando
para trabalhar especificamente com os dados armazenados no uma propriedade. O objeto SimpleXMLEIement o que torna
objeto. Os arrays servem simplesmente para armazenar um isso possvel.
conjunto de dados relacionados, e no tm nenhuma noo de
mtodos. Adicionalmente, os elementos dos arrays so acessados T * Espere a, o que o objeto SimpleXMLEIement?
especificando-se o ndice ou chave, de um elemento entre
colchetes ([ ]), enquanto que as propriedades e os mtodos dos f c Todo objeto do PHP tem um tipo de dados especfico,
objetos so acessados por nome, usando-se o operador ->. significando que "objeto" na verdade um termo genrico.
Assim, quando voc cria um objeto, est criando um
F - 0 que exatamente um objeto? parecido com uma objeto de um tipo especfico, elaborado para realizar uma
varivel normal? tarefa especfica. No caso do XML, o tipo do objeto
SimpleXMLEIement, e automaticamente retornado pela
K . * Sim. Dm objeto igual a qualquer outra varivel em PHP; a funo simplexmlJoadfile(). Em outras palavras, chamara
diferena que ele capaz de armazenar dados mais complexos. funo simplexmlJoadJileO resulta na criao de um objeto
Assim, em vez de apenas armazenar uma string de texto ou um do tipo SimpleXMLEIement.
nmero, o objeto capaz de armazenar uma combinao de
strings, nmeros, etc. A ideia que, combinando-se dados com as "P * O que eu preciso saber sobre SimpleXMLEIement?
funes que agem sobre eles, o design e a codificao gerais das
aplicaes tomam-se mais lgicos. Surpreendentemente, no muito. A principal coisa
a saber que ele expe os elementos de um documento
T * * Como os objetos ajudam a processar dados XML? XML como propriedades, e que essas propriedades levam
a objetos filhos que so, eles mesmos, instncias do
Os objetos ajudam no processamento de dados XML porque objeto SimpleXMLEIement, e assim por diante. O objeto
eles so capazes de modelar a hierarquia de elementos de um SimpleXMLEIement tambm possui mtodos que lhe permitem
documento XML em objetos filhos aninhados. O benefcio dessa acessar dados de um elemento, como children{) e attributes().
abordagem que voc pode navegar atravs dos objetos filhos
usando o operador -> e acessar os dados que quiser.
republicaes e servios web

Cada vez mais avstamentos de Fang


Enquanto Owen esteve ocupado aprendendo a lidar com o XML e descobrindo como
se comunicar com o YouTube, Fang tem estado ocupado. Numerosos avistamentos tm
aparecido, com o cozinho aparentem ente trabalhando como guia turstico para os seus
captores aliengenas. Owen est pronto para term inar o script do YouTube, obter alguns
vdeos para colocar na sua home page e encontrar seu co perdido.

DogRittesin UFO Hovering Hear San Francisco!

A boa notcia que Owen j tem quase todo o script do


YouTube pronto. Na verdade, s o que falta term inar de
processar os dados XML e format-los como cdigo HTML.

- firiar uma reqwcigSo por vdeos do


-YouTube:
Ris^uc este passo e O Emit ir a requisio do vdeo poro o~
o sdrpt youtube-php YouTubcr
estv- pvointo! P.eceber a resposta do VouTubo,
contendo informaes suUre us vwfeesr-
Processar os dados do resposta e
format-los como cdigo HTML.

Desenhe abaixo como voc formataria os dados de


resposta do YouTube como vdeos, colocando-os na
parte de baixo da pgina principal do site Fui Abduzido
por Aliens:

voc est aqui 701


o script completo youtube php

0 script youtube.php usa cdigo PHP para obter os cinco primeiros resultados
de uma busca no YouTube. Em seguida, eie exibe imagens reduzidas
fc iO (thumbnails) desses vdeos em uma linha horizontal, com links para os vdeos
propriamente ditos no YouTube. Complete o cdigo que est faltando no script,
usando o exemplo de dados de resposta XML do YouTube, na pgina seguinte,
como guia.

<?php
define('YOUTUBE_URL', 'http://gdata.youtube.com/feeds/api/videos/-/alien/abducton/
head/first');
define('NUM VIDEOS', 5);

// L os dados XML e os coloca em um objeto


$xml =................ (YOUTUBE_URL) ;

$num_videos_found = count (........... );

if ($num_videos_found>0) {
echo '<table><tr>';
for ($i = 0; $i < min ($num__videos_found, NUM_VIDEOS); $i++) {
// Obtm o ttulo
$entry = $xml->entry[$i];
$media = $entry->children('http://search.yahoo.com/mrss/');
$title = $media->group->.....;

// Obtm a durao em minutos e segundos, e depois a formata


$yt = $media->children('http://gdata.youtube.com/schemas/2007');
$attrs = $yt->duration->attributes ();
$length_min = floor ($attrs [1...... .'] / 60) ;
$length_sec = $attrs ['...... .
'] % 60;
$length_formatted= $length_min . (($length_min !=1) ? minutes, ':'minute, 1
$length_sec . (($length_sec 1=1) ? ' seconds':' second');

// Obtm a URL do video


$attrs = $media->group->player->

$video url = $attrs['url'];


repubicaes e servios web
// Obtm a URL da imagem thumbnail

$attrs = $media-> ..... ->thumbnail[0]->attributes();


$thumbnail_url= $attrs['uri ];

// Exibe os resultados para esta entrada

echo '<td style="vertical-align:bottom; text-align:center" width=" ' . (100 / NUM VIDEOS)

6 ><a href=" ' . $video_url . . ...... <br/Xspan style="font-size:smaller"> .


$length_formatted . </spanXbr/ximg src="' .............. . -- /></a></td> ;

echo '</trX/table> ';


} Esteja a votade para
usar este exemplo de
else {
odi0o tomo
echo '<p>Desculpe, nenhum.video encontrado,</p>; woroiid ao esfivevgv
O iodiCjO pttp csf
altando.
?>

:ntry>
,:id>http://gdata.youtube.com/f eeds/api/videos/_6Uibqf0vtA</id>
>.'Dublished>200 6-06-20T07 :49:05.000-07 :00</pubIished>
0 ttulo do vdeo.
.Cmedia:grcup> _______________
<media:title type- plain ^>UFO Sighting in Yosemite Park near Are ajyl</media:titie>
' <media:description type= plain 1>1 went on a trip to Yosemite Park in 2002 . Yosemite Park is very
close to the border between California andHevada, and close to Area 51. ..</media:description>
< <media:keywords>51, alien, aliens, area, ca, California, nevada, sighting, sightings,
u f o < /m e d ia : k e y w o rd s> > ^_______ A d&Tdi^dO d o V ideo e
< <yt:duration s e c o n d ^ > / ^ < r ------- --- ' seftUhdoS-
<media:category label='Travel Samp; Events j
scheme='http *.//gdata.youtube .com/schemas/2007/categories .cat'>Travel</media:category>
<media:content url='http://www.youtube .com/v/_6UibqfOvtA1 type='application/x-shockwave-flash'
medium=1video' isDefault=1true' expression=1full' duration='50' yt:format^15 1/>
^ Cmedia:content url= 1Xtsp://rtsp2 .youtube.com/ChoLEtIy73wIaEQnQwSnbiKl_xMYDSAiFEgGDA==/0/0/0/
ideo.3gp'
type=video/3gpp'medium='video1 expression='full1 duration^'50' yt:format='1'/>
^ <media:content url=1rtsp://rtsp2 .youtube.com/ChoLENy73wIaEQnGwSnbiKI_xMYESARFEgGDA==/0/0/0/
ideo.3gp'
tvpe=1video/3gpp'medium^ 'video expression^1full1 nin'rrvtiwp.-5O' yt: format='6' />
<media:player url= '<tp:77 www. you tube.com/watch? ^ 6Uibgf OvtV / *C. " '>*
A URL
nrl^htffvT/imn ynntnh>p .fn"nii.' i, ill[.U^f-PvtA^^ HDa height='97' width='130' do lihk
time=00:00:25'/>
<media: thumbnail url= http://img.youtube .com/vi/_6Uibgf 0vtA/l.jpg' height=97 'width=' 130 '
para o
time='00:00:12.500 1/> video mo
<media: thumbnail url='http: //img.youtube.com/vi/_6Uibqf0vtA/3.jpg height-' 97' width=' 130 1
time= '00:00:37. 500' />____ _ ___________
cmedia:thumbnail u r H < http://img.youtube.com/vi/ 6UibqfOvtA/0.jpg) height=240' width='320'
time= 00 :00:2 5 1/
</media:group> --- ^ . ..pi j.
<yt:statistics viewCount=2478159 favoriteCount='1897 1/> fl IAIM-
<gd: rating min=' 11 max='5' numRaters='1602 average='4 .17 /> w3<^CW'
<gd:comments> , .i
<gd: feedLink href='http://gdata.youtube.com/feeds/api/videos/_6UibqfOvtA/comments' reOUZiflo
countEint='442 6 1/> (t,Kurnblr3i0 do
</gd:comments>
</entry> VdCO
<entry>

</entry>
site de aliens agora com videos do youtube

T fe S T O R fV e
A dicione o script YouTube ao site Fui Abduzido por Alens.
Crie um arquivo de texto chamado youtube.php e digite nele o cdigo para o script
YouTube das duas pginas anteriores (ou baixe o script no site da Alta Books, em www.
altabooks.com.br). Voc ainda precisa incluir este script no index.php para ter os vdeos
do YouTube colocados na pgina principal do site Fui Abduzido por Aliens. Eis as duas
linhas de cdigo PHP para faz-lo:

echo '<h4>Vdeos de abdues mais recentes:</h4>1;

require_once{'youtube.phpT);

Envie os scripts para o seu servidor web e depois abra index.php


em um navegador. A parte de baixo da pgina dever mostrar uma
linha, gerada dinamicamente, de links para vdeos do YouTube
relacionados com abdues por aliengenas.

fnfcluir o strict
you-fcubepHp na
farina principal
e "tudo o c^uc
vote predisa
saer para
adicionar a
1'mKa de vdeos
de abdues.

Os vdeos
do ykuTube
jwdare (hucn
3 descobrir o
paradeiro de

7rtQ
republicaes e servios web
ponte seu lpis

voc est aqui > 709


voc achou fang!

i % p o n te seu lpis
Solupo
republicaes e servios web

Sua Caixa de Ferramentas do PHP MySQL


Agora que Fang foi encontrado, possvel

CAPITL 0 12
re fle tir um pouco sobre tudo o que foi
preciso para chegarm os a t ele. Como se
pode ver, o PHP e o MySQL precisaram de um
pouco de ajuda de algum as outras tecnologias.

voce est aqui


A p n d ic e I: S o t t is .

Os Dez Principais Tpicos


+(Que No Abordamos)

Mesmo depois de tudo isso, ainda tem mais um pouco, algumas


coisas que voc precisa conhecer No seria certo as ignorarmos, mesmo
que s precisem de uma breve meno. Portanto, antes de guardar o livro,
d uma lida nestes pequenos, mas importantes pargrafos sobre PHP e
MySQL. Alm disso, uma vez concludo este aqui, s faltaro mais dois
pequenos apndices... e o ndice... e talvez algumas propagandas... e a o
livro realmente acaba. Promessa!

isto um apndice > 713


adpte seu cdigo php

*1. Adapte este livro para funes PHP4 e mysql


Com exceo das funes XML do Captulo 12, a maioria dos cdigos deste livro roda tambm
em servidores PHP 4, com apenas uma pequena modificao. Ns usamos a famlia de funes
mysqli neste livro, que s esto disponveis no PHP 4.1 e acima. E, uma vez que essa biblioteca
te m q u e ser in sta la d a m a n u a lm e n te , alg u n s servid o res n o te r o su p o rte a mysqli.

As funes mysqli em geral so mais rpidas, mas isso s comea a realmente fazer
diferena quando o seu banco de dados fica muito grande. Bancos de pequeno ou mdio
porte no so perceptivelmente mais lentos com as funes mysql antigas. Esta seo lhe
ensinar como adaptar suas funes mysqli para funcionarem como funes mysql, com
verses antigas do PHP.

Quando voc vir:


$dbc = mysqli_connect(localhost, 'mork', 'fromork');
mysqli_select_db($dbc, 'alien_database');

Mude para o seguinte:


A varivel de doe*ao ao bado
$dbc = mysql_connect(localhost, 'mork
mysql_se1ect_db('alien_database', $db<
do <\ue adorctede do mysqli
seled dbO.
Em geral, voc apenas remove o i de mysqli ficando mysql e depois muda a ordem dos
argumentos, de forma que a varivel de conexo ao banco de dados ($dbc neste exemplo)
aparea por ltimo.
Mas a coisa fica um pouco mais complexa quando a funo mysqli_connect() toma o lugar
de mysqli_ select_db() que usa o nome de um banco de dados. No existe nada parecido
com isso na famlia de funes mysql. Para reproduzir a funo mysqli_connect() que usa
um nome de banco de dados, voc precisar de duas funes mysql.
Quando voc vir:
$dbc = mysqli_connect(localhost, 'mork', 'fromork', 'alien database');

dados e seledionado
Precisar usar dois comandos: t parie da
operaao de do*e*ao -
a$o \ue ao e possvel
') ;
$dbc = mysql_connect(localhost, 'mork', 'fromork'); azer Cm um s passo
dom -(undoes mys^l
mysql__select_db ('aliendatabase ', $dbc) ;

de do^e*So ao bando de dados.


sobras

Aqui uma comparao entre as funes mysql e mysqli.

Fechar a conexo do mysqli close(conn) mysqli close (conn)


MySQL
Abrir uma conexo a um mysql connect(host, mysqli connect(host,
servidor MySQL username, password) username, password,
Voc precisa usar mysql database)
select db () para Voc no precisa de mysqli
selecionar um banco de select db() para selecionar
dados. um banco de dados.
Retomar o texto da mysql error(conn) mysqli_error(conn)
mensagem de erro de uma
operao MySQL anterior
Escapar de uma string mysql escape mysqli escape
string (string, conn) string(conn, string)
A ordem dos argumentos ao A ordem conexo (link), e
contrrio, com a string vindo depois a string.
antes da conexo (link).
Obter uma linha de mysql fetch row(result) mysqli fetch row(result)
resultados como um array
associativo, um array
numrico, ou ambos
Obter o nmero de linhas mysql num rows(result) mysqli num rows(result)
do resultado
Executar uma consulta mysql query(query, mysqli query(query,
MySQL conn) conn)
Escapar de caracteres mysql real escape mysqli real escape
especiais em uma string string(string, conn) string(conn, string)
A ordem dos argumentos ao A ordem conexo (link), e
contrrio, com a string vindo depois a string.
antes da conexo (link).
Selecionar um banco de mysql select mysqli select db(conn,
dados MySQL d b (dbname, conn) dbname)
A ordem dos argumentos ao A ordem conexo (link), e
contrrio, com a string vindo depois a string.
antes da conexo (link).

voc est aqui > 715


configurando permisso de usurio mysqi

* t. Permisses do usurio no M ySQ l


Suponha que voc tenha criado uma aplicao web que s permite aos visitantes
selecionarem dados da sua tabela, com SELECT. Voc realiza consultas nos seus dados
usando um banco especfico, e o MySQL lhe permite m anipular os seus dados.
Mas considere o seguinte: o login e a senha que voc usa na sua string de conexo mysqli,
se conectados diretam ente ao banco atravs do terminal ou GUI MySQL, permitiriam ao
usurios fazer INSERT, UPDATE e DELETE nos dados.
Se a sua aplicao no precisar fazer essas coisas, no h nenhum motivo para que o
nome de usurio/senha que voc esteja usando para se conectar a ela tenha a capacidade
de faz-las. Com o MySQL, voc pode limitar o aceso ao seu banco de dados. Voc pode
instruir o MySQL somente perm itir que o usurio execute SELECT. Ou ento SELECT e
INSERT. Ou qualquer combinao que voc precisar.
E o que mais impressionante, voc pode controlar o acesso a tabelas especficas. Por
exemplo, se a sua aplicao s trabalha com um a tabela chamada a lie n jn fo e no precisa
acessar a tabela cyborg_info, voc pode limit-la.
Primeiramente, voc poder querer um nom e de usurio e uma senha completamente
novos para serem usados na sua aplicao. Voc pode fazer isso no terminal MySQL:
I File Edit Window Help Aliens!

mysqi> CREATE USER alienuy ..IDENTIFIED BY aliensRsc4 ry


Query OK, 0 rows affected (0.07 sec) .

Ento possvel usar o comando MySQL GRANT para controlar o que alienguy pode fazer no seu
banco de dados. Se ele s precisar executar SELECT e INSERT no banco, isto seria o suficiente:
i F i l e E dil W indow Help ThevLive ......... .................... 1 11 - m

mysql> USE alien jdatabase ;


Database changed
mysqi> uRA^T biiLECi, I^bERT ON. alien into TO alienguy;
Query OK, 0 rows affected (0.03 see)

Se no gostar de usar o terminal MySQL para criar usurios e definir privilgios, voc pode
baixar e instalar um til programa chamado MySQLAdministrator. Baixe-o aqui: h ttp ://
dev.mysql.com/downloads/gui-tools/5.0.html.
pPssVel dfint prVlgog kcistante especficos para ps usurfps,
i mesmo coTifrolar o <jue o usuria p<ie fezer em uma coluna
especfica. Para aprender mais, consulte o lyYo Use a Cabea! SQL
sobras

O MySQL Administrator lhe permite controlar as contas dos seus usurios, bem como o
que cada usurio pode acessar no seu banco de dados. Ele lhe permite at especificar quais
tipos de consultas o usurio pode realizar em cada tabela do seu banco. Para controlar o
acesso dos usurios a cada tabela e cada consulta, abra o aplicativo MySQL Administrator e
clique na guia Accounts.
Segue abaixo a interface e uma explicao geral sobre como controlar o que cada usurio
pode fazer. Em primeiro lugar, crie uma conta:

i i a %
ifwnrafcor 5orvfce Options

arnselm
S I ,
logs Backup Xestorc C^r^gjS?*

-.iLag/AR::-*d!iwirtfofmtonabout tb&
Primeiramente, Aps dar um
em h tto unts. >*ySQsrAi*m**
nome e uma
Cwfrr senha para o
IBOPoptK*\!iJ. . novo usurio,
Lsers-fy .raar^s. dli^ue <\ui
para dondeder
Em seguida use este I privilgios a ele
botao para adidionar
uma nova donta-
Esta e a lista dos seus
usurios, l/ode pode dria* SE l tefreaft\
ovos usurios para de-finir
espediidamente o dontrole ^ u i esta a lista de tabelas de um
*\ue dada um tera sobre determinado bando de dados. Seledione
jj d e W i^ d a aj-lidao.
Seledione a donta |ue vode 1 v
<^uer modvidar a^ui-
:: - -

iipM 5-- **- . j, * S ;,B f-MrT l


V ornw tior Scm ot Optsrts :^t!KJM_OofW(ai(Kis. Hltti- Loss r Sickup . Cstajogi
'A
vW 'P"V
Se observar
*.|-<Oe^aliIjtSdiiitf^^tegeg>;;asourw esta lista, vode
redonbedera
r as prindipais
: -j& -elnier
Asstgr. sthem a (d stab as* ) i o a n e c t t o i privfleggs to t h f j r .
! iyrn
y
mmmmm
: T & m y w tb ap p

&rne
ScKis
Tfijef T
,

^ informaiorusebe
I te,grfYi-/.tsei A valsblt P r viiiflii

% Snser;
instrues My$L.
<y*e viu o lon^o

&roct siertdatabas*
Italiens
^Update
Dei deste Wo.
: Seledione apenas
j Qehfs^stofe ^ Create
! Qmysqi
j @ rlsltvjas
CD' 3< Dras
G rari aduelas de <\ue
% ' F-',r CL) K'References
a sua aplida^ao
predisa para
31 Index
^ Alter

jrundionar.
^ C rea ti.tm n .tiM e
%LockjaW
% C reate, vl ew
% 5how_viw
C reate. rDUtine
Alter, rod t me
Execute

fr'ftefresh j iiCciiG^a-iisi^
mmmmm mm
717
wm m
relatando erros ao mysql

*$. Relato de erros para o MySQL


Era muitos dos nossos exem plos de cdigos, voc ver linhas com o a seguinte:
m ysqli_conn ect(localhost, 'mork', 'fromork') or die ('no conectou.')
Quando esse comando falha, as palavras no conectou. so exibidas na pgina web. Elas
nos informam que algo deu errado, mas no nos diz nada mais alm disso.
Felizmente, o PHP tem um funo, rnysql_error(), que pode nos dar uma dica sobre o
que exatamente houve de errado. Considere este cdigo, no qual estamos tentando nos
conectar a um servidor MySQL que no existe:
<?php
mysqli_connect ('badhostname', 'mork'f 'fromork') or die (mysqli
error());
?>
'boost do servidor MYSQL 'badhostname'

O seguinte cdigo retom a informaes claras sobre o que realmente aconteceu de errado
quando a funo mysqli_connect() falhou. Voc pode usar tambm mysqli_error() com
outras funes mysqli:
<?php
$dbc = mysqli_connect('localhost', 'mork', 'fromork');
mysqli_select_db ($dbc, alien_database); s3os -tcn-Undo
echo mysqli_error($dbc) . '<br />';
mysqli_select_db($dbc, 'alien_database');
mysqli_query($dbc, "SELECT * FROM alien_inro");
echo iriysqli_enf"r)r \ .
*
?>

Eis o output:

Eis algumas outras mensagens de erro que voc poder ver:


Tabela 'teste .sein_essa_tabela no existe
No consegui criar a tabela
No consegui criar o banco de dados 'seubancodedados'; banco j existe
No consegui deletar o banco de dados 1seubancodedado'; banco no existe
Existem muitas outras e seria um desperdcio de papel list-las todas aqui. Consulte este
site para obter mais informaes:
http://dev.mysql.com/doc/refman/5.0/en/ error-messages-server.html

Caso esteja adaptando suas funes para verses antigas do PHP,


com o m encionado no item #1, voc pode usar mysql_error() em vez de
m ysqli_error().
sobras

#4. Erros PHP com tratamento de excepes


O tratamento de excees lhe permite modificar o
fluxo normal do seu cdigo e executar um bloco
de cdigo especial quando uma determinada
exceo ocorrer. A verses 5 e 6 do PHP oferecem o
tratamento de erros. Eis aqui uma breve introduo.
Digamos que voc queira sacar $200 de um caixa
automtico.
Mas talvez o seu banco requeira que mantenha um
saldo mnimo de $1000, sendo que este saque o
colocaria abaixo de $1000. Isso no permitido.
A transao falhou!
Eis aqui a forma como esse cenrio poderia se
desenrolar na forma de cdigo PHP, com a ajuda do
tratamento de excees para capturar a falha.
<?php Eis o eedbadk <^ue

function checkBalance($balance) { enviaremos, daso o

/
saldo i^ue abaixo de
if($balance < 1000) { 1000.
throw new Exception("0 saldo est abaixo de $1000.");

}
return true;
} o b\oto % r f t i*ado fra
te s ta r o nosso vior gv
-j~r y | ter^^ar o -lui^o do todi^y?-
Hs, verihfidamos
checkBalance (999); ^ w * s o saldo
echo 'Saldo maior que $1000.';

}
catch(Exception $e) { K r
Se a e*dea odorrer, os
echo 'Error: ' . $e->getMessage (); ^ _______ ^ e*edvt*KS o dodtgo deste
blodo. Neste daso, edodmos
a ensaie*-
?>
Quando o cdigo for executado, voc ver isto:
Erro: 0 saldo est abaixo de $1000.

voc est aqui > 719


tratamento de excees no php

#4. Erros PHP eom tratamento de excepes (contiwuapo)


O tratamento de excees consiste de trs blocos de cdigo:

1. Try - neste bloco que voc verifica se o valor o que estava esperando.
Se for, est tudo bem, e o seu cdigo prossegue. Se no, significa que ocorreu uma
exceo. Na lngua dos programadores, a exceo "lanada".
E quando algo lanado, precisa existir alguma outra coisa para peg-lo. Se houver
uma exceo, o cdigo do bloco "catch" executado. Se no, o cdigo continua
normalmente
2. Throw - o "throw" comanda
o bloco "catch" e envia a
ele uma mensagem de erro. <?php
Cada "throw possui no function checkBalance($balance) {
mnimo um catch".
if($balance < 1000) {

throw new xception("0 saldo esta abaixo


de $1000.");

}
return true; /

1
3. Catch - um objeto try {
criado com as informaes
da exceo. Para mais checkBalance(999) ;
informaes sobre os objetos, echo 'O saldo est acima de $1000.';
veja a pgina seguinte
}
catch(Exception $e) {

echo 'Error: 1 . $e->getMessage();

}
?>
sobras

#5. PHP orientado a objetos


As linguagens orientadas a objetos usam um modelo de programao bastante
diferente das linguagens procedurais. Voc tem usado o P H P de forma
procedural, mas essa linguagem tambm tem um lado orientado a objetos. Em
vez de termos um conjunto de instrues ordenadas, as estruturas particulares se
tomam objetos. Os objetos incluem no somente uma definio dos seus dados,
mas tambm todas as operaes que podem ser realizadas neles. Quando voc usa
P H P orientado a objetos, voc cria e trabalha com objetos.

Antes de entrarmos no assunto do por que voc poderia querer usar o P H P Esta e a nossa dlasse
orientado a objetos, vamos escrever alguns destes: SonOj, ^vie define o
nosso obieto-
O Escreva a sua classe.
class Song M 3<V*i deine
{ Estas sdo variveis o ttu lo t it le )
var $title-; de mstlntias- e a le tra lyrids)
var $lyrics; da 3ao
($0*3), assim
function Song($title, $lyrics) driarmos uma.
$this->title - $title;
$this->lyrics = $lyrics;
} Este e um etodo ^ve ^sa 5s
variveis de mstwd do objeto*
function sing() {
echo 'This is called 1 $this->title . 1.<br />
echo 'One, two, three. . $this->lyrics;
}
A nossa hova tSnlio t e o valor
O Crie um objeto novo. wBl*et*ede SKoesw t<mo o wwe-

$shoes_song = new Song('Blue Suede Shoes', 'Well it\'s one for the money...');
$shoes song->sing();

nos dhamamos miodo


f r o nosso objeto.

Q A sua cano pode c a n ta r a si mesma!

Quando voc executa este cdigo, obtm o seguinte:

Mas se podemos simplesmente


escrever o cdigo echo sem nada
This is called Blue Suede Shoes.
One, two, three...Well its one for the desse negcio de objetos, por que
money... usar o P H P orientado a objetos?
Existem algumas timas razes...
voc est aqui > 721
php orientado a objeto

*5. PHP orientado a objetos (continuao)


Em vez de um conjunto ordenado de instrues, as suas estruturas de dados tomam-se
objetos. Os objetos incluem no somente a definio dos seus dados, mas tambm todas
as operaes que podem ser realizadas neles. No nosso exemplo Song, ns definimos o
ttulo e a letra da cano dentro da classe, e criamos o mtodo singQ dentro da classe.
Se precisssemos adicionar outras funcionalidades ao nosso objeto Song, s teramos de
adicionar novos mtodos e variveis nossa classe Song. Por exemplo, se quisssemos que o
autor de cada cano ficasse associado a cada objeto, poderamos adicionar isso, como uma
varivel, nossa classe.
O poder da orientao a objetos realmente aparece quando a aplicao cresce. Suponha
que decidssemos usar a classe Song como parte de uma aplicao de karaok, com
centenas ou at milhares de objetos song individuais, cada um com o seu ttulo, letra e
autor. Agora digamos que algum deseje escolher apenas dentre as canes escritas por
Elvis. Tudo o que teramos de fazer olhar a varivel de instncia referente ao autor de
cada objeto.
E para enviar a letra da cano aplicao de karaok? Ns poderamos simplesmente
chamar o mtodo sing() para cada objeto executado. Embora estejamos chamando
exatamente o mesmo mtodo para cada objeto, ele estar acessando dados nicos a cada
um dos objetos.
Assim temos duas grandes vantagem para se usar PHP Orientado a Objetos;
Os objetos podem ser reutilizados facilmente. Eles so elaborados para serem
independentes do cdigo onde so usados, e podem ser reutilizados conforme necessrio.
O cdigo fica mais fcil de entender e manter. Se um tipo de dados precisar se modificar, a
mudana s ocorre no objeto, e em nenhuma outra parte do cdigo.
Uma grande desvantagem que, de forma geral, o cdigo OO pode ser mais longo e
demorar mais tempo para ser escrito. Se voc s precisa exibir a letra de uma cano, ento
escrever um pequeno programa procedural poder ser a melhor opo. Mas , no futuro, se
achar que poder querer criar essa aplicao de karaok online, considere a possibilidade
de usar o PHP orientado a objetos.
sobras

*6. tornando segura a sua aplicao PHP


Existem alguns passos simples que voc pode seguir para proteger seus scripts
PHP daqueles nefastos hackers que, neste exato momento, esto a postos nos
seus teclados esperando que cometa um vacilo.
Remova referncias a phpinfo(). Quando comear a criar
aplicaes PHP em novos servidores web, voc provavelmente ir
criar um script contendo a funo phpinfo(), para ver qual verso
do PHP voc est usando e se ela tem suporte ao MySQL, junto com
uma lista de outras bibliotecas instaladas. No tem problema em
fazer essa checagem com phpinfo(), mas deve remover essa funo
depois de ter feito a verificao. Se no o fizer, qualquer hacker que
descobrir uma nova vulnerabilidade do PHP poder checar se o seu
site suscetvel a ela.
O Se no estiver usando um servio de web hosting e tiver acesso
ao arquivo php.ni, h algumas modificaes que pode fazer
para tomar suas aplicaes PHP mais seguras. Ironicamente, a
localizao do seu arquivo php.ini pode ser encontrada usando-se
phpinfoQ:

Eis o daminho 3t
o seu arquivo php.
"mi. Depois de
not!o, lembre-
se de deieiar a
funao pHpmoO.

Existem mis
in-formadoes
sensveis n
parte de kai*o
da p^rna.

voc est aqui > 723


medidas de segurana no php

#6. Tomando segura a sua aplcapo PHP (continuao)


Eis algumas configuraes especficas que deveria considerar para o arquivo php.
ini. Abra esse arquivo em um editor de texto, faa as modificaes, salve-as e depois
reinicie seu servidor web.
safe_mode = On
Quando voc ativa o safe_mode, nenhum script PHP pode ser chamado por
outro script, pertencente a outro usurio, do mesmo servidor web. E claro que, se
precisar permitir que os scripts de outros usurios chamem os seus, no poder
usar esta configurao.
open_basedir = directory[:...]
Isto restringe os scripts e arquivos que o PHP poder executar ou acessar neste
diretrio e nos subdiretrios dentro dele.
expose_php = Off
Com isto definido como On, todo navegador que visitar o seu site receber
informaes, na forma de cabealhos, revelando detalhes sobre o seu servidor PHP.
Definindo-o como off, voc esconde essas informaes e torna o seu servidor um
pouco menos exposto.
display_errors = Off
Uma vez que tenha desenvolvido sua aplicao e que ela esteja rodando no seu
servidor, voc no precisa mais ver todas as mensagens de erro. A esta altura, espera-
se que j tenha corrigido os erros, mas s vezes alguns escapam. Para esconder as
mensagens de erro dos visitantes, defina este item como Off.
log_errors = On
Isto envia as suas mensagens de erro para um log. Quando quiser verificar se a sua
aplicao contm erros, esse um bom lugar para comear a procurar. Com display_
errors definido como Off e log_errors como On, poder ver as mensagens de erro,
mas os visitantes do seu site no as vero.
error_log = filename
Voc ter de verificar no seu software servidor web particular onde este arquivo se
localiza. E nele que os seus erros sero escritos, quando log_errors estiver definido
como On.
sobras

#7. Proteja sua aplicapo de scripts cross-site


Voc poder ter ouvido falar dos scripts cross-site
com o nome de XSS. Essa tcnica refere-se a um
tipo de ataque contra aplicaes web, no qual
um determinado cdigo passado para o script
que processa os seus formulrios, permitindo ao
hacker assumir o controle do seu output. Esse um
grande problema de segurana nas aplicaes web
PHP. Vamos ver o que exatamente e como nos
defendermos desse tipo de ataque.
O ataque de script cross-site geralmente ocorre contra /
sites que exibem dados submetidos pelos usurios. nao pode ais trapadear,
Quaisquer dados que voc recebe dos seus usurios e was ela pode redirediohar a
exibe no site poderiam ser corrompidos e fazer com que p^ma de pontuaes para
os visitantes do seu site fiquem vulnerveis ao hacker. 0 SCta Prprio site, usando o
ataque de script dross-site-
Usando um ataque XSS, o hacker pode fazer uma
srie de coisas. Uma das piores delas redirecionar E voc
a sua pgina de resultados para uma pgina de achou que tinha
um site sob o controle do hacker, onde ele poder me vencido. Eu vou
pedir mais informaes ao usurio. O seu usurio sequestrar o seu site
poder no perceber que no est mais no seu site e voc est perdido!!
e, uma vez que ele confia em voc, poder fornecer
informaes sensveis diretamente no site do hacker.
Eis como isso poderia acontecer no site do Guitar Wars:
Ethel, em vez de escrever o nome dela no campo
"Nome" do formulrio, digita algum cdigo JavaScript
No exemplo, ela est usando a funo window.location
para redirecionar o navegador para o site dela. E uma
vez que ela controla o seu prprio site, poder mostrar <script language-
ao visitante qualquer pgina que quiser, inclusive uma ja vascript>wi nd ow.
idntica do Guitar Wars. Ela poderia fazer algo ainda location=http://ethelrulz.
mais nefasto no caso de sites onde as pessoas submetem com;</script>
informaes mais importantes do que pontuaes,
como por exemplo, informaes financeiras.
Existem outras coisas, ainda mais insidiosas, que
ela poderia fazer, incluindo roubar cookies ou Tudo o <\ue ela predisa
apresentar ao usurio uma tela que se parea com azer e suWeter
uma tela de login. Assim que o usurio se conecta, este ddi^o o tawpo
ela passa a ter o seu nome e senha, e poder ento "nome do orulario-
usar essas informaes para se conectar no site $ua*do al^uem
original como se fosse o usurio hackeado. visualiza a pontuaao,
o seu navegador sera
Ento, como evitar os ataques de scripts cross-site na^ redirediohdo para o site
suas aplicaes web? de tHei por esse dodigo
JavaSdript-
voc est aqui > 725
prevenindo scripts cross-site

*7. Proteja sua aplicapo de scripts cross-site (continuao)


Felizmente, se estiver validando seus dados, j est com meio caminho andado para
proteger sua aplicao. Voc j aprendeu como fazer isso no Guitar Wars. Eis as trs
orientaes bsicas para manter suas aplicaes seguras:
Valide tudo
Quaisquer dados que receber, como por exemplo input de formulrios, precisam ser
validados, de modo que o cdigo do hacker seja detectado antes que possa fazer algo
contra a sua aplicao. Se assumir que os dados so prejudiciais at que a validao prove
que no so, voc estar muito mais seguro.

Funpes internas do PHP podem ajudar


Use funes do PHP, como strip_tags(), para ajud-lo a sanear os dados externos. strip_
tags() uma tima funo que remove quaisquer tags HTML presentes em uma string.
Assim, se usar strip_tags() no $_POST['name'] de Ethel, o resultado final ser:
window.location='h t t p ://ethelrulz.com'

Embora isso ainda no seja um nome, no ir mais redirecionar o navegador, porque as


tags JavaScript necessrias para isso foram removidas.

Os dados so culpados at provar a sua inoencia


Comece com a validao mais restrita que puder, e s facilite se for preciso. Por
exemplo, se comear aceitando apenas nmeros em um campo de nmero telefnico
e depois aceitar hfens ou parnteses, ser muito mais seguro do que se permitisse
quaisquer caracteres alfanumricos originalmente. Ou, no caso do Guitar Wars, se
ns no permitirmos nada alm de letras no campo do nome, nunca teremos o sinal
menor que (<) que abre o malfico cdigo JavaScript de Ethel. As expresses regulares
(Captulo 10) podem ser bastante teis para garantir que s sejam permitidos os dados
exatos que voc quer.
sobras

*8. Precedncia de operadores


Considere esta linha de cdigo.
$marbles = 4 / 2 - 1 ; <_ 0 resultado ser /.
0 valor armazenado por $marbles poderia ser 1 ou 4. impossvel saber s olhando o cdigo,
mas podemos assumir certas regras de precedncia. Por precedncia, queremos dizer a ordem
em que os clculos so executados. Os operadores do PHP so executados em uma determinada
ordem. No exemplo acima, a diviso ocorre antes da subtrao, e por isso $marbles ser igual a 1.
Dependendo do output que precisemos do nosso cdigo, poderamos t-lo escrito de duas
formas diferentes:
$marbles = (4 / 2) - 1;
$marbles = 4 / (2 - 1);
Na primeira expresso, dividimos 4 por 2 e depois subtraamos 1. No segundo caso, subtramos
1 de 2 e depois dividimos 4 pelo resultado, que 1. O uso de parnteses lhe permite controlar
de forma precisa a ordem das operaes. Mas conhecer a precedncia dos operadores do PHP
poder ajud-lo a descobrir o que est acontecendo em uma expresso complexa. E, acredite,
isso lhe ajudar tambm a tirar os bugs do seu cdigo quando se esquecer de usar os parnteses.
Antes de passarmos para a lista de precedncia dos operadores, eis aqui outro motivo pelo
qual deve usar os parnteses. Considere o seguinte:
$marbles = 4 - 3 - 2 ; ^ --- -- Q resu|tado ser -I-
Nenhuma regra de precedncia se aplica aqui. O resultado poderia ser 3 ou -1. Isso bem
confuso quando se est escrevendo cdigo. Portanto, melhor programar com parnteses,
como nestas duas linhas:
$marbles = 4 - (3 - 2);
$inarbles = ( 4 - 3 ) - 2;

Agora a lista, em ordem da maior precedncia (avaliada primeiro) at a menor (avaliada


por ltimo).
Operador Tipo de O perador 1
++ acrscimo/decrscimo
*/ % aritmtico
+ - . aritmtico e string
< < - > > = <> comparao ------ ------------ - -
== != = !== comparao Os operadores de
&& lgico tow^aradao, tomo
11 lgico aqueles <^*e vode
atribuio usa e detlaraoes
\II

dPII
*II
+II

aII

|= A_ <<=
I1I

II
II

>>= flr, entra


and lgico no ordenamento de
pretederwtia-
xor lgico
or lgico
voc est aqui 727
php 5 versus php 6

*9. Qual a diferena entre PHP 5 e PHP 6


No momento em que escrevemos este livro, a verso mais recente do PHP a 5. Mas o
PHP 6 est sendo elaborado e j est disponvel para desenvolvedores aqui: http://snaps.
php.net/.
As diferenas entre o PHP 4 e o 5 so muito maiores do que entre o 5 e o 6. De muitas
formas, o 6 mais um refinamento dos recursos de orientao a objetos introduzidos na
verso 5. Outras modificaes incluem melhor suporte a XML e Unicode.

Maior suporte Unicode


Suponha que a sua aplicao precise fazer output de texto em grego.

Isso e
para ns/.

Considere o tipo de coisas que voc, s vezes, precisa fazer com strings quando, por
exemplo, precisa saber o tamanho delas, ou precisa classific-las. E bem simples na
sua lngua nativa, mas quando est trabalhando com caracteres de outros alfabetos,
as operaes com strings ficam muito mais complicadas.
O Unicode um conjunto de caracteres e tecnologias para codific-los. Em
Unicode, o caracter grego que se parece com um tringulo tem um valor nmero
especfico atribudo a ele, junto com outros caracteres de outros alfabetos. O
Unicode um padro, o que significa que ele aceito e empregado pelos mais
importantes fornecedores de tecnologias. No Unicode, todo caracter tem um
nmero nico, no importa que lngua, programa ou plataforma esteja sendo
usada. Antes da verso 5, o PHP no tinha suporte real ao Unicode. O PHP 6
tem um suporte melhorado a strings Unicode nas suas funes, bem como novas
funes criadas especificamente para se criar e decodificar Unicode.
sobras

*9. Qual a diferena entre PHP 5 e PHP 6 (continuao)


Melhorias de 00, suporte a X M l, e outras modffcapes
O PHP 5 oferece um modelo de programao orientado a objetos, Nenhum tityo
mas ainda permite a escrita no estilo procedural. O PHP 6 vai mais ao 4: deste livro usa
fundo do reino da orientao a objetos. Uma das grandes modificaes fundes dinmias,
que as funes dinmicas no podero mais ser chamadas com portanto naci
sintaxe esttica. Existem tambm vrias modificaes pequenas, porm precisa se
importantes, na maneira como o PHP manipula o seu cdigo OO, de preoCupar se o
modo a tom-lo mais consistente com outras linguagens orientadas a ddi$o vai ou no
objetos, como C++ e Java. un&ionr o
PHP
Algumas outras modificaes:
*+ Tanto o XML Reader quanto o XML Writer sero extenses no PHP
6, facilitando o trabalho com arquivos XML.
*+ As opes register_globals, magic_quotes e safe_mode do arquivo
php.ini no estaro mais disponveis.
*+ A extenso ereg, que fornecia outra forma de criar expresses
regulares, foi removida. Felizmente, o mesmo cdigo com preg_
match() que vimos neste livro continuar sendo a principal forma
de criar expresses regulares no PHP 6.
+ Um tipo integer de 64 bits ser adicionado.
Os arrays multidimensionais podero usar foreach.
+ A verso 6 do PHP , mais do que qualquer coisa, uma atualizao
que organiza e refina a linguagem.

voc est aqui > 729


aplicativos php populares

*10. Reutilizando o PHP de terceiros


Nem sempre necessrio escrever o seu prprio cdigo PHP a partir do zero. Em
alguns casos, melhor reutilizar o cdigo j escrito por terceiros. Seguem abaixo
alguns pacotes de software baseados em PHP bastante populares e bem-sucedidos,
que dever pensar em usar, caso precise e prefira no ter de reinventar a roda do
PHP. Ah, e so todos gratuitos!
Espere um minuto! Por
Prupal que se dar ao trabalho de
Um dos projetos PHP mais impressionantes at hoje, o aprender PHP se voc s
Drupal um poderoso sistema de gerenciamento de vai reutilizar o cdigo dos
contedo que pode ser usado para se criar praticamente outros?
qualquer tipo de site baseado em contedo. A NASA, o
The Onion, a Electronic Frontier Foundation e o Popular
Science so alguns dos que usam o Drupal nos seus web Owbro sistemS de
sites. Ele flexvel o suficiente para criar basicamente gercni3mev>to t
qualquer coisa que tenha grandes quantidades de onteudo baseado
contedo. Visite http://drupal.org/. em PHP <\ue
mwho bom e o
phpW Joomlf e voCe pode
Lder da categoria dos quadros de mensagens online v/Yfw tKetav em Wttp:/ /
(forums), o phpBB bastante fcil de usar para jooml-or^/'
a criao do seu prprio forum. E extremamente
flexvel e difcil de ser batido naquilo que faz to bem
- gerenciar discusses temticas. Descubra mais sobre
ele em http:// www.phpbb.com/.
Coppermine G-allery
Se o que tem em mente fazer hosting de imagens,
a Coppermine Gallery a aplicao PHP para o seu
caso. Em uma era de Flickr, Photobucket, Shutterfly Porque reu tilizar cdigo no
e Snapfish, manter a sua prpria biblioteca de fotos sem pre t o fcil quanto parece
parece um exagero. Mas o controle significa maior - em alguns casos, isso requer
poder, e se quiser controle total sobre as suas fotos, algum as habilidades em PHP.
d uma olhada na Coppermine Gallery, em http:// Muitos pacotes de software PHP ainda
coppermine-gallery.net/. requerem alguma personalizao, e
WordPress isso frequentemente, requer slidas
habilidades de desenvolvimento PHP.
Um dos campees da blogosfera, o WordPress No apenas isso, mas poder optar
um software baseado em PHP que lhe permite por reutilizar apenas um pequeno
criar e fazer a manuteno de blogs como componente do cdigo de terceiros
mnimo de esforo. Existe muita competio ou ento no reutilizar nada. De uma
nessa rea, de modo que poder desejar pesquisar forma ou de outra, tendo conhecimento
um pouco mais, mas o WordPress simplesmente de PHP, voc tem opes - e opes
uma tima opo caso queira criar um blog. sempre so uma boa coisa!
Baixe-o em http://w ordpress.org/.
Apndice 11: Conii^ure um Ambiente-
de Desen V1VU1ent9
Um Lugar para Brincar
+

Voc precisa de um lugar para praticar suas recm-


adquiridas habilidades em PHP e MySQL, porm sem
tornar os seus dados vulnerveis na web. sempre uma
boa idia ter um local seguro para desenvolver sua aplicao PHP antes de
lan-la no mundo (ou seja, na web). Este apndice contm instrues para
a instalao de um servidor web, do MySQL e do PHP, para lhe fornecer um
lugar seguro onde possa trabalhar e praticar.

isto um apndice > 731


instalando php e m ysql locai
Crie um ambiente de desenvolvimento PHP
Antes de poder colocar a sua aplicao no ar, voc precisa desenvolv-
la. E nunca uma boa ideia desenvolver sua aplicao diretamente
na web, onde todos possam v-la. Voc pode instalar algum software
localmente para criar e testar sua aplicao antes de coloc-la online.
So trs os tipos de software que precisar ter em seu computador local
para criar e testar aplicaes PHP:
1. Um servidor web
2. PHP
3. Um servidor de bancos de dados MySQL
O PHP no um servidor; um conjunto de regras que o seu servidor
web entende e interpreta. Tanto o servidor web quanto o servidor
MySQL so programas executveis que rodam em um computador.
Tenha em mente que estamos falando de configurar o seu computador
local como um servidor web para desenvolvimento PHP. Voc ainda
precisar de um servidor web online ond colocar a sua aplicao
finalizada, para que as pessoas possam acess-la e us-la.
/ll<y*m sotware servidor web, Em um ambiente de
domo o ApadHe, e nedessario desenvolvimento PHP, o seu
para servir os sdripts PHP
Servidor dompwtador Iodai a$e domo se
domo pginas web- osse um servidor^ e r^ tw b n d o
os seus sdripts PHP.
0 servidor de bandos
de d a d o s My$L
frequentemente insblad 0 PHP e instalado domo
no mesmo dompuiador parte do servidor web,
que o sotware servidor e permite que este
web - neste daso, 0 seu e*edute os sdripts PHP-
domputador lodaf/
Pescubra o que voc tem
Antes de tentar instalar qualquer um dos softwares NOTA: Este apndice
necessrios para o desenvolvimento PHP, a sua cobre o W indows 2000,
melhor opo avaliar o que j tem instalado. Vamos XP, V is ta , W indows
dar uma olhada em cada um dos tipos de software
e ver como pode descobrir o que j existe no seu Server 2003/2008,
sistema. ou outros sistem as
operacionais W indows
A plataforma do seu computador local faz muita
diferena para saber o que j est instalado. Por de 32 bits. Para o Mac,
exemplo, o Mac OS X tem um servidor web aplica-se ao M ac OS X
instalado por padro, enquanto que a maioria dos 10.3.x ou acim a.
computadores Windows no tem.
Configure um Ambiente de Desenvolvimento

Voc tew um servidor web?


Se estiver usando um PC ou Mac mais recente, provavelmente j tem um servidor web. Para
descobrir isso rapidamente, em qualquer desses sistemas, abra uma janela do seu navegador
e digite http://localhost na barra de endereos. Se voc vir uma pgina introdutria, isso
significa que o seu navegador web est acessando a sua prpria mquina local.

<h M t to** o servidor web V e f,ver u mqurna


Apadhe instalado, poder ver Wmdovjs to |[, poder ver
algo to m o isto. al^o to m o isto-

Voc tem o PHP? Qual verso?


Se tiver um servidor web, possvel verificar facilmente se tem o PHP instalado, e em caso
afirmativo, qual verso. Crie um novo script chamado info.php e digite nele o seguinte:
<?php phpinfoO; ?>
Salve esse arquivo no diretrio que o seu servidor web usa. No Windows, geralmente :
C: inetpub/wwwroot/

No Mac, geralmente algo como:


/Users/seunome/sites/
Se tentar abrir esse arquivo no seu navegador digitando http://localhost/info.php, ver
algo como a figura abaixo, se tiver o PHP instalado:

voc est aqui 733


verificando sua verso do mysql

Voc tem o M ySQ l? Qual verso?


No Windows, possvel saber abrindo o Painel de Controle -> Ferramentas Administrativas ->
Servios:

aqw que vod


vcv o

Para determinar se voc tem o MySQL no MAC, abra o seu terminal


e digite:
cd /user/local/mysql
Se o comando funcionar, porque voc tem o MySQL instalado. 0 To-jwinl MyS<$L
Para saber qual a verso, digite: t onhetdo
rwon'rtorW
to m o
mysql MySQL.
I rile Edit Window Help iHeartPHP

Se este $ cd. /usr/iocai/mysql


tom ii\& Q $ mysql
e*e.utar Welcome uo the MySQL monitor. Commands .end with ; cr
to m sudesso, Your MySQL;: connection id is 3
si^i-fiia que o Server version: -5.0.51b MySQL Community Server --(GPL)
/Vty$L- est Type'' 'help; or ''H fcr help : Type /\c' to-clear the
instalado- buffer. 7/
Configure um Ambiente de Desenvoivimento

Comece pelo Servidor Web


Dependendo da sua verso do Windows, possvel baixar o Servidor de Informaes
Internet (Internet Information Server, ou IIS) da Microsoft, ou ento o servidor web de
cdigo aberto Apache. Se precisar de um servidor no Mac, a sua melhor opo usar o
Apache, uma vez que ele j estar instalado.
Seguem breves instrues para a instalao do Apache no Windows:
Acesse http://httpd.apache.org/download.cgi
Se estiver usando o Windows, sugerimos que voc baixe o arquivo
apache_2.2.9-win32-x86-no_ssI-r2.msi. Ele automaticamente
instalar o Apache para voc depois que o baixar e clicar duas
vezes nele.

Baixe est verso e


clique duas vezes no
arquivo apos -te-l
baixado.

Em seguida, ver o Assistente de Instalao. A


maioria das instrues bem simples, e voc
pode aceitar as opes padres.

scolha o domnio em A opo de instalao Em geral, voc pode


que o seu computador tpica (typical) dever ser escolher o diretrio
se encontra. Se voc no suficiente para as suas padro para a instalao
tiver um domnio, pode necessidades. do software.
digitar localhost.
instalando php

Instalapo do Apache... concluda


Est quase pronto. Clique em Install e espere por mais ou menos um minuto at que a
instalao se complete. Isso tudo!

O seu servidor web configurado para se iniciar automaticamente


quando voc iniciar seu computador. Mas voc pode controlar esse
comportamento usando o painel Service, interrompendo e iniciando
o servio na caixa de dilogo Painel de Controle - > Ferramentas
Administrativas - > Servios, onde ele agora ir aparecer.

Iwstalapo do PHP
Acesse http://www.php.net/downloads.php.
Como no caso do Apache, se estiver usando o Windows, ns recomendamos que
baixe a verso com o instalador para Windows, php-5.2.6-win32-installer.msi. Esse
arquivo ir automaticamente instalar o PHP para voc, depois que o baixar e clicar
nele duas vezes.

das loealidddes e Clique no boto Run para


faa o download- iniciar a instalao.
Configure um Ambiente de Desenvolvimento

Passos para a instalapo do PHP


Tudo comea com um Selecionar a pasta de
Setup bsico. Aceite os Termos de instalao padro em
Licena para continuar. geral uma boa ideia.

Cuidado ao chegar nesta tela. Se estiver usando o Apache, selecione a verso


certa. Se estiver usando o IIS, provavelmente dever selecionar o mdulo
IISAPI. Verifique no seu software particular para determinar exatamente o que
que voc necessita.
Esta prxima tela tambm importante. Voc precisa
acessar as opes sob Extensions e escolher MySQLi.
Isso lhe permitir usar as funes mysqli do PHP que
apresentamos ao longo deste livro!

Adesse as opoes para Extension/ e diique e


MySQU- Clique n opdo "Ehiire -feature".
voc est aqui 737
instalando m y s q l no windows

Passos para a instalao do PHP... concludos


Isso tudo. Clique em Install, Agora experimente dar uma olhada no seu
e depois em Done para fechar arquivo http://localhost/info.php no seu
o in sta la d o r.
navegador web, e veja qual verso est aparecendo.

Instalando o M ySQ l
Instrues e Resolupo de Problemas

Voc ainda precisa instalar o MySQL, ento vamos ver os passos para baixar
e instalar o software. O nome oficial da verso gratuita do servidor MySQL
RDBMS, atualmente, MySQL Community Server.

Segue abaixo uma lista de passos para a instalao do MySQL no Windows e


no Mac OS X. Isto no deve substituir as excelentes instrues encontradas
no site do MySQL e ns recomendamos que acesse o site e as leia! Para
instrues muito mais detalhadas, bem como um guia de resoluo de
problemas, acesse: ^ ___________ Ba* a vmao .O ou ama.

http: //dev.mysql.com/doc/refman/6.0/en/windows-ins tallation.html

Tambm ir gostar do MySQL Query Browser que mencionamos


anteriormente. Nele, possvel digitar suas consultas e ver os resultados
dentro da interface do software, em vez de em uma janela de console.
Configure um Ambiente de Desenvolvimento

Passos para a instalao do MySQL no Windows


Acesse:
http://dev.mysql.com/downloads/mysql/ 6.0. html
e clique no boto de download do MySQL Community Server.
V o t podev ifc
dc folar Uta pouo
a pagina.

O Escolha Windows na lista.


priweira opao

voc es aqui 739


instalando mysql no windows (continuao)

Paixe o seu instalador


O Em Windows downloads, ns recomendamos escolher a opo
Windows ZIP/Setup.EXE, porque ela inclui um instalador que
simplifica bastante o processo. Clique em Pick a Mirror.

O Ver uma lista de localidades com uma cpia que pode baixar;
escolha aquela mais prxima de voc.
O Terminado o download do arquivo, clique nele duas vezes para
execut-lo. A partir deste ponto, voc ser guiado atravs da
instalao pelo assistente de instalao. Clique no boto Next.

Welcome to the Setup Waarrf for MySQL

T3P S e tjjp W izard w i a w y o u o rra rc w e


M ySQL .S a ^ r . 5*0 J 6 . icrfco u e., d id c N e x t.

I>epois que tiver t h t d o duas


veaes no arquivo e a dai*a de
dialogo Setup Wizard Assistente
de nstaia^ao) tiver aparedido,
diique no boto Ne*t

7An 11
Configure um Ambiente de Desenvolvimento

Escolha uma pasta de destino

Ser perguntado se quer a instalao Typical, Complete ou Custom.


Para os nossos propsitos neste livro, escolha Typical.
Voc pode mudar a localizao no seu computador onde o MySQL ser
instalado, mas recomendamos que mantenha a localizao padro:
C :\Program Files\MySQL\MySQL Server 6.0
Clique no boto Next.

Clique em install" e pronto!


Ser visualizada a caixa de dilogo Ready to Install com Destination
Folder ("pasta de destino") listada. Se estiver satisfeito com o diretrio
de destino, clique em Install. Caso contrrio, clique em Back, depois
em Change para mudar o diretrio, e siga a partir da.
Clique em Install.

voc est aqui 741


instalando mysql no mac os x

Habilitando o PHP no Mac OS X


O PHP vem includo nos Macs, com o OS X verso 10.5+ (Leopard), mas no
habilitado por padro. E preciso acessar o arquivo de configurao principal do
Apache e ativar uma linha de cdigo para habilitar o PHP. Esse arquivo se chama http.
conf, e u m arqu ivo oculto, localizado dentro da pasta de instalao do Apache.

Voc ir procurar pela seguinte linha de cdigo, que tem um smbolo # na frente
dela, indicando que ela est desativada como um comentrio:
#LoadModule php5_module Iibexec/apache2/libphp5.so

E preciso remover o smbolo # e reiniciar o servidor, paia habilitar o PHP.


O documento http.conf de propriedade de "root," o que significa que
ter de digitar sua senha para modific-lo. E uma boa ideia modificar
o arquivo php.ini para que o Apache o utilize. Para informaes mais
detalhadas sobre como executar esses passos e habilitar o PHP, visite http: / /
foundationphp.com/tutorials/php_leopard.php.

Passos para a instalapo do MySQL no Mac OS X


Se estiver usando o Mac OS X Server, uma verso do MySQL j dever estar instalada.
Antes de comear, verifique se j no tem uma verso instalada. V at Aplications/
Server/MySQL Manager (Aplicaes/Servidor/Gerenciador MySQL) para acess-la.

Acesse:
http://dev.mysql.com/downloads /mysql /6.0. html
e clique no boto Download do MySQL Community Server.

IA O
Configure um Ambiente de Desenvolvimento

O Escolha Mac OS X (package format) na lista.

Voteic^a <^v>c roiav


MySQL 5.0 Community Server - Generally Available (GA) Release urn pouio a fajina
ncontrast to grtefsasg Serv&r.wfiich fe^vss bct\ iscmtty r^ d updatesend ijua.'terty rvK* pack
ipeciJicsdiadute for whan a version cl tie MySQLCoam^ Serveris reieaseO- Wtilte evsiy&ugAx*at AasSenpps**
there a
. &rterp1$eSan*rwM alsob* availablein tie s u b s e q u e n t Catnrrwr.%Severreteise. tie re d be sourct-offtyaJea& es s\ Detwewft
; tscwce snd tunaty) cojrurwnl^ bonds. S<j vwiethe latest piifced cwnmunitysourceswill atoays&avallsite Iwr tfts Ssura
para adcssi!o.
Davffltoati* the bircftrias listedon ihispa^e mayb fromajMwous rtfsase. In anycese, fiii binariesfor all aur$upport&3


cperatfig system are an$ will remainaorwnianuy availed fromft page.
* TheStafl^dtnriaf^srerecorfimsna&o.iciTir^ituseTs
ti5 e * ta * v e r 5 f lin d u d e s a d d tiK if ia i{ e a g r e s f ta th a v e f io lb e e n e x h s u s tw ^ y te s te a o r a r r t itr e c fa r^
/
tiiese feat^es ftava natures and proven to be stable,Jhaywill be worporweii info tutLirefeJeasesof -S*r-
Hax veition aiso, fa1most plsdfcrms, coffiatre^ fiL j 2i2si storage node, man^j
ptogWH*.
* The De&ug binaries hava been nripiied with a debug Information. 3Qp
inctutied d e&ujjgJngcwJe may r e d u c e pe rtonnerce.
View * MySQL5.0list of Cttaoaea
: Wfl sugoesi at von usethe VPS cheetah;*!* and

Escolha o pacote apropriado para a sua verso do Mac OS X. Clique


em Pick a Mirror.
Ser visualizada uma lista de localidades que tm uma cpia que pode
baixar; escolha aquela que estiver mais perto de voc.
Terminado o download, clique duas vezes no arquivo para execut-lo. Agora
possvel abrir uma janela do Terminal no seu Mac e digitar:
shell> cd /usr/local/mysql
shell> sudo ./bin/mysqld__safe
(Digite sua senha, se necessrio)
(Pressione Control-Z))
shell> bg
(Pressione Control-D ou digite exit para sair do shell)
Se estiver usando uma ferramenta GUI, como o phpMyAdmin, consulte a
sua documentao para saber como acess-la depois que o MySQL estiver
instalado com sucesso.

voc est aqui 743


colocando seu site no ar

Passando do ambiente de produpo para um site no ar


Voc passou dias ou semanas trabalhando no seu site, e acha que agora
est tudo pronto para ir ao ar. Para passar o seu site PHP e MySQL do
seu computador local para web, necessrio um pouco de planejamento,
bem c o m a lg u m a s tcnicas especficas.
Primeiramente, necessrio se certificar de que o lugar onde o seu site
ser colocado tem as mesmas verses do PHP e do MySQL que usou
para desenvolv-lo. Caso contrrio, talvez precise adaptar seu cdigo aos
recursos disponveis. A maioria dos cdigos deste livro so adaptveis, mas
poder ter que ajustar seu cdigo usando as antigas funes mysql do
PHP, em vez das funes mysqli que usamos no livro. Se o problema for
esse, consulte o item #1 dos Dez Principais Tpicos (que no abordamos),
no Apndice 1, para mais informaes, 0 s seus arquivos PHP
Se o software do seu site online for compatvel, ento o processo de predisam ser enviados,
transferir seu site para l ser simples. Eis os passos: atravs de FTP, para o
diretrio web do seu site
1. Envie os arquivos PHP do seu servidor de produo para o
diretrio web do seu servidor online. Mantenha a estrutura dos
arquivos intacta, e certifique-se de manter quaisquer pastas que
tenha criado para conter os seus arquivos includos.
prediso obter 3
estrutura das suas
2. Faa um dump do banco de dados (o que lhe mostraremos tabelas e dos dados
logo a seguir) para obter as instrues MySQL de que precisa armazenados nela.
para criar suas tabelas, bem como as instrues INSERT de que Eis to m o '
necessita para transferir seus dados para o servidor online.
0 seu dump S .Q L
3. Faa login no seu banco de dados online, onde possa rodar as iWe tar a smta*e
exata para as suas
instrues MySQL CREATE e INSERT para transferir seus dados
do site local para o site online. instrues CRBATB
TABLB t im R T .

4. Modifique, conforme necessrio, o cdigo de quaisquer arquivos


PHP para apontarem para o servidor online do banco de dados.
Se no fizer isso, o seu cdigo online ir tentar se conectar ao
seu site de produo, e no o conseguir.

Modi-fi^ue s instrues *ys^ii__donnedtO


para apontarem para o seu servidor /Vty$L
n!ine> ju n to om o nome de usurio e senha
dorretos para azxr a done*ao.
Configure um Ambiente de Desenvolvimento

Pump seus dados (e as suas tabelas)


Voc j enviou por FTP os seus arquivos PHP para o servidor online, mas os seus
dados ainda no esto no servidor MySQL do site online. Quando a sua tabela
contm muitos dados, a ideia de mov-la para outro servidor MySQL pode ser
atemorizante. Felizmente, o MySQL oferece o programa MySQLdump, que lhe
fornece uma maneira fcil de reproduzir a instruo CREATE TABLE necessria
para recriar sua tabela, bem como todas as instrues INSERT para colocar seus
dados na nova tabela. Voc s precisa usar o programa MySQLdump. Para fazer
uma cpia dos seus dados, com o propsito de transferi-los para outro servidor
MySQL, digite o seguinte no seu terminal:
I File Edit Window Help DumpYourData

Isso enviar a instruo CREATE TABLE da tabela jobs para um arquivo de


texto que acabamos de criar, chamado riskyjobstable.sql. Se voc no emitir o
argumento > riskyjobstable.sql, ento as instrues CREATE TABLE e INSERT
iro simplesmente ser exibidas no seu terminal. Tente entender o que elas
fazem. No muito til, mas ver tdos os seus dados voando na tela, formatados
elegantemente em instrues INSERT.
Uma vez que tenha enviado todos esses dados para o seu novo arquivo usando
o sinal maior, voc poder usar o contedo desse arquivo como consultas
MySQL no seu site online, para fazer a transferncia das suas tabelas e seus
dados.
Prepare-se para usar seus dados
Prepare-se para transferir seus dados, executando uma instruo CREATE
DATABASE no seu servidor MySQL online. Em seguida, execute um USE
DATABASE no seu novo banco. Agora, est pronto para transferir seus dados do
servidor de produo para o servidor online.

voc est aqui 745


colocando dados mysql no servidor online

Mova os dados consolidados para o servidor ativo


Voc criou um arquivo chamado riskyjobstable.sql, o qual contm
instrues MySQL que criam a sua tabela e inserem dados nela.
O arquivo riskyjobstable.sql provavelmente se parecer com o
seguinte:
riskyjo^table.sql

' -- MySQL dump 10.11


Tudo isto So
do*er>ta\rios; -- Host: localhost Database: riskyjobs
vode pode
ijnora-los. Server version 5.0.51b

/* 140101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_C'LIENT


*/;
Estrutura da tabela 'jobs'
S soubev \ue ao caste w*a
0 ys^ldump
tabela dHa*ada jobs, vote pode
sempre
DROP TABLE- IF EXISTS 'jobs'; iywrar este dow>ando-

J
CREATE TABLE 'jobs' ( <?=--
csdreve una 'job_id' int (11) NOT NULL auto__increment7^N js ^
twstvuo 'title' varchar(200) default NULL,
PROP pav-a 'description' blob,
tO VKtt* do 'city' varchar(30) default NULL,
table.
2-CVO, ar>tcs state' char(2) default NULL,
de ew>itiv 'zip' char(5) default NULL,
co_id' int(ll) default NULL,
c m r tc
PRIMARY KEY ('job_id')
im m . ) ENGINE-MylSAM AUTO_INCREMENT=l4 DEFAULT CHARSET=utf8;
\jotx, pod t Uyndrar esta

Dumping de dados da tabela 'jobs' f inst'f'wdao LOC^ t apewas


t o piav e eolav a p a r t * da
msfeup* IKSERT-
LOCK TABLES 'riskyjobs' WRITE;
/*!40000 ALTER TABLE 'riskyjobs' DISABLE KEYS */;
0 mys^ldump INSERT INTO 'riskyjobs' VALUES (8,'Custard Walkerr,'We need
dria un>a people willing to test the theory that you can walk on
urtida custard.\r\n\r\nWe\'re going to fill a swimming pool with
mstrudao custard, and you\'ll walk on it. \r\n\r\nCustard and other
INSERT kinds of starchy fluids are known as non-Newtonian fluids.
They become solid under high pressure (your feet while you
redvia todas walk) while remaining in their liquid form otherwise.\r\n\r\
as linhas da nTowel provided, own bathing suit, a must.\r\n\r\nNote: if
tabela- you stand on for too long on the custard\'s surface, you will
slowly sink. We are not liable for any custard sinkages;
Configure um Ambiente de Desenvolvimento

Copie o texto inteiro do arquivo .sql e cole-o no seu term inal do MySQL ou
^ na janela de consultas do seu cliente grfico MySQL (como o phpMyAdmin).
Isso faz com que as consultas do arquivo sejam realizadas. No caso do exemplo desta pgina,
o arquivo riskyjobstable. sql contm uma instruo CREATE TABLE e uma INSERT. Alm
delas, o arquivo riskyjobstable. sql instrui o seu servidor MySQL a excluir quaisquer tabelas
existentes e a trancar a tabela com LOCK (impedindo que qualquer pessoa a utilize)
enquanto voc insere os novos dados.

Conecte-se ao servidor ativo


Voc transferiu seus arquivos PHP para o site online; traduziu as estruturas das suas
tabelas na forma de instrues CREATE TABLES e os seus dados na forma de uma imensa
instruo INSERT, usando o mysqldump, e as executou no seu servidor web online, o que
realizou a transferncia dos seus dados.
S h mais um pequeno passo a se executar. O cdigo PHP que voc enviou por FTP ao seu
web site no est se conectando com o seu servidor MySQL.
preciso modificar a string de conexo da sua funo mysqli_connect(), para que ela
aponte para o seu servidor MySQL online. Em qualquer lugar do seu cdigo que chame a
funo mysqli_connect(), voc ter de modific-la.

$ d b c = mysqli_connect ('localhost', 'myusemame' mypassword.', database')


or die('Error connecting!to MySQL s e r v e r ); 7
B s it sera o nome
do bndo de dados
Este sera o ho**c ou t n t r e t o *\ue vode driou no
fr do seu sj-f cr r seu servidor online.
seu servidor
MySQL estiver *es>s B estes sero o nome de
^ue as suas patinas pffp. uswrio e a senha <^ue \he
perm itiro donedtar-se
Isso tudo! So seu servidor M y$L
online-
~ Voc copiou seus arquivos PHP para o servidor web,
gerou suas tabelas e dados em um arquivo .sql,
executou as consultas do arquivo .sql no seu servidor MySQL online,
** e modificou seu cdigo PHP para que ele passe a chamar o seu servidor de banco
de dados MySQL online.
Seu site lgora deVel'4 esf l}Q ff!
voc est aqui 747
c lp p e n d c e !!!: A n ip lie S e u f U P

Obtenha Ainda Mais Proveito

Sim, voc pode programar com PHP e MySQL e criar


timas aplicaes web. Mas voc sabe que ainda deve haver
mais a se explorar. E h. Este pequeno apndice ir lhe mostrar como
instalar a extenso mysqli e a extenso da biblioteca grfica GD. Em seguida,
mencionaremos mais algumas extenses do PHP que poder querer baixar.
Porque, s vezes, no tem problema em querer sempre mais.

isto um apndice 749


instalando novos mdulos no php

Estendendo o seu PHP


Este livro ensina a instalao dos mdulos mysqli e GD no Windows. Nesta
seo, ns lhe mostraremos como verificar quais mdulos voc tem, como obter
o GD ou o mysqli, se no os tiver, e como instal-los no Windows. Infelizmente,
instalar esses mdulos em um sistema Mac ou Linux mais complicado.
Falaremos mais sobre isso no final deste apndice.
NOTA: Este apndice cobre o W indows 20 0 0 , XP, V ista, W indows S erver
2 0 0 3/2 008 ou outros sistem as operacionais W indows de 32 bits.

Se estiver usando o Windows, voe est com sorte

Voc provavelmente j tem ambos os mdulos mysqli e GD no seu computador.


E mesmo se no os tiver, relativamente fcil adicion-los. Ns lhe
mostraremos como verificar o que voc tem e, caso algum deles esteja faltando,
como os obter e ativar.
Vamos comear verificando o que voc tem.

Primeiramente, descubra __53N


se o GD ou mysqli esto ............ rype ___ _

no seu sistema. Para


ApphCabotf Extrrn
133 KB feafeen Sxtertston
S & te Appfatfon Extension
isso, comece navegando 37 KE Appiicatan Extensors
57 f3
at o diretrio onde
Appteabon xtenaon j
i f iS Aopfica;&nexnsort
92$ f Acplicatiori SxSersien
as extenses do PHP 4SK3 ApptafeenExtension '
129 f Appfeawn Exienort I
esto instaladas. Elas 617 KB :

geralmente ficam no S/o


125XB
1,829 XB
Application Extension
jkaSon Extension

diretrio C:/PHP/ext, 5^
Ai KB
25 KE
Appkafio" extendv i
A0P&r*acmEXlSrt

embora o caminho possa \iec 33KB


321KB
Extension
Applcafion erterraon

ser diferente na sua dU e 33*$


49 KB
App&afton E*tec\sn
appkaBon Extenaon

mquina. Abra o diretrio


4SKB App&cation Extension
S5KB AptftMKn Extensas

ext e procure por php_


101KB App&eCon E x t e r n
65 KB Appficfltjan Extension

gd2.dll e php_mysqli.dll.
35 KBApsfccawn sxfenaon
32 KBAppliabon S^tanaon

Em geral, esses mdulos


25* AppaotanExtension
2&KB lkation Extensor

so instalados com o
33 KSAppkatwn&ctensoa
33KB AppcatfcnExterwoR |
29 KBApplication [

PHP 5 e mais tarde, s AppkatonExerakyi


273f A*CnExter>SH5n
;

precisam ser ativados. Se 29 KB Appfcation Exterscn !


lS *E fcwfc^on&tersskin

os tiver, timo, passe para I7 tE efcaton Exteisn |


AppAc^onExtension
Apptctkui ytertsan j

o item 3. Se no, v para o 241KB fl#C3tiofi Exterision j

item 2.
. AppkrtCT&itm son I
237*2 MtlrtMn Extensen
45^ p)tcan >cerart !
221K3 Appbc3t3onxtensfor i
205 X Appl'iQtoo -tensorv j
57 rS appteslcnExienson J
amplie seu php

Caso no tenha qualquer um dos arquivos php_ gd2.dll e php_mysqli.dll, voc ter
de obt-lo. provvel que j tenha ambas as DLLs na sua mquina, mas se no for
o caso, pode encontrar o php_gd2.dll em: http://www.libgd.org/Downloads. Baixe
o arquivo e copie-o para a pasta ext dentro da sua instalao do PHP. Nos nossos
exemplos, ela se localiza em C:/PHP/ext.
Voc pode obter a extenso mysqli em MySQL.com. Primeiramente, acesse http://
www.mysql.com. Clique em Downloads (no alto da pgina) -> Connectors (se
estiver no menu da esquerda) -> MySQL native driver for PHP - > Download php_
mysqli.dll for PHP 5.2.1 (Windows) (Certifique-se de que esta a sua verso).

Bai*e a verso do
HsoXy teria vara a
sua verso do P^P-

I A esta altura, voc dever


ter php_mysqli.dll e
php_gd2.dll copiados
para a sua pasta PHP/
ext. Ns precisamos
instruir o nosso arquivo
php.ini a usar essas
DLLs. Para fazer isso,
v at o diretrio onde
esse arquivo se encontre
abra-o em um editor de
texto.
n> alguns dasos, sua
instalao do ? W ? vai parar
no diretrio Ar*\uWos de
Pvo^ra^aAPttP. Endontre
o seu arquivo pHp-ni e
abra-o para exedutar o
passo seguinte-
voc est aqui 751
instalando novos mdulos no php (continuao)

Encontre as seguintes linhas


dentro do seu arquivo php.ini: w in d e w s E x t e n s i o n s !|i
N o te t h a t ODBC s u p p o r t i s b u i l t i n , s o no d l l i s n eeded f o r '
extension=php_gd2.dll N o te t h a t n;ar>y dll f i l e s a r e l o c a t e d i n t h e e x t e n s i o n s / (P h
e x te n s io n f o ld e r s a s w e ll a s t h e s e p a r a t e PECL DLL d o w n !o a c
Be s u r e t o a p p r o p r i a t e l y s e t t h e e x te n s - ii) n _ d i r d i r e c t i v e .

2
; e x te n s io n = p h p _ b z . d l l
1
; e x c e n s io n = p h p _ c u r . d l l
extension=php_mysq-li. ; e x te n s io rt= p h p _ d i> a .011
; e x t en s i on=php_d b a s e . d l l
; e x t e n s i or=php_ex i f . d l l
dll ; e x te n s i o n = p h p _ fd f. d l l
5 2 1
ie x te n io n = p h p _ g d . d l
Se qualquer uma delas tiver , e x te n s io n = p b p _ g e tte x t. d l l
5
; e x te n s i o n = p h p _ m p .< jn

sinais ; ou # na frente delas, isso 1


;e x te n s io n = p h p _ if x. dl
; e x te R s io n - p h p _ iw a p .d ll

significa que esto desativadas ; e x te n s io n = p h p _ in te rb a s e , d l l


e x te n s i o r > = p h p _ ld a p . d l l

por comentrios. Remova esses


; e x te n s to n -p n p jib s trin g . d ll
; e x t e n s i or>=php_m tr y p t . a l 1
1
sinais e salve seu arquivo.
; e x te n s io t> = p h p jih a s h . d l
1
; e x t e r s s i o n = p h p _ rai a e j s a p i c . d l
; e x t e n s i ors=php_ffii n g . d l l
; e x te n s io n ^ p b p jis q l . d l 1
; e x te n s i o n = p h p _ f n s s q l. d l l
5
ue os ponto e vrgulas e x t e n s i o r^ p n p _ m y q t . d l l
e x t e n s i o r t^ p h p ji y s q l i . d l l
8
<\ue aparcdcrcm na -(rente
; e x te n s io o = p h p _ o c i . d l l
51
e x t e r is i o o = p h p _ o p e n s .d ll

destas duas linhas, se


; e x te r ts io n = p h p _ p d o . d l l
; e x te n s io n ? = .p h p _ p d o _ fi r e b i r d , d l l
5
houvev. Depois, salve seu
; e tte n s is > r t= p h p _ p d o _ m s s q l. d l l
; e x t e r e i en= php_pdo_w ysql . d l l
; e x te r s s i o n = p h p _ p d o _ o t i . d l l
arquivo. ; e x t e n s i or*=php_pdcL_oci S. d l l
; e x t e n s i o r?= p hp_pdoc(dbc . d l l
; e x te n s io r t= p b p _ p < io _ p g s q l. d l l
1
; e x t e n s i o n = php_pdo_sq i t e . d l l
; e x te r is io n = p h p _ p g s q l, d l1
1
; e x te n s io rs = p h p _ p s p e l , d l l
; e x te r is i o r j = p h p _ s h m o p ,d ll
; 11
e x te n s i o r t = p h p _ s m i p , d
; e x te n s io r v = p h p _ s o a p . d l l

O ltimo passo reiniciar seu


; e x te n s io n = p h p _ s o c k e ts .d ll
; e x te rts io n ^ p h p ^ s q lite . d l l
6
servidor web Apache, para que as
; X tf e f ^ s io o = p h p _ s y b a s e _ c t. d l l
; e x te n s io rs = p h p _ f id y .d ll
,1
: e x t e n s i on=php_xjr r p c . d l1
modificaes feitas no seu arquivo 1 1
; e x te n s i o r t = p h p _ x s . d l
1
; e x te r s s i on= p h p _ zi p . d l
php.ini tenham efeito. Para isso,

mm
v at o Painel de Controle do
Windows, clique duas vezes em
Ferramentas Administrativas, e
depois clique em Servios. Voc
dever ver o seguinte:

Seleiione o Apadhe e
depois di^ue no link
ReiniCiav-

Clique no servio Apache e


depois em Reiniciar, no m enu
da esquerda. Da prxima vez
que voc tentar usar as funes
GD ou mysqli, elas devero
funcionar corretamente.
amplie seu php

l no Mac...
Infelizmente, um pouco mais difcil. Para adicionar mdulos no Mac
preciso recompilar o cdigo-fonte do PHP, passando a ele argumentos
que dizem quais mdulos voc quer usar. So inmeras as combinaes
possveis de sistemas operacionais Mac e verses do PHP, de modo que
no possvel inclu-las neste pequeno apndice. Existe um timo guia
que poder lhe ajudar a instalar o mdulo GD:
h t t p ://macoshelp.blogspot.com/2008/02/adding-gd-library-for-mac-os-
x-leopard.html

S ir funcionar se voc tiver a verso certa do OS X (Leopard)


e a verso certa do PHP (5). Se no tiver, ou se as instrues
no funcionarem para voc, possvel consultar os comentrios Tnh C mfihte ^ue
desse site e do site original do GD, http:// www.libgd.org/, para esta domplidadao rt
instrues de instalao mais detalhadas e especficas para a sua ihstaidao d o s mdulos
prpria combinao de OS X e PHP. jt> e mys^li s se aplida
Para ajuda na adio do mysqli sua verso Mac do PHP, se estiver tentando
que tambm exige recompilao do PHP, recomendamos as rodar um servidor web
instrues do seguinte site: m un domputador N\t,
por e*empio um servidor
de desenvolvimento lodal-
Se estiver apenas usando
http ://dev.mysql.com/downloads/connector/php-mysqlnd/ um Mad para esdrever
dodijo PHP, <^ue ser
enviado e testado em
algum outro servidor,
isso nao z problema

voc est aqui 753


Ic e ^ e t n ls s lv

S_GET 276
$i 264
A 572 $_POST
26 array 34
fornece os dados do formulrio 91
instrues SQL 111 superglobal 33
MySQL 64 Verifique se o formulrio foi submetido
PHP 25 202
$result 135
operador NOT 174 $_SERVER 342
. 40 $_SERVER[ PHPjSELF] 200
* 70 $_SESSION 391
\ 46 \d 572
8c8c 179
/ * e */ 335
% 505 Ni 47
< 168 <?php>
o 168 espaos dentro 305
== 167 V 572
> 168 \w 572
>= 168
II 179 A
$ abduo aliengena
cifro 25 Desconstruindo o script PHP 24
$_COOKIE 376 formulrio HTML 5
flLFILES receber emails 53
erro no upload 269 republicao de vdeos do YouTube 686

este o ndice remissivo 755


ndice remissivo

requisio REST 686 Passo 3 326


Test Drive 7 Passo 4 327
Adicione o script YouTube 708 PHP 723
clusula WHERE 97 script Autorizar 314
instruo SQL INSERT 69 spam bots 606
script do Newsfeed 675 aplicaes
Variveis 31 definidas 424
acidentalmente, deletado 149 Aplicaes Web Personalizadas
ADD COLUMN 232 armazenando dados do usurio no
servidor (ver sesses) 348
addemail.php 126
comunidade de usurios 347
Adicionar Pontuao 226
segurana 348
A funo explode () 510
cookies (ver cookies) 348
alias 477
logins dos usurios (ver logins dos
ALTER TABLE 209 usurios) (ver tambm aplicao
Anatomia de um Cabealho 303 Mismatch) 348
Aplicao Segura aplicativo Mismatch
autenticao HTTP 299 Armazenando dados do grfico de
barras 632
Autenticando com cabealhos 306 cabealho das pginas 421
basic realm 311 comunidade de usurios 347
cabealhos 302 desencontrabilidade 483
cabealho de localizao 309 Compare usurios 487
CAPTCHA 611 loop FOR 488
GD (Graphics Draw) 612 Prepare-se para a busca 486
texto da senha 613 Faa o Download! 350
Enganando o MySQL com comentrios Formulando um plano para execuo
334 dos grficos de barras 639
injeo de SQL 335 Fundamentos dos grficos de barras 644
INSERT mais seguro (com parmetros) Joins 478
337
Lado do servidor 57 logins para os usurios 348
moderao humana 320 Nome do Usurio 348
Passo 1 322 plano 349
Passo 2 324 Preparando o banco de dados para
ndice remissivo

351 Autenticando com cabealhos 306


Senha 348 cabealhos 307
menu de navegao 421 criptografia da senha 360
questionrio 445 Autenticando com cabealhos 306
gerando o formulrio 446 authorize.php 314
Passo 1 449 AUT0_INCREMENT 209
Passo 2 449 aviso 171
Passo 3 457
Passo 4 457 B
rodap das pginas 421 banco de dados
sesses 392 integridade referencial 437
cadastro de novos usurios 369 localizao 239
templates 422 modificaes estruturais 471
Test Drive 422 Nome do usurio 308
Crie o script My Mismatch 648 normalizao 462
script de login 362 benefcios 464
script do questionrio 458 Trs passos 465
script mymismatch 494 relao de um-para-muitos 439
Um login baseado em cookies 380 relao de um-para-um 439, 441
apstrofo 47 Senha 63
armazenamento inicial dos arquivos tabela de juno 440
enviados 245
barra invertida (\) 46
arquivo php.ini 252
biblioteca de grficos 612

c
arquivos include 254
array 34
AS n o m e 499

aspas 47 cabealho de recarregamento 309


aspas d u p la s 192 cabealho de tipo de contedo 309
aspas simples 47 cabealhos
asterisco (*) 580 Anatomia de um Cabealho 303
atributo action 14 Autenticando com cabealhos 306
autenticao HTTP cabealho de recarregamento 309

voc est aqui 757


ndice remissivo

caixa baixa 118 imagepngO 654


caixa de ferramentas PHP & MySQL imagerectangle () 654
$_OOKIE 414 imagestringO 654
$_FILES 293 imagestringupO 654
$_POST 57 imagettftext() 654
$_SERVER 342 implode () 560
$_SESSION 414 Injeo de SQL 343
ALTER TABLE 221 INNER JOIN 499
array 57 instruo DELETE FROM 291
AS nome 499 is_numeric () 342
Autenticao HTTP 343 isset() 221
Biblioteca GD 654 lado do cliente 165
CAPTCHA 654 Lado do cliente 57
Caracter de escape 57 Lado do servidor 57
checkdnserrQ 604 LIKE 560
Classe de caracteres 604 LIMIT 293
clusula else 184 loop FOR 488
comando DELETE 147 loop while 157
comando DESCRIBE 122 mail() 57
comando DROP TABLE 124 metacaracteres 572
declarao if 221 Moderao Humana 343
echo 57 MySQL 57
esquema 499 mysqli_fetch_array() 157
Expresso regular 604 mysqli_real_escape_string() 342
funo empty() 221 Normalizao 499
funo exit() 342 operadores lgicos 221
funo explode () 560 operador NOT 221
funo header () 618 operador ternrio 499
Funo personalizada 560 ORDER BY 293
funo simplexml_load_fiIe() 711 pasta images 247
imagecreatetruecolorO 654 PHP 57
imagedestroyO 654 preg_match () 604
imagelineQ 654 preg_replace () 604
ndice remissivo

require 293 clusula WHERE 96


require_once 293 cdigo duplicado 194
REST 711 coleo de objetos 697
RSS 711 coluna
Script PHP 57 alias 636
session_destroy() 414 colunas que no so chaves 465
session_start() 414 comando CREATE DATABASE 111
setcookie() 414 comando DELETE
SimpleXMLElement 711 apagamentos acidentais 149
SQL 57 clusula WHERE 149
str_replace() 560 comando DROP TABLE 124
substr() 560 comando echo 24
switch-case 560 comando SQL 111
trim () 342 comando SQL DESCRIBE 123
Validao de Formulrio 343 comentrios
Varivel 57
Enganando o MySQL com 334
WHERE 157
multilinhas 335
XML 711
condio de teste 166
caixas de verificao 212
conectando-se ao My SQL
CAPTCHA
comando CREATE TABLE 65
funes 616
comando USE 120
Guitar Wars 625
CREATE DATABASE 64
Test Drive 613
funes PHP 78
texto da senha 613
die() 83
Caracteres de escape 46
mysqli_close ( ) 78
caracteres newline (\fi) 47
mysqli_connect() 78
caracteres reservados 580
mysqli_query() 78
chaves 436
mysqli_select_db () 82
chaves primrias
instruo SELECT 211
cinco regras 210
asterisco (*) 580
normalizao 465
clusula WHERE 504
clusula else 184
nome do banco de dados 76
voc est aqui 759
ndice remissivo

nome do usurio 39 comando SQL DESCRIBE 123


query 78 comando USE 120
executar 86 consulta 147
requerimentos 311 Crie um banco de dados e uma tabela
script PHP 76 64

senha 63 funo mail () 144


servidor de banco de dados 76 instruo ALTER 125
tabela 75 linha 149
Configure um Ambiente de nomes das colunas 66
Desenvolvimento ponto e vrgula (;) 25
My SQL 731 primeiros passos 110
PHP 731 prompt-> 119
instalao 736 script addemail.php 127, 133
constante GW_UPLOADPATH 253 array $_POST 134
Controle Seus Dados funo mysqli_fetch_array() 136
alias 477 funo mysqli_query( ) 79
junes 477 varivel $result 135
normalizao 495 SELECT * FROM 135
cookies 375 Tabelas 79
apagar 385 definidas 411
Definir 375 estrutura 56
sesses sem 403 tipo de dados 113
tamanho dos dados 410 Cruzadas PHP & MySQL 155
tempo de vida 390
Coppermine Gallery 730 V
crie e preencha um banco de dados Dados Armazenados em Arquivos
colunas 71 arquivos externos 240
comando CREATE DATABASE 111 constante GWJJPLOADPATH 251
comando CREATE TABLE 65 pasta images 252
comando DELETE 147 programa de FTP 248
apagamentos acidentais 149 pasta temporria 246
clusula WHERE 149 Planejando os uploads de arquivos
comando DROP TABLE 124 grficos 231
ndice remissivo

Passo 1 234 espaos dentro das tags <?php ?> 305


Passo 2 237 expose_php 724
Passo 3 238 Expresses Regulares
Passo 4 242 classes de caracteres 578
Passo 5 250 definindo 385
Passo 6 257 endereos de email vlidos 595
validao 266 Sufixos de domnios 598
mensagem de erro 268 funo checkdnsrr() 599
Dados atmicos funo preg_match() 584
normalizao 465 funo preg_replace () 588
declarao swtch 542 metacaracteres 572
Desenhando Grficos Dinmicos 605 quantificador 577
design da aplicao 410 extenso .php 25
display_errors 724
Drupal 730 F
Faa o Download!
E aplicao Mismatch 359
emails aplicao Risky Jobs 506
cdigo PHP 43, 46 Guitar Wars 357
< br/> 46 feed RSS
caracteres newline (Np) 47 gerar dinamicamente 672
Crie 48 imagens 670
funo mail() 51 link para 676
obter 54 formulrio
perder 54 $_POST 32
vazios 171 $_SERVER[PHP_SELF] 200
endereo IP 63 atributo action 14
endereos de emal a tr ib u to ty p e 6

Sufixos de domnios 598 boto Submit 202


data-drive 450
Erros PHP com tratamento de excees
719 funo isset() 202
escapando caracteres reservados 580 mailto 6
voc est aqui 761
ndice rem issivo

mtodo GET 278 CAPTCHA 614


mtodo POST 202 funes 616
script PHP 11 imagecolorallocate () 616
consultas SQL 82 imagecreatetruecolor() 616
tags <br /> 41 imagedestroyO 619
tags <form> 6 imageellipseO 618
tags input 6 imagefiUedellipseO 618
validao 339 imagefilledrectangle() 616, 617
formulrio que referencia a si mesmo 199 imageline() 617
formulrios permanentes 199 imagepngO 618
funo array_push() 449 imagesetpixel() 617
funo checkdnsrr() 599 imagestring () 619
funo die() 83 imagestringupO 619
funo empty() 172 image ttftext () 620
funo headerQ 305 GET e POST 279
funo now() 238 grfico de barras
funo personalizada 537 Fundamentos 644
funo PHP exit() 307 Grfico de Barras Exposto 635
funo preg_match() 584 grficos dinmicos 276
funo rand() 613 Grficos Dinmicos 605
funo setcookie() Guitar Wars
Fazer o logout de um usurio 385 Baixe isto! 228
funes personalizadas CAPTCHA 625
Construa uma consulta com 537 Homenageando o Guitar Warrior 261
paginao 548 pgina Admin 272
clusula LIMIT 551 Protegendo 300
variveis 552 pasta images 247
Funes Personalizadas Expostas 538 Planejando os uploads de arquivos
grficos 231
funes PHP 78

e
passo 1 234
passo 2 237
passo 3 238
GD (Graphics Draw) passo 4 242
ndice remissivo
passo 5 250 imagefilledellipseO 618
passo 6 257 imagefilledrectangle() 617
pontuaes no-verificadas 265 imageline() 617
segurana para a sua aplicao 297 imagens
autenticao HTTP 299 feed RSS 670
moderao humana 299 imagepngO 618
Proteja seus dados contra injees de image rectangle ( ) 617
SQL 336 imagesetpixel ( ) 617
Test Drive 336 imagestringO 619
arquivos inelude 257 imagestringup () 619
Crie o script Aprovar 328 imagettftext ( ) 620
pasta images 247
Implode () 513
removescore.php e admin.php 290
injeo de SQL 335
script Autorizar 314
INSERT INTO
validao dos arquivos grficos 270 Test Drive 69
ver a maior pontuao 265 instruo ALTER 125
instruo if
B aninhadas 178
HTML clusula else 184
cliente 10 condio de teste 168
cdigo PHP 27 operador ternrio 455
linguagem sem vida 2 instruo ORDER BY 258
Pginas HTML dinmicas 3 instruo require_once 255
instruo SELECT
I * 70
cones RSS clusula WHERE 96
banco de dados para o news reader 666 FROM 70
imagecolorallocate() 616 instruo SQL DELETE FROM 283
imagecreatetruecolorO 616 instrues include_once 255
imagedestroyO 619 integridade referencial 437
imageellipse() 618 is_numeric () 342
issetQ 172
voc est aqui 763
ndice remissivo

J M
join mailO 50
notao com pontos 474 mail to 6
Maior ou igual a (>=)' 168
L maior que (>) 168
lado do cliente 165 manipulando strings
Lado do servidor 57 boto submeter 6
LIMIT caracter coringa 505
consulta DELETE FROM 285 classificao busca dos resultados 532
linguagem markup 661 clusulas LIKE 505
linhas 109 clusula WHERE 535
concatenar strings e variveis 41
log_errors 724
consulta precisa de termos de busca
logins 349 legtimos 524
logins dos usurios (ver logins dos usurios) funo substr() 528
349
prprocessando a string 518
loja Elvis Substitua caracteres de busca
PLANEJE ANTES 108 indesejados 520
projeto da aplicao 106 substring 528
script addemail 133 MD5() 355
feedback 183 Menor ou igual a (<=) 168
validao 164 menor que (<) 168
Test Drive 201 mensagem de erro 268
coluna de chave 211 me tacarac teres
comando DELETE 150 quandficador 577
comando USE 120 metacaracter ponto final 572
Crie o banco de dados e a tabela 118 mtodo children () 699
Envie um email para a lista usando o mtodo GET 278
formulrio Enviar Email 145 modelos 422
operadores lgicos 181
moderao humana
script addemail.php 129 instruo ALTER TABLE 322
validao 164
passo 1 322
ndice remissivo

passo 2 324 dados atmicos 463


passo 3 326 empty() 566
passo 4 327 endereos de email vlidos 595
MODIFY COLUMN 232 formatao HTML em emails que voc
envia a partir de um script PHP 45
move_uploaded_file 245
formulrio foi submetido 202
MySQL
funo array_push() 449
Permisses do usurio 716
funo die() 88
Relato de erros 718
funo exit() 311
mysqli_close() 78
funo isset() 173
mysqli_connect() 78 funo mysqlLqueryO 88
mysqli_fetch_array() funo SHA() 355
loop while 140 GETs e POSTs 278
mysqlLqueryO 78 grfico de barras 633
mysqli_real_escape_string() 336 GWJV1AXFILESIZE 270
imagens geradas dinamicamente 605
j instruo ALTER 125
no existem perguntas idiotas instruo DESCRIBE 123
$_POST 92 instruo INSERT 85
arquivos de scripts compartilhados 255 JON 476
arrays e os objetos 700 leitor de RSS 662
aspas simples 47 loop 489
ataque de injeo SQL 335 namespaces 695
autenticao HTTP 301 normalizao 467
CAPTCHA 612 objeto SimpleXMLElement 700
Caracteres de escape 46 operador-> 700
classes de caracteres 579 operador ternrio 459
clusula else 184 O que significa PHP? 15
comando SELECT 147 p a g in a o 5 5 8

comentrios em SQL 335 pasta temporria 246


condio de teste 170 phpMyAdmin 68
cookie 375 ponto-e-vrgula 125
apagados 387 pontuaes sem verificao 261
voc est aqui 765
ndice remissivo

prom pt-> 119 Nota Geek


require_once 255 CAPTCHA 620
REST 682 SUBSTRING() 530
RSS 662 NOT NULL 209
session_start() 397
sesses 397 0
string de busca 518
objeto
substr() 530
Acesse os dados XML com 696
sufixo de domnio vlido 597
coleo de 697
tabela mismatchcategory 468
tag <? 27 objeto SimpleXMLElement 700
template 423 openjbasedir 724
terminal MySQL 68 operador lgico
tipo de dados ENUM 325 ordem 181
user_id 351 operador ternrio 455
validao 165
VARCHAR 115 P
variveis 27 pgina Admin
XML 670 links para remoo de pontuaes 275
navegador 42 Protegendo 300
newsfeed 660 paginao
nome do host 63 clusula LIMIT 549
Nome do meu banco de dados 76 links de navegao da pgina 554
nomes das colunas 66 variveis 552
nomes de variveis 25 Pginas HTML dinmicas 3
non- equijoins 480 pasta images 247
normalizao pasta temporria 246
benefcios 397 Persistncia
chave primria 465 Sesses + Cookies 409
dados atmicos 462 temporria 452
Trs passos 465 usurio 383
notao com pontos 474 PHP
ndice remissivo

Erros PHP com tratamento de excees funo header () 305


719 funo mysqli_connect() 78
Estendendo 750 GD (Graphics Draw) 612
Instalao 736 instruo ALTER 252
navegador 42 loop while 139
O que significa PHP? 15 metacaracteres 572
orientado a objetos 721 mysqli_connect() 78
regras 25 mysqli_query () 79
servidor 11 pasta images 247
PHP4 714 preg-match () 584
phpBB 730 preg_replace() 593
phpMyAdmin 62 Quantificadores 602
PHP orientado a objetos 721 sesses 317
ponto-e-vrgula tag<input> 453
instrues SQL 111 variveis da sesso 390
MySQL 64 post 6
PHP 25 Precedncia 727
ponto final (.) 580 Precedncia de operadores 727
Pontos Importantes preg_replace() 588
$_FILES 239 PRIMARY KEY 209
LSERVER 315 prom pt-> 119
autenticao HTTP 342 pseudocdigo 641
cabealhos 309
CAPTCHA 611
caracteres 580
Q
comando CREATE DATABASE 111 quantificador 577
comando CREATE TABLE 65 query
comando DROP TABLE 124 executar 86
conexes a bancos de dados 88 m ltip la s ta b e la s 436
cookies 376 query SQL 86
funo checkdnsrrQ 598 termos de busca legtimos 524
funo die () 88 query SQL 86
funo exit() 315
voc est aqui 767
ndice remissivo

funo generate_sort_links() 546


n funes explode() e implode() 526
referncias a phpinfo() 723 validao de emails 603
regex 570 rtulos CASE 542
relao de muitos-para-muitos 440 RSS 711
Relato de erros para o MySQL 718 RSS Revelado 671
Removendo dados
apagamentos acidentais 149

republicao de vdeos do YouTube
safe_mode 724
funo simplexml_load_file () 688
schema
requisio REST 682
setas 436
XML 690
direo 438
republicaes e servios web
script Autorizar 314
RSS 661
scripts
require_once 293
arquivos include 254/ '
requisio GET 276
comunicarem-se uns cm os outros 276
requisio REST
engenharia reversa 316
construindo 686
instruo require_once 255
requisies POST 277
scripts cross-site 725
Risky Jobs
script sendemail.php
build_query() 537
array $_POST 134 .
classificar 545
feedback 183
links de navegao da pgina 554 funo mail() 134
paginao 548 lgica por trs 171
Revise a consulta para ter resultados mysqli_fetch__array() 135
553
mysqli_query() 135
variveis da paginao 552
validao 164
Faa o Download! 559
varivel $result 135
o script Search completo 557
Scripts PHP
Test Drive 559
atributo action 14
Ajuste os nmeros de telefone no
script de registro 594 servidor 12
formulrio de busca 515 segurana visual 353
ndice remissivo

Senha funo implode () 513


autenticao HTTP 357 funo str_repla.ce () 520
criptografia da senha 360 funo substr() 528
Comparando 355 substr() 528
criptografadas 352 Sufixos de domnios 598
funo SHA() 354 superglobal 33
segurana visual 353 superglobal SID 403
servidor supresso de erros 288
identificando 682
instalao do Apache no Windows 735
PHP 11
T
tabela de juno 440
scripts PIIP 12
tabela principal 439
rodando 18
tabelas
servidor de bancos de dados 61
alias 477
sessin_destroy() 390
chaves primrias 209
session_start() 390^m'
child 438
sesses 395 '
comando CREATE TABLE 65
cooldes 406
definir 113
sem cookies 403
tamanho dos dados 410 estrutura 123
tempo de vida 406 juno 440
setas parent 438
direo 438 tags <? 27
SHA() tags <br /> 41
Comparando senhas 355 telas capturadas
sinais de igual (==) 167 armazenamento inicial dos arquivos
sites de comunidades 372 enviados 245
spam bots pasta temporria 244
CAPTCHA 611 templates 422
SQL 57 terminal MySQL
stings e funes ponto-e-vrgula 111
funo explode () 510 prom pt-> 119

voc est aqui


ndice remissivo

Teste mltiplas condies 179 operador lgico 179


tipo de dados sendemail.php 175
eficiente 453 tamanho para imagens 266
tipo de dados ENUM 325 Teste mltiplas condies 179
tipos MIME diferentes para imagens JPEG VALUES 66
270 VARCHAR 114
tipo TINYINT 322 variveis
trim() 336 Si 26 l
armazenam as partes do email 49
TJ concatenar strings e variveis 41
underscore (_) 26 sesses 389
underscore (_) 505 superglobal 33
unlink() 269 variveis de sesso 389
UPDATE SQL 235
USE 64
user_id 351 WordPress 730
Username 348
USING 476
X
usurios faam logout
XML
sesses 393
Acesse os dados 696
coleo (collecdon) de objetos 697
V entidades 693
validao hierarquia de elementos 695
cdigo duplicado 194 namespaces 693
declarao if 339 O YouTube fala 690
clusula else 184 Penetre nos dados 698
' <t 194 RSS 661
>es PHP para verificar 172
r trs 165
e erro 189
y
YouTube fala XML 690

Você também pode gostar