Sie sind auf Seite 1von 61

APOSTILA

PHP
Fbio B. Salvador Julho 2007 Revisada em Abril de 2008

Parte 1 CONCEITOS BSICOS


Antes de mais nada, precisamos aprender a usar algumas ferramentas bsicas para o desenvolvimento em PHP. Temos um simulador de servidor chamado EasyPHP e temos a base de dados MySQL, com um pacote chamado MySQL Tools 5, usado para editar o banco de dados. Sim, porque vocs vo precisar de um banco de dados. E no final do curso, todos j entendero por qu os bancos de dados so a inveno do sculo, no sculo XX e no sculo XXI. E provavelmente em todos os sculos que ainda viro.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 2

CAPTULO 1 INTRODUO
POR QUE PHP? Embora haja j h algum tempo um preconceito incutido na mentalidade de muitos profissionais de TI quanto ao PHP, a verdade que esta uma linguagem rica em funcionalidades e capaz de gerar aplicaes complexas, com eficincia e segurana. O PHP conta ainda com a vantagem de ser server-side, o que faz com que os programas desenvolvidos em PHP executem conforme as configuraes do servidor, e no do cliente. O contrrio poderia levar a distores de resultado, como ocorre com freqncia no ambiente da Internet (especialmente com cdigo CSS e HTML). O QUE SIGNIFICA SERVER-SIDE? PHP uma linguagem que diferencia-se do JavaScript porque sua execuo ocorre no servidor que abriga o programa, e no na mquina do usurio. Por isso dizemos que server-side. Sendo assim, quando um usurio tenta visualizar o cdigo de uma pgina em PHP, acaba invariavelmente visualizando apenas o cdigo CSS/HTML gerado pelo cdigo PHP em si. O QUE PRECISO Para publicar um site com PHP e um banco de dados (principal motivo de se usar o PHP), deve-se antes ter certeza de que o servidor que hospeda nosso site tem suporte s tecnologias envolvidas e preciso tambm configurar estes recursos de forma correta. Normalmente, estas instrues so fornecidas pelas empresas que oferecem este tipo de servio. J para testar nossas bases de dados e o cdigo PHP, podemos configurar um pequeno servidor local no nosso computador, sem grandes dificuldades. AS FERRAMENTAS No nosso curso, utilizaremos dois programas simples, com interface intuitiva e instrues elementares. Serviro para testar o site. Assim, quando o colocarmos no ar, se alguma coisa sair errada, saberemos que o problema est no servidor, e no no cdigo. O primeiro destes programas o EasyPHP, que configura um servidor local com suporte a PHP e MySQL, configurvel atravs de uma interface simplssima. O segundo deles o MySQLTools, uma ferramenta de gerenciamento de banco de dados MySQL que servir para que possamos testar nossas bases de dados, criar tables e campos nelas, alm de verificar eventuais erros de manipulao dos dados por parte do nosso cdigo PHP.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 3

INSTALANDO E CONFIGURANDO O EASYPHP Primeiro, clique duas vezes sobre instalador do programa. Escolha a lngua (portugus), d os tradicionais OK, Avanar, etc. Concorde com os termos de uso. Quando o EASYPHP estiver instalado, ele ir parar no menu Iniciar em um grupo prprio dentro de Programas. Quando estiver em ao, ele ficar junto ao relgio do Windows. Clicando duas vezes sobre seu cone (um E preto), abre-se a janela de controle.

Nela, podemos ver os servidores Apache e MySQL em atividade no PC. O boto da esquerda (aquele com o E preto) abre o menu de opes. Dentre elas, est a de Configuraes. E dentro desta, PHPMyAdmin. ali que criaremos nossos bancos de dados antes de preench-los com tabelas, campos e registros, seguindo as instrues na tela. CONFIGURANDO O MYSQLTOOLS O software MySQLTools deve ser utilizado depois de instalarmos o EasyPHP e de criarmos uma base de dados (mesmo que seja vazia e sem tables dentro). Este programa servir exclusivamente para trabalharmos nosso banco de dados MySQL de modo que possamos identificar onde e como o cdigo PHP alterou os dados, o que funcionou e at sejamos francos o que eventualmente deu algum problema. O MySQLTools ser instalado de forma semelhante ao EasyPHP: clicar sobre o instalador e depois ir clicando OK e Avanar diante de todas as mensagens (que tratam de termos de uso e trazem informaes sobre o programa, mas no instrues importantes sobre como us-lo). Depois de instalado, o MySQLTools ocupa um lugar no menu Iniciar. Usaremos o MySQL Query Browser (cujo cone um pequeno raio azul). A abertura do programa nos pergunta pelas informaes do banco de dados com o qual vamos trabalhar.
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 4

STORED CONNECTION uma combobox que serve para trazer uma conexo j salva poupandonos do trabalho de digitar tudo novamente. SERVER HOST o endereo do nosso servidor de banco de dados. Como acabamos de configurar um servidor local atravs do EasyPHP, vamos usar LOCALHOST. PORT a porta usada para a conexo com o banco de dados. Por padro, a 3306. USERNAME e PASSWORD so os dados de login ao banco de dados. No exemplo mostrado nesta pgina, no usaremos senha e o usurio chama-se ROOT. DEFAULT SCHEMA o nome da base de dados que usaremos como padro (ou seja, j abrimos o programa usando-a). No preciso preencher este campo, mas recomendado.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 5

O ESPAO DE TRABALHO DO MYSQLTOOLS

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 6

CAPTULO 2 DETALHES GERAIS


O cdigo PHP inicia-se com a tag <?php e termina com a tag ?> Ao final de cada linha com um comando deve-se colocar o ponto-e-vrgula (;) O cdigo PHP capaz de devolver cdigo para a pgina na qual est abrigado, tornando-se um gerador de cdigo HTML atravs da instruo ECHO. Assim, para que eu consiga, por exemplo, o efeito de NOVA LINHA, posso mandar uma tag <BR /> pelo ECHO: ECHO (<Br />); Variveis em PHP so indicadas pelo $ no incio de seus nomes. As variveis em PHP no precisam de declarao prvia e ganham seus tipos no momento de atribuio. Assim, se eu disser simplesmente: $x = Texto; Ento $x ser uma string. Se eu tivesse declarado um nmero, seria integer ou double, ou qualquer coisa. Sem declarao prvia. Podemos criar nomes de variveis a partir de outras variveis. Um exemplo: $X = conta; $$X = 3000; O valor de 3000 estar guardado na varivel $conta, porque no PHP, primeiro se interpreta o que significa $X, que no caso conta, e depois se atribui uma varivel com o nome que aparecer de dentro de $X. EXPRESSO CONDICIONAL (IF) Sintaxe: If (condio) { Comandos; } Abaixo, demonstrarei um cdigoque jamais funcionaria de forma independente, pois pressupe que eu carreguei a varivel $idade de algum lugar. If ($idade >= 18) { Print Maior de idade;} Else { Print Menor de idade; }

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 7

CAPTULO 3 OPERADORES
PHP, como toda linguagem, possui algumas sintaxes para a realizao de tarefas comuns maioria das linguagens de programao existentes. No cabe aqui explicar conceitos bsicos de programao pois o conhecimento deles pr-requisito para o aprendizado do PHP. A execuo de cdigos em PHP segue uma lgica linear, e com suporte criao de classes (programao orientada ao objeto). Tambm possvel criar funes e cham-las mais adiante no programa. OPERADORES DE COMPARAO $a == $b Igual Verdadeiro se $a igual a $b $a === $b Idico Verdadeiro se $a igual a $b e eles so mesmo tipo (PHP4) $a != $b Diferente Verdadeiro se $a diferente de $b $a <> $b Diferente Verdadeiro se $a diferente de $b $a !== $b N idico Verdadeiro se $a diferente de $b, ou se eles no so do mesmo tipo (PHP4) $a < $b Menor Verdadeiro se $a menor que $b $a > $b Maior Verdadeiro se $a maior que $b $a <= $b Menor ou igual Verdadeiro se $a menor ou igual a $b $a >= $b Maior ou igual Verdadeiro se $a maior ou igual a $b OPERADORES LGICOS So colocados entre duas condies (que podem ser verdadeiras ou falsas) como forma de montar uma terceira condio, que engloba as duas primeiras. And ou && Quando usamos o AND, ambas as condies precisam ser verdadeiras para que a condio formada pelas duas possa ser verdadeira. Exemplo: Se (hoje fizer sol) AND (eu tirar folga), vou ao parque. Or ou || Se qualquer uma das duas condies for verdadeira, a grande condio formada ser verdadeira. Exemplo: Se (chover) OR (o armazm estiver fechado), ficarei em casa. XOR Se uma das duas for verdadeira, mas no as duas ao mesmo tempo, a condio resultante ser verdadeira. Exemplo: Se (o Grmio ganhar) XOR (o Inter ganhar), dar empate.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 8

CAPTULO 4 LAOS DE REPETIO


LAO ENQUANTO...FAA (WHILE) Sintaxe: while (condio) { Comandos; } Abaixo, demonstrarei um cdigo simples, capaz de gerar uma pgina da Internet com uma srie de nmeros corridos, um em cima do outro: <HTML> <BODY> <?php $cont =1; while ($cont <=10) { echo $cont.'<Br />'; $cont++; } ?> </BODY> </HTML> LAO DE REPETIO PARA (FOR) Sintaxe: For ( valor iniciar da varivel ; condio para continuar ; incremento) { Comandos } Aqui, usamos um tipo de funo que serve para rodar um nmero determinado de vezes uma determinada cadeia de comandos. Exemplo: <?php for ($a = 1;$a < 10; $a++) { echo $a; } ?> Quando o fluxo de execuo entra no for acima, a varivel $a recebe o valor 1. Enquanto $a for menor que 10, o fluxo continua dentro do for (essa verificao executada sempre no comeo da repetio). Quando os comandos aninhados ao for acabam, a varivel $a recebe $a + 1, devido a terceira expresso da estrutura for ($a++).

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 9

