Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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! H T M L com C S S e X H T M L
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 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
\,VtC^
Mo'r'f'SOir'
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
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?
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.
C o n e c ta n d o -s e M /S o L
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
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
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
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
Coisas como imagens JPEG e documentos PDF? Faz sentido armazenar todas essas
de dois mundos - este captulo revela que voc pode usar arquivos e bancos de dados
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.
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
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)
XVII
contedo (sumrio)
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.
xxi
contedo (sumrio)
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.
$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
xxiii
contedo (sumrio)
MySQL e do PHP, para lhe fornecer um lugar seguro onde possa trabalhar e praticar.
Arapllie Seu
99 Obtenha Ainda Mais Proveito
algumas extenses do PHP que voc poder querer baixar. Porque s vezes no
XXV
Como Usor Este LVrc>
Introduo
xxvii
como usar este fivro
de frredi-fxj.
introduo
xxix
como u sar 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
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:
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.
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.
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
^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-
T fe sr O r v c
O
o
0 ormulrio esta
timo, a te voee
t\\t no boWRelatav
Abduo - enta? tudo
dcsntoron!
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.
r e p o r t htm l
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
reportphp
adicionando vida s suas pginas estticas
nty? existeni
T e rg u n ta s id P tc ts
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-
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
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 >
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.
_ T Je s t O r iv e
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?
reportphp
Mais cdigo HTML estate,
*lu e transmitido pelo servidor
ao navegador sem modiaoes.
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.
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.
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
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
<html>
<head>
</head>
<body>
<?php
$email * $_POST['e m a i l ;
?>
</body>
</html>
report, php
ideiadoque deerrado?
problema e escreva o que elas esto causando. Alguma
h
<html>
<head>
ttTM U e os dados
Vmdz-ena em um3 <?php
$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 />';
</body>
</html>
Uma forma de consertar o script seria atribuir a string exata que estamos
esperando para a varivel $ a 1ien_de s cription, desta forma:
(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
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];
$alien_description = $_POST['description'];
$fang_spotted = $_POST[1fangspotted'];
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>
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.
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>
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>
</head>
<body>
<?php
$when_it_happened = $_POST['whenithappened'];
$how_long = $_POST['howlong'];
$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;
?>
c/body>
</html>
report php
</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];
$fang_spotted = $_POST['fangspotted
modiiicar i j > o s r
pra tonrigiv o echo Thanks for submitting the form.<br
wa!icndestvip'tiohW. echo and were gone for ' . $how_long . '<br />';
?>
</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.
fabilmznht o sdrift
vcfortfhf esta
i^snorSndo Cinto
dam^os o -ormulrie
v>3dreditvc!
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;
^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
T fe S T D r i v e
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
'*...................................................................................................................
- tf -s
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:
existem
Perguntas Idtas
- Existe alguma maneira de se usar
formatao HTML em emails que voc envia a
partir de um script PHP?
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"
<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
*
m u F
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
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
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.
_ / 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
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.
Apos digitar o
dodig SQL,
dli^ue neste
b o ta o para
driar a tabela.
Eu tenho um banco de
dados MySQL e uma
tabela; agora, como eu
insiro dados neles?
s t a p a r te uma lista
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.
i
bando de dados. s
^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-
* B i rsls5t Ifuiwmwfnlr WS
X vA . . J - V ^ ^ S> J .1- .,,-1
1 's s>
r
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,
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}
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
soas doiuhas.
<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
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
$ tabela al'ens_abdudtion
rmxjtn os re la to s na o rm a
de mhas r e ^ s tr o s ) de ddos.
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!
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-
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
$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, "
"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
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
Conexo fechada.
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()
$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.
j\
111 M H-i,,..!, ..
. . . . M .................. ......................................................................................
............................ ...........................................................................................................
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.
Jstp. ^ n d io n a . desde. \ue o. serv id o r web e. o sryidor, do bando estejam na mesma mquina-..............
|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.
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
//
L-Cftibvescj nosso
objetivo c autom atizar
esta ^uery (HSBRj
usnclotc\op PffP.
!>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:
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.
PONTOS DE BALA
RQ
conectando-se ao My SQL
0 P e js t O r iv e
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 . ..................................
m ysqli_query()
..... .......
na existem
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
$dbc =
$result =
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.
T fe S T O R fv e
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:
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
T fe S T O r o v e
--------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.
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
ada endeve^o
no mpo 7*.
> Q
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
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.
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.
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
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
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
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-
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
U PR 9 P9 SfTQ
Ligue cada tipo de dados MySQL descrio dos dados que voc
poderia armazenar em uma tabela.
(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
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-
C flu.e..
.....V A R c M f t f e -J-/......
h .s :L ^ ... V A Q m p 1 .
& r.si.
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
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.
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 .
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
;.v
T fe S T O R fV G ------------------------------
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
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
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.
o we da cota*
dWtado f"">
- ?s-
rTi^EdM/Tindow Hep Typo?
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
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?
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
<?php
$dbc = a
.... Q ................................................
^$first
t i r s t _ n aname
iu t =
- S_POST['firstname
l * 1
i_query (
mysqii_< C /
?>
addemail.php
5query =
= fKSERT IfrTFO emaiMist -first__name, last__nme> email) 11
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-
................ t _ .....................................................................................................
Somente a doluna last_ame e
retorndd nos resultados d donsulta-
/N
Ls
crie e preencha um banco de dados
^
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-
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
0 sdsrip-fc
ptredisa
de dados
da tabela
eai iisfc.
cr/e e preencha um banco de o<
$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-
CO
g-
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
i _ r 1 " v'\
c
......
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 :
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
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
$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
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.
<?php
$from = 'elmer@makemeelvis.com';
$subject = * A sxcw.to
*
$text =(/** _ J. _
while($row = mysqli_fetch_arrayf$result)) {
$first_name = $row['first_name];
$last_name = $row['last_name'];
$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
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-
^$to =
1From:1
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.
Prezado Senhor,
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.
[~ ^ 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.
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
O R t v e _______________________
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
$. .....W .E !? . ................
I ^
I...../
*Ii f r~
/ ' T
C -C .Ti Q. . k 1 ........ f __ . - r ? . i .!......... : ............. o .5 _j
mysqli_close($dbc)
dhama-se email".
Os dados do formulrio
presentes em f__P0ST s3o
armazenados em uma variavel,
e depois usados na donsulta
pelbte.
TfeST RIVE
"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.
C ru z a d a s p H P & M y S o L
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
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
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.
i
SE Subject contiver texto E Body contiver texto
\ Se abas as tonditoez
-Pore atendidas, e sinsl de
<\ue esis tudo derto e <\ue
podeos enviar os eails.
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?
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.
O fillO rd e r 0 ;
^ ( also ^dependendo da validade
s r ] do darto de dredito.
Jk. n n
aplicaes realistas e p i.
a r>e\
aplicaes realistas e prticas
$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')
($your_name == $my_name)
($favorite_song == 'Trouble')
$my__name = 'Buster;
$a_number = 3;
$a_decimal -4.6;
$favorite_song = 'Trouble';
$another_number = 0;
^ 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
($ 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
$text = $_POST[1elvsmail'];
n a existem
iSSetO Veffoct se a VatfaVel id ptas
existe e se est deltuda. * Ento qual o propsito de usar issetQ?
''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?
<?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 , /*
?>
0 ponto de exdlamao
inverte a lgida da
funo emptyO.
O R tv e
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.
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
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.
<?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
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________________
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.
<?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.');
mysqli_close($dbc);
Tendo apenas uma dediaraao i, ns s
rdismos de uma dKave de fedKamen-fco.
?>
aplicaes realistas e prticas
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.
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
&
}
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 (
}
else {
m . .
mysqli close($dbc);
?>
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 )
}
else {
// $text est vazia
}
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
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
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
CXfcRESRO
O que voc faria para melhorar o tratamento de
erros do script Enviar Email, de modo a torn-lo
mais til?
1cols="40"></textarea><br />';
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.
?> Escreva abaixo qualquer coisa que voc considere que esteja
limitando este cdigo. Como voc o consertaria?
.v. 'k : v :..
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
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
mm
sendemail.php
. .jy-ry.r^r?.
..
- 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
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 .
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::
<form methott="post">
TfeST Or iv e
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?
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.. ..
....................................... ...............
' ' / ? *
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
ls y.
$oucput_fci-n
pv-edisamos
if ($output_form) { mosbr-leJ
?>
<?php
?>
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:
T te S T O R fv e
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-
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 nome da tabela 3
r
0 nome da doluna a
ser alterada- ser adidionada.
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 .
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 :
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 ) :
<?php
$dbc = mysqli connect('data.makemeelvis.com'r 1elmer', 'theking, 'elvis__store')
or die('Erro ao conectar servidor MySQLr.);
while ( = mysqli_fetch_array($result)) {
echo '
echo .
echo ' .
mysqli_close($dbc) ;
?>
</form>
im
ms php & m ysql - soluo
}
mysqli_close($dbc);
?>
</form>
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.
Escreva aqui como voc acha que um loop foreach poderia fazer
iteraes atravs de um array contendo as IDs dos clientes de Elmer:
acho $ c u s to m e r;
Dentro do loop, vode pode adessar dada
elemento, usando o nome da variavel-
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
$delete_id ^
if { )
mysqli_close($dbc);
?>
esdolHer o dlientc
foreach ($ POST['todelete'] as $delete_id) {
a ser e%dludo-
flVTY- PRO/yj. eaiMist INHERE id ^ fdelete^d;
echo 1 . $row[1email1];
?>
</form>
OHQ a
aplicaes realistas e prticas
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..
no apavede ais.
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.
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 *
arquivos e bancos de dados juntos para criar aplicaes PHP cheias de dados binrios.
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.
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
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?
mysqli_close($dbc) ;
</body>
</html>
index.php
Tui ta rw a rs
" - - - , 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'] ;
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
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) ;
totuirmar o exrto.
;s dados da pontuaSo para limpar o formulrio
OS hO W C S d s t c l u h 3 s-
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.
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
Esdreva a outra
instruo
certificar-sedequeacolunafoi adicionadacomsucesso.
consulta SQL, desta vez para verificar a estrutura da tabela e
^ instruaAiTBR ditiona
A jl ~
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?
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
<br />
clabel for="score">Pontuao:</label>
<br />
ulrio
Adicionar Pontuao de
modo que ele passe a
usar um campo de input
de arquivos para permitir
o upload das imagens.
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
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
$ 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-
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
<?php
echo '<table>';
}
else {
echo 'ctdximg src="unverified.gif" alt="Unverified score" / x / t d x / t r > ';
echo 'c/table>';
mysqli__close ($dbc) ;
?>
echo '<table>';
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 '< 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-
} 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
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
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.
mQ existem
p e r g u n ta s id io ta s
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 .
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
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
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
N avegador w eb
do clien te
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'];
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
A tap-tava dc tela
enviada agora -Pita visvel
na pagina printipa!.
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?
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
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.
W R > 9
CREBRO
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
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
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
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);
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 .
/\{d>onar noV
agora envolve
o envio de Wage
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
I screensho;
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\-----
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
.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- }
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
echo 1<table>';
$i = 0;
if (..................) {
}
echo 1 c trx td class="scoreinfo">';
}
else {
echo 'ctdximg src="' . Gw_uPLOADPATH . 'unverified.gif1 .
}
echo ,</table>1;
I
index.php
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.
frov^rsCore^ 4< /t d x / b r ^ i
}
echo '<tr><td class="scoreinfo">';
T ejst O r i v g ---------------------------
, 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.
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.
if (
) {
de
appvars.php
jeanpau1sscore.jpg
mysqli_query($dbc, $query);
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;
T f e S T O R f v e
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.
; 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
; 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
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
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
require_once ('.connectvars.php') ;
// Faz um loop atravs do array contendo os dados das pontuaes, formatando-os como HTML
mysqli_close($dbc) ;
2MM3MMas3SOtSVJ
i im m -X 09:13:34 35g42(f K ^ n ..........
um orma de envia*/ Ml
dados \mpor tnteS)
trabalhando com dados armazenados em arquivos
$ 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.
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.
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
$_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
removescore. ph p
n? existem
ferguntas Idiotas
? Como possvel o mesmo script processar tanto requisies GET
quanto POST?
<?php
('appvars.php');
(connectvars.php);
= $ GET [ .....];
= $ 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'] == ) {
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>';
?>
c/body>
c/html>
removescore.php
v o c e e s t aqui 287
o script removescore.php finalizado
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- ^
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
mysqli_query($dbc, $query);
mysqli_close($dbc);
else
echo '<p class="error">A pontuao no foi removida.</p>' ;
echo '<p><a href= ;< 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
As pontuaes hao
vcri i&adasj ou seja*
aquelas sem imagens
.omprobat*r'sas, -foram
removidas do sistema-
trabalhando com dados armazenados em arquivos
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.
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.
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
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.
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
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
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-
/y
s
5_SERVER[.pHp_0TH
l_PW< ]
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.
Quando que a
autenticao da pgina
deve realmente ocorrer?
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 --------- ------ -------------------------------------------------------------
0 primeiro dabealbo
a resposta ttTT P do
servidor-
1 1 : 2 2 : 0 9 GMT
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
</html>
umd senha-
Your password will be sent in the cfcar.
.ftfettae; . ,.;rock ;
Password: j
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.
= 'rock';
.............. = 'roll';
if (! isset { ....................................... ) I1
!isset ( .................................... ) iI
</html>
segurana para a sua aplicao
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
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.
'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 ---- -- -
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?
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 >.
Ns
precisamos tornar seguro o script Remover
Pontuao, e tenho quase certeza que podemos simplesmente
O ^-------- usar a autenticao HTTP novamente.
Vocs dois tm razo, e por isso que eu acho que precisamos de um novo arquivo
Jill: incluae
admin.pnp
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.
esta pgina.1) ;
authorize, php
<?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.
np existam
p e r g u n ta s id io ta s
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-
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
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
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
'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-
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-
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?
?>
<?php
require_once{'appvars.php');.
require_once{'connectvars.php');
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);
else {
echo
?>
<?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-
}
echo '< /td>< /tr> '; ^ as r*o
} apv-ovadas t deve c r w*
echo '</table>'; Af'roV3r -
% ^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.
Use WHERE
Pontuaes no aprovadas no so dignas pcflTct s e le c io n a i-
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
- . 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.
Um simples ovmirflrio
requer coniymaao
a^ies de 'reaUewe
aprovar o re^istvo.
h ^edewiapvovada ,
pohiuacao aaova apareie
pagina principal do
quiiav IVv-s.
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!?
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)
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?
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.
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.
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'
} $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 .
ftccio que ela use a funo is_numeric() para permitir apenas pontuaes 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.
Gui t a r
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.
Lembra de Mim?
%
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.
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
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-
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
m i s m a tc h _ _ u s e r
Usar A V T B K ia i(^ ic io n a r
colunas usernam e e password
{ tab ela.
(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
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.
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.
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
T J S T O R V e
ALTER TABLE mismatch_user ADD username VARCHAR(32) NOT NULL AFTER user_id,
ADD password VARCHAR {16)NOT NULL AFTER username
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?
O envio dos cabealhos para autenticao HTTP resulta em duas linhas de cdigo
PHP - uma chamada funo header() para cada cabealho sendo enviado.
; 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
login.php
viewprofile.php
index.php
mi smatch__user
I l I l l i S I If!
editprofile.php
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-
"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
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
?>
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.
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.
$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-
Nome de Usurio?
Senha?
criando aplicaes web personalizadas
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
v o c e s t aqui
signup.php finalizando
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);
if (isset($_POST[s u b m i t 'I)) {
// Obtm os dados do perfil a partir de POST
( ............................ = = ............................. )) I
$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 t y p e = " ..... ....... " i d = " ..............." name=M ............... " / x b r />
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 ');
\
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,
value="<?php if (lempty
<label for=".:
</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.
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!
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
. *,
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.
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.
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'
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 .
<?php
requre__once (' connectvars -php');
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> . ');
l o g in .p h p
A
rediredionado para a Kome
page, onde o menu agora
revela <\ue ele esta logado.
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-
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
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
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
/v|eYv para
usuirios locados.
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-
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.
S
* 8} ) ;
'
setcookie(1username 1
segundos ^ minutos ~ ^ 0 0
hp passado.
l>0 ^0
segundos, o da ura Hora no passado.
<?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 ( ) {
}
// 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 ' ] ) .
?>
usudVio se este \
SoLuo , *
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
dc\oUWzX$o
R e d i r e c i o n a p a r a a home p a g e
____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?
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.
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 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
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
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
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>') ;
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
<? p h p
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)
}
// 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 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.
Destruir d sesso
if ( i s s e t {$ _ C O O K I E [ s e s s i o n _ n a m e ()])) {
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
editprofile.php
editprofile.php
criando aplicaes web personalizadas
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
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 'ϰ <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>';
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);
Conversa Informal
Conversa de hoje: Cookie e varivel
de sesso discutem quem tem a
m elhor memria.
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.
UsiASrie
rvsb-ad fMnt
t i^o bo**
4 > 0 ____________
c x t c r w q
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.
-----------
^
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.
^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.
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.
> Ento por que eu deveria optar por uma sesso ou um cookie em vez
de um banco de dados MySQL?
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 ) ;
'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
// 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 () ;
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 ();
if (!iss e t ( ..............
_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
<?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
- {);
/\
$ SESSION a r r a y ();
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 ();
[ '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 ] ;
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.
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.
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
^<;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
+
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
* Compartilhar Cuidar
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
sempre que precisar dele. A eliminao de cdigo duplicado resulta em aplicativos mais
eficientes, de manuteno mais fcil e finalmente mais robustos.
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.
L a te st bb *
t
*
Bad
A
M'
J l
Ccpyngh-2009MenmckolKpr,i-ta
index.php
elimine cdigo duplicado
Username: jneities
First sane: Johan
Last name: Nettles
Gender: Male
Birthdate; 1981-11-03
Location; Atheas,GA
Picture:
viewprofile.php
editprofile.php
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
^startsession.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
no e x is te m
Perguntas Idiotas
<?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> ❤
/VJostra um aviso
<a href=signup.php">Cadastrar-se</a>'; de dopyright e
edha o dodigo
echo
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 ) ;
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
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
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
first_nam e
!ast_name
gender
b irthdate
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
mi smatch_topic
litopfcld l r ;. name /. .category
1 Tattoos Appearance
2 Cowboy hats Appearance
3
4
Reality TV
Horror
movies
Entertainment
Entertainment
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
response id H H B M H M M Q i
to p ic jd
response
name
^ user id
category
topic id 4 """"
11 jnettles ********
mismatch_response
||P |y |S ! | user:
i i S i A I h ^sJlliSillfl
lWlstiMllikll ilrtMftfi a
. - - 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
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.
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
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
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?
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-
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
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.
(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-
muitosp a ra muitos
Sm m :
id_do_tpico
nome
ump a r muitos
(c a te g o r^
AAO
controle seus dados, controle seu mundo
"WHERE = '$response_id";
mysqli_query($dbc,.$query);
}
echo '<p>As suas respostas foram registradas.</p>;
}
ms php & m ysql soluo
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..
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.
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
// 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
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
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
}
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 )-
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 ';
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-
mysqli c l o s e($dbc);
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.
de dados. Fn terrainment-
Reality TV: O Love IgHate
Professional
wrestling: If
response
category
u s e r jd
to p ic jd
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
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?
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 ?
w
chegar at essa principal E labore sua -tbeia
C erti-fi^u e-sc de
\ue os dados sejam
apenas -fcao pequenos
3. As suas colunas contm Quanto rsedessario.
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?
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?
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?
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
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.
first_name
iiiiSimftlliSili
last name
gender
birth date f j responsejd " 8^
city
state
I O response
------ id
/ picture
topic id
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
questionnaire.php
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
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
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
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 [
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?
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.
0 \uestiortfirio
de Sidney e st
preendHido,
an z n d o e
p ro n to pava
ser usado ao
AliSnrvtdV
482 CsDtuio 8
controle seus dados, controle seu mundo
= Par imperfeito!
Adoro=
0
Odeio = 2
response
user_id
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
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
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.
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.
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?
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
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
mymismatch.php
$user_responses = array 0 ;
a r r a y _ p u s h ($user_responses, $row);
$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-
__ __ T fe S T O r iv e
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
Eis o bando de
dados original do
g u ita r Wars, o
^al armana
pohtua^ocs
subm cilds pelos
usurios.
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
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
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
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'
^ 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
506 Caoitulo 9
stings e funes personalizadas
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 )
M
T f c S T O R f v e ___________________
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.
...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 -
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...
walker, circus);
Sempre <\ue aparefier uma vrgula nesta __
string, ela sera substituda por um espado.
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.
bull,matador cape
$search words
3 cspatos;
buli matador cape
$search words
$search words
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
bull,matador cape
$search words
buli,matador, cape
$search words
stings e funes personalizadas
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.
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";
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.
echo '</tr>';
echo '</table>';
^ 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">';
nao existem
jvjptl Geek p e r g im ta s i d i o t a
T e js t O R v e
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
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:
domando dlassi-Pida os
resul-tados da donsul'fca pelas
desdries dos empregos, cm
ordem alabtida dresdenie-
stings e funes personalizadas
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
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
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
' ?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>
case 4:
>
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>';
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.
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
It
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
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
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
$query = $query
$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
$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.
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.
if (...................... ) {
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 (.............................. ) {
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.
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.
else {
$page links .:
/
0 link next" aparede domo uma
seta para a direita,
return $page links;
stings e funes personalizadas
return $page_links;
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?
Ernesto endohxrou um
emprego dom d ^ iid ad e
per+eia de rsdo/
ajudar. Elas podem modificar strings de forma precisa, com base em um conjunto de regras, em
vez de um s critrio.
?mprengoDeseiado:Ninja
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
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
- ^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.
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-
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
/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-
u sa d a s p a r a c o n c d r
Sim, as expresses
regulares so clarssimas.
Claras como lama.
* +
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
/A\d{3}\s\d{7}$/ 55 5 6 3 6 4 6 5 2
/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.
*57A
expresses regulares
S iN T A -S E co m o u m a
E xp resso R e g u la r
/ A\ d { 3 } - \ d { 3 } - \ d { 4 } $ /
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->
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.
Voc se
esqueceu de uma coisa. Os
nmeros telefnicos nos EUA no
podem comear com 0 nem 1.
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
/ 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.
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.
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 ou | vez...
expresses regulares
if (empty($phone)) {
// $phone est em branco
echo '<p class="error">0 seu nmero de telefone no
vlido.</p>!;
$output_form = 'yes';
}
(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<
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.
* / 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:
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
555-4 41-9005
5 5 5 .9 0 3 .6 3 8 6
(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
1
$new_phone = preg_replace ('/[\(\)\-\s]/', '', $phone) ;
tndontre estes
darafiteres.... -e os substitua por
uma string vazia...
###-###-####
# # # ###-####
(###)-###-####
(###) ###-####
C.
preg replace()
T fe S T O R fv e
$replacement = '';
3 0 hun*cro
f fcclc-wiido c
I reduzido apenas
j dgitos -
Voubro tra-Uy-l
/ A \w + /
' M mais taratteres
Comea dom... a lW r i* -
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.
jNPtcl Geek
0 Sistema de Nomes de
Poderam os fazer isso, e Domnios um servio
funcionaria. de dados distribudo que
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;
3 1 i teres especiais.
>o^endereo de email fiote
" i > ntes
esse smbolo 1 . Jdommio-
- I . . do ___
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.
$output_form = 'yes';
}
else {
if {.................. ) {
echo 'Seu endereo de email invlido. <br />';
$output_form = 'yes';
}
1
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)) {
rejisbaao- ha-loMw.
PONTOS DE BALA
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.
C/til
11 ViSUclllzUlcIo seus Dclclos... e]V[cl!s!
Desenhando Grficos
Dinmicos
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
Escreva abaixo trs perguntas que voc poderia fazer para distinguir
entre um ser humano real e o crebro artificial de um rob:
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
Quanto 7 + 5?
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??
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
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!
// Preenche o fundo
i
CA A
visualizando seus dados... e mais!
Servidor w eb
PrediSmos de um -undo
Wando onde desenhar os
CAPTCHA-
FVuneiramente,
desenhe algumas
linhas aleatrias.
Finalmente, retorne
im^em, na N avegador
ora de PN 4 3o w eb do clien te
navegador
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
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
. 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!
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
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.
// Cria a imagem
$img = imagecreatetruecolor (CAPTCHA__WIDTH, CAPTCHA_HEIGHT);
// Preenche o fundo
imagefilledrectangle($img, 0, 0, CAPTCHAJWIDTH, CAPTCHA_HE1GHT, $bg_color);
^ 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.
Recarregar o script
CAPTCHA resulta a
gerado de uma nova
imagem, Contendo uma nova
senha aleatria-
visualizando seus dados... e mais!
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
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
}
?>
<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.
/>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.
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
/
$graph data = array(
array! "Heading-'.!/. .$vaue|||,
array("Heading 2", $value2),
array("Heading 3", $value3)
m ir
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 ^
CO A
visualizando seus dados... e mais!
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
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
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
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!
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.
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!
Traduza o pseudocdigo para completar o cdigo PHP real que cria o array
bidimensional de dados de categorias do Mismatch, chamado $category_totals.
}
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) );
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.
" 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.
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.
// 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);
imagefilledrectangle
HW
ms do php solues
| 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
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
O R f V e _______________________ __
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!
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?
u mismatch_user
-lismatchgraph-1 lpliMH MiiuaiiJJf l i i ! ! 81
1 sidneyk 745c52...
N 2 nevilj 12a20b...
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
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?
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!
1 3-mymismatchgraph. png
0 graifco de barras de ada
usuiri agora e ar^az-e^ad
em um arquivo prprio.
5-mymismatchgraph.png &
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!
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.
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-
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
um Site,
receba atualizaes do site da m esm a
forma que recebe m ensagens de email.
pV ^ ni , Jir ..
| T o d o s os valores dos atributos precisam estar dentro de
aSpaS dUplaS. <mg i r e - " :e:'.. :.f " />
nb existam
perguntas idiotas
X Por que usar o R S S to melhor do que ter as pessoas
acessando o meu site?
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:
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
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
<rss> Esta tag no tem nada a ver com o RSS. Mas pelo menos
ela seria um nome legal para algum item de dados!
Esta tag sempre contm uma URL que serve como o link
<languae> para um canal ou item de notcias.
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.
aliens abduction
r.i
abduction. how_
tong
illlliiililjlS flfISI ' 'V
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*>
na? existem
Fergurttas I d io ta s
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
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
<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
8
<?php header('Content-Type: text/xml1); ?>
<?php echo '<?xml version="l.0" encoding="utf-8"?>'; ?:
<rss version='2.0>
< ?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 ...... ...';
<?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
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:
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.
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.
E x p e r im e n te is t o j
^ fr
Assista a alguns dos vdeos de abdues que Owen encontrou. Voc acha
que o cachorro nos vdeos Fang?
Aliens Abducted Me
R e p o r U ta * ! y ^ encounlcr wi* Weis you afidnaed? Have you seen B y abduced dog, Fang?
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
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
n? existem
P e tg u t if c c is i d i o t a s
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-
-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.
O 0
http ://gdata.youtube.com/feeds/api/videos/-.
0 pvimeiiro passo ja
io') a URL dc
reqiMSto Y*Tube.
^ g iiiiiP
T fe S T O R iv e _____________ _
http://gdata.youtube.com/feeds/api/videos/-/alien/abduction/head/first
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-
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
. 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/
is,ve i
i'-: de
<media: title type= plair/>UFO Sighting in Yosemite Park near Area 5^</media:title> |j
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 &, 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
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
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.
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
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>.
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.
<-----
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];
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
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);
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->.....;
: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:
require_once{'youtube.phpT);
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
i % p o n te seu lpis
Solupo
republicaes e servios web
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.
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.
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) ;
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
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-
:: - -
&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
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:
/
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.
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) {
}
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) {
}
?>
sobras
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();
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.
dPII
*II
+II
aII
|= A_ <<=
I1I
II
II
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
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.
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.
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.
7An 11
Configure um Ambiente de Desenvolvimento
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
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
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
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
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.
diretrio C:/PHP/ext, 5^
Ai KB
25 KE
Appkafio" extendv i
A0P&r*acmEXlSrt
gd2.dll e php_mysqli.dll.
35 KBApsfccawn sxfenaon
32 KBAppliabon S^tanaon
so instalados com o
33 KSAppkatwn&ctensoa
33KB AppcatfcnExterwoR |
29 KBApplication [
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-
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
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-
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_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
c
arquivos include 254
array 34
AS n o m e 499
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