Professional Documents
Culture Documents
com
Programao em PHP
Autores do manual Este manual foi criado pelos seguintes colaboradores de Criarweb.com: Miguel Angel Alvarez Miguel Angel Alvarez Traduo de JML Traduo de Celeste Veiga
(41 captulos) (1 captulo)
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
Este manual est destinado a todos os que quiserem comear do zero na aprendizagem desta linguagem e que estejam procura da sua utilizao directa no seu projecto de site ou no seu site HTML. Os captulos so extremamente simples, sem ser simplistas, procurando ser acessveis maioria. Eles podem ser complementados posteriormente com outros artigos de maior nvel, destinados gente mais experiente. A forma como relatamos este manual faz com que este seja acessvel a qualquer pessoa no familiarizada com a programao. Mesmo assim, possvel que em determinadas alturas algum que nunca tenha programado se veja um pouco desorientado. O nosso conselho de no querer perceber tudo antes de passar ao captulo seguinte, mas sim de tentar assimilar alguns conceitos e voltar a trs quando surgir uma dvida ou nos tenhamos esquecido de algum detalhe. Nunca faz mal ler vrias vezes o mesmo at que fique bem gravado e assimilado. Esperamos que este manual seja do vosso agrado e que se corresponda s nossas expectativas: O poder aproximar o PHP a todos os amantes do desenvolvimento de webs que querem dar o passo s webs profissionais. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
Neste ltimo ano, o nmero de servidores que utilizam PHP aumentou, conseguindo situar-se perto dos 5 milhes de sites e 800.000 endereos IP, o que converteu PHP numa tecnologia popular. Isto deve-se, entre outras razes, ao facto de PHP ser o complemento ideal para que o Linux-Apache seja compatvel com a programao do lado do servidor de stios web. Devido aceitao que conseguiu, e o grande esforo realizado por uma crescente comunidade de colaboradores para tentar conseguir uma implementao ptima, podemos assegurar que a linguagem ir converte-se num standard que compartilhar os xitos augurados ao conjunto dos sistemas desenvolvidos em cdigo aberto. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
pode ser muito satisfatrio. Artigo por Miguel Angel Alvarez - Traduo de JML
Para ficar a conhecer a forma de instalar PHP sobre cada servidor de cada sistema operativo podemos ir ao apartado de documentao da pgina oficial de PHP onde podemos consultar um manual em HTML de rpida consulta e um enorme manual em PDF de quase 1000 pginas que explica de minuciosamente entre outras coisas, os passos a seguir para cada caso particular. De qualquer forma, ns vamos oferecer algumas ajudas para configurar PHP nos sistemas mais comuns. A eleio do nosso programa servidor ter muito que ver com o sistema operativo que tenhas a funcionar no teu computador. Estas seriam algumas possibilidades de sistemas operativos e solues que funcionam bem. Windows 95/98 Se ests a trabalhar em Windows 95 ou Windows 98 e para principiantes, recomendvel utilizar o servidor Personal Web Ser. Neste caso necessitaramos: Personal Web Server de Microsoft como servidor, que tambm serve para a aprendizagem em ASP. Uma instalao da verso mais recente de PHP que, para alm de demorar menos a fazer o download, nos guiar passo a passo em todo o processo de instalao. Esta verso no inclui todas as funcionalidades de PHP, mas servir para aprender at um bom nvel.
H que destacar que, para o caso de PHP em PWS, margem de tudo o que foi dito no capitulo de instalao, importante ao criar o directrio virtual permitir a execuo de scripts validando a caixa correspondente. Em Windows 95/98 tambm podemos utilizar o servidor Apache e pode que seja uma opo ainda mais completa que a de utilizar PWS. Passamos a explicar mais sobre o assunto. Windows ME e XP Home edition No experimentamos PHP nestas plataformas, mas em principio no tm compatibilidade com Personal Web Server, pelo qual deveramos escolher o outro servidor.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
Outra possibilidade para os usurios de Windows em geral instalar Apache como servidor web que pode ser vantajoso em relao ao uso do PWS, pois PHP est principalmente desenhado para funcionar neste servidor. Isto quer dizer que, ainda que em principio tudo devesse funcionar correctamente nos dois servidores, possvel que algum bug no corrigido faa falhar algum dos nossos scripts se trabalhamos com algum servidor cujas actualizaes so menos frequentes e detalhadas. Apache foi especialmente pensado para plataformas Unix-Linux, ainda que recentemente, com Apache 2.0 tenha sido feita uma verso especfica para Windows. Windows NT, Windows 2000 e XP nas suas verses Professional e Server Para estes sistemas temos duas possibilidades muito interessantes pois podemos instalar PHP sobre Internet Information Server ou sobre Apache com todas as garantias. Se tivssemos que recomendar alguma das duas opes, escolheramos Apache pois como tnhamos dito, PHP est pensado para trabalhar sobre Apache. Podia ser interessante IIS no caso que desejemos usar ASP e PHP sobre o mesmo servidor pois em principio Apache no compatvel com ASP. Unix - Linux Temos de dizer que neste sistema, e acompanhado de Apache, onde se obtm as melhores prestaes desta linguagem sendo a combinao mais comum na maioria dos servidores web que trabalham com PHP. Concluso De qualquer modo, para fins de desenvolvimento local, em princpio podemos trabalhar em qualquer sistema. Somente em casos de programao realmente avanada poderemos enfrentar-nos com problemas relacionados com o sistema operativo utilizado ou o servidor no qual correm as nossas pginas. Temos de ver que em alguns casos pontuais, nos quais o nosso PC possa no ser muito potente, podemos fazer directamente os nossos testes com o servidor donde temos o nosso site o qual ser, muito provavelmente, um Unix ou Linux funcionando com Apache. Artigo por Miguel Angel Alvarez - Traduo de JML
verses, uma que tem um instalador, e outra que um ficheiro ZIP. Optamos pela segunda hiptese. Uma vez descarregado o ficheiro temos que descomprimi-lo dentro de uma pasta que no tem que estar dentro do path do Apache. Este artigo assumir que se descomprime dentro duma pasta C:\PHP. Verificar que o contedo do ficheiro ZIP no fica num subdiretrio da pasta C:\PHP, mas sim directamente no directrio raiz da dita pasta. Na pasta C:\PHP encontra-se um ficheiro chamado PHP4ts.dll, h que mov-lo para dentro da pasta C:\Windows\system ou C:\winnt\system. A seguir, dentro da pasta c:\php encontra-se um ficheiro chamado php.ini-recomended. Temos de copiar este ficheiro para dentro da pasta C:\Windows, e renome-lo a php.ini Neste ficheiro encontra-se toda a configurao de PHP, e todas as modificaes na configurao de PHP (mostrar erros, variveis globais, etc...) encontram-se dentro deste ficheiro. muito recomendvel mudar a directiva display_errors que como valor pr-definido est em OFF, e pr em ON, para poder ver os erros que se produzem nas pginas durante o desenvolvimento. Para um servidor em produo conveniente deix-la em OFF. Uma vez feito isto, resta indicar-lhe ao Apache, onde se encontra instalado o PHP, para isso temos de editar o ficheiro httpd.conf que se encontra dentro da pasta conf, na pasta de instalao do apache (C:\Program Files\Apache Group\Apache2\conf). Abrimos o ficheiro, situamo-nos no final do mesmo e escrevemos as seguintes linhas: ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php .php Action application/x-httpd-php "/php/php.exe" Aqui indicamos onde se encontra o executvel de php, e como associ-lo aos ficheiros php que se encontrem dentro do Apache. A continuao reiniciar o servidor Apache, e j esta! Por ltimo, para comprovar a nova instalao, recomenda-se criar um ficheiro php com o seguinte contedo:
<? phpinfo(); ?>
A seguir guardamo-lo dentro da pasta raiz de documentos do Apache (C:\Program Files\Apache Group\Apache2\htdocs), com um nome terminado em .php, por exemplo info.php Para execut-lo, atravs de um navegador, escrever o endereo http://localhost/info.php. Devia aparecer um ecr como o que se mostra a seguir.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
Se virmos isto correctamente porque tudo correu bem e temos PHP perfeitamente instalado no nosso servidor Apache.
Nota: Este tipo de instalao de PHP sobre Apache pouco recomendvel por motivos de segurana. Podemos segui-la para configurar PHP em local, com a inteno de fazer as nossas pginas web, mas nunca se vamos utilizar o servidor num entorno de produo, isto , num servidor que se encontre permanentemente conectado a Internet servindo pginas a todo tipo de usurios. Seria necessrio instalar PHP como um mdulo de Apache, em lugar de CGI, para dotar ao sistema de uma maior segurana, e tambm mais potncia.
Se tivermos problemas para instalar PHP e os programas relacionados no nosso sistema, sempre podemos optar pela opo mais rpidas, que instalar um pacote que inclui tudo o necessrio para comear. Poderemos encontrar tudo explicado numa guia gratuita com vdeos muito instrutivos e recomendveis que nos ensinam a instalar PHP, Apache, MySQL e outras aplicaes. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
Referncia: Vamos supor que o servidor de pginas web Apache 2.0 est instalado no nosso sistema. No obstante, para os que no o tenham, aconselhamo-los o nosso manual de instalao e configurao de Apache. Tambm pomos vossa disposio um link a uma guia em vdeo muito interessante e super simples para poder instalar PHP no nosso computador. A guia gratuita e serve para instalar PHP, Apache e MySQL.
Descer e descomprimir PHP O primeiro passo consiste em descer a ltima verso de PHP. Poderemos faz-lo desde a pgina oficial de PHP, na seco de downloads http://www.php.net/downloads.php Devemos escolher a verso "Zip Package" que contem todas as funcionalidades de PHP e do mdulo necessrio para instala-lo no Apache. Uma vez obtido o pacote comprimido em .zip de PHP necessitamos descomprimi-lo no nosso disco rgido. Podemos utilizar o directrio raz do disco para descomprimir os ficheiros. Neste caso, cria-se uma pasta com um nome semelhante a "php-4-3-1-Win32" que estar no directrio raiz. Recomenda-se mudar o nome da pasta criada para algo simples como "C:\php". Em todo caso, avisam-nos na pgina de PHP para no colocar nenhum nome de pasta que tenha espaos, pois poderia dar problemas com alguns servidores. Por exemplo, cuidado com instalar PHP em algum directrio como este "C:\Program Files\php", pois o path contm espaos. Copia das DLL Em seguida informam-nos sobre a necessidade de copiar no nosso diretrio de sistema uma srie de livrarias (.dll) que encontraremos no directrio sapi da nossa instalao de PHP, supostamente algo como "C:\PHP\Sapi". O mencionado directrio do sistema pode variar de umas verses a outras de Windows. Em Windows XP, o directrio de sistema onde temos de copiar as dll :"C:\WINDOWS\system32". Em Windows 9x/ME, o directrio seria "C:\Windows\System" sendo em Windows NT/2000 o directrio "C:\WINNT\System32" ou "C:\WINNT40\System32".
Nota: No se devem misturar as DLL de diversas verses de PHP, porque do contrario, poderia causar-nos problemas.
Deferir um ficheiro php.ini Outro ficheiro que devemos copiar, desta vez no nosso diretrio Windows, o php.ini, que guarda as opes de configurao definidas para PHP. Nas distribuies de PHP inclui-se dois ficheiros php.ini que podemos utilizar directamente no nosso sistema. Estes ficheiros chamamse "php.ini-dist" e "php.ini-recommended" e contem umas opes tpicas de configurao em PHP. Recomenda-se utilizar "php.ini-recommended", porque vem optimizado para obter os melhores nveis de segurana. Em qualquer caso, podemos editar em qualquer momento o contedo do ficheiro para modificar a configurao de PHP ao nosso gosto ou necessidades. Para definir o php.ini devemos fazer uma copia do ficheiro ed configurao escolhido ("php.inidist" ou "php.ini-recommended") e renome-lo como o "php.ini". Posteriormente devemos copi-lo na nossa pasta de Windows que em sistemas 9x/ME/Xp "C:\windows" e em sistemas NT/2000 "C:\WINNT" ou "C:\WINNT40". Editar httpd.conf Posteriormente devemos editar o nosso ficheiro de configurao de Apache, chamado "httpd.conf" que est no directrio "conf" da nossa instalao de Apache. Tambm podemos encontrar um acesso directo para editar esse ficheiro acedendo a Inicio - Programas - Apache
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 9
HTTP Server - Configure Apache HTTP Server - Edit httpd.conf configuration file. Devemos acrescentar um par de linhas de configurao do modulo Apache. LoadModule php4_module C:\php\sapi\php4apache2.dll AddType application/x-httpd-php .php O lugar adequado para acrescentar essa linhas no bloco de carga de mdulos, que podemos encontrar se procuramos pelo texto "LoadModule". Podemos acrescentar as linhas de carga do modulo PHP depois da carga dos outros mdulos que vem j configurados no ficheiro http.conf de Apache. Se instalarmos o PHP no directrio C:\PHP, devemos editar as linhas e colocar no http.conf o path correto ao diretrio onde esta a livraria php4apache2.dll. Um ltimo passo Antes de terminar e comprovar se o PHP se instalou correctamente, necessitamos copiar uma dll no diretrio sapi. Concretamente, a dll "php4ts.dll", que podemos encontrar no nosso diretrio de instalao de PHP, a qual devemos copiar ao directrio sapi, algo assim como "C:\PHP\sapi"
Nota: Esta aco no vem documentada no manual de PHP, ainda que se no a fizermos no funcionar. O erro que obtemos ao arrancar o Apache ser algo como: Syntax error on line 173 of C:/Program Files /Apache Group/Apache2/conf/httpd.conf: Cannot load C:/php/sapi/php4apache2.dll into server: No se pode encontrar o mdulo especificado.
Outra configurao que podemos aplicar no ficheiro httpd.conf definir tambm como documento padro o ficheiro index.php no nosso servidor Apache. O documento padro geralmente index.html, mas o habitual se formos programar com PHP que tambm necessitemos de definir o index.php como documento a mostrar se no se indica outro documento do directrio a que se est a aceder. O documento pr-definido define-se com a varivel DirectoryIndex. Obteremos uma definio como esta: DirectoryIndex index.html index.html.var index.php Comprovar se PHP est a funcionar correctamente Para terminar, podemos criar uma pgina de prova de PHP, que colocaremos no nosso directrio de publicao do Apache, geralmente chamado htdocs, que est dentro do directrio onde se instalou Apache, algo assim como "C:\Program Files\Apache Group\Apache2\htdocs". Podemos criar um ficheiro chamado, por exemplo, "prova.php", no qual colocaremos dentro o seguinte cdigo: <? phpinfo() ?> Esta funo simplesmente criar uma pgina que mostra as configuraes definidas para PHP nesse servidor. Para aceder ao ficheiro criado desde o nosso explorador, escreveremos na barra de endereos
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 10
Se por qualquer motivo encontramos problemas ao instalar PHP e os programas relacionados com o nosso sistema, sempre podemos usar uma via mais rpida que consiste em instalar um pacote que inclui tudo o necessrio para comear. Poderemos encontrar todos os detalhes numa guia gratuita com vdeos muito instrutivos e recomendveis que nos ensinam a instalar php, Apache, MySQL e outras aplicaes. Artigo por Miguel Angel Alvarez - Traduo de JML
P-lo a funcionar no tem muita dificuldade. Uma vez instalado o programa podemos executar as nossas ordens em modo MS-DOS. Para isso, abrimos uma janela MS-DOS e colocamo-nos no directrio bin de mysql. Neste directrio encontram-se os ficheiros executveis. Aqui teremos de encontrar um ficheiro chamado mysqld. No caso da verso mais actual durante a redaco deste artigo, este ficheiro chama-se mysqld-shareware. Uma vez executado este ficheiro podemos executar o seguinte: mysql Uma vez chegados a este ponto veremos como uma mensagem de bem-vinda aparece no nosso ecr. Neste momento encontramo-nos dentro da base de dados. A partir de ai podemos realizar todo tipo de operaes por comandos SQL. No vamos entrar numa explicao pormenorizada do funcionamento dessa base de dados pois isso dava-nos para um manual inteiro. Como resumo, aqui propomos as operaes mais bsicas: Instruccin Show databases; Use nome_da_base Create Database nome_da_base; Drop Database nome_da_base; Show tables; Describe nome_da_tabela; Load Data Local Infile "ficheiro.txt" Into Table nome_da_tabela; Quit Descripcin Mostra o conjunto da base de dados presente no servidor Determina a base de dados sobre a qual vamos trabalhar Cria uma nova bd com o nome especificado Elimina a base de dados com o nome especificado Mostra as tabelas presentes na base de dados actual Descreve os campos que compem a tabela Cria os registos da tabela a partir de um ficheiro de texto no qual separamos por tabulaes todos os campos de um mesmo registro Sair de MySQL
Para evitarmos ter de editar as nossas tabelas directamente sobre os ficheiros de texto, pode ser muito prtico usar qualquer outra base de dados com um editor e exportar a seguir a tabela num ficheiro de texto configurado para deixar tabulaes entre cada campo. Isto possvel em Access, por exemplo, clicando com o boto direito sobre a tabela que queremos converter e escolhendo a opo exportar. Uma janela de dialogo aparecer na qual escolheremos guardar o ficheiro em tipo texto. O passo seguinte ser escolher um formato delimitado por tabulaes sem qualificador de texto. Outra possibilidade que pode ser muito prtica e que nos evita trabalhar continuamente com comandos do estilo aos do tempo da carochinha servir-se de programas em PHP ou Perl j existentes e que se podem obter na rede. O mais popular sem duvida o phpMyAdmin. Estes tipos de scripts so executados desde um navegador e podem, por tanto, albergados no nosso servidor ou empregues em local para, a partir deles, administrar MySQL de uma forma menos difcil.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
12
Do mesmo modo, dentro do directrio bin de MySQL, podemos encontrar uma pequena aplicao chamada MySqlManager. Trata-se de uma interfaz windows, mais agradvel a vista e ao uso do que a que obtemos executando o ficheiro mysql. Neste caso, as sentenas SQL devem realizar-se sem o ponto e vrgula final. Artigo por Miguel Angel Alvarez - Traduo de JML
se queres escrever uma linha ou mais. Vejamos um primeiro exemplo de script: <? $mensagem="Tenho fome!!"; //Comentrio de uma linha echo $mensagem; #Este comentario tambm de uma linha /*Neste caso o meu comentrio ocupa varias linhas, ests a ver? */ ?> Executar script Se usarmos dupla barra (//) ou o smbolo # podemos introduzir comentrios de uma linha. Mediante /* e */ criamos comentrios multilinha. Claro que, nada nos impede de usar os ltimos com uma s linha. No te preocupes se no compreendes o texto contido nas etiquetas, tudo chegar. Adiantamos que as variveis em PHP definem-se antepondo um smbolo de dlar ($) e que a instruo echo serve para sacar pelo ecr o que est escrito a continuao. Lembramos que todo o texto introduzido em forma de comentrio completamente ignorado pelo servidor. importante acostumar-se a deixar comentrios, com o tempo agradece-se. Artigo por Miguel Angel Alvarez - Traduo de JML
Variveis em PHP
No manual de pginas dinmicas introduzimos o conceito de varivel. No captulo anterior comentvamos que, para PHP, as variveis eram definidas antepondo o smbolo dlar ($) ao nome da varivel que estamos a definir. Dependendo do tipo de informao que contm, uma varivel pode ser considerada de um tipo ou de outro: Variveis numricas Armazenam cifras Inteiros $inteiro=2002; Real $real=3.14159 ; Nmeros sem decimais Nmeros com ou sem decimal
Variveis alfanumricas Armazenam textos compostos de nmeros e/ou cifras Cadeias Armazenam variveis alfanumricas $cadeia="Ol amigo";
Tabelas
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
14
Armazenam sries de informaes numricas e/ou alfanumricas A r r so as variveis que a guardam as tabelas y s $sentido[1]="ver";$sentido[2]="tocar"; $sentido[3]="ouvir";$sentido[4]="gosto"; $sentido[5]="cheirar";
Objectos Trata-se de conjuntos de variveis e funes associadas. Tem uma complexidade maior que as variveis vistas at agora, mas a sua utilidade mais do que interessante. A diferena com outras linguagens, PHP tem uma grande flexibilidade a hora de operar com variveis. De facto, quando definimos uma varivel dando-lhe um valor, o computador atribuilhe um tipo. Por exemplo, se definirmos uma varivel entre aspas, a varivel ser considerada de tipo cadeia (de caracteres):
$variavel="5"; //isto uma cadeia
Mesmo assim, se pedirmos ao nosso script para realizar uma operao matemtica com essa varivel, no obteremos uma mensagem de erro mas sim que a varivel cadeia ser assimilada como numrica:
<? $cadeia="5"; //isto uma cadeia $inteiro=3; //isto um inteiro echo $cadeia+$inteiro ?>
Executar script Este script dar como resultado "8". A varivel cadeia ser assimilada como inteiro (ainda que o seu tipo continua a ser de tipo cadeia) para poder realizar essa operao matemtica. Do mesmo modo, podemos operar com variveis de tipo inteiro e tipo real. No devemos preocupar-nos com nada, PHP encarrega-se durante a execuo de interpretar o tipo de varivel necessrio para o bom funcionamento do programa. Mesmo assim, em contraste, temos de ter cuidado para no mudar maisculas por minsculas, pois neste sentido, PHP sensvel. Convm pois trabalhar sempre em maisculas ou sempre em minsculas para evitar este tipo de mal-entendidos s vezes muito difceis de localizar. Variveis atribudas por referncia Em PHP tambm podemos atribuir variveis por referncia. Neste caso no se lhes atribui um valor, seno outra varivel, de modo que as duas variveis compartem o espao de memria para o mesmo dado. A notao para atribuir por referncia colocar um "&" antes do nome da varivel.
<?php $foo = 'Bob'; // Atribui o valor 'Bob' a $foo $bar = &$foo; // Referncia $foo via $bar.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
15
$bar = "O meu nome $bar"; // Modifica $bar... echo $foo; // $foo tambm se modifica. echo $bar; ?>
Isto dar como resultado a visualizao duas vezes do string "O meu nome Bob". Algo assim como: O meu nome Bob O meu nome Bob Artigo por Miguel Angel Alvarez - Traduo de JML
Foragem De todos modos, podemos forar uma varivel para que mude o tipo com a funo setType().
setType($variavel,"novo_tipo");
A funo setType() atualiza o tipo de $variavel a "novo_tipo" e retorna um boleano indicando se houve xito ou no com a converso. Entre "novo_tipo" temos: "integer" "double" "string" "array" "object"
Tambm podemos fazer com que uma varivel se comporte como um tipo determinado forando-a, da mesma maneira a como se faz na linguagem C.
$variavel = "23"; $variavel = (int) $variavel;
(int), (integer) - fora a inteiro (integer) (real), (double), (float) - fora a duplo (double) (string) - fora a cadeia (string) (array) - fora a array (array) (object) - fora a objeto (object)
$PHP_AUT Armazena a varivel password quando se efectua a entrada a pginas de H_PW acesso restringido. Combinado com $PHP_AUTH_USER ideal para controlar o
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 17
acesso s pginas internas do site. $REMOTE_ ADDR $DOCUMEN T_ROOT Mostra o endereo IP do visitante. Retorna-nos o path fsico no qual se encontra alojada a pgina no servidor.
$PHPSESSI Guarda o identificador da sesso do usurio. Veremos mais frente o que so D as sesses. Nem todas as variveis esto disponveis na totalidade dos servidores ou em determinadas verses dum mesmo servidor. Ademais, algumas delas tem de ser previamente activadas ou definidas por meio de algum evento. Assim, por exemplo, a varivel $HTTP_REFERER no est definida a menos que o cibernauta aceda ao script a partir de um link desde outra pgina. Variveis superglobais A partir de PHP 4.1.0, dispem-se de um conjunto de variveis de tipo array que mantm informao do sistema, chamadas superglobais porque se definem automaticamente num mbito global. Estas variveis fazem referncia s mesmas que se acediam antes por meio dos arrays do tipo $HTTP_*_VARS. Estas ainda existem, ainda que a partir de PHP 5.0.0 podem-se desactivar com a diretiva register_long_arrays. A lista destas variveis, extrada directamente da documentao de PHP a seguinte: $GLOBALS Contem uma referncia a cada varivel disponvel no espectro das variveis do script. As chaves desta matriz so os nomes das variveis globais. $GLOBALS existe desde PHP 3. $_SERVER Variveis definidas pelo servidor web ou directamente relacionadas com o entorno onde se est a executar.Anloga a antiga matriz $HTTP_SERVER_VARS (a qual ainda est disponvel, ainda que no se utilize). $_GET Variveis proporcionadas ao script por meio de HTTP GET. Anloga a antiga matriz $HTTP_GET_VARS (que ainda est disponvel, ainda que no se utilize). $_POST Variveis proporcionadas ao script por meio de HTTP POST. Anloga a antiga matriz $HTTP_POST_VARS (que ainda est disponvel, ainda que no se utilize). $_COOKIE Variveis proporcionadas ao script por meio de HTTP cookies. Anloga a antiga matriz $HTTP_COOKIE_VARS (que ainda est disponvel, ainda que no se utilize).
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
18
$_FILES Variveis proporcionadas ao script por meio da subida de ficheiros via HTTP. Anloga a antiga matriz $HTTP_POST_FILES (que ainda est disponvel, ainda que no se utilize). $_ENV Variveis proporcionadas ao script por meio do entorno. Anloga a antiga matriz $HTTP_ENV_VARS (que ainda est disponvel, ainda que no se utilize). $_REQUEST Variveis proporcionadas ao script por meio de qualquer mecanismo de entrada do usurio e portanto no se pode confiar nelas. A presena e a ordem em que aparecem as variveis nesta matriz so definidas pela directiva de configurao variables_order. Esta matriz no tem um anlogo em verses anteriores a PHP 4.1.0. Veja tambm import_request_variables(). $_SESSION Variveis registradas na sesso do script. Anloga a antiga matriz $HTTP_SESSION_VARS (que ainda est disponvel, ainda que no se utilize). Artigo por Miguel Angel Alvarez - Traduo de JML
Neste caso este array cataloga os seus elementos, normalmente chamados valores, por nmero. Os nmeros do 1 ao 5 so por conseguinte chaves e os sentidos so os valores associados. Nada nos impede de utilizar nomes (cadeias) para classific-los. A nica coisa que temos de fazer coloc-los entre aspas:
<? $moeda["espanha"]="Peseta"; $moeda["Portugal"]="Escudo"; $moeda["usa"]="Dolar"; ?>
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
19
Outra forma de definir identicamente este mesmo array e que nos pode ajudar na criao de arrays mais complexos a seguinte sentena.
<? $moeda=array("espanha"=> "Peseta","portugal" => "Escudo","usa" => "Dolar"); ?>
Uma forma muito prtica de armazenar dados mediante a criao de arrays multidimensionais (tabelas). Suponhamos o seguinte exemplo: Queremos armazenar dentro de uma mesma tabela o nome, moeda e lngua falada em cada pas. Para faz-lo podemos utilizar um array chamado pas que vir definido por estas trs caractersticas (chaves). Para cri-lo, deveramos escrever um expresso do mesmo tipo que a vista anteriormente na que meteremos um array dentro de outro. Este processo de incluir uma instruo dentro de outra chama-se aninhar e muito corrente em programao.
<? $pais=array ( "espanha" =>array ( "nome"=>"Espanha", "lingua"=>"Castelhano", "moeda"=>"Peseta" ), "portugal" =>array ( "nome"=>"Portugal", "lingua"=>"Portugues", "moeda"=>"Escudo" ) ); echo $pais["portugal"]["moeda"] //Saca pelo ecr: "Escudo" ?>
Executar script Antes de entrar em detalhe com este pequeno script, comentemos alguns pontos referentes a sintaxe. Como podemos observar, nesta sequncia de script no introduzimos ponto e vrgula ";" no fim de cada linha. Isto deve-se simplesmente a que o que escrevemos pode ser considerado como uma nica instruo. Na realidade, somos ns quem decidimos cort-la em varias linhas para facilitar a sua leitura. A verdadeira instruo acabaria uma vez definido completamente o array, e a precisamente onde colocamos o nico ponto e vrgula. Por outro lado, podes observar como usamos o tabulador para separar umas linhas mais que outras do princpio. Isto tambm se faz por questes de clareza, pois permite-nos ver que partes esto includas dentro de outras. importante acostumar-se a escrever desta forma assim como a introduzir comentrios pois a clareza dos scripts fundamental na hora de depura-los. Um pouco de esforo pode poupar-nos muitas horas na hora de corrigi-los ou modific-los meses mais tarde. Passando j ao comentrio de programa, como podes ver, este permite-nos armazenar tabelas e a partir de uma simples petio, visualizar um determinado valor pelo ecr. O interessante que a utilidade dos arrays no acaba aqui, podendo tambm utilizar toda uma srie de funes criadas para orden-los por ordem alfabtico directo ou inverso, por chaves, contar o nmero de elementos que compem o array para alm de poder movimentar-mo-nos nele para frente ou para trs.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
20
Muitas so as funes propostas por PHP para o tratamento de arrays, no vamos entrar aqui em detalhe das mesmas. Somente incluiremos esta pequena tabela que pode ser complementada, se necessrio, com a documentao que mencionamos. Funo array_values (meu_array) asort(meu_array) e arsort(meu_array) count(meu_array) ksort(meu_array) e krsort(meu_array) list ($variavel1, $variavel2...)=meu_array next(meu_array), prev(meu_array), reset(meu_array) y end(meu_array) each(meu_array) Descrio Lista os valores contidos em meu_array Ordena por ordem alfabtica directa ou inversa em funo dos valores D-nos o nmero de elementos do nosso array Ordena por ordem alfabtica directa ou inversa em funo das chaves Atribui cada varivel a cada um dos valores do array Permite-nos mover por dentro do array com um ponteiro para frente,para trs, ao principio e ao fim. D-nos o valor e a chave do elemento no qual nos encontramos e mexe o ponteiro ao elemento seguinte.
Tambm devemos relembrar a grande utilidade do loop foreach que recorre de forma sequencial o array do princpio ao fim. Artigo por Miguel Angel Alvarez - Traduo de JML
Modificar o nmero de elementos de um array Agora vamos ver vrios exemplos nos quais os nossos arrays podem aumentar ou reduzir o nmero de cdulas disponveis. Reduzir o tamanho de um array array_slice() Para diminuir o nmero de clulas de um array temos vrias funes. Entre elas, array_slice() que a utilizaremos quando quisermos recortar algumas clulas do array, sabendo que os ndices das cdulas que desejarmos conservar.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
21
Recebe trs parmetros. O array, o ndice do primeiro elemento e o nmero de elementos a tomar, sendo este ultimo parmetro opcional. No seguinte exemplo temos um array com quatro nomes prprios. Na primeira execuo de array_slice() estamos a indicar que desejamos tomar todos os elementos desde o ndice 0 (o principio) at um numero total de 3 elementos. O segundo array_slice() indica que se tomem todos os elementos a partir do ndice 1 (segunda cdula).
<? $entrada = array ("Miguel", "Carlos", "Joaquim", "Joao", "Paulo"); //modifico o tamanho $saida = array_slice ($entrada, 0, 3); //mostro o array foreach ($saida as $atual) echo $atual . "<br>"; echo "<p>"; //modifico outra vez $saida = array_slice ($saida, 1); //mostro o array foreach ($salida as $atual) echo $atual . "<br>"; ?>
Ter como sada: Miguel Carlos Joaquim Carlos Joaquim array_shift() Esta funo extrai o primeiro elemento do array e retorna-o. Alm disso, reduze a longitude do array eliminando o elemente que estava na primeira cdula. Sempre faz o mesmo, pelo tanto, no receber mais nada a no ser o array ao que se deseja eliminar a primeira posio. No cdigo seguinte tem-se o mesmo vetcor com nomes prprios e executa-se duas vezes a funo array_shift() eliminando um elemento em cada ocasio. Imprimem-se os valores que retorna a funo e os elementos do array resultante de eliminar a primeira cdula.
<? $entrada = array ("Miguel", "Carlos", "Joaquim", "Joao", "Paulo"); //elimino a primeira cedula $saida = array_shift ($entrada); //mostro o array echo "A funao retorna: " . $saida . "<br>"; foreach ($entrada as $atual) echo $atual . "<br>";
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
22
echo "<p>"; //elimino a primeira cdula, que agora seria a segunda do array original $saida = array_shift ($entrada); echo "A funao retorna: " . $salida . "<br>"; //muestro el array foreach ($entrada as $actual) echo $actual . "<br>"; ?>
D como resultado: A funo retorna: Miguel Carlos Joaquim Joao Paulo A funo retorna: Carlos Joaquim Joao Paulo unset() Utiliza-se para destruir uma varivel dada. No caso dos arrays, pode-se utilizar para eliminar uma cdula de um array associativo (os que no tem numricos mas sendo este uma cadeia de caracteres). Vejamos o seguinte cdigo para conhecer como definir um array associativo e depois eliminar uma das suas cdulas.
<? $estadios_futebol = array("Barcelona"=> "Nou Camp","Real Madrid" => "Santiago Bernabeu","Valencia" => "Mestalla","Real Sociedad" => "Anoeta"); //mostramos os estadios foreach ($estadios_futebol as $indice=>$atual) echo $indice . " -- " . $atual . "<br>"; echo "<p>"; //eliminamos o estadio associado ao real madrid unset ($estadios_futebol["Real Madrid"]); //mostramos os estadios outra vez foreach ($estadios_futebol as $indice=>$atual) echo $indice . " -- " . $atual . "<br>"; ?>
A sada ser a seguinte: Barcelona -- Nou Camp Real Madrid -- Santiago Bernabeu Valencia -- Mestalla Real Sociedad -- Anoeta
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
23
Barcelona -- Nou Camp Valencia -- Mestalla Real Sociedad -- Anoeta Aumentar o tamanho de um array Temos tambm a nossa disposio varias funes que nos podem ajudar a aumentar o nmero de cdulas de um array. array_push() Insere no fim do array uma srie de clulas que se indiquem por parmetro. Portanto, o nmero de clulas de um array aumentar em tantos elementos como se tenham indicado no parmetro da funo. Retorna o numero de clulas do array resultante. Vejamos este cdigo onde se cria um array e se acrescentam a seguir trs novos valores.
<? $tabela = array ("Lagartixa", "Aranha", "Cao", "Gato", "Rato"); //aumentamos o tamanho do array array_push($tabela, "Galinha", "Pombo", "Urso"); foreach ($tabela as $atual) echo $atual . "<br>"; ?>
D como resultado esta sada: Lagartixa Aranha Cao Gato Rato Galinha Pombo Urso array_merge() Agora vamos ver como unir dois arrays utilizando a funo array_merge(). Passando-lhe dois ou mais arrays por parmetro retorna um array com todos os campos dos vetores passados. Neste cdigo de exemplo criamos trs arrays e depois unimo-los com a funo array_merge()
<? $tabela = array ("Lagartixa", "Aranha", "Cao", "Gato", "Rato"); $tabela2 = array ("12","34","45","52","12"); $tabela3 = array ("Sauce","Pinheiro","Laranjeira","Toupeira","Cao","34"); //aumentamos o tamanho do array $resultado = array_merge($tabela, $tabela2, $tabela3); foreach ($resultado as $atual) echo $atual . "<br>"; ?>
Da como resultado:
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
24
Lagartixa Aranha Cao Gato Rato 12 34 45 52 12 Sauce Pinheiro Laranjeira Toupeira Cao 34 Por ltimo, dizer que tambm se podem introduzir novas cdulas num array pelos mtodos habituais de atribuir as novas posies do array s cdulas que necessitemos. Em arrays normais faria-se assim:
$tabela = array ("Sauce","Pinheiro","Laranjeira"); $tabela[3]="Pereira";
Em arrays associativos:
$estadios_futebol = array("Valencia" => "Mestalla","Real Sociedad" => "Anoeta"); $estadios_futebol["Barcelona"]= "Nou Camp";
Veremos mais frente outras possibilidades de trabalho com arrays. Artigo por Miguel Angel Alvarez - Traduo de JML
Cadeias
Uma das variveis mais frequentes as que teremos que fazer frente na maioria dos nossos scripts so as cadeias, que no so mais que informao de carcter no numrico (textos, por exemplo). Para atribuir a uma varivel um contedo deste tipo, escrevemo-lo entre aspas dando lugar a declaraes deste tipo:
$cadeia="Esta a informao da minha varivel"
Se queremos ver no ecr o valor de uma varivel ou uma mensagem qualquer usaremos o comando echo como j dissemos anteriormente:
echo $cadeia //sacaria "Esta a informao da minha varivel"
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
25
echo " Esta a informao da minha varivel " //daria o mesmo resultado
Executar script Tambm podemos introduzir variveis dentro da nossa cadeia o qual nos pode ajudar muito a desenvolver os nossos scripts. O que veremos no o nome, mas sim o valor da varivel.
<? $a=55; $mensagem="Tenho $a anos"; echo $mensagem //O resultado : "Tenho 55 anos" ?>
Executar script A pergunta que podemos fazer-nos agora ... Ento, como fao para que em vez do valor "55" me saia o texto "$a"? Noutras palavras, como se faz para que o smbolo $ no defina uma varivel mas sim que seja tomado tal qual. Esta pergunta interessante tal que em alguns scripts este smbolo deve ser utilizado por uma simples razo comercial (pago em dlares por exemplo) e se no o escrevermos tal qual, o computador vai pensar que o que vem detrs uma varivel quando no o . Pois bem, pra meter este e outros caracteres utilizados pela linguagem dentro de cadeias e no confundi-las, temos que escrever uma contrabarra a frente: Caracter \$ \" \\ \8/2 Efeito na cadeia Escreve dlar na cadeia Escreve aspas na cadeia Escreve contrabarra na cadeia Escreve 8/2 e no 4 na cadeia
Tambm existem outras utilidades de esta contrabarra que nos permitem introduzir no nosso documento HTML determinados eventos: Caracter \t \n \r Efeito na cadeia Introduz una tabulao no nosso texto Mudamos de linha Salto de linha
Estas mudanas de linha e tabulaes tm unicamente efeito no cdigo e no texto executado pelo navegador. Noutras palavras, se queremos que o nosso texto seja executado mude de linha temos de introduzir um echo " " e no echo"\n" pois este ultimo s muda de linha no ficheiro HTML criado ao enviar ao navegador quando a pgina seja executada no servidor. A diferena entre estes dois elementos
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 26
pode ser facilmente compreendida observando o cdigo fonte produzido ao executar o script:
<HTML> <HEAD> <TITLE>mudancalinha.php</TITLE> </HEAD> <BODY> <?echo "Ol, \n continuo na mesma linha executada mas no no cdigo fonte.<br>Agora mudo de linha executada mas continuo na mesma no cdigo fonte."?> </BODY> </HTML>
Executar script D uma vista de olhos ao cdigo fonte do navegador O cdigo fonte que observaramos seria o seguinte: <HTML> <HEAD> <TITLE>mudancalinha.php</TITLE> </HEAD> <BODY> Ol, continuo na mesma linha executada mas no no cdigo fonte.<br>Agora mudo de linha executada mas continuo na mesma no cdigo fonte. </ BODY> </HTML> As cadeias podem ser tratadas por meio de funes de todo tipo. Veremos estas funes mais frente com mais detalhe. S devemos reter que existem muitas possveis aces que podemos realizar sobre elas: Dividi-las em palavras, eliminar espaos que sobram, localizar sequncias, mudar caracteres especiais pelo seu correspondente em HTML ou inclusive sacar as etiquetas META de uma pgina web. Artigo por Miguel Angel Alvarez - Traduo de JML
Funes
No nosso manual de pginas dinmicas vimos o conceito de funo. Vimos que uma funo podia ser definida como um conjunto de instrues que exploram certas variveis para poder realizar uma tarefa mais ou menos elementar. PHP baseia a sua eficcia principalmente neste tipo de elemento. Uma grande livraria que cresce constantemente, medida que novas verses vo surgindo, complementada com as funes prprias dando como resultado um sem fim de recursos que so aplicados com uma simples chamada. As funes integradas em PHP so muito fceis de utilizar. S temos de realizar a chamada da forma apropriada e especificar os parmetros e/ou variveis necessrias para que a funo realize a sua tarefa.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
27
O que pode parecer ligeiramente mais complicado, mas que se torna sem lugar a duvidas muito pratico, criar as nossas prprias funes. De uma forma geral, poderamos criar as nossas funes para nos conectarmos a uma base de dados ou criar os cabealhos ou etiquetas META de um documento HTML. Para uma aplicao de comrcio eletrnico poderamos criar, por exemplo funes de mudana de uma moeda a outra ou de calculo de impostos a acrescentar ao preo de um artigo. Em definitiva, interessante criar funes para a maioria de aces mais ou menos sistemticas que realizamos nos nossos programas. Aqui daremos o exemplo da criao de uma funo que, chamada no comeo do script, nos cria o cabealho do nosso documento HTML e coloca o ttulo que queremos na pgina.
<? Function fazer_cabecalho($titulo) { $cabecalho="<html>\n<head>\n\t<title>$titulo</title>\n</head>\n"; echo $cabecalho; } ?>
Esta funo poderia ser chamada ao principio de todas as nossas pginas da seguinte forma:
$titulo="Minha web"; fazer_cabecalho($titulo);
Desta forma automatizamos o processo de criao do nosso documento. Poderamos por exemplo incluir na funo outras variveis que nos ajudassem a construir as etiquetas meta e desta forma, com um esforo mnimo, criaramos os cabealhos personalizados para cada uma das nossas pginas. Desta forma nos possvel criar fins de documento ou formatos diversos para os nossos textos como se fossem de folhas de estilo que teriam a vantagem de ser reconhecidas por todos os navegadores. Claro que, a funo h de ser definida dentro de um script pois no se encontra integrada em PHP, tendo que a criar ns mesmos. Na realidade isto no nos d nenhum problema pois pode ser includa a partir de um ficheiro no qual iremos armazenando as definies das funes que vamos criando ou compilando. Estes ficheiros nos que se guardam as funes chamam-se livrarias. A forma de inclui-los no nosso script a partir da instruo require ou include.
require("livraria.php") ou include("livraria.php")
Por outra parte teramos o nosso script principal pagina.php (por exemplo):
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
28
Executar script
Dar uma vista de olhos no cdigo fonte do navegador
Podemos meter todas as funes que formos encontrando dentro de um mesmo ficheiro mas torna-se muito mais vantajoso ir classificando-as em diferentes ficheiros por temtica: Funes de conexo a base de dados, funes comerciais, funes gerais, etc... Isto vai ajudar-nos a localiz-las antes para as corrigir ou modificar, permite-nos tambm carregar unicamente o tipo de funo que necessitamos para o script sem sem recarregar este em excesso para alm de nos permitir utilizar um determinado tipo de livraria para diferentes stios web. Tambm se pode tornar muito prtico utilizar uma nomenclatura sistemtica hora de nomelas: As funes comerciais poderiam ser chamadas com_qqcoisa, as bases de dados bd_qqcoisa, as de tratamento de ficheiros file_qqcoisa, Isto vai permitir reconhece-las rapidamente quando lermos o script sem ter de recorrer a nossa oxidada memria para descobrir a sua utilidade. No obstante, antes de nos lanarmos a criar a nossa prpria funo, vale a pena dar uma vista de olhos documentao para ver se a funo existe ou podemos se nos podemos aproveitar de alguma das existentes para facilitar o nosso trabalho. Assim, por exemplo, existe uma funo chamada header que cria um cabealho HTML configurvel que evita termos que a criar ns mesmos. Como pode ver-se, a tarefa do programador pode nalguns casos parecer-se de um coleccionador. H que ser paciente e metdico e no fim, a base de trabalho prprio, intercmbio e tempo podemos chegar at o nosso pequeno tesouro. Exemplo de funo Vejamos um exemplo de criao de funes em PHP. Trata-se de fazer uma funo que recebe um texto e o escreve na pgina com cada carcter separado por "-". dizer, se recebe "Ola" deve escrever "O-l-a" na pgina web.
Nota: Para compreender este exemplo necessitamos conhecer o loop for, que se explica no captulo Controlo do fluxo em PHP: Loops II.
A maneira de realizar esta funo ser recorrer o string, caracter a caracter, para imprimir cada um dos caracteres, seguido do signo "-". Recorremos o string com um loop for, desde o carcter 0 at ao nmero de caracteres total da cadeia. O nmero de caracteres recebe uma cadeia e obtm-se com a funo predefinida em PHP strlen(), que recebe o string entre parnteses e retorna o nmero dos caracteres que tem.
<html> <head> <title>funo 1</title> </head>
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
29
<body> <? function escreve_separa($cadeia){ for ($i=0;$i<strlen($cadeia);$i++){ echo $cadeia[$i]; if ($i<strlen($cadeia)-1) echo "-"; } } escreve_separa ("Ola"); echo "<p>"; escreve_separa ("Texto mais comprido, a ver o que faz"); ?> </body> </html>
A funo que acabmos de criar chama-se escreve_separa e recebe como parmetro a cadeia que h que escrever com o separador "-". O loop for serve-nos para recorrer a cadeia, desde o primeiro ao ultimo caracter. Depois, dentro do loop, imprime-se cada caracter separado pelo signo "-". O if que h dentro do loop for comprova se o atual no seja o ultimo carcter, porque neste caso no teramos que escrever o signo "-" (queremos conseguir "o-l-a" e se no estive-se o if obteramos "o-l-a-"). Neste cdigo fazem-se um par de chamadas funo para ver o resultado obtido com diferentes cadeias como parmetro. Podemos ver o script em funcionamento.. Artigo por Miguel Angel Alvarez - Traduo de JML
Assim definimos uma funo f1 que recebe dois parmetros. Como se pode observar, no temos de definir o tipo de dados de cada parmetro. Os parmetros tem validede durante a execuo da funo, isto , tem um mbito local funo de onde se recebem.Quando a funo termina, os parmetros deixam de existir. Os parmetros por valor A passagem de parmetros em PHP realiza-se por valor. "Por valor" uma maneira tpica de
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
30
passar parmetros em funes, quer dizer que a modificao de um parmetro no actualiza o dado da varivel como parmetro, apesar de mudarmos o valor do parmetro dentro da funo, a varivel original no se v afectada pela mudana. Veja melhor num exemplo:
function porvalor ($parametro1){ $parametro1="ol"; echo " " . $parametro1; //imprime "ol" } $minhavariavel = "isto no muda"; porvalor ($minhavariavel); echo "<br>" . $minhavariavel; //imprime "isto no muda"
Esta pgina ter como resultado: ol isto no muda Passagem de parmetros por referncia Em contraposio passagem de parmetros por valor, est a passagem de parmetros por referncia. Neste ltimo caso, a mudana do valor de um parmetro dentro de uma funo afecta o valor da varivel original. Podemos passar os parmetros por referncia se, na declarao da funo, colocarmos um "&" antes do parmetro.
<? function porreferencia(&$cadeia) { $cadeia = 'Sim muda'; } $str = 'Isto uma cadeia'; porreferencia ($str); echo $str; // Imprime 'Sim muda' ?>
Este script mostrar pelo ecr 'Sim muda'. Parmetros pr-definidos Podemos definir valores pr-definidos para os parmetros. Os valores pr-definidos servem para que os parmetros contenham algum dado pr-definido, que ser o valor da varivel se no se lhes passa nenhum valor na chamada da funo. Os valores por defeito definem-se atribuindo um dado ao parmetro quando se declara na funo.
function predefinido ($parametro1="Z";$parametro2=3)
Para a definio de funo anterior, $parametro1 tem como valor pr-definido "Z", assim como $parametro2 tem 3 como valor pr-definido. Se chamarmos funo sem indicar valores aos parmetros, estes tornar-se-o valores atribudos.
predefinido () // $parametro1 igual a "Z" e $parametro2 igual a 3
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
31
Se chamarmos a funo indicamos um valor, este ser tido em conta para o primeiro parmetro.
predefinido ("ol") // $parametro1 igual a "ol" e $parametro2 igual a 3
Ateno, estamos obrigados a declarar todos os parmetros com valores por defeito no fim. Artigo por Miguel Angel Alvarez - Traduo de JML
Se os conceitos se perceberam bem, este exemplo no pode resultar difcil. A funo recebe um parmetro chamado $percentagem com 16 como valor pr-definido. Retorna a percentagem dada aplicando a base tambm passada por parmetro. Deste modo, na primeira execuo da funo, como no se indica a percentagem, mostrar-se o 19% de 1000. Na segunda, mostra-se o 7% de 1000 e na terceira o 0% de 10. Retornar mltiplos valores
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
32
Uma funo retorna um nico valor. Se queremos fazer que se possam retornar vrios valores diferentes temos que recorrer a um truque que consiste em retornar um array.
function small_numbers() { return array (0, 1, 2); } list ($zero, $one, $two) = small_numbers();
list() usa-se para atribuir uma lista de variveis numa s operao. Depois de essa operao, $zero ter como valor 0, $one ter como valor 1 e $two ter como valor 2. Artigo por Miguel Angel Alvarez - Traduo de JML
Chegados a este ponto, o programa verificar o cumprimento ou no da condio. Se a condio certa as instrues 1 e 2 sero executadas. Do contrario (else), as instrues A y B sero levadas a cabo.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 33
Esta estrutura de base pode complicar-se um pouco mais se tivermos em conta que nem tudo necessariamente preto no brano e que existem muita possibilidades. por isso que outras condies se podem questionar dentro de uma condio principal. Falamos pois de condies aninhadas que teriam uma estrutura do seguinte tipo:
if (condio1) { Instruo 1; Instruo 2; ... } else { if (condio2) { Instruo A; Instruo B; ... } else { Instruo X ... } }
Deste modo, poderamos introduzir o nmero de condies que quisermos dentro de uma condio principal. de grande ajuda a instruo elseif que nos permite numa s linha introduzir uma condio adicional. Este tipo de instruo simplifica ligeiramente a sintaxe que acabmos de ver.
if (condio1) { Instruo 1; Instruo 2; ... } elseif (condio2) { Instruo A; Instruo B; ... } else { Instruo X ... }
O uso desta ferramenta claro com um pouco de prtica. Utilizemos um exemplo simples de utilizao de condies. O seguinte programa permitiria detectar a lngua empregue pelo navegador e visualizar uma mensagem nessa lngua.
<HTML> <HEAD> <TITLE>Detector de Lingua</TITLE> </HEAD> <BODY> <?
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
34
//Antes de nada introduzimos mensagens em forma de variveis $portugues="Ola"; $ingles="Hello"; $frances="Bonjour"; //Agora lemos do navegador qual a sua lngua oficial $idioma=substr($HTTP_ACCEPT_LANGUAGE,0,2); //Formulamos as possibilidades que se podem dar if ($idioma == "pt") {echo "$portugues";} elseif ($idioma=="fr") {echo "$frances";} else {echo "$ingles";} ?> </BODY> </HTML>
Executar script Para poder ver o funcionamento deste script necessrio mudar o idioma preferido o qual pode ser realizado a partir do menu de opes do navegador. Para ler a lngua aceite pelo navegador o que fazemos definir uma varivel ($idioma) e, mediante a funo subst, recolhemos as duas primeiras letras do cdigo correspondente ao idioma aceitado pelo navegador ($HTTP_ACCEPT_LANGUAGE). A terceira parte do script encarrega-se de ver se o navegador est em portugus (pt), francs (fr) ou em qualquer outro idioma que no seja nenhum destes dois e de imprimir a mensagem que proceda em cada caso. Temos de destacar que, quando se trata de comparar variveis, pomos um duplo igual "==" em lugar de um simples "=". Este ltimo fica reservado exclusivamente para atribuir valores s variveis. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
35
Um exemplo simples este loop que aumenta o tamanho da fonte numa unidade em cada passagem:
<? $size=1; While ($size<=6) { echo"<font size=$size>Tamanho $size</font><br>\n"; $size++; } ?>
Executar script Como explicao, diremos que, antes de mais, temos de definir o valor da varivel que vamos avaliar na condio. Algo absolutamente bvio mas fcil de esquecer. Neste caso atribumoslhe o valor 1 que corresponde a letra mais pequena. O passo seguinte criar o loop no qual impomos a condio que a varivel no exceda o valor 6. A instruo a executar ser imprimir no nosso documento um cdigo HTML em que a etiqueta font e a mensagem que contm variam medida que $size muda o seu valor. Seguidamente, devemos incrementar numa unidade o valor de $size. Isto pode-se fazer com uma expresso como a mostrada no loop ($size++) que na realidade sinnimo de:
$size=$size+1
Veremos outras abreviaes mais a frente. Outro exemplo do loop While O loop while costuma utilizar-se quando no se sabe exactamente quantas iteraes se devem realizar antes de acabar. Utilizamo-lo num outro exemplo, no qual temos de recorrer uma cadeia at encontrar um carcter dado. Se o encontra, escrever a sua posio. Se no, escrever que no se encontrou.
Nota: Para fazer este exerccio necessitamos de conhecer a funo de cadeia strlen(), que obtm a longitude da cadeia que se passa por parmetro. int strlen (string cad) Retorna um inteiro igual ao tamanho da cadeia. <? $cadeia = "Ola a todo o mundo"; //recorro a cadeia at encontrar uma "m" $i=0; while ($cadeia[$i]!="m" && $i< strlen($cadeia)) { $i++; }
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
36
if ($i==strlen($cadeia)) echo "No se encontra..."; else echo "Est na posio $i"; ?>
Neste exemplo define-se uma cadeia com o valor "Ola a todos". Posteriormente recorre-se essa cadeia at finalizar ou at encontrar o carcter "m", utilizando uma varivel $i que assentando o numero de caracteres recorridos. No fim do loop while, se samos do loop porque se encontrou o carcter "m", a varivel $i ter como valor um nmero menor que o tamanho da cadeia. Se saiu do loop por chegar ao fim da cadeia, a varivel $i ter um valor igual ao do tamanho da cadeia, e por tanto, obtemos que no se achou o carcter passado por parmetro. Podemos ver o exemplo em funcionamento. Loop do/while Este tipo de loop no difere em excesso do anterior. A sintaxe a seguinte:
do { instruo1; instruo2; ... } while (condio)
A diferena em relao aos loops while que este tipo de loop avalia a condio no final, o que quer dizer que, inclusive sendo falsa a condio desde um principio, este executa-se pelo menos uma vez. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
37
Executar script As expresses dentro do parntese definem respectivamente: Inicializao da varivel. Valida para o primeiro recorrido do loop. Condio de avaliao em cada recorrido. Se for certa, o loop continua. A realizar no final de cada recorrido do loop.
Loop foreach Este loop, implementado nas verses 4 de PHP, ajuda-nos a recorrer os valores de um array o que pode ser muito til para, por exemplo, efectuar uma leitura rpida do mesmo. Recordamos que um array s uma varivel que guarda um conjunto de elementos (valores) catalogados por chaves. A estrutura geral a seguinte:
Foreach ($array as $chave=>$valor) { instruo1; instruo2; ... }
Executar script Este script encarrega-se de nos mostrar pelo ecr o contedo do array $moeda. No seria m ideia criar uma funo prpria baseada neste loop que nos permitisse visualizar arrays unidimensionais e armazen-la na nossa livraria. Esta funo poderia ser definida desta forma:
Function mostrar_array ($array) { Foreach ($array as $chave=>$valor) { echo "$chave=>$valor<br>"; } }
Break e Continue Estas duas instrues introduzem-se dentro da estrutura e servem-nos respectivamente para sair do loop e para saltar a seguinte iterao. Podem ser muito teis nalgumas situaes. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
38
Operadores
As variveis, como base da informao de uma linguagem, podem ser criadas, modificadas e comparadas com outras por meio dos chamados operadores. Nos captulos anteriores utilizmos nos nossos exemplos alguns deles. Neste captulo pretendemos dar a conhecer os mais importantes para os usar em futuros exemplos. Operadores aritmticos Permitem-nos realizar operaes numricas com as nossas variveis. + * / Soma Subtraco Multiplicao Diviso
Operadores de comparao Utilizam-se principalmente, nas nossas condies, para comparar duas variveis e verificar se cumprem ou no a propriedade do operador. = = != < Igualdade Desigualdade Menor que
< Menor igual que = > Maior que > Maior igual que = Operadores lgicos Usam-se em combinao com os operadores de comparao quando a expresso da condio assim o requer. And Or ! Operadores de incremento Servem para aumentar ou diminuir numa unidade o valor de uma varivel E Ou No
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
39
Uma forma habitual de modificar o valor das variveis atravs dos operadores combinados: $variavel += 10 $variavel -= 10 $variavel .= "acrescento" Soma 10 $variavel Subtrai 10 $variavel Concatena as cadeias $variavel e "acrescento"
Este tipo de expresses no so mais do que abreviaes de outras formas mais clssicas: $variavel += 10 o mesmo que: $variavel = $variavel +10 Artigo por Miguel Angel Alvarez - Traduo de JML
Podem observar que estas variveis no possuem o smbolo $ frente. Isto por que, na realidade, este modo de passar variveis no especfico de PHP, sendo utilizado por outras linguagens. Agora a nossa varivel pertence tambm ao entorno da pgina destino.php e est pronta para a sua utilizao.
Nota: Nem sempre se definem automaticamente as variveis recebidas por parmetro nas pginas web,
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
40
depende de una varivel de configurao de PHP: register_globals, que tem de estar activada para que assim seja. Ver comentrios do artigo ao final da pgina para mais informao.
Para resolver possveis dvidas, vejamos isto em forma de exemplo. Teremos, pois duas pginas, origem.html (no necessrio dar-lhe extenso PHP pois no h nenhum tipo de cdigo) e destino.php:
<HTML> <HEAD> <TITLE>origem.html</TITLE> </HEAD> <BODY> <a href="destino.php?comprimento=ola&texto=Isto uma varivel de texto">Passo variveis comprimento e texto pgina destino.php</a> </BODY> </HTML> <HTML> <HEAD> <TITLE>destino.php</TITLE> </HEAD> <BODY> <? echo "Varivel \$comprimento: $comprimento <br>\n"; echo "Varivel \$texto: $texto <br>\n" ?> </BODY> </HTML>
Executar exemplo $_GET Relembramos que possvel compilar numa s varivel tipo array o conjunto de variveis que foram enviadas ao script por este mtodo a partir da varivel de sistema $_GET, que um array associativo. Utilizando-o ficaria assim:
<? echo "Varivel \$comprimento: $_GET_["comprimento"] <br>\n"; echo "Varivel \$texto: $_GET["texto"] <br>\n" ?> Nota: Ainda que possamos recolher variveis com este array associativo ou utilizar directamente as variveis que se definem na nossa pgina, mais seguro utilizar $_GET por duas razes, a primeira que assim temos a certeza que essa varivel vem realmente da URL e a segunda, que assim o nosso cdigo ser mais claro quando o quisermos ler, porque ficar especificado que estamos a receber essa varivel pela URL.
primeira pgina com o formulrio clssico para preencher e as variveis so recolhidas numa segunda pgina que as processa:
Nota: Nem sempre se definem automaticamente as variveis recebidas por parmetro nas pginas web, depende de uma varivel de configurao de PHP: register_globals, que tem de estar activada para que assim seja. Ver comentrios do artigo ao final da pgina para mais informao. <HTML> <HEAD> <TITLE>formulario.html</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="destino2.php"> Nome<br> <INPUT TYPE="TEXT" NAME="nome"><br> Apelidos<br> <INPUT TYPE="TEXT" NAME="apelidos"><br> <INPUT TYPE="SUBMIT"> </FORM> </BODY> </HTML> <HTML> <HEAD> <TITLE>destino2.php</TITLE> </HEAD> <BODY> <? echo "Varivel \$nome: $nome <br>\n"; echo "Varivel \$apelidos: $apelidos <br>\n" ?> </BODY> </HTML>
Executar exemplo $_POST Relembramos que possvel compilar numa s varivel tipo array o conjunto de variveis que foram enviadas ao script por este mtodo a partir da varivel de sistema $_POST:
echo "Varivel \$nome: " . $_POST["nome"] . "<br>\n"; Nota: Ainda que possamos recolher variveis com este array associativo ou utilizar diretamente as variveis que se definem na nossa pgina, torna-se mais seguro utilizar $_POST por duas razes, a primeira que assim temos a certeza que essa varivel vem realmente de um formulrio e a segunda, que assim o nosso cdigo ser menos confuso quando queiramos l-lo, porque ficar especificado que estamos a receber essa varivel atravs de um formulrio.
Exemplo de restrio de acesso por idade Para continuar com exemplos de uso de formulrios vamos realizar uma pgina que mostra e solicita a idade do visitante e, dependendo da sua idade, permite ou no visualizar o contedo da web. A maiores de 18 anos -lhes permitido ver a pgina e a menores no. O exemplo muito simples e no seria correcto para utiliz-lo tal e qual a modo de uma verdadeira barreira de acesso. S nos serve para saber como obter dados de um formulrio e como trat-los para realizar uma ou outra aco, dependendo do seu valor. A pgina do formulrio, qual demos o nome idade.php, teria o seguinte aspecto:
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 42
<html> <head> <title>Restringir por idade</title> </head> <body> <form action="idade2.php" method="post"> Escreve a tua idade: <input type="text" name="idade" size="2"> <input type="submit" value="Entrar"> </form> </body> </html>
Esta uma pgina sem nenhum cdigo PHP, simplesmente tem um formulrio. Se repararmos no action do formulrio, que est dirigido a uma pgina chamada idade2.php, que a que receber o valor da idade e mostrar um contedo ou outro dependendo desse valor. O seu cdigo seria o seguinte:
<html> <head> <title>Restringir por idade</title> </head> <body> <? $idade = $_POST["idade"]; echo "Tua idade: $idade<p>"; if ($idade < 18) { echo "No podes entrar"; }else{ echo "Bemvindo"; } ?> </body> </html>
Esperamos que este outro cdigo tambm no seja estranho. Simplesmente o formulrio recebe a idade, utilizando o array $_POST. A seguir, mostra-se a idade e executa-se uma expresso condicional em funo de que a idade seja menor que 18. Em caso positivo (idade menor que 18), mostra-se uma mensagem que informa que no se pode aceder pgina. Em caso negativo (maior ou igual a 18) mostra-se uma mensagem de Boas-vindas. Podemos ver o exemplo em funcionamento. Artigo por Miguel Angel Alvarez - Traduo de JML
Autochamada de pginas
Ao incluir um formulrio numa pgina deve-se indicar, atravs do atributo action, o nome do
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
43
ficheiro PHP ao que enviaremos os dados escritos no formulrio. Desta maneira, para um esquema de envio de dados por formulrio, podem participar duas pginas: uma que contm o formulrio e outra que recebe os dados de dito formulrio. O mesmo acontece quando enviamos variveis pela URL. Temos uma pgina que conter o link e outra pgina que receber e tratar esses dados para mostrar uns resultados. Neste artigo vamos ver como se pode enviar e receber dados de um formulrio com uma nica pgina. Tambm veremos como na mesma pgina podemos ter links com passagem de variveis pela URL e podemos recolher e tratar esses dados com a mesma pgina. A este efeito podemos chamar-lhe "autochamada de pginas", mas tambm normal dar-lhe o nome de "formulrios reentrantes" ou trminos similares. muito interessante conhecer o modo de funcionamento destes scripts, porque sero muito habituais nas nossas pginas PHP e ajudam muito a ter os cdigos ordenados. Em ambos casos, para formulrios o envio de dados pela URL, deve-se seguir um esquema como este: Comprovar se recebo dados pela URL ou pelo formulrio Se no recebo dados Mostro o formulrio e os links que pasma as variveis Se recebo dados Tenho de processar o formulrio ou as variveis da URL
No exemplo, o primeiro passo conhecer se se esto a receber ou no os dados atravs de um formulrio. Pra isso comprova-se com um enunciado if se existe ou no uma varivel $_POST.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 44
Em concreto if (!$_POST) quer dizer algo assim como "Se no existem dados provenientes de um formulrio". No caso de que no existam, mostro o formulrio. Em caso de que efetivamente existam, recolho os dados e imprimo-os na pgina. Pode-se ver o exemplo em funcionamento noutra pgina. Para passagem de variveis pela URL A idia a mesma. Verificar com um enunciado if se os dados so recebidos desde uma URL. Vejamos o cdigo a continuao. Trata-se de uma pgina que mostra uma serie de links para ver as tabuadas do 1 ao 10. Cada um dos links mostra uma tabuada. Pressionando o primeiro link podemos ver a tabuada do 1, no segundo a tabuada do 2, etc. Recordemos que a pgina chama-se a si mesma. Para compreende-la mais facilmente interessante ve-la em funcionamento.
<html> <head> <title>Tabuadas</title> </head> <body> <? if (!$_GET){ for ($i=1;$i<=10;$i++){ echo "<br><a href='ver_tabuada.php?tabuada=$i'>Ver a tabuada do $i</a>\n"; } } else { $tabuada=$_GET["tabuada"]; ?> <table align=center border=1 cellpadding="1"> <? for ($i=0;$i<=10;$i++){ echo "<tr><td>$tabuada X $i</td><td>=</td><td>" . $tabuada * $i . "</td></tr>\n"; } ?> </table> <? } ?> </body> </html>
Este cdigo um pouco mais complicado, porque faz bastantes mais coisas que o anterior, mas para o assunto que nos preocupa que a autochamada de pginas, tudo continua igual de simples. Temos de reparar que o if verifica se recebemos dados pela URL: if ($_GET), que quer dizer algo como "Se no se recebem variveis pela URL". Em caso positivo (no se recebem dados pela URL) mostram-se os links para ver cada uma das tabuadas e em caso de receber dados, mostra-se a tabuada do nmero que se est a receber na URL. Para mostrar os links e as tabuadas utilizam-se loops for, que esperamos que no resultem
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
45
desconhecidos para o leitor. Pode ficar-se a conhecer mais sobre loops for em Controlo de fluxo em PHP: Loops II. Artigo por Miguel Angel Alvarez - Traduo de JML
Utilizao de cookies
Sem dvida este trmino resulta familiar para muitos. Alguns tero lido ou ouvido falar mas no sabem de que se trata. Outros, sabero que as cookies so "umas informaes" armazenadas por um sitio web no disco rgido do usurio. Esta informao armazenada num ficheiro tipo texto que se guarda quando o navegador acede ao sitio web. possvel, evidentemente, ver estes ficheiros. Para abri-los h que ir ao diretrio C:\Windows\Cookies para os usurios de IE 4+ ou a C:\...\Netscape\User\defaultuser para os usurios de Netscape. Como podem comprovar, na maioria dos casos a informao que se pode obter indecifrvel. A utilidade principal das cookies permitir ao navegador, quando o cliente visita por segunda vez um sitio web, em funo do perfil que o cliente deu na sua primeira visita, poder adaptarse dinamicamente s suas preferncias (lngua utilizada, cores do ecr, formulrios preenchidos total ou parcialmente...) Para criar um ficheiro cookie, modificar ou gerar uma nova cookie faze-lo-emos a partir da funo SetCookie:
setcookie("nome_da_cookie",valor,expirao);
Ponhamos um exemplo simples. Imaginemos que queremos introduzir numa varivel cookie o nome do visitante. O nome pode ter sido recolhido previamente por um formulrio tal e como vimos:
setcookie("pessoa",$nome,time()+86400*365);
Deste modo, criamos uma cookie chamada pessoa que tem como valor o contedo da varivel $nome e ter uma durao de 1 ano a partir da sua criao (o tempo time() atual em segundos somado a um ano em segundos) importante que a criao da cookie seja prvia a apertura do documento HTML. Noutras palavras, as chamadas funo setcookie() devem ser colocadas antes da primeira etiqueta HTML Por outro lado, interessante apontar que o feito de definir uma cookie j existente implica que a antiga seja apagada. Do mesmo modo, ao criar uma primeira cookie leva consigo a gerao automtica do ficheiro texto. Para utilizar o valor da cookie nos nossos scripts s teremos de chamar a varivel que define a cookie. Realmente simples! H que ter cuidado em no definir variveis no nosso script com o mesmo nome que as cookies pois PHP dar privilegio ao contedo da varivel local em relao a cookie e no
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 46
mostrar mensagem de erro. Isto pode conduzir-nos a erros realmente complicados de detectar. Lembramos que possvel compilar numa varivel de tipo array o conjunto de cookies armazenadas no disco rgido do cibernauta mediante a varivel de servidor $HTTP_COOKIE_VARS As cookies so uma ferramenta fantstica para personalizar a nossa pgina mas temos de ter cuidado pois no todos os navegadores permitem a utilizao de cookies e podemos deliberadamente no querer a criao de cookies. Vemos que as cookies so um complemento e no uma fonte de variveis infalvel para o nosso site. Artigo por Miguel Angel Alvarez - Traduo de JML
Sesses I
Nos programas que vimos at agora, utilizmos variveis que s existiam no ficheiro que era executado. Quando carregvamos outra pgina diferente, os valores destas variveis perdiamse a no ser que nos incomodssemos em passa-los pela URL ou inscrev-los nos cookies ou num formulrio para a sua posterior utilizao. Estes mtodos, ainda que teis, no so de todo prticos pois em determinadas situaes nas que a varivel que queremos conservar tem de ser utilizada em vrios scripts diferentes e distantes entre si. Poderamos pensar que esse problema pode ficar resolvido com as cookies pois so variveis que podem ser invocadas em qualquer momento. O problema, como j dissemos, que os cookies no so aceitos nem pela totalidade dos usurios nem pela totalidade dos navegadores o que implica que uma aplicao que se servisse das cookies para passar variveis de um ficheiro a outro no seria 100% infalvel. importante s vezes pensar "na imensa minoria", sobretudo em aplicaes de comrcio eletrnico onde devemos captar a maior quantidade de possveis clientes e portanto, os nossos scripts devem estar preparados para qualquer eventual deficincia do navegador do cliente. Visto isto, tona-se necessrio poder declarar certas variveis que possam ser reutilizadas tantas vezes como queiramos dentro da mesma sesso. Imaginemos um site multilingue em que cada vez que queremos imprimir uma mensagem em qualquer pgina necessitamos de saber em que idioma se deve fazer. Poderamos introduzir um script identificador da lngua do navegador em cada um dos ficheiros ou bem declarar uma varivel que fosse vlida para toda a sesso e que tivesse como valor o idioma reconhecido no primeiro momento. Pensemos tambm num carrinho de compras de uma loja virtual onde o cliente vai navegando pelas pginas do site e acrescenta os artigos que querem comprar ao carrinho. Este carrinho poderia ser perfeitamente uma varivel de tipo array (tabela) que armazena para cada referncia a quantidade de artigos contidos no carrinho. Esta varivel deveria ser obviamente conservada ao longo de todos os scripts. Este tipo de situaes so resolvidas a partir de variveis de sesso. Uma sesso considerada como o intervalo de tempo empregue pelo usurio em recorrer as nossas pginas at que abandona o nosso site ou deixa de trabalhar sobre ele durante um tempo prolongado e obviamente tambm, se simplesmente, fecha o navegador.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
47
PHP permite-nos armazenar variveis chamadas de sesso que, uma vez definidas, podem ser utilizadas durante este lapso de tempo por qualquer um dos scripts do nosso site. Estas variveis sero especficas do usurio de modo que podem coexistir diversas variveis de sesso do mesmo tipo com diferentes valores para cada uma das sesses que esto a ter lugar simultaneamente. Estas sesses tm o seu prprio identificador de sesso que ser nico e especfico. Alguns melhoramentos referentes utilizao de sesses foram introduzidos com PHP4. Nesta nova verso a que faremos referncia na hora de explicar as funes disponveis e a forma de operar. Para os programadores de PHP3 a maior diferena que esto obrigados a gerir eles mesmos as sesses e definir os seus prprios identificadores de sesso. Vejamos no seguinte captulo a forma de plasmar esta necessidade tcnica nos nossos scripts a partir das funes que gerem as sesses em PHP. Artigo por Miguel Angel Alvarez - Traduo de JML
Sesses II
Tnhamos dito no captulo anterior que as vaiveis de sesso se diferenciam das variveis clssicas em que estas residem no servidor, so especificas de um s usurio definido por um identificador e que podem ser utilizadas na globalidade das nossas pginas. Para iniciar uma sesso podemos faz-lo de duas maneira diferentes: Declaramos abertamente a abertura de sesso atravs da funo session_start(). Esta funo cria uma nova sesso para um novo visitante ou recupera a que se estava a utilizar. Declaramos uma varivel de sesso por meio da funo session_register('variavel'). Estas funo, para alem de recuperar a sesso para a pgina em que se inclui tambm serve para introduzir uma nova varivel de tipo sesso.
As sesses devem ser iniciadas ao principio do nosso script. Antes de abrir qualquer etiqueta ou de imprimir seja o que for. Em caso contrario obteremos um erro. Visto isto, vamos propor um exemplo clssico de utilizao de uma sesso: um contador. Este contador dever aumentar numa unidade cada vez que reabrimos a pgina ou apertamos o link.
<? session_register('contador'); ?> <HTML> <HEAD> <TITLE>contador.php</TITLE> </HEAD> <BODY> <? If (isset($contador)==0) { $contador=0; } ++$contador; echo "<a href="contador.php">Abriste esta pgina $contador vezes</a>"; Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 48
Executar Script A condio if tem em conta a possibilidade de que a varivel $contador no tenha sido ainda iniciada. A funo isset encarrega-se de lhe dar o valor 0 quando uma varivel ainda no foi iniciada. Outras funes teis para a gesto de sesses so: Funo Session_id() Session_destroy() Descrio Retorna-nos o identificador da sesso D por abandonada a sesso eliminando variveis e identificador.
Session_unregister('variave Abandona uma varivel de sesso l') Se ests procura de mais funes ou de informao adicional sobre sesses, consulta o manual oficial de PHP. Artigo por Miguel Angel Alvarez - Traduo de JML
No caso de utilizar qualquer outra base compatvel, as correces que temos de fazer em relao aos nossos exemplos no so excessivamente grandes e a leitura de esses captulos continua a ser de grande utilidade. Uma vez instalado MySQL e antes de poder comear com os nossos exemplos, ser necessrio realizar as seguintes operaes: - Introduzidos dentro de MySQL, criaremos a base de dados exemplo com a seguinte sentena:
create database exemplo;
Agora j temos nossa disposio a nossa tabela vazia. S resta comear a preenche-la com dados que iremos introduzindo. Artigo por Miguel Angel Alvarez - Traduo de JML
Uma vez na pgina destino do formulrio (inserir.php), o primeiro que teremos de fazer
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
50
estabelecer um vnculo entre o programa e a base de dados. Esta ligao faz-se atravs da funo mysql_connect. A seguir, devemos gerar uma ordem de insero do registo na linguagem SQL. Esta ordem ser executada por meio da funo mysql_db_query. Nesta funo especificaremos a base de dados sobre a que queremos trabalhar e a continuao incluiremos a sentena SQL:
<HTML> <HEAD> <TITLE>Inserir.php</TITLE> </HEAD> <BODY> <? //Ligao base mysql_connect("localhost","user","password"); //Execuo da sentena SQL mysql_db_query("exemplo","insert into clientes (nome,telefone) values ('$nome','$telefone')"); ?> <h1><div align="center">Registo Inserido</div></h1> <div align="center"><a href="leitura.php">Visualizar o contedo da base</a></div> </BODY> </HTML>
Executar exemplo Os parmetros user e password so definidos para o criador da base. conveniente ao princpio, ao criar as nossas bases, trabalhar sem eles com o qual deixaremos esses campos vazios: "". Para alm da prpria insero, o programa avisa da introduo do registo e oferece um link a uma pgina de leitura a qual ser comentada a continuao. Artigo por Miguel Angel Alvarez - Traduo de JML
<tr> <th>Nome</th> <th>Telefone</th> </tr> <? //Mostramos os registos while ($row=mysql_fetch_array($result)) { echo '<tr><td>'.$row["nome"].'</td>'; echo '<td>'.$row["telefone"].'</td></tr>'; } mysql_free_result($result) ?> </table><div align="center"> <a href="inserir.html">Acrescentar um novo registo</a><br> <a href="actualizar1.php">Actualizar um registro existente</a><br> <a href="apagar1.php">Apagar um registro</a><br> </div> </BODY> </HTML>
Executar script Os passos a realizar so, em princpio, os vistos para a insero de um registo: Conexo base de dados e execuo da sentena. Esta vez, a informao da execuo ser armazenada numa varivel ($result). O que fazemos a seguir visualizar no ecr a informao recolhida em $result. Faremos isto mediante a funo mysql_fetch_array que retorna uma varivel array com os contedos de um registo ao mesmo tempo que se posiciona sobre o seguinte. O loop while permite-nos ler e imprimir sequencialmente cada um dos registos. A funo mysql_free_results encarrega-se de liberar a memria utilizada para executar a consulta. Ainda que no seja necessria a sua utilizao, altamente aconselhvel. Artigo por Miguel Angel Alvarez - Traduo de JML
Actualizao de um registo
Para mostrar como se actualiza um registo presente na nossa base de dados, vamos faz-lo a partir de um caso um pouco mais complexo para que comecemos a familiarizar-nos com estas operaes. Realizaremos um par de scripts que permitam mudar o nmero de telefone das diferentes pessoas presentes na nossa base. O nome destas pessoas, assim como o novo nmero de telefone, sero recolhidos atravs de um formulrio. Este ficheiro do formulrio vai ser de esta vez um script PHP no que efectuaremos uma chamada nossa base de dados para construir um menu dinmico onde apaream todos os nomes. Ficaria assim:
<HTML> <HEAD> <TITLE>Actualizar1.php</TITLE> </HEAD> <BODY> <div align="center">
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
52
<h1>Actualizar um registo</h1><br> <? //Conexo base mysql_connect("localhost","user","password"); echo '<FORM METHOD="POST" ACTION="actualizar2.php">Nombre<br>'; //Criamos a sentena SQL e executamo-la $sSQL="Select nome From clientes Order By nome"; $result=mysql_db_query("exemplo",$sSQL); echo '<select name="nome">'; //Geramos o menu dinmico while ($row=mysql_fetch_array($result)) { echo '<option>'.$row["nome"]; } ?> </select><br>Telefone<br><INPUT TYPE="TEXT" NAME="telefone"> <br> <INPUT TYPE="SUBMIT" value="Actualizar!"> </FORM> </div> </BODY> </HTML>
A maneira de trabalhar para construir o menu dinmico a mesma que para visualizar a tabela. Novamente empregamos um loop while em combinao com a funo mysql_fetch_array o que nos permite mostrar cada uma das opes. O script de actualizao seria muito parecido ao de insero:
<HTML> <HEAD> <TITLE>Actualizar2.php</TITLE> </HEAD> <BODY> <? //Conexo com a base mysql_connect("localhost","user","password"); //Criamos a sentena SQL e executamo-la $sSQL="Update Clientes Set telefone='$telefone' Where nome='$nome'"; mysql_db_query("exemplo",$sSQL); ?> <h1> <div align="center">Registro Actualizado</div> </h1><div align="center"> <a href="leitura.php">Visualizar o contedo da base</a></div> </BODY> </HTML>
Eliminao de um registo
Outra das operaes elementares que se podem realizar sobre uma base de dados apagar um registo. Para o fazer, SQL prope sentenas do tipo Delete. Vejamos com um exemplo aplicado nossa agenda. Primeiro, criamos um menu dinmico como no caso das
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 53
actualizaes:
<HTML> <HEAD> <TITLE>Apagar1.php</TITLE> </HEAD> <BODY> <div align="center"> <h1>Apagar um registo</h1> <br> <? //Conexo com a base mysql_connect("localhost","user","password"); echo '<FORM METHOD="POST" ACTION="borrar2.php">Nome<br>'; //Criamos a sentena SQL executamo-la $sSQL="Select nome From clientes Order By nome"; $result=mysql_db_query("exemplo",$sSQL); echo '<select name="nome">'; //Mostramos os registos em forma de menu dinmico while ($row=mysql_fetch_array($result)) { echo '<option>'.$row["nome"]; } mysql_free_result($result) ?> </select> <br> <INPUT TYPE="SUBMIT" value="Apagar!"> </FORM> </div> </BODY> </HTML>
O seguinte passo fazer efectiva a operao a partir da execuo da sentena SQL que construmos a partir dos dados do formulrio:
<HTML> <HEAD> <TITLE>Apagar2.php</TITLE> </HEAD> <BODY> <? //Conexo com a base mysql_connect("localhost","user","password"); //Criamos a sentena SQL y executamo-la $sSQL="Delete From Clientes Where nome='$nome'"; mysql_db_query("exemplo",$sSQL); ?> <h1><div align="center">Registo Apagado</div></h1> <div align="center"> <a href="leitura.php">Visualizar o contedo da base</a> </div> </BODY> </HTML>
Executar exemplo Com este captulo fechmos o bloco de acessos s bases de dados com PHP. Para mais informao relacionada poders consultar num workshop de PHP que estamos a pensar fazer em breve.
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
54
Ao ligar-nos ao servidor como s dados do FTP, que devem ser proporcionados pelo nosso provedor, acederemos a um directrio. Este directrio poderia ser o de publicao, ainda que normalmente no assim, seno que costuma ser um subdirectrio chamado "HTML" ou "docs" ou algo similar. Como estava a dizer, este directrio pode ter nomes diferentes em provedores diferentes, mas em qualquer caso, com uma simples pergunta ao nosso provedor resolvemos essa duvida. Os ficheiros devem-se subir ao directrio de publicao, ou a qualquer subdirectrio deste. Concluindo, teremos de aloja-los por ai dentro e para aceder a eles bastaria com escrever o nome do domnio ou URL do nosso alojamento, seguido do nome do ficheiro. Se tivssemos um ficheiro chamado ola.php e o nosso alojamento se tivesse contratado para o domnio www.meudominio.com, deveramos de subir esse ficheiro ao directrio de publicao e acederamos ao ficheiro escrevendo: http://www.meudominio.com/ola.php Se criamos subdirectrios dentro do directrio de publicao poderemos aceder a eles escrevendo o nome do domnio ou URL do nosso alojamento, seguido do nome do directrio e do nome do ficheiro. Por exemplo, se criamos um subdirectorio chamado paginas e temos dentro um ficheiro chamado pag1.php, poderamos aceder a ele da seguinte forma: http://www.meudominio.com/paginas/pag1.php
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
55
Referncia: h outro conceito interessante que deveramos conhecer neste ponto, que o "documento pr-definido". Este o ficheiro que se envia ao navegador se na URL acedida no se especifica nenhum ficheiro. Costuma chamar-se index.html ou index.php (ou index.asp se o nosso servidor suporta programao em ASP), ainda que pode variar de um provedor a outro.
No seria possvel sair do directrio de publicao com uma URL como esta, por muito que utilizemos o operador .. (que serve para aceder ao directrio pai). http://www.meudominio.com/../funcoes_php/ficheiro_inalcancavel.php De todos modos, colocar alguns ficheiros fora do directrio de publicao pode ser muito til. Por exemplo, poderamos colocar ali copias de segurana de alguns ficheiros ou documentos que simplesmente queremos guardar no servidor para aceder a eles desde qualquer parte e com o nosso programa de FTP. H outra utilidade mais interessante sobre colocar ficheiros fora do directrio de publicao. Muitas vezes utilizamos nos nossos programas bocados de cdigo repetidamente, por exemplo, para abrir e fechar bases de dados, para mostrar o cabealho do nosso portal, para verificar que um e-mail escrito num formulrio correcto, etc. muito til separar estes bocados de cdigo num ficheiro parte e chamar este ficheiro com as funes PHP include() ou require(). Deste modo, se um dia modificamos o cabealho do nosso portal, s temos que modificar um ficheiro ou se muda a base de dados que utilizamos s teramos que modificar o ficheiro que faz a ligao base de dados em vez de ir alterando todas as pginas PHP que faziam uma apertura da base de dados. Estes ficheiros no so pginas independentes, mas sim fragmentos. Provavelmente se os executamos por separado no mostrariam nenhum resultado vlido, inclusive poderiam dar mensagens de erro. Por esta razo vale a pena coloca-los num lugar onde ningum pudesse ter acesso: fora do directrio de publicao. Com PHP poderemos aceder a este directrio para incluir estes ficheiros. Somente deveramos utilizar as funes PHP include() ou require() indicando o path para aceder aos ficheiros. No caso de ter uma pgina chamada ola.php no directrio de publicao e um ficheiro, que chama abre_base_dados.php, no directrio funcoes_php, que est fora do directrio de publicao, se quisssemos aceder (desde ola.php) ao ficheiro que abre a base de dados
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 56
Desde PHP sim podemos aceder aos ficheiros que se encontram fora do directrio de publicao. Para isso especificamos o path adequado, na que utilizamos o operador .. para descer ao directrio pai. No h nada mais a dizer sobre a colocao dos ficheiros: uma vez situados no directrio de publicao poder-se aceder aos ficheiros com o nosso navegador e deveria-se poder executar perfeitamente. Temos de ter em conta que, tanto PHP como o servidor onde trabalhamos, podem ter configuraes diferentes e pode que algum detalhe de programao das nossas pginas no funcione correctamente. Por exemplo, o nosso PHP pode declarar ou no automaticamente as variveis que chegam atravs dum formulrio. Se em local estava configurado para fazer isso e em remoto no, deveramos localizar os lugares onde recolhemos as variveis e utilizar as variveis correctas (ver artigo sobre Processar variveis em formulrios e os comentrios para saber mais sobre esta possvel fonte de erros). Mesmo no sendo um caso habitual, podemos nos por em contacto com o nosso provedor de alojamento para ver se pode ajudar-nos com a configurao do sistema ou se pode indicar-nos os passos a seguir para resolver o assunto nos nossos scripts.
Comentrio: O seguinte script calcula o nvel de directrio dos scripts que queremos incluir na pgina actual. // Achamos o nvel do directrio onde se encontra a pgina 1. Contamos os caracteres que contem o nome do script actual. $Chars = count_chars($PHP_SELF,1); 2. Exploramos a tabela dos caracteres retornados procurando o carcter ('/' Cdigo 47 ) de directrio (pasta) que retorna Apache. foreach ($Chars as $Char=>$nChars){ if ($Char==47) {$n=$nChars;break;} } 3. Geramos uma cadeia de n-1 vezes com a subcadeia "../" que nos da o nvel de directrio no que se encontra o script. if ($n==0) $PathString=""; else $PathString=str_pad("",($n-1)*3,"../");
muito normal que o nosso provedor de hosting oferea junto com PHP a base de dados MySQL, assim que os apontamentos para subir essa base de dados ao servidor de este artigo vo encaminhados a oferecer solues para essa base de dados. A base de dados MySQL no se pode subir por FTP, como se fazia com os ficheiros do cdigo PHP. Para a subir teremos que utilizar outros mecanismos. Vou distinguir entre trs casos diferentes nos que poderamos encontrar-nos neste momento: 1. A base de dados que pretendemos subir est vazia. S crimos as tabelas, mas no introduzimos dados ou simplesmente introduzimos algum dado como experincia. 2. A base de dados que queremos subir est completa e uma base de dados MySQL. Neste caso teremos de criar a base de dados em local com toda a informao dentro e obviamente, queremos que esteja disponvel essa informao em remoto. 3. A base de dados est completa (como no caso anterior), mas no uma base de dados MySQL. Neste caso estaramos a fazer uma migrao da base de dados de um sistema gestor a outro. Veremos os trs casos por separado mais frente, mas antes disso, vamos mostras umas ferramentas que nos sero muito teis para a administrao de qualquer base de dados remota. As ferramentas em concreto so as seguintes: PhpMyAdmin. Uma aplicao criada em PHP que podemos instalar no nosso espao de alojamento para administrar a base de dados. Mysql Control Center (a partir de agora MyCC). Uma aplicao Windows que permite conectar-se a diversas bases de dados MySQL, que se estejam em local ou em remoto. Access. Tambm permite administrar uma base de dados MySQL conectada em local ou em remoto. Neste caso utiliza-se uma interface que muitos j conhecem, como a do Access, para administrar uma base de dados que nada tem a ver com o mencionado programa.
Nos trs casos o que nos permite realizar o software de administrao so tarefas, sobre as bases de dados, de todo tipo, como podem ser criar tabelas, modific-las, inserir dados, apag-los, edit-los. Modificar ou apagar tabelas ou campos das mesmas, etc. A eleio de uma ferramenta ou de outra passa pelos recursos que nos permitam utilizar no nosso provedor. Basicamente, o que nos pode levar a escolher uma opo ou outra se nos permitem ou no conectar de maneira remota base de dados MySQL. Conheo alojamentos onde se permite essa conexo e alojamentos onde no. Se no permidito conectar-nos remotamente escolheramos o PhpMyAdmin, pois uma aplicao PHP que se conecta em local e ao que se pode aceder atravs de uma pgina web, e isso est permitido pelos provedores, inclusive h muitos que j tm instalado esse software para administrar as bases de dados. No caso de que efetivamente possmos conectar-nos remotamente com a base de dados, a nossa escolha ser MyCC ou Access, que so aplicaes Windows muito mais potentes e rpidas que as que utilizam interface web, como o PhpMyAdmin. prefervel usar MyCC porque est especialmente feito para conectar-se e operar com bases de dados MySQL. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 58
Ferramenta de backup de PhpMyAdmin. Est marcada a opo de extrair s a estrutura das tabelas. Se marcamos tambm a opo "Send", o nosso navegador criar um ficheiro de texto. Se no o fizermos s se visualizar.
O que temos de fazer neste caso um backup da estrutura da base de dados, isto , os "create tables" ou sentenas SQL para criar as tabelas. Seriam bastantes sentenas deste gnero. # -------------------------------------------------------# # Table structure for table 'comentario' #
CREATE TABLE comentario ( Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 59
id_comentario int(5) unsigned NOT NULL auto_increment, id_artigo int(4) DEFAULT '0' NOT NULL, comentario text NOT NULL, data int(14) unsigned DEFAULT '0' NOT NULL, revisado tinyint(1) DEFAULT '0' NOT NULL, nome_comentario varchar(100) DEFAULT 'Nome no especificado' NOT NULL, email_comentario varchar(100) DEFAULT 'Email sem especificar' NOT NULL, tipo tinyint(1) unsigned DEFAULT '1' NOT NULL, PRIMARY KEY (id_comentario) );
Para restaurar estas sentenas temos opes tanto dentro de PhpMyAdmin como de MyCC. Em ambos casos o que temos de fazer executar estas sentenas no servidor MySQL remoto. Em PhpMyAdmin temos um campo para introduzir sentenas SQL e outro para seleccionar um ficheiro de texto com todas as sentenas SQL, para executa-las uma detrs da outra. No MyCC temos um boto que nos permite abrir uma consola onde introduzir uma ou vrias sentenas SQL e executa-las.
Recordamos que isto s nos servir para subir a estrutura da base de dados e no os dados que contenham. Se desejamos subir tambm a informao da base de dados temos de utilizar outras estratgias que relataremos proximamente. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
60
Neste caso o processo seria muito parecido ao de subir uma base de dados vazia, relatado anteriormente, excepto que agora temos de extrair no s a estrutura da base de dados, mas tambm os registos que contm. Para fazer isto podemos utilizar mysqldump ou PhpMyAdmin, seleccionando a opo que indica que o backup contem a estrutura e os dados (Structure and data). A estrutura e os dados vem num ficheiro de texto com uma serie de sentenas SQL para criar as tabelas e os insert necessrios para introduzir cada um dos dados. Para restaurar a base de dados, vamos seguir os mesmos passos como para o caso em que a base de dados est vazia, com a ajuda de uma instalao de PhpMyAdmin em remoto ou MyCC, que se conecte a base de dados contratada no servidor de Internet. Se temos problemas para subir o ficheiro de backup da base de dados possvel que o nosso provedor de alojamento nos possa ajudar a subir o ficheiro e restaura-lo. Como o provedor dispe dos servios nas suas prprias instalaes, tem muitas mais possibilidades para trabalhar com as bases de dados do que ns, sem temor a que as lentas comunicaes pela internet nos dem erros na restaurao dos dados. Se o nosso provedor no pode ajudar-nos, de certeza que dispem ou nos pode indicar algum mecanismo para realizar a tarefa sem erros. Pode acontecer que algum provedor nos diga que se encarrega de tudo mas que nos exige um pagamento pelas horas de trabalho da pessoa que vai restaurar o backup da base de dados. Se no dispe de facilidades nem sequer nisto, provavelmente seja melhor ir pedindo-lhe o dinheiro de volta porque o seu servio quase de certeza no vai ser de qualidade. Artigo por Miguel Angel Alvarez - Traduo de JML
dificuldade de transferir informao entre os dois sistemas gestores de bases de dados, tambm influir muito na complexidade do problema o tipo de dados das tabelas que estamos a utilizar. Por exemplo, as datas, os campos numricos com decimais ou os boleanos podem dar problemas ao passar de um sistema a outro porque podem armazenar-se de maneiras diferentes ou nos caso dos nmeros, com uma preciso diferente. Recomendaes para migrar de Access a MySQL Se a nossa base de dados anterior estava construda em Access a migrao ser fcil graas a que MySQL dispe dum driver ODBC para sistemas Windows, que nos permite conectar Access com o prprio MySQL e passar informao facilmente. Devemos indicar que se desejarmos fazer uma exportao desde Access em local a MySQL em remoto pode haver problemas porque no todos os servidores permitem as conexes em remoto com a base de dados. Se no temos disponvel uma conexo em remoto com o nosso servidor de bases de dados vamos ter que mudar de estratgia. A idia neste ltimo caso instalar MySQL em local e realizar a migrao desde Access em local a MySQL em local e depois ,fazer um backup da base de dados local e subi-la a remoto, tal e qual como se relatou antes. Recomendaes para migrar desde SQL Server a MySQL A verdade que nunca passei por este problema, mas Access tambm nos pode ajudar neste caso. Access permite seleccionar uma base de dados SQL Server e trabalhar desde a prpria interfaz de Access. A idia que Access tambm permite trabalhar com MySQL e possivelmente fazendo uma pontes entre estes dois sistemas gestores podemos exportar dados desde SQL Server a MySQL. O certo que utilizando o prprio Access de ponte poderamos realizar o trabalho. Primeiro exportando de SQL Server a Access e depois de Access a MySQL. Outras bases de dados e outras tcnicas Se a base de dados origem dispem de um driver ODBC no haver (em teoria) nenhum problema para conecta-la com Access, de maneira similar a como se conecta com MySQL. Poderamos utilizar Access para exportar os dados, porque desde ali poderia-se aceder aos dois sistemas gestores de bases de dados Se no temos Access, ou a base de dados original no tem driver ODBC, ou ainda se no funciona correctamente o processo e no sabemos como resolver o problema, outra possibilidade exportar os dados a ficheiros de texto, separados por vrgulas ou algo parecido. Muitas bases de dados tm ferramentas para exportar os dados das tabelas a ficheiros de texto, os quais podem ser introduzidos no nosso sistema gestor destino (MySQL) com a ajuda de alguma ferramenta tal como PhpMyAdmin. Para isso, na pgina de propriedades da tabela encontraremos uma opo para fazer o backup da tabela e para introduzir ficheiros de texto dentro de uma tabela (Insert textfiles into table)
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
62
Acedendo a este link poderemos ver um formulrio onde introduzir as caractersticas do ficheiro de texto, como o carcter utilizado como separador de campos, ou o terminador de linhas, etc, junto com o prprio ficheiro com os dados, e PhpMyAdmin encarregar-se- de todo esse trabalho de incluir eses dados na tabela.
Obviamente, necessrio ter a tabela criada em remoto para que se possa introduzir os dados do ficheiro de texto. Mudana de um formato de dados a outro Toda migrao tem de ter em conta muito especialmente, como j se disse, as formas que tenham cada base de dados de guardar a informao. Temos que contar sempre com a possibilidade de transformar alguns dados como podem ser os campos boleanos, datas, campos memo (texto com longitude indeterminada), etc, que podem armazenar-se de maneira diferente em cada um dos sistemas gestores, origem e destino. Nalguns casos possivelmente tenhamos de realizar algum script que realize as mudanas necessrias nos dados. Por exemplo para localizar os valores boleanos guardados como
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 63
true/false e muda-los a valores inteiros 0 / 1, que como se guarda em MySQL. As datas tambm podem sofrer alteraes de formato, por exemplo, em Access aparece com o formato (dd/mm/aaaa), e em MySQL o formato (aaaa-mm-dd). PHP pode Ajudar-nos na tarefa de fazer este script mas tambm Visual Basic Script para Access pode fazer estas tarefas complexas e a prpria linguagem SQL, base de sentenas dirigidas contra a base de dados. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
64
Neste exemplo criou-se uma classe Caixa, indicando como atributos a altura, a grossura, a largura e tambm a cor e o contedo. Para comear criaram-se um par de mtodos, um para introduzir um elemento na caixa e outro para mostrar o contedo. Se repararmos, os atributos definem-se declarando umas variveis ao principio da classe. Os mtodos definem-se declarando funes dentro de uma classe. A varivel $this, utilizada dentro dos mtodos ser explicada um pouca mais em baixo. Utilizar a classe As classes so definies. Se queremos utilizar uma classe temos de criar um exemplar dessa classe, o que normalmente se chama instanciar um objectos de uma classe.
$minhacaixa = new Caixa;
Com isto crimos ou melhor dito, instancimos, um objecto da classe Caixa chamado $minhacaixa
$minhacaixa->introduz("algo"); $minhacaixaa->mostra_conteudo();
Com estas duas sentenas estamos a introduzir "algo" na caixa e depois estamos a mostrar esse contedo no texto da pgina. Repara que os mtodos de um objecto chamam-se utilizando o cdigo "->".
nome_do_objecto->nome_do_metodo()
Para aceder aos atributos de uma classe tambm se acede com o cdigo "->". Desta forma:
nome_do_objeto->nome_do_atributo
A varivel $this Dentro de um mtodo, a varivel $this faz referncia ao objecto sobre o que invocamos o mtodo. Na invocao $minhacaixa->introduz("algo") est-se a chamar ao mtodo introduz sobre o objecto $minhacaixa. Quando se est a executar esse mtodo, passa-se o valor que recebe por parmetro ao atributo contedo. Neste caso $this->contedo faz referncia ao atributo contido no objecto $minhacaixa, que sobre o que se invocava o mtodo. Artigo por Miguel Angel Alvarez - Traduo de JML
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
65
Construtores em PHP
Os construtores so funes, ou mtodos, que se encarregam de realizar as tarefas de iniciao dos objectos ao ser instanciados. Isto , quando se criam os objectos a partir das classes, chama-se a um construtor que se encarrega de iniciar os atributos do objecto e realizar qualquer outra tarefa de iniciao que seja necessria No obrigatrio dispor de um construtor, mas so muito teis e a sua utilizao muito habitual. No exemplo da caixa, que comentmos no artigo anterior de programao orientada a objectos em PHP, o normal seria iniciar as variveis como cor ou as relacionadas com as dimenses e tambm indicar que o contedo da caixa est vazio. Se no h um construtor no se iniciam nenhum dos atributos dos objectos. O construtor define-se dentro da prpria classe, como se fosse outro mtodo. O nico detalhe que o construtor deve ter o mesmo nome que a classe. Ateno a PHP, que faz diferena entre maisculas e minsculas. Para a classe Caixa definida anteriormente, poderia declarar-se este construtor:
function Caixa($altura=1,$grossura=1,$largura=1,$cor="preto"){ $this->altura=$altura; $this->grossura=$grossura; $this->largura=$largura; $this->cor=$cor; $this->conteudo=""; }
Neste construtor recebemos por parmetro todos os atributos que h que definir numa caixa. muito til definir uns valores pr-definidos nos parmetros que recebe o construtor, igualando o parmetro a um valor dentro da declarao de parmetros da funo construtora, deste modo, ainda que se chame ao construtor sem proporcionar-lhe parmetros, iniciar-se- com os valores pr-definidos. importante assinalar que nos construtores no se tem porque receber todos os valores para iniciar o objecto. H alguns valores que se podem iniciar a vazio (NULL) ou a qualquer outro valor fixo, como neste caso, o contedo da caixa, que inicialmente supusemos que estar vazia. Artigo por Miguel Angel Alvarez - Traduo de JML
Herana em PHP
A programao orientada a objectos tem um mecanismo chamado herana pela que qual se podem definir classes a partir de outras classes. As classes realizadas a partir de outra classe ou melhor dito, que derivam de outra classe, chamam-se classes derivadas. As classes derivadas herdam todos os atributos e mtodos da classe base, para alm de poder ter tantos atributos e mtodos novos como se desejem. Para ampliar o exemplo que temos tado a utilizar, a classe Caixa, vamos criar uma classe
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 66
derivada chamada Caixa_tematica. Esta classe herda de caixa, mas tem um "tema", que a descrio do tipo de coisas que metemos na caixa. Com isto podemos ter varias caixas, cada uma com coisas de um tema concreto.
class Caixa_tematica extends Caixa{ var $tema; function define_tema($novo_tema){ $this->tema = $novo_tema; }
Nesta classe herdamos de Caixa, por tanto temos nossa disposio todos os atributos e mtodos da classe base. Tambm se definiu um novo atributo, chamado $tema, e um mtodo, chamado define_tema(), que recebe o tema com o que se deseja etiquetar a caixa. Poderamos utilizar a classe Caixa_tematica de maneira similar a como fazamos com a classe Caixa original
$minhacaixa_tematica = new Caja_tematica(); $minhacaixa_tematica->define_tema("Cabos e conectores"); $minhacaixa_tematica ->introduz("Cabo de rede"); $minhacaixa_tematica ->introduz("Conetor RJ45"); $minhacaixa_tematica ->mostra_conteudo();
Neste caso, o resultado que se obtm parecido ao que se obtm para a classe base. Mas, quando se mostra o contedo de uma caixa, o mais interessante seria, que se indicara tambm o tipo de objectos que contem a caixa temtica. Para isso, temos que redefinir o mtodo mostra_conteudo(). Redefinir mtodos em classes derivadas Redefinir mtodos significa voltar a codifica-los, isto , voltar a escrever o seu cdigo para a classe derivada. Neste caso, temos que redefinir o mtodo mostra_conteudo() para que mostre tambm o tema da caixa. Para redefinir um mtodo, o nico que devemos fazer voltar a escrever dentro da classe derivada.
function mostra_conteudo(){ echo "Conteudo da caixa de <b>" . $this->tema . "</b>: " . $this->conteudo; }
Neste exemplo codificmos de novo o mtodo inteiro para mostrar os dados completos. Nalgumas ocasies muito til basear-se na definio de um mtodo da classe base para realizar as aces da classe derivada. Por exemplo, para este exemplo concreto, temos de definir um construtor para a classe Caixa temtica, no que tambm se inicie o tema da caixa. Como j existe um mtodo construtor na classe base, no vale a pena reescrever o cdigo de este, o melhor chamar ao construtor que tnhamos definido na classe Caixa original, com o que se iniciaro todos os dados da classe base, e depois realizar a iniciao para os atributos da prpria classe derivada. Para chamar a um mtodo da classe pai dentro do cdigo de um mtodo que estamos a redefinir, utilizamos uma sintaxe como esta:
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
67
Aqui vemos a redefinio de construtor, da classe Caixa, para a classe Caixa_tematica. O construtor faz primeiro uma chamada ao construtor da classe base, atravs de uma referncia a "parent". Depois inicia o valor do atributo $tema, que especifico da Caixa_temtica. Na mesma linha de trabalho, podemos redefinir o mtodo mostra_conteudo() baseando-nos no que foi declarado para a classe base. O cdigo ficaria assim:
function mostra_conteudo(){ echo "Conteudo da caixa de <b>" . $this->tema . "</b>: "; parent::mosta_conteudo(); }
Cookies em PHP
As cookies en PHP so muito fceis de utilizar. J comeamos a explicar alguns pontos interessantes no artigo utilizao de cookies no manual de PHP. Agora vamos mostrar outros detalhes que convm saber para trabalhar com as cookies, sobretudo com relao sua criao.
cookie ter validade dentro de todo o domnio. Domnio o subdomnio onde se poder acessar a cookie. As cookies s podem ser geradas e utilizadas para o domnio da pgina onde est colocado o script, porm podemos torn-lo visvel para todos os subdomnios do domnio da web por meio de ".meudominio.com". Seguro um booleano que, se true, indica que a cookie s pode ser transmitida por shttp (http seguro). S http Isto outro booleano que serve para indicar que a cookie s ser acessvel por meio dos cabealhos do http, o que a tornaria inalcanvel para linguagens de script no cliente como Javascript. Este parmetro foi adicionado no PHP 5.2.0 A funo setcookie() de PHP gera e envia a cookie ao navegador e retorna um booleano, se true indica que foi includa no navegador do usurio e se false indica que no foi possvel coloc-la no sistema. Contudo, este valor no indica que o visitante aceitou a cookie, posto que o navegador pode t-lo configurado para no aceitar cookies e isso no pode ser detectado por setcookie() diretamente. Por exemplo, estas seriam diferentes chamadas a setcookie():
setcookie("minhacookie", "meuvalor"); setcookie("cookie2", "meuvalor2", time() + 3600); setcookie("outracookie", "valorfinal", time() + 3600, "/", ".meudominio.com");
Porm, ateno com um assunto: enviar uma cookie ao navegador deve ser feito antes de ter mandado os cabealhos do http ao cliente, ou seja, antes de ter escrito qualquer texto na pgina. Caso contrrio, PHP pode enviar um erro de headers already sent (cabealhos j enviados). Recuperar cookies com PHP Por outro lado, para receber as cookies que o navegador do usurio possa ter criadas no sistema se utiliza o array associativo $_COOKIE. Neste array esto todas as cookies disponveis na pgina PHP no domnio e no diretrio onde est colocado. Por meio do nome da cookie acessamos seu valor:
$_COOKIE["minhacookie"]; $_COOKIE["cookie2"];
Para ver um exemplo de uso de cookies PHP acessar a oficina de PHP Estilos CSS diferentes a uma pgina com PHP e cookies. Artigo por Miguel Angel Alvarez - Traduo de Celeste Veiga
Manual do Programao em PHP: http://www.criarweb.com/manuais/programacao_php/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.
69