LAO DE REPETIO PARA CADA (FOREACH) Sintaxe: Forach ($Um_array_qualquer as $x) { Comandos } O ForEach uma das jogadas mais inteligentes do PHP. Quando temos um array (um vetor, conforme vimos em Lgica da Programao), no precisamos saber o tamanho dele para percorr-lo e fazer alguma coisa com seu dados. Usamos o FOREACH, que percorrer o array, item por item, na medida em que hajam itens, e encerra a repetio do lao no momento em que o array chegar ao fim. preciso, no entanto, usar o AS, para pegar o item que est sendo lido e jogar para uma varivel temporria, no meu caso, $x.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 10

CAPTULO 5 PRIMEIROS PASSOS RUMO A UM PROGRAMA


Para explicar as funes bsicas do PHP, acompanharemos desde o incio uma srie de pequenos programas. Note que todos eles tm Tags HTML acompanhando o arquivo, pois dentro do arquivo .PHP vo tags HTML com o intuito de desenhar a pgina. Programa Ola Mundo! demonstrative da funo echo: <html> <head><title>Meu primeiro PHP</title></head> <body> <?php echo "Ola mundo!" ; ?> </body> </html> Manipulando String (texto). importante observar a diferena entre os resultados produzido pelos dois cdigos abaixo: <html> <head><title>Teste</title></head> <body> <? php $curso = "PHP"; $tmp = '---$curso--\n'; echo "$tmp"; ?> </body> </html> Vai aparecer na tela a frase "---$curso--\n" <html> <head><title>Teste</title></head> <body> <?php $curso = "PHP"; $tmp = "---$curso---\n"; echo "$tmp"; ?> </body> </html> Agora j aparece "---PHP--\n"

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 11

IMPRIMINDO A DATA DE HOJE FUNO PRINT Este exemplo uma simples instruo para mostrar a data na pgina. Neste caso temos o uso de duas funes PHP: print - que imprime dados date - que gera uma string representando a data <html> <head> <title>Data no PHP</title> </head> <body> <? php print(date("l - F d, Y")); ?> </body> </html> Note que DATE aparece com uma configurao de formatao. Para obter a data no formato que a gente normalmente v por a (23/10/1994), bastaria usar date(d/m/Y). Formatos de Date: d Nmero do Dia m Nmero do ms y Ano com 2 casas D Dia da semana abreviado M Y l F Nome do Ms abreviado Ano com 4 casas Dia da semana completo Nome do Ms completo w Nmero do dia da semana

ALGUNS TRUQUES MAIS COMPLEXOS Os prximos exemplos sero incrementais, os cdigos devem ser colocados dentro de um mesmo arquivo (sugesto principal.php). COR DE FUNDO APROPRIADA PARA CADA DIA DA SEMANA Utilizando a mesma funo date vamos fazer com que a cor de fundo seja varivel de acordo com o dia da semana. Para isso basta fazermos algumas adies ao cdigo acima. E ficar assim: <html> <head> <title>Cor conforme o dia</title> </head> <?php $diaDaSemana = date("w");
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 12

$cor = array( "#FEF0C5", "#FFFFFF", "#FBFFC4", "#FFE0DD", "#E6EDFF", "#E9FFE6", "#F0F4F1" ); ?> <body bgcolor="<?php print("$cor[$diaDaSemana]");?>"> <? print(Date("l - F d, Y")); ?> </body> </html> LTIMA ATUALIZAO A data da ultima atualizao de uma pgina pode ser gerada de maneira automtica. o cdigo abaixo pode ser inserido no cdigo acima ou usado de maneira independente. Eu vou passar apenas a parte que interessa, e que poder ser inserida na pgina HTML: <?php $last_modified = filemtime("ex1.php"); print("Ultima atualizao"); print(date("m/j/y h:i", $last_modified)); ?>

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 13

CAPTULO 6 CRIAO DE FUNES


PHP, assim como qualquer linguagem moderna, possui a capacidade para a criao de funes. Caso voc no esteja habituado com isso, assim: Uma funo um pedao de cdigo que no executado, e sim declarado para ser usado mais tarde. Uma funo normalmente recebe alguns parmetros e ento faz alguma coisa. Quando a funo executa comandos mas no retorna resultados de forma nenhuma, ela void. Quando retorna, ela pode dar qualquer tipo de retorno. Como PHP no nos exige declarao prvia de tipos de dados, ento tanto faz. O importante mesmo saber criar a funo. Abaixo, vem um cdigo criando e executando uma funo simples: <?php function somar($prim, $seg) { $novonum = $prim + $seg; return $novonum; } Acima, eu declarei a function somar, que recebe dois nmeros ($prim e $seg), e ento faz a soma deles, carregando o resultado em $novonum e retornando este resultado. $somado = addnum(4,5); echo $somado; ?> Depois, eu s disse que a varivel $somado guardaria o resultado da execuo da funo somar passando os nmeros 4 e 5 como parmetros. O resultado final deste cdigo ser uma pgina com o nmero 9. No parece muito til, mas ser, quando tivermos que fazer uma grande poro de cdigo com tarefas repetitivas.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 14

CAPTULO 7 CRIAO DE CLASSES


Vamos desenvolver agora algumas classes e depois vamos utiliz-las. Sobre as classes e subclasses, como funcionam e sus fundamentos, observe o captulo 7 logo a seguir. Primeiro, a classe Pessoa, que tem dois mtodos, a princpio, servir de exemplo: <?php class Pessoa { var $nome; var $end; var $telefone; var $mail; function cadastrar($n, $e, $t, $m) { $this->nome=$n; $this->end=$e; $this->telefone=$t; $this->mail=$m; } function imprimir () { printf( " Nome: $this->nome <br>" ); printf( "Endereo: $this->end <br>"); printf( "Telefone: $this->telefone <br>" ); printf( " e-mail: $this->mail <br>"); } } A classe Aluno que estende Pessoa ( uma sub-classe de Pessoa): class Aluno extends Pessoa{ var $matricula; function cadastrar( $mat, $n, $e, $t, $m) { $this->nome=$n; $this->end=$e; $this->telefone=$t; $this->mail=$m; $this->matricula=$mat; } function imprimir () { printf( "<br>Dados do Aluno<br>"); printf( "Matricula: $this->matricula <br>"); printf( " Nome: $this->nome <br>" ); printf( " Endereo: $this->end <br>"); printf( " Telefone: $this->telefone <br>" ); printf( " e-mail: $this->mail <br>"); } }
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 15

E por fim, a classe Professor que tambm estende Pessoa: class Professor extends Pessoa{ var $matricula; var $area; function cadastrar( $mat, $n, $e, $t, $m, $a) { $this->nome=$n; $this->end=$e; $this->telefone=$t; $this->mail=$m; $this->matricula=$mat; $this->area=$a; } function imprimir () { printf( "<br>Dados do Professor<br>"); printf( "Matricula: $this->matricula <br>"); printf( " Nome: $this->nome <br>" ); printf( " Endereo: $this->end <br>"); printf( " Telefone: $this->telefone <br>" ); printf( " e-mail: $this->mail <br>"); printf( " area: $this->area <br>"); } } Temos ento que Professor e Aluno so duas sub-classes de Pessoa, ou seja, estendem todas as funcionalidades de Pessoa e ainda adicionam a ela suas substituies e atribuies prprias. Note que eu criei alguns atributos (nome, etc) l na superclasse Pessoa e depois coloquei especificidades dentro das classes Aluno e Professor. E dentro delas, coloquei mtodos. Mtodos so as coisas que um objeto de uma classe capaz de fazer. No caso, por exemplo, o Professor capaz de guardar os dados do seu cadastro e de imprimir na tela seus dados. Ento, me resta instanciar estas classes e rodar seus mtodos. No caso, vou instanciar apenas a classe Professor, para fins de demonstrao. $professor1 = new Professor(); Na linha acima, eu disse que a varivel $professor1 vai guardar um objeto do tipo Professor. $professor1->cadastrar(1, "Juca Chaves", "Rua A, 23", "3333.2323", "juca@chaves.com.br", "Msica"); Agora, rodei o mtodo de cadastrar o professor, passando as informaes como argumentos. $professor1->imprimir(); ?> Depois, mandei mostrar na tela as informaes.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 16

CAPTULO 8 OBJETOS E CLASSES


O que uma classe? Uma classe, ao contrrio do que alguns normalmente supe quando entram em contato com a programao orientada a objeto, no um espao que guarde dentro de si os objetos dela mesma. Uma classe como se fosse um molde, a partir do qual sero fabricados os objetos. Uma classe tem normalmente duas coisas: atributos e mtodos. Atributos so os dados contidos em um objeto desta classe. Por exemplo, digamos que a classe Pessoa tenha os atributos Nome e Idade. Quando um objeto desta classe for criado, provavelmente sero designados um nome e uma idade para a pessoa cadastrada naquele objeto (a pessoa o objeto). Alm dos atributos, uma classe tem mtodos. Os mtodos so aes possveis de um objeto. como ter um objeto Telefone. Ele tem atributos (cor, modelo, etc), e tem mtodos (telefonar, receber ligao). Por isso ele ter utilidade. Assim, por exemplo, se eu criar uma classe da seguinte maneira (eu vou usar termos em portugus para facilitar a compreenso): classe Pessoa { Nome; Idade; } Eu tenho simplesmente uma classe com dois atributos. Ela no faz nada, ainda. Ento, vou adicionar um mtodo com o mesmo nome da classe, que ns chamaremos de mtodo construtor (o construtor sempre tem o mesmo nome da classe). Vai ficar assim: classe Pessoa { Nome; Idade; funo Pessoa (n, i) { este.nome = n; este.idade = i; } } Agora, a minha classe j capaz de receber, no seu mtodo criador, dois dados um nome e uma idade e guardar neste objeto (no objeto que est executando a ao). Ento, j posso fazer um comando para criar um objeto Pessoa, com uma linha que segue a seguinte lgica: Pessoa X = novo Pessoa(Joo, 23); Aqui, criei uma varivel capaz de guardar um objeto do tipo Pessoa, e a varivel se chama X. Depois, eu atribu a ela um objeto, NOVO, pois ainda no temos nenhum, do tipo PESSOA, e j passei os argumentos para o mtodo construtor: nome e idade da pessoa.
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 17

