Beruflich Dokumente
Kultur Dokumente
PHP
Fbio B. Salvador Julho 2007 Revisada em Abril de 2008
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.
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.
Pgina 5
Pgina 6
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.
Pgina 8
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.
Pgina 10
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)); ?>
Pgina 13
Pgina 14
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.
Pgina 16
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).
Pgina 18
Pgina 20
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.
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.
Pgina 23
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.
Pgina 25
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'; } ?>
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.
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.
Pgina 31
Pgina 32
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. } } ?>
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.
Pgina 35
<?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.
Pgina 37
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).
Pgina 39
Pgina 40
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
Pgina 43
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).
Pgina 45
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:
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.
Pgina 50
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
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);
Pgina 53
POSICIONANDO O LOGOTIPO Agora, exibirei os clculos. Estas linhas de clculo devem ser colocadas exatamente antes da linha que foi passada acima.
Pgina 54
ALTURA DO MEIO, CANTO DIREITO $logocoluna = $origemlargura - $logolargura; $logolinha = ( $origemaltura / 2 ) - ( $logoaltura / 2 );
Pgina 55
Pgina 56
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.
Pgina 58
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