Isso padro das linguagens orientadas ao objeto: quando eu crio um mtodo com o mesmo nome da classe, ele rodado quando eu instancio a classe (instanciar criar um objeto daquela classe). Agora, vamos tentar isso com mais mtodos diferenciados. classe Pessoa { Nome; Idade; funo Pessoa (n, i) { este.nome = n; este.idade = i; } funo Aniversario() { este.idade = este.idade+1; } funo Escrever() { escrever na tela este.nome; escrever na tela este.idade; } } Agora, eu vou chamar esses mtodos aqui de fora. Pessoa X = novo Pessoa(Joo, 23); X.Escrever(); X.Aniversario(); X.Escrever(); O resultado final disso ser o seguinte: 1 Criao da ficha do Joo no objeto X. 2 Mostra os dados dele na tela. 3 O Joo fica um ano mais velho. 4 Mostra os novos dados dele na tela (ou seja, o nome e o ano, agora um ano mais velho).

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 18

CAPTULO 9 SUBCLASSES E SUPERCLASSES


Uma vez que criamos uma classe, podemos entrar em um assunto que meramente o aprofundamento do anterior: a subclasse. Uma subclasse um filhote da classe acima dela, que chamamos de superclasse. A subclasse servir para fazer uma variante incrementada da classe original. Ela herda os atributos e mtodos da superclasse, podendo no entanto possuir mtodos que no existiam naquela e atributos tambm inditos. Vamos a um exemplo: classe Pessoa { Nome; Idade; funo Cadastra (n, i) { este.nome = n; este.idade = i; } funo Aniversario() { este.idade = este.idade+1; } funo Escrever() { escrever na tela este.nome; escrever na tela este.idade; } } Acabei de criar uma classe chamada Pessoa, que alis, ns j havamos visto antes. classe Ninja estende Pessoa { Arma; funo Cadastra (n, i, a) { este.Arma = a; este.Nome = n; este.Idade = i; } funo Morre() { este.nome = este.nome + morreu com honra Ninja; } } Agora, eu tenho numa subclasse, um tipo especial de Pessoa que o Ninja. Ele tem todos os atributos e mtodos da Pessoa, mas note que ele tambm tem um mtodo Cadastra. Quando eu escrevo na subclasse um mtodo que j existe na superclasse, eu o sobreponho. O Ninja faz tudo o que uma pessoa comum faz (Aniversrio e Escrever), e ainda por cima capaz de morrer (mtodo Morre), ocasio na qual seu nome simplesmente ganha a adio da frase caracterstica.
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 19

CAPTULO 10 INSTANCIANDO A SUBCLASSE


Muito bem. Eu criei as classes Pessoa e Ninja, sendo que Ninja estende Pessoa (ou seja, uma subclasse da primeira). Eu posso agora criar objetos do tipo Ninja, sem mencionar Pessoa. Mais ou menos assim: Ninja X = novo Ninja(); X.Cadastrar(Juca, 3, Espada); X.Escrever(); X.Aniversario(); X.Morre(); X.Escrever();

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 20

CAPTULO 11 CLASSES NO PHP


Agora que j vimos a lgica do uso de classes e subclasses, objetos e mtodos, vamos implementar isso tudo no PHP. Declarao de classe feita da seguinte forma: Class Pessoa { Se for uma subclasse, assim: Class Ninja extends Pessoa { Atributos so declarados da seguinte forma: var $matricula; var $area; Mtodos so declarados como functions: function Morre() { Quando um mtodo pretende modificar um atributo do prprio objeto, refere-se a si mesmo como THIS. $this->nome = Joozinho; Sendo o smbolo -> o desenho estilizado de uma seta, feita com o sinal de subtrao seguido de um sinal de maior. Quando o meu mtodo exige argumentos para poder operar, usa-se assim: function Cadastrar($n, $i) { Ento, agora, eu estou operando a funo Cadastra com os dados $n e $i. Ento eu atribuo estes dados aos atributos do meu objeto. Digamos que sejam Nome e Idade: $this->nome = $n; $this->idade = $i; E a eu fecho meu mtodo com um sinal de } Quando eu quero usar um mtodo, depois de criar um objeto de determinada classe, eu chamo o mtodo pelo nome do objeto, ponto mtodo, e entre parnteses os argumentos. Quando no h nenhum, s abro e fecho parnteses. Tipo em X.Cadastra(Joo, 22) ou N.Morre().

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 21

CAPTULO 12 $_SERVER
$_SERVER['REQUEST_URI'] Retorna a URL escrita pelo usurio para chegar at aqui (por exemplo, se o site est hospedado em algum lugar eu obtenho o endereo do site). $_SERVER['SERVER_PORT'] a porta que est sendo usada no trfego de informaes do site. $_SERVER['PHP_SELF'] Mostra o endereo do arquivo PHP, mas o endereo real (normalmente, um pedacinho da rvore de diretrios do servidor mais o nome do arquivo). $_SERVER['REMOTE_ADDR'] Retorna o IP do servidor. $_SERVER['HTTP_USER_AGENT']; Retorna informaes do browser do usurio e do SO dele.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 22

Parte 2 COOKIES
No incio, era a Web. E a Web era esttica e sem forma. Ou melhor, tinha forma, mas era muito feia. As pginas eram paradas e duras. Dia aps dia, a qualquer hora que se entrasse num site, l estava a mesma capa, com as mesmas frases de sempre. Ento, vieram as fotos. E depois delas, as constantes para dizer data e hora no cantinho da pgina. Algo banal hoje. Um gigantesco salto para a poca. Entrar s oito ou ao meio dia, hoje ou amanh, em uma pgina j fazia alguma diferena. E ento chegamos era dos Cookies. Uma vez que o usurio informe seu nome e preferncias, passar a ser saudado de forma personalizada a cada entrada no site. Ver as informaes no esquema grfico que mais lhe agradar. Ser lembrado mesmo depois de fechar a pgina... desde que no demore muito a reabri-la. Se sentir especial e dir: puxa, esse desenvolvedor um cara legal. Bom. Talvez no chegue a tanto. Mas ficar com certeza contente em no ter que re-digitar informaes. Com os Cookies, enfim, o site ganhou algo como uma memria ele capaz ento de saber o que foi feito ontem ou h uma hora atrs e retomar estas informaes. capaz de ser navegado sem perder as informaes do usurio que fez Login.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 23

CAPTULO 1 NOSSO AMIGO, O COOKIE


O QUE UM COOKIE? Um Cookie um pequeno arquivo temporrio, que vai ser gravado no computador do usurio do nosso site. Nele, ser possvel gravar informaes para posterior recuperao. A idia de ter um cookie no us-lo como base de dados e nem gravar grandes extenses de informaes. A idia us-lo como um parmetro, por exemplo, de validao de usurio (quem o sujeito, ou qual esquema visual ele prefere no site, ou quais as propagandas que mais interessam a ele, etc.). O uso de Cookies em um site abre possibilidades infinitas. Quer exemplos? 1 Certa vez, desenvolvi o site de um poltico. Este site tinha 3 StyleSheets (padres visuais definidos em arquivos CSS) diferentes. O site gravava um Cookie no PC do usurio, de modo que sempre sabia qual a preferncia daquele usurio. 2 Depois de logar-se um usurio de um site que usa Cookies ser saudado sempre pelo nome, pelo prazo, digamos, de uma semana. Desde que continue usando o mesmo PC, claro. O grande risco no uso de Cookies que o usurio pode ter configurado o browser dele para bloquear Cookies. Da, o nosso site no vai funcionar direito. CRIANDO UM COOKIE A criao do Cookie ocorre com o comando setcookie e deve aparecer antes do incio da pgina HTML deste arquivo, da seguinte forma: <?php setcookie("nomedocookie", "NomeDoFulano", time()+3600); ?> <html><body>Contedo da pgina</body></html> Onde, no setcookie, declaramos: ( o nome do cookie, o que vai dentro dele, e um tempo de expirao) no caso, meu tempo de expirao de 3600 segundos, ou seja, uma hora. LENDO O COOKIE DEPOIS Criamos o Cookie na mquina do usurio. Agora, a gente vai abrir outra pgina dentro do site e esta pgina vai descobrir quem que est logado nela. O valor do cookie fica dentro do array $_COOKIE. <?php echo $_COOKIE["nomedocookie"]; ?>

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 24

DESCOBRINDO SE O COOKIE DE FATO EXISTE J vimos como criar e como ler o Cookie. Agora nos resta descobrir se ele existe (algo que deve ser feito antes de ler. Vamos a um pequeno exemplo de uma pgina em PHP capaz de descobrir se o Cookie existe ou no no computador do nosso usurio: <html> <body> At aqui, temos apenas HTML comum. <?php if (isset($_COOKIE["nomedocookie"])) { echo "Bom dia, " . $_COOKIE["nomedocookie"] . "!<br />"; } else { echo "Antes, crie o Cookie!<br />"; } ?> Veja que usei um IF comum, mas usando o comando isset, que serve para descobrir se o cookie existe ou no. </body> </html> E da eu encerro o meu HTML, claro. APAGANDO UM COOKIE J gravamos, verificamos e lemos o Cookie. E agora? Agora vamos apag-lo. Basta setar o prazo de expirao deste cookie em algum momento do passado. <?php setcookie("nomedocookie", "", time()-60); ?> A nova configurao de tempo sobrepe a antiga. Como o Cookie foi declarado como expirando h um minuto atrs, ele cai morto na hora.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 25

Parte 3 $_POST, $_FILE, $_SESSION, $_GET


Uma das bases para se trabalhar com PHP o fato de que seus cdigos e funes so interdependentes, interligados a tudo: formulrios HTML, outros arquivos PHP, etc. Em ltima anlise, a linguagem seria absolutamente intil se no fosse capaz de guardar algumas informaes quando do salto de uma pgina a outra dentro do site. O usurio digita alguma coisa no campo de texto na Tela A e estas informaes precisam ter alguma conseqncia na Tela B. Para bem utilizarmos nossas aplicaes PHP, precisamos de conhecimentos que transcendem o PHP em si, e que passam principalmente pelo HTML, onde tudo tem sua base.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 26

NOTA: para especificaes sobre $_FILE, leia a parte 3 deste material, que fala de Uploads de arquivo com PHP.

CAPTULO 1 $_POST
POST abriga uma coleo de valores cujos ndices so o nome dos campos de formulrio postados pelo arquivo HTML que chamou o arquivo PHP que est sendo executado. Por exemplo: vou construir um site que apenas aceita um valor digitado pelo usurio e retorna o quadrado deste valor. Eu tenho o arquivo FORMULARIO.HTML: <html><body> <form method=post action=quadrado.php> <input type=text name=valor> <input type=submit value=Calcular> </body></html> E tenho o arquivo QUADRADO.PHP: <?php $valor = $_POST[valor]; $quadrado = $valor * $valor; echo O quadrado de .$valor. .$quadrado; ?> Note que no PHP, eu abri $_POST e dentro disso, defini que queria [valor]. O ndice VALOR existe porque l no Form em HTML, que chamou meu programa PHP, havia um campo chamado VALOR. Eu poderia ter mais campos. VALIDAO DE SENHA USANDO $_POST Validar uma senha parece bastante complicado a princpio, pois envolve uma questo crucial para qualquer empresa que esteja presente na Web: a segurana de determinadas reas de seu site. Basta receber os campos vindos do PHP e fazer uma pergunta do tipo IF. Abaixo, o arquivo HTML: <html> <body> <form action="senha.php" method="POST"> Aqui abrimos o nosso FORM pronto para postar as informaes para o PHP processar. Usurio: <input name="login" type="text" size="30"><br> Senha: <input name="senha" type="password" size="30"> <br>
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 27

Aqui abrimos duas caixas, mas uma delas de TEXT e a outra de PASSWORD. A nica diferena que a de PASSWORD vai ter as letras substitudas por bolinhas pretas. <input name="enviar" type="submit" id="enviar" value="enviar"> E o velho e bom boto de Submit, claro. </form> </body> </html> Agora, vamos ao arquivo PHP que foi chamado: <?php if ($_POST['login']=="user" && $_POST['senha']=="123") { Na linha acima, $_POST[login] o campo Login l do nosso Form PHP. E tambm temos aqui o campo SENHA. Eles sero comparados com expresses string (no caso, user e 123, que so nosso usurio e senha de exemplo). echo 'Senha correta'; } else { echo 'Senha errada'; } ?>

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 28

CAPTULO 2 $_SESSION
Aqui estamos diante de uma funcionalidade essencial para o sucesso do PHP como linguagem para o desenvolvimento de sites seguros. Se no existisse $_SESSION, estaramos perdidos toda vez que um browser fosse configurado para no receber Cookies. Um exemplo: Eu vou comear criando um arquivo HTML: <html><body> <form method="post" action="senha.php"> <input type=text name="login"> <input type=password name="senha"> <input type=submit value="Entrar!"> </body></html> Depois, vou fazer o arquivo SENHA.PHP: <?php session_start(); if (($_POST['login']=="senac")&&($_POST['senha']=="123")){ $_SESSION["passou"] = "sim"; } else { $_SESSION["passou"] = "no"; } header("location:resultado.php"); ?> Veja o cdigo acima. Antes de dizer o IF, eu declarei um session_start(), para iniciar uma sesso do meu site, indicando que vou dar incio gravao de variveis de valor global para esta sesso. Depois, fiz um IF comparando o nome de usurio e a senha com as respostas corretas (SENAC e 123). Caso o usurio tenha acertado, a varivel global PASSOU valer sim, caso contrrio, no. Em seguida, redirecionei o usurio para a pgina RESULTADO.PHP. Ento vamos escrever resultado.php: <?php session_start(); if ($_SESSION["passou"] == "sim") { echo "Parabns, voc acertou";} else { echo "Voc errou"; } session_unset(); ?> Esta pgina bem simples. Ela apenas l o valor de $_SESSION[passou] e d uma resposta dependendo do que encontrar. Nos serve apenas para notar que o valor de PASSOU continua valendo nesta outra pgina. Na realidade, nossa sesso existe em funo de um Cookie gravado no computador do usurio. Note que a pgina comea com a abertura da sesso. importante iniciar o
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 29

uso de uma pgina ligada sesso no nosso site informando que se quer fazer esta conexo, seno ele no l o Cookie. No final, usei session_unset(), que acaba com a sesso atual, para evitar que depois de sair desta pgina, algum espertinho venha e use o boto Voltar para visualizar os dados do meu usurio. Mas h tambm uma forma de fazer a sesso expirar depois de decorrido algum prazo (como acontece quando a gente tenta voltar a uma caixa de email aberta h horas atrs, e aparece o aviso de sesso expirada). Se eu quiser que a sesso dure apenas por um tempo, devo usar antes de abrir o session_start o comando: session_cache_expire(30); Sendo que neste exemplo o tempo de 30 minutos (e poderia ser qualquer tempo). Mais ou menos assim: vou criar uma nova sesso que vai expirar em 10 minutos: <?php session_cache_expire(10); session_start(); e aqu vai o resto do cdigo.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 30

CAPTULO 3 $_GET
A varivel global $_GET foi introduzida no PHP partir da verso 4.1. Ela contm um array associativo de variveis passadas para o script atual atravs do mtodo GET. Abaixo, apresentarei 2 exemplos usando a varivel $_GET: uma com formulrio e outra pegando as variveis atravs de parmetros passados pela URL. <form method=get action=<?php PHP_SELF; ?>> Nome: <input type=text name=nome><br> Idade: <input type=text name=idade><br> <input type=submit value=submit> </form> Acima, eu constru um Form em HTML que servir para carregar nosso PHP. Note que na ACTION do Form, h apenas um cdigo PHP_SELF, ou seja, rodar o PHP dentro da prpria pgina. Ento, vamos fazer este PHP! <?php print Seu nome .$_GET["name"]; print 'sua idade '.$_GET["age"]; ?> O PHP que roda bem simples. Ele simplesmente pega com o $_GET os valores das caixas de nome e idade e reproduz na tela.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 31

Parte 4 OPERAES COM ARQUIVOS


Com PHP, voc pode criar arquivos, copiar, apagar, fazer o que quiser. Basta ter cuidado para no avacalhar completamente com o seu servidor, entupindo-o com arquivos excessivos ou apagando acidentalmente alguma coisa muito importante.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 32

CAPTULO 1 UPLOAD DE ARQUIVOS PARA O SERVIDOR


O PHP capaz de receber o upload de qualquer arquivo de texto ou binrio. Com as funes de autenticao e manipulao de arquivos do PHP, voc tem o controle completo de quem pode fazer o upload de arquivo e o que fazer com o arquivo aps seu upload. Depois de criar um FORM apropriado no seu arquivo HTML (siga o modelo abaixo, que bsico mas funciona, basta ordenar que no boto Submit dele seja chamado o PHP. <form enctype="multipart/form-data" action="upeloader.php" method="POST"> A linha acima cria o Form que vai chamar o arquivo PHP. <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> Acima, uma linha HTML que criar um objeto to tipo HIDDEN, ou seja, escondido, apenas para declarar o tamanho mximo de arquivo a baixar. O valor est em bytes. O valor de MAX_FILE_SIZE um aviso para o browser e bem fcil de contornar este limite. No chega a ser uma segurana total (ao contrrio do Maximum Size no PHP, que realmente seguro). Mas dependendo do browser, este MAX_FILE_SIZE pode impedir que o usurio espere pelo upload de um arquivo grande de maneira intil (porque ser barrado mais adiante). Escolha o arquivo: <input name="arquivo" type="file" /><br /> Acima, a linha com a caixinha para escolha do arquivo. <input type="submit" value="Upload File" /> </form> O boto de envio do formulrio e o fim do FORM. Em seguida, precisamos montar o arquivo PHP que ser o centro da nossa operao: <?php Abertura do PHP. $pastadebaixar = 'uploads/'; Aqui, estamos dizendo que $pastadebaixar ser a pasta uploads, dentro da pasta onde est o nosso arquivo PHP (l no servidor, claro). $arquivodebaixar = $pastadebaixar . $_FILES['arquivo']['name']; O arquivo de baixar (o local onde baixar o arquivo enviado) ser composto pela Pasta de Baixar e pelo nome do arquivo que j existe.
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 33

No caso, $_FILES[arquivo][name], onde $_FILES a entrada de dados vinda do form no HTML anterior, ARQUIVO o nome do campo que estamos lendo, e NAME para pegar o nome do arquivo explicitado ali (mais adiante veremos outros atributos que podem ser pegos por uma sintaxe semelhante). if ($_FILES['arquivo']['size'] >=1000) { Aqui, eu fao uma pergunta: se o tamanho do arquivo enviado exceeder a 1000 bytes (voc pode alterar este valor, claro). print "O arquivo grande demais"; } Da ento, escrever simplesmente que o arquivo grande demais. else { Do contrrio, vamos fazer uma pequena operao. if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $pastadebaixar . $_FILES['arquivo']['name'])) { Aqui tenho uma pergunta dentro da pergunta anterior: uma vez que o arquivo no grande demais, vamos validao do upload em si: move_uploaded_file recebe aqui dois parmetros. Um deles o TMP_NAME, que pegar o nome temporrio do arquivo (porque quando se faz o upload, o arquivo fica em um local temporrio no servidor), e outro o nome do local definitivo onde o arquivo ficar salvo (no caso, formado pelo nosso PASTADEBAIXAR e mais o nome original do arquivo, ou seja, copiar com o nome original e colocar a pasta UPLOADS). print "O arquivo valido e foi carregado com sucesso."; Aqui, temos um aviso que visvel ao usurio, quando ele conseguiu fazer essa transferncia de arquivo temporrio para pasta dos baixados (e no caso, ele j tinha feito antes, obviamente, do PC do usurio para o temporrio); } else { print "No deu certo!"; Aqui vem um seno, com o que fazer em caso de falha. No caso, exibir apenas uma mensagem de erro. } } ?>

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 34

SOBRE ATRIBUTOS DO $_FILES $_FILES['userfile']['name'] O nome original do arquivo no computador do usurio. $_FILES['userfile']['type'] O tipo mime do arquivo, se o browser deu esta informao. Um exemplo pode ser "image/gif". $_FILES['userfile']['size'] O tamanho, em bytes, do arquivo. $_FILES['userfile']['tmp_name'] O nome temporrio do arquivo, como foi guardado no servidor. $_FILES['userfile']['error'] O cdigo de erro associado a este upload de arquivo. ['error'] foi adicionado no PHP 4.2.0 e no funciona nas verses anteriores. Mas fique tranqilo porque dificilmente veremos algo anterior rodando por aqui. Onde fica o diretrio temporrio do servidor? J vimos que o arquivo vai para um local temporrio antes de ser realmente validado como baixado de verdade (e se no for, ele ser automaticamente deletado). O diretrio temporrio do servidor especificado com a opo upload_tmp_dir no php.ini, l na hora de configurarmos o servidor em si. No recomenda-se mudar isso, porque no final das contas no faz a mnima diferena: o que importa, mesmo, o arquivo cujo upload foi feito com sucesso (ou no) e seu uso na nossa aplicao PHP. Se ns colocarmos para funcionar o cdigo acima, teremos uma aplicao extremamente simples, capaz apenas de receber um arquivo e de grav-lo no servidor, algo sem segurana, sem maiores detalhes e sem sequer validao de tipo de arquivo. Mas j um comeo.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 35

CAPTULO 2 ESCREVENDO E APAGANDO ARQUIVOS


Escrever e apagar arquivos bem fcil, em PHP. Vejamos diretamente em um exemplo (que o meu mtodo preferido). <?php $arquivo = "thecure.htm"; Acima, carreguei uma varivel com um nome de arquivo, no caso, THECURE.HTM. O arquivo ainda no existe. $editor = fopen($arquivo, 'w'); Aqui, declarei que $editor equivale ao comando fopen, que significa File Open, ou abrir arquivo. Vamos abrir o arquivo especificado na varivel, com o outro atributo tendo W, de Write. $Dado = "Eu sou a linha 1\n"; Aqui, carreguei uma varivel $Dado com uma frase pra l de sem nexo, seguida do sinal \n, que significa Nova Linha. fwrite($editor, $Data); Aqui, usei a funo fwrite, ou File Write, que escreve dentro do arquivo aberto em $editor a linha contida em $Dado. $Dado = "Bom dia eu sou a Linha 2\n"; fwrite($editor, $Dado); E aqui j fiz outra linha com mais uma frase sem muito sentido. print "Arquivo completo"; fclose($editor); ?> No final, eu devo fechar o $editor, para fechar o arquivo. Olhe agora no servidor. L est um arquivo chamado thecure.htm com essas duas linhas escritas dentro. Para apagr um arquivo, basta usar a instruo unlink(" nome do arquivo "); CONTROLANDO O NMERO DE VISITAS O nmero de visitas a pgina pode ser controlado usando as funes de manipulao de arquivos. Trata-se de um programinha bem simples e que no faz nem crtica quanto a visitantes que retornam mais de uma vez.
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 36

<?php if(file_exists("visitas.dat")) { $fp = fopen("visitas.dat","r+"); $data = fgets($fp, 255); fseek($fp,0); $data++; $r= fwrite($fp,$data); fclose($fp); print("<br> <center><b>$data</b> visitas </center><br>"); } else { $file = fopen("visitas.dat", "w"); fputs($file, "1"); fclose($file); } ?> Aqui temos algumas funes novas. File_exists checa a existncia ou no de um arquivo. Fgets l apenas uma linha de arquivo de cada vez. No caso l s a primeira. O nmero 255 o comprimento mximo desta linha (no vamos usar um nmero to extenso que tenha 255 algarismos, mas fica a um nmero alto como segurana). Fputs um sinnimo de fwrite e escreve algo no arquivo. Fseek serve para achar um lugar no arquivo. No nosso caso, voltamos ao incio usando o ndice zero.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 37

CAPTULO 3 LER OS DADOS DE UM ARQUIVO


Muito bem. Ns temos ento no servidor aquele arquivinho de texto contendo uma redao maravilhosa e queremos criar um cdigo em PHP capaz de l-lo (ou, ainda voc decidiu criar sua prpria verso do Bloco de Notas online). De qualquer jeito, vamos abrir o arquivo: <?php $var1 = file('teste.txt'); De cara, eu carreguei a varivel $var1 com o comando para abrir TEXTE.TXT. A partir de agora, toda a referncia que eu fizer a este arquivo ser atravs de $var1. foreach ($var1 as $var1virtual => $cadalinha) { Foreach significa para cada, e vai servir para correr linha a linha o arquivo. $var1 o arquivo lido. $. Ento, eu vou fazer com que o sistema carregue este arquivo na varivel $var1virtual, e vou descarregar cada linha dele dentro da varivel $cadalinha. Este FOREACH na verdade um lao de repetio, e vai ficar rodando at acabarem-se as linhas do arquivo. print $cadalinha . "<br />\n"; Aqui, dei um Print no contedo da linha contida em $cadalinha, seguindo a expresso de um sinal de troca de linha em HTML. que eu quero que o meu PHP exiba na tela o contedo do arquivo TXT na ntegra, como ele . Se for o caso de ler um arquivo HTML, eu substituo a linha do print por outro comando, que interpreta as tags HTML e faz a nova linha baseada nessas tags, colocando a linha abaixo: print htmlspecialchars($cadalinha) . "<br />\n"; } ?>

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 38

CAPTULO 4 INCLUDE
Para abrigar dentro de um arquivo PHP o contedo de outro PHP, no necessrio ler ele linha por linha. Basta usar a instruo include, que bem simples: Vamos criar dos arquivos. VARIAVEIS.PHP <?php $cor = 'verde'; $fruta = 'ma'; ?> Trata-se de um cdigo bem simples, que apenas carrega duas variveis. At aqui, tudo muito inocente. TESTE.PHP <?php include 'variaveis.php'; echo "Uma $fruta $cor"; ?> O cdigo acima no faria o menor sentido, uma vez que no carrega nada nas variveis $fruta e $cor, mas ele tem um include, que insere aqui as funes do programinha anterior (que carregou as variveis).

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 39

Parte 5 OPERAES COM BANCO DE DADOS


Chegamos ao ponto pelo qual 9 entre 10 estudantes de PHP esperam ansiosamente: a integrao do cdigo com o banco de dados. Vamos comear este captulo assumindo algumas verdades: 1 Seu servidor j est configurado corretamente; 2 Voc j domina o bsico do uso do MySQL; 3 Voc j sabe o bsico do PHP; 5 Voc j testou seu banco de dados usando o MySQLTools. E agora, bem-vindo fronteira final entre a Web e as aplicaes Desktop. Seu site vai ganhar vida, memria e dinamismo.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 40

CAPTULO 1 INTEGRAO COM BANCO DE DADOS


UMA PRIMEIRA APLICAO SIMPLES Para operar com um banco de dados em PHP, usa-se a seguinte lgica: Passo 1 Estabelecimento de uma conexo com o banco de dados. Passo 2 Envio de uma query SQL para o banco de dados. Passo 3 Manipulao dos resultados desta operao. Vamos a um pequeno, porm funcional, cdigo em PHP para comear nosso trabalho de hoje: Para comear, ns j criamos nossa base de dados que se chama dados e uma table que se chama pessoas, onde eu deixei trs campos: cdigo, nome e idade. Agora, vamos ao cdigo: <?php $db = mysql_connect("localhost", "root"); mysql_select_db("dados", $db); $resultado = mysql_query("insert into pessoas values (1, 'Juca', 23);", $db); $resultado = mysql_query("SELECT * FROM pessoas", $db); echo "Nome: - ".mysql_result($resultado,0,"nome"); echo "<br />"; echo "Idade: - ".mysql_result($resultado,0,"idade"); $idade = mysql_result($resultado,0,"idade"); If ($idade >= 18) { echo ' - Maior de idade'; } Else { echo ' - Menor de idade'; } ?> Traduzindo: <?php $db = mysql_connect(localhost, root, 123); Nas duas linhas acima, abrimos o cdigo PHP com sua Tag caracterstica, e em seguida fizemos uma coisa que novidade em nossas aulas: o uso do mysql_connect. A instruo ali simples: $db a varivel que vai guardar a conexo com o banco de dados. Mysql_connect o comando caracterstico do PHP para fazer esta conexo. Perceba que ele recebe como parmetros as palavras localhost, root e 123. Localhost o nosso servidor de banco de dados (caso voc esteja utilizando um servidor remoto, coloque ali o IP do mesmo). Root o nosso nome de usurio para login (assumindo que o banco de dados tem senha). E 123 a senha. Este parmetro pode ser pulado caso estejamos usando um banco sem senha.
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 41

mysql_select_db("dados", $db); Aqui, fizemos a seleo do banco de dados (aquilo que chamamos de Schema, l no MySQLTools). Note que depois da instruo caracterstica, temos o nome do schema e a varivel $db. Fica claro que o primeiro parmetro para esta instruo o nome da base de dados e a segunda, a conexo de banco de dados usada (j que carregamos ela na linha anterior). $resultado = mysql_query("insert into pessoas values (1, 'Juca', 23);", $db); Aqui, a coisa comea a ficar mais complexa e estamos utilizando nossos conhecimentos em SQL para obter resultados. A varivel $resultado vai guardar os resultados da operao que ser realizada. Nesta linha especfica, no temos resultado aproveitvel, pois a instruo SQL insert into pessoas values (1, 'Juca', 23); far o seguinte servio: inserir um registro na tabela pessoas, passando como dados o 1 (que ser colocado no campo cdigo), o Juca (no campo nome) e 23, (no campo idade). No cabe aqui explicar com muitos detalhes esta query SQL. O fato que, embora no retorne resultado utilizvel, a query ser executada e o nosso amigo Juca ser cadastrado no banco de dados. Depois da instruo SQL, temos novamente a varivel $db, que (lembrando novamente) traz aqui a conexo com o banco de dados. $resultado = mysql_query("SELECT * FROM pessoas", $db); Novamente, uma instruo SQL. Mas, desta vez, temos um resultado aproveitvel. A query aqui servir para trazer os dados contidos na tabela pessoas, l no banco de dados. No cabe explicar novamente todos os parmetros do comando mysql_query (que continuam sendo os mesmos). O fato que os resultados obtidos de tal consulta ficaro guardados na varivel $resultado (que eu, alis, estou reaproveitando, prtica que no d problema algum no PHP). echo "Nome: - ".mysql_result($resultado,0,"nome"); Aqui, eu comeo colocando uma frase diretamente na pgina HTML, quando coloco o comando echo "Nome: - " e em seguida concateno o valor de mysql_result($resultado,0,"nome"); Mysql_result retorna, obviamente, o resultado de uma consulta ao banco de dados. No caso, aquela contida na varivel $resultado. O nmero zero o ndice do registro (se eu cadastrasse uma segunda pessoa, ela seria o 1, e da por diante). O terceiro parmetro, nome, o campo a exibir (lembre-se que ns estamos pressupondo que o desenvolvedor conhece bem a estrutura do banco de dados, claro). No caso desta consulta, retornar o nome do primeiro cadastrado (que o Juca, lembra?). echo "<br />"; A linha acima simplesmente adiciona, na pgina HTML, um sinal de mudana de linha. echo "Idade: - ".mysql_result($resultado,0,"idade");
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 42

Aqui, repetimos a frmula do primeiro mysql_result, mas com a inteno de retornar a idade da pessoa. Tambm inclumos a expresso Idade: - antes do dado obtido. $idade = mysql_result($resultado,0,"idade"); Aqui, criamos uma varivel $idade (nada a ver com o campo idade do banco de dados). Em seguida, atribumos a esta varivel o valor da idade contida no banco de dados (no caso, a nica que temos, a idade do Juca). If ($idade >= 18) { Aqui comeamos a expresso condicional. SE A $IDADE FOR MAIOR OU IGUAL A 18... echo ' - Maior de idade'; ... ENTO DIZEMOS QUE MAIOR DE IDADE... } Else { ... SENO... echo ' - Menor de idade'; ...DIZER QUE MENOR } Fim da expresso condicional. ?> Fim do cdigo PHP

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 43

Parte 6 USANDO A BIBLIOTECA GD


PHP uma linguagem aberta. Foi feita em linguagem C e est sempre sendo modificada por algum maluco em algum lugar do mundo. Sendo uma linguagem dinmica, e existindo no contexto da Web, natural que acabe se transformando em um projeto a muitas mos. Imediatamente aps o lanamento do PHP, surgiu uma apaixonada comunidade virtual de fantticos desenvolvedores. E quase to instantaneamente, comearam a surgir as constataes de que a linguagem no tinha funes prontas para tudo aquilo que as pessoas queriam fazer com ela. Ento alguns o pessoal comeu a criar novas funcionalidades. Assim nasceram as centenas de bibliotecas. E uma delas, esta brilhante inveno, a GD.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 44

CAPTULO 1 INTRODUO GD
O que GD? O PHP, como toda linguagem moderna, no tem uma nica fonte de produo para suas funcionalidades. J so mais de 10 anos de PHP no mundo e, ao longo do tempo, diversas pessoas contriburam para o seu aprimoramento. Normalmente, quando algum desenvolvedor experiente precisa de alguma funcionalidade que o PHP ainda no possui, e quando dispe de tempo para isso, cria uma biblioteca nova com funcionalidades inditas que ser em seguida disponibilizada para toda a comunidade PHP. Este o caso da biblioteca GD criada por Thomas Boutell, que permite que o PHP faa operaes com arquivos de imagem rapidamente. As primeiras verses da GD lidavam com os formatos GIF, JPEG e PNG. Porm, o mdulo que continha as funcionalidades para GIF inclua um trecho de algoritmo j registrado pela Unisys e portanto foi retirado das verses mais recentes da biblioteca (a partir da verso 1.4). Mesmo assim, permanecem as funes para PNG e JPG, que sempre foram as mais usadas. As possibilidades de uso da GD so muito variadas, mas aqui vamos abordar apenas aquelas principais e que nos servem para trabalhar com imagens de forma dinmica. Esta biblioteca vem nas verses mais recentes do PHP e, se o servidor for Windows, preciso alterar o arquivo PHP.INI, tirando a marcao de comentrio da linha que chama a GD execuo. Ao final deste captulo, voc conseguir no apenas fazer o upload de imagens para o seu site, como tambm redimensionar estas imagens, incluir marca dgua e mudar o esquema de cores (tornar, por exemplo, preto-e-branco).

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 45

CAPTULO 2 REDIMENSIONANDO IMAGENS


PASSO 1 SIMPLESMENTE COPIANDO UMA IMAGEM Para fazer isso, preciso fazer duas coisas: a primeira carregar uma varivel com a imagem e a segunda criar a imagem nova a partir do contedo desta varivel. <?php $origem = imageCreateFromJPEG("lugosi.jpg"); Acima, temos a abertura do cdigo PHP e o uso da funo imageCreateFromJPEG, que captura a imagem a partir do arquivo JPG. Neste caso, joga a figura para a varivel $origem. imagejpeg($origem, "plasedontgo.jpg", 100); ?> Em seguida, temos a funo imagejpeg, que cria uma imagem a partir de uma varivel que j contenha uma imagem em si. No caso, criamos pleasedongo.jpg a partir de $origem. O nmero 100 ao lado dos argumentos a qualidade da nova imagem (colocando 100, obtemos qualidade muito alta, e colocando, por exemplo, 25, temos uma imagem totalmente pixelada e deformada, mas que ocupa bem pouco espao no HD). PASSO 2 REDIMENSIONANDO A IMAGEM Agora, vamos ver como se redimensiona uma imagem. <?php $origem = imageCreateFromJPEG("lugosi.jpg"); Novamente, estou carregando o contedo do arquivo LUGOSI.JPG para dentro da varivel $origem. $saida = ImageCreateTrueColor(200,250); Agora estou criando a varivel $saida, que no caso abriga o procedimento de criao de uma imagem (na memria) com 200 pixels de largura por 250 de altura. ImageCopyResampled($saida, $origem, 0,0,0,0,200,250,600,400); Este prcedimento, o ImageCopyResampled, composto de diversos argumentos, mas todos eles so bem fceis de entender. Primeiro, temos $saida, que o procedimento de criao de imagem declarada pouco antes. Ela receber ento a cpia redimensionada da imagem. Depois, temos $origem, que a imagem de origem que ser copiada. Depois, temos 4 nmeros zero. Cada um deles representa a margem que deve ser dada do canto da imagem (uma margem escura, como uma borda). O primeiro zero a
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 46

margem da esquerda. O resto vem em sentido horrio. Assim, temos esses zeros como: esquerda, alto, direita, baixo. Logo depois, temos as dimenses de largura e altura da imagem resultante. No caso do exemplo, nossa imagem ter 200 pixels de largura por 250 de altura. Depois, temos as dimenses da poro que estamos capturando na imagem de origem. No caso, 600 pixels por 400. imagejpeg($saida, "pingo.jpg", 100); Este comando final bem fcil: o velho imagejpeg, que cria um arquivo de imagem a partir de uma imagem na memria. No caso, nossa imagem est armazenada no $saida e ser jogada para PINGO.JPG. ?> Nesse exemplo, digamos que a imagem original, que eu chamei pelo pitoresco nome de LUGOSI.JPG, tenha 600 pixels por 400 de tamanho. Com o cdigo escrito acima, eu estou criando uma imagem, PINGO.JPG, que exatamente a fotografia do ator Bela Lugosi aterrorizando a mocinha em um filme dos anos 30, reduzida pela metade (como se fosse um thumbnail, ou uma miniatura para servir de demonstrao da foto real). PASSO 3 VERIFICANDO O TAMANHO ORIGINAL DA IMAGEM Muito bem. J redimensionamos a imagem e tudo mais. O grande problema que no exemplo anterior eu tive que adivinhar o tamanho da fotografia original. Isso cria uma srie de dificuldades, principalmente porque ns no sabemos quais so as dimenses da imagem original. Pense bem: o Orkut, o Blogspot, os Fotologs por a no exigem que o usurio mande suas imagens com um tamanho especfico, exigem? Claro que no. Nosso programa deve ser capaz de verificar estas informaes. E isso relativamente fcil. <?php $origem = imageCreateFromJPEG("lugosi.jpg"); $saida = ImageCreateTrueColor(200,250); No comeo (linhas acima) nosso programa permanece igualzinho ao que era antes. $dadosdaorigem = getimagesize("lugosi.jpg"); $origemlargura = $dadosdaorigem[0]; $origemaltura = $dadosdaorigem[1]; Nas linhas acima temos as novidades: o uso do comando getimagesize nos permite carregar os dados de dimenses da imagem em uma varivel, no caso, $dadosdaorigem. Abaixo, ns retiramos a largura e a altura de dentro desta varivel de dimenses, que na verdade um vetor. Seu ndice 0 guarda a largura e o 1 guarda a largura. ImageCopyResampled($saida, $origem, 0,0,0,0,200,250,$origemlargura,$origemaltura); A linha de ImageCopyResampled tambm sofre uma mudana: ao invs de colocarmos a largura e a
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 47

altura adivinhadas da imagem original, colocamos as variveis que guardam estes dados desde a verificao recm-explicada. imagejpeg($saida, "pingo.jpg", 100); echo '<img src="pingo.jpg">'; ?> O resto do cdigo continua exatamente igual a antes. Aqui, adicionei uma linha ECHO apenas para inserir uma instruo HTML que faz a nova imagem ser exibida na tela. Como resultado final, temos o seguinte:

lugosi.jpg imagem 395 X 473 PASSO 4 MANTENDO PROPORES

pingo.jpg, imagem 200 X 250

Agora, ficamos diante de um pequeno dilema: eu criei uma imagem menor a partir de uma maior (e poderia ter feito o contrrio), mas para manter as propores da imagem original (isto , evitar que o atores aparecessem achatados ou esticados), tu tive que declarar um tamanho de destino
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 48

compatvel com as dimenses originais da figura. Ento, o que fazer quando eu sei qual ser a largura final de uma imagem mas no sei qual a altura que devo dar a ela para manter suas propores? Isso se obtm por meio de uma frmula muito simples. Veja abaixo como ficaria o cdigo: <?php $origem = imageCreateFromJPEG("lugosi.jpg"); $dadosdaorigem = getimagesize("lugosi.jpg"); $origemlargura = $dadosdaorigem[0]; $origemaltura = $dadosdaorigem[1]; Acima, temos as linhas j conhecidas: pega-se o arquivo original e disseca-se seu vetor de dimenses para conhecer a altura e a largura. $larguraautomatica = ((250/$origemaltura)*$origemlargura); Na linha acima, vem a novidade. Eu pego sei qual ser a relao entre as alturas, original e de destino. Ento, divido a altura do destino pela de origem para obter o valor da relao entre as duas. Em seguida, multiplico este valor pela largura da figura de origem. Na prtica, pense: se na diviso eu descobrir que a imagem reduzida ter 80% da altura da original, ento $larguraautomatica ser a multiplicao da largura original por 80%. Ou seja, ser uma reduo proporcional da largura original. Ento, eu usarei este valor daqui para a frente, como se v abaixo: $saida = ImageCreateTrueColor($larguraautomatica,250); ImageCopyResampled($saida, $origem, 0,0,0,0, $larguraautomatica, 250, $origemlargura, $origemlargura); E abaixo, as linhas idnticas ao que j vimos: imagejpeg($saida, "pingo.jpg", 100); echo '<img src="lugosi.jpg">'; echo '<img src="pingo.jpg">'; ?> A diferena que adicionei mais um ECHO, para visualizar as duas imagens, origem e destino. Na realidade, d para fazer todo tipo de comparao com o mesmo tipo de raciocnio matemtico. possvel, por exemplo, reduzir a imagem por porcentagem (obter 30% do tamanho, por exemplo), estabelecer uma largura ou altura padres, etc. possvel cortar da foto todo o pedao que excede a dimenses de altura ou largura (mudando as propriedades nos dois indicadores que representam a rea de corte na imagem principal), enfim. possvel editar como se queira uma imagem em um site PHP. Um fator a levar-se em considerao o seguinte: se decidirmos aumentar uma imagem ao invs de
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 49

reduzir ela, corremos o risco da perda de qualidade. Como em qualquer expanso de imagem. Nossos exemplos todos tm como padro imagens JPEG, mas eu j disse que possvel tambm trabalhar com PNG. Mais adiante, veremos uma lista completa de comandos e formatos para a biblioteca GD.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 50

CAPTULO 3 MESCLANDO IMAGENS


Voc criou um site bem bonito. Deu-se ao trabalho de adicionar todas as fotografias batidas nos ltimos meses, formando uma galeria de belas imagens. Vira e mexe, algum espertinho copia uma imagem sua e a usa em um site qualquer perdido pela Web. O grande problema que voc no est afim de processar o sujeito por utilizar-se de material alheio sem autorizao. Voc s queria que estes copiadores lhe dessem o crdito pela imagem. Afinal, a fama pode ser muito benfica, especialmente quando se trata da Web, onde as informaes propagam-se na velocidade da luz. Ento, voc resolve colocar sua marca dgua, um pequeno logotipo no canto da imagem, para obrigar a quem quer que utilize a foto, exibir tambm seu nome e o endereo do seu site. Tomada esta deciso, voc passa a virar noites adicionando a tal marca dgua em cada uma de suas fotos, no Photoshop, claro. cansativo, estressante e irritante, mas necessrio. Pois agora seus problemas acabaram! No graas s Organizaes Tabajara, e sim graas ao nosso amigo Thomas Boutell e sua biblioteca GD, que comporta funes de insero de uma imagem dentro da outra, com transparncia! Para o nosso exemplo, vou colocar duas imagens no servidor (mas que poderiam muito bem ter sido colocadas l atravs de um upload feito pelo usurio).

galera.jpg imagem 581 X 301

logo.jpg imagem 96 X 100

A minha idia aqui colocar o logotipo do Senac dentro da fotografia da galera reunida na sala do caf. Como que eu vou fazer isso? Muito fcil! <?php $origem = imageCreateFromJPEG("galera.jpg"); $logo = imageCreateFromJPEG("logo.jpg");
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 51

Logo de incio, o meu cdigo comea com dois imageCreateFromJPEG, capturando as duas imagens: a foto e o logotipo. $dadosdaorigem = getimagesize("galera.jpg"); $origemlargura = $dadosdaorigem[0]; $origemaltura = $dadosdaorigem[1]; $dadosdologo = getimagesize("logo.jpg"); $logolargura = $dadosdologo[0]; $logoaltura = $dadosdologo[1]; Acima, eu fiz aquela srie de comandos para obter a altura e a largura das duas imagens (vimos isso na funo anterior). imageCopyMerge($origem, $logo, 10, 10, 0, 0, $logolargura, $logoaltura, 40); Aqui estamos diante da verdadeira novidade. imageCopyMerge faz um trabalho que o seguinte: pega-se uma imagem, e em cima dela se coloca outra. No caso, vamos colocar nosso logotipo. $origem a imagem de origem j devidamente lida. $logo o logotipo, j devidamente lido. Ali onde diz 10, 10, 0, 0 estamos diante de uma coordenada que diz onde colocar o logo, em relao borda da fotografia principal. O primeiro nmero corresponde a uma margem esquerda. O segundo, o espao acima. O terceiro, o espao direita e o ltimo, o de baixo. Se eu definir um espao direita de 10 pixels, por exemplo, o logo ter um corte e perder seu canto esquerdo, mas ficar com um borro na parte direita, que eu apago declarando a largura do logo como menor do que ela . Veremos isso no parmetro seguinte. $logolargura, $logoaltura so as dimenses do logo. Aqui, coloquei estas variveis que haviam sido carregadas com os valores de largura e altura da imagem de logo, portanto ele vai sair em tamanho natural aqui. No entanto, se eu colocar uma dimenso menor, o logotipo no ser reduzido, e sim cortado. O ltimo nmero, o 40, percentual de opacidade do logotipo. Se eu colocar ali um 100, ele ser opaco, tapando um pedao da imagem. Se eu colocar 0, ele sumir. Colocando 40, 50, por a, eu consigo o efeito de marca dgua. imagejpeg($origem, "pingo.jpg", 100); echo '<img src="pingo.jpg">'; ?> O final do cdigo apenas transforma $origem em uma imagem, a PINGO.JPG e depois a exibe. Note que a imagem contida em $origem no mais a fotografia limpa. Quando eu dei um imageCopyMerge, eu carreguei o logotipo para dentro da imagem $origem, o que significa que ela agora carrega a foto e o logo. Assim, quando eu a transformo em arquivo, o arquivo j tem tudo.
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 52

O resultado do nosso exemplo fica assim:

pingo.jpg imagem 581 X 301 Agora, se quisermos posicionar a imagem em locais diferentes da imagem, teremos que fazer clculos em cima da imagem e do logo, estabelecendo uma relao para achar os diferentes campos. Abaixo, segue uma pequena lista da clculos para obter a posio de um logo, seguidos de uma imagem demonstrativa dos resultados de cada um deles. Para que estes clculos funcionem, substitua a linha que diz o comando imageCopyMerge por esta: imageCopyMerge($origem, $logo, $logocoluna, $logolinha, 0, 0, $logolargura, $logoaltura, 40);

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 53

POSICIONANDO O LOGOTIPO Agora, exibirei os clculos. Estas linhas de clculo devem ser colocadas exatamente antes da linha que foi passada acima.

CENTRALIZADO $logocoluna = ( $origemlargura / 2 ) - ( $logolargura / 2 ); $logolinha = ( $origemaltura / 2 ) - ( $logoaltura / 2 );

CANTO SUPERIOR ESQUERDO $logocoluna = 0; $logolinha = 0;

CANTO SUPERIOR DIREITO $logocoluna = $origemlargura - $logolargura; $logolinha = 0;

CANTO INFERIOR DIREITO $logocoluna = ($origemlargura - $logolargura) - 5; $logolinha = ($origemaltura - $logoaltura) - 5;

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 54

CANTO INFERIOR ESQUERDO $logocoluna = 0; $logolinha = $origemaltura - $logoaltura;

CENTRALIZADO NO TOPO $logocoluna = ( ( $origemlargura - $logolargura ) / 2 ); $logolinha = 0;

ALTURA DO MEIO, CANTO DIREITO $logocoluna = $origemlargura - $logolargura; $logolinha = ( $origemaltura / 2 ) - ( $logoaltura / 2 );

CENTRALIZADO NO RODAP $logocoluna = ( ( $origemlargura - $logolargura ) / 2 ); $logolinha = $origemaltura - $logoaltura;

ALTURA DO MEIO, NA ESQUERDA $logocoluna = 0; $logolinha = ( $origemaltura / 2 ) - ( $logoaltura / 2 );

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 55

CAPTULO 4 VERIFICANDO A BIBLIOTECA GD


Para trabalhar com imagens, preciso ter a biblioteca GD. E para ter certeza de que o seu servidor est devidamente configurado com ela, preciso fazer um teste. Abaixo, segue um cdigo para fazer este teste: if(!function_exists("ImageCreateTrueColor")) { if(!function_exists("ImageCreate")) { echo "Configurao malfeita - voc no possui a GD no seu PHP!"; exit; } } bem simples compreender o cdigo acima: trata-se de um IF dentro do outro. O ponto de exclamao no incio da expresso !function_exists significa NO, ou seja, eu no estou testando SE A FUNO EXISTE e sim, se ela NO EXISTE. Ento, eu estou dizendo: Caso a funo ImageCreateTrueColor no exista, ento... Ento o qu? Ento eu pergunto se a funo ImageCreate tambm no existe. E se nenhuma delas existir, eu mando exibir uma mensagem na tela informando isso, seguida do comando EXIT, que encerra a execuo deste cdigo PHP. Isso importante, pois evita que o seu cdigo termine de forma inesperada, enchendo a tela de mensagens de erro (indicando a linha onde est o erro, etc.) e levando o desenvolvedor a passar vergonha. Mas aqui cabe uma rpida explicao: Por qu testar duas funes que tm a mesma destinao? Qual a diferena entre elas? ImageCreate a funo de criao de imagens das primeiras verses da biblioteca GD. As verses mais recentes usam ImageCreateTrueColor (a partir da verso 2.0). Esta ltima uma evoluo da primeira, corrigindo eventuais erros que ocorriam, de a imagem criada sair com uma paleta de cores deformada em relao imagem original (normalmente, com as cores lavadas).

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 56

CAPTULO 5 TRATANDO TIPOS DIFERENTES DE ARQUIVO


JPEG Para abrir imagens JPEG, usa-se imageCreateFromJPEG( nome do arquivo ) ; Para criar JPEG - imagejpeg( varivel de origem , "nomedafigura.jpg", 100); PNG Para abrir imagens PNG, usa-se imageCreateFromPNG( nome do arquivo ) ; Para criar PNG - imagepng( varivel de origem , "nomedafigura.png", 100); Mas como que o nosso programinha vai saber com que tipo de arquivo est lidando? Isso bem simples. Ns precisamos quebrar o nome do arquivo que foi mandado em Upload, e dali extrair sua extenso. Um exemplo simples: <?php $fimdoarquivo = end(explode(".", $_FILES['foto']['name'])); $fimdoarquivo = strtolower($fimdarquivo); if (($fimdoarquivo == "jpg")... O programinha acima simplesmente pega o nome de arquivo da imagem uploadeada pelo campo foto do Form HTML, decompe este nome tirando tudo o que vem depois do ponto (isso na segunda linha), depois ele converte essa extenso em letras minsculas (para poder fazer comparaes de forma funcional) e em seguida comeam os IF, cuja estrutura conhecemos j bem. Ento, na hora de abrir uma foto, por exemplo, usamos: if ($fimdoarquivo == "jpg") { imageCreateFromJPEG($nomedoarquivo); } else if ($fimdoarquivo == "png") { imageCreateFromPNG($nomedoarquivo); } else{ echo Arquivo invlido tente com um JPG ou PGN;}

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 57

NOTAS EXPLICATIVAS
1 - A frase uma citao do filme The Rocky Horror Picture Show, pronunciada pelo personagem Riff Raff pouco antes de os protagonistas passarem por uma aventura depois da qual nada nunca mais ser o mesmo, exatamente o que acontece com o WebDeveloper ou WebDesigner depois que ele toma contato com as infinitas possibilidades do PHP. 2 - No vamos entrar em detalhes sobre o HTML. Para fazer testes de cdigo PHP, basta saber usar a tag <FORM> e seus <INPUT>. Em caso de dvida, consulte o material sobre HTML do mesmo autor, ou pesquise na Internet. 3 A frase do seriado Jornada nas Estrelas.

Por Fbio B. Salvador fabio.b.salvador@gmail.com

Pgina 58

ANEXO 1 A LGICA POR TRS DE UM CARRINHO DE COMPRAS


Vamos agora fazer um exemplo funcional de programa em PHP bem simples, com apenas 2 arquivos. Eu criei este exemplo pensando nas pessoas que tentam compreender o uso da Orientao a Objetos no PHP mas, pesquisando na Internet, s encontram exemplos completos de Carrinhos de Compras para sites e e-commerce. Estes exemplos, extensos, geralmente confundem os leitores. Minha idia aqui no criar um Carrinho funcional, e sim, um exemplo o mais simples possvel para que todos possam compreender o que se passa. O programa aqui faz algo bem simples: ele mantm uma lista de pessoas, com Nome e Idade, e vai aumentando esta lista medida que o usurio digita novos dados. Para construir o carrinho de compras do site de e-commerce, o sistema seria o mesmo, mas teramos mais campos de dados, teramos toda a parte de segurana do site, enfim, essas coisas. No entanto, a lgica de funcionamento do carrinho em si permanece sendo esta mesma. Os produtos entram em um Array, e quando o usurio concluir sua lista de compras, todos estes dados vo para o Banco de Dados. Ento, vamos l! Arquivo index.php <?php session_start(); class Pessoa { var $nome; var $idade; function Pessoa ($n, $i) { $this->nome = $n; $this->idade = $i; } function Aniversario() { $this->idade ++; echo $this->nome.' tem agora '.$this->idade.' anos.'; } } $_SESSION["contador"] = 0; echo '<form method="POST" action="testa.php"> Nome : <input type="text" name="nome" size=20 /> <br /> Idade : <input type="text" name="idade" size=20 /> <input type="submit" value="Adicionar" size=20 /> </form>'; ?> Observe que eu criei uma varivel chamada contador dentro da Session. Ela servir para o controle do ndice no vetor de pessoas, iniciando com zero. Eu criei aqui uma classe, chamada Pessoas. Esta classe no precisaria estar aqui, mas eu vou coloc-la em todos os meus arquivos PHP. No final,
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 59

simplesmente fiz um ECHO e passei instrues HTML, desenhando um FORM extremamente tosco para que o usurio digite os dados da primeira pessoa a ser cadastrada. Arquivo testa.php <?php session_start(); class Pessoa { var $nome; var $idade; function Pessoa ($n, $i) { $this->nome = $n; $this->idade = $i; } function Aniversario() { $this->idade ++; echo $this->nome.' tem agora '.$this->idade.' anos.'; } } $nomi = $_POST["nome"]; $ida = $_POST["idade"]; $_SESSION["lista"][$_SESSION["contador"]] = new Pessoa($nomi, $ida); $_SESSION["contador"]++; foreach ($_SESSION["lista"] as $temp) { echo $temp->nome.' cuja idade '.$temp->idade.'<br />'; } echo '<form method="POST" action="testa.php"> Nome : <input type="text" name="nome" size=20 /> <br /> Idade : <input type="text" name="idade" size=20 /> <input type="submit" value="Adicionar" size=20 /> </form>'; ?> Aqui, o cdigo ficou um pouco mais complexo, mas permanece simples. No incio, eu inicio a sesso e declaro a classe (eu vou ter que redeclar-la em cada um dos meus arquivos). Depois, capturei os dados que o usurio me mandou, atravs do $_POST. Em seguida, eu disse que a varivel lista, da $_SESSION (que um vetor), no ndice zero, abrigaria um objeto do tipo Pessoa, com os dados passados pelo usurio. Na linha seguinte, incrementei a varivel contador tambm da $_SESSION para fazer com que a prxima pessoa cadastrada seja colocada no ndice 1, deixando o zero intacto. Depois, rodei um foreach, passando toda a lista de pessoas que j foram cadastradas para a tela. E no fim, fiz um ECHO para exibir o mesmo FORM da pgina anterior. O FORM, agora, envia as informaes para a mesma pgina onde est. A cada pessoa que o usurio cadastrar, o sistema d uma volta retornando ao mesmo lugar, mas sempre incrementando a famosa varivel $_SESSION[contador], e fazendo com que sejam preenchidos os ndices 2, 3, 4, at o infinito, do vetor que eu denominei $_SESSION[lista];
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 60

ENCERRAMENTO
No pense, caro leitor ou aluno, que voc sabe tudo de PHP depois de ler este documento. Tudo, tudo, dificilmente existir algum que saiba, pois PHP uma linguagem viva, sempre em atualizao e com mltiplas aplicaes. Alguns desenvolvedores tero mais inclinao para o trabalho com banco de dados e outros, com imagens. E assim por diante. Alm disso, enquanto ns estamos aqui nesta aula, com certeza algum, em algum lugar, est pensando ou desenvolvendo alguma funcionalidade nova que teremos que aprender amanh, no ms que vem, ou algum dia quando viermos a precisar. Disso, ningum escapa (a no ser quem no se atualiza, mas esses acabam jogados para escanteio no mercado). O fato que depois de concluir este curso, voc est preparado para construir seus sites dinmicos, capazes de receber upload, atualizaes, guardar dados, com validao de usurio e senha, sesses seguras, dentro dos padres atuais da Internet. Se voc chegou at esta ltima pgina, significa que est se preparando para enfrentar o mercado de trabalho na Web, um mercado em expanso que no d sinais de esgotamento, que no ser suplantado pelos prximos anos por nada que possamos hoje imaginar. Este mercado um verdadeiro Eldorado para os verdadeiros profissionais. A prpria linguagem PHP tem um futuro promissor. Quando surgiu, foi chamada de linguagem de brinquedo para amadores, e no entanto quase metade da Web depende dela para funcionar. H alguns anos, foi decretada sua morte, diante das tcnicas jax e do surgimento do Ruby e de outras coisas mais modernas. S que depois os prprios especialistas que vinham declarando PHP como lngua morta voltaram atrs. E a linguagem est a, mais forte do que antes. Para o PHP 6, os cabees do desenvolvimento da linguagem anunciam um reforo na rea de orientao a objetos (a que possibilitou a construo do carrinho de compras nos anexos desta apostila). Com isso, PHP aproxima-se mais do Java, e manter sua competitividade no mercado por mais alguns anos. Depois, viro mais atualizaes com certeza. Se algum um dia te disser que PHP no tem futuro algum como linguagem, lembre a esta pessoa que isso j foi dito umas quatro ou cinco vezes ao longo dos ltimos 10 anos, e no entanto todos os tericos do desastre quebraram a cara. Ento, v em frente. E boa sorte . Prof. Fbio Salvador
Por Fbio B. Salvador fabio.b.salvador@gmail.com Pgina 61

Das könnte Ihnen auch gefallen