Você está na página 1de 166

PHP 5 e MySQL 5 e Ajax

ndice
O que PHP?.................................................................................................................... 6 Client Side scripts............................................................................................................. 6 Server Side scripts ............................................................................................................ 6 Ambiente de desenvolvimento de pginas PHP ............................................................... 7 O que pode ser feito com PHP?........................................................................................ 7 Como surgiu a linguagem PHP?....................................................................................... 8 A sintaxe ........................................................................................................................... 8 Delimitando o cdigo PHP ............................................................................................... 9 Alternagem avanada ....................................................................................................... 9 Separador de instrues .................................................................................................. 10 Comentrios.................................................................................................................... 10 Variveis......................................................................................................................... 11 Regras para nomear as variveis .................................................................................... 11 Variveis Predefinidas.................................................................................................... 11 Variveis do servidor: $_SERVER ................................................................................ 12 Usando strings de consulta ............................................................................................. 15 Variveis HTTP GET: $_GET ....................................................................................... 16 Transmitindo diversas variveis de string de consulta ................................................... 16 Variveis da requisio: $_REQUEST........................................................................... 17 Transmitindo caracteres especiais em uma string de consulta ....................................... 17 Array Associativo de recebimento de formulrio........................................................... 19 Cotas mgicas no PHP.................................................................................................... 21 stripslashes( ) .................................................................................................................. 21 addslashes( ) ................................................................................................................... 21 Usando objetos de aplicao e sesso............................................................................. 22 Usando cookies para monitorar os clientes .................................................................... 22 Usando variveis de sesso para controlar clientes ........................................................ 24 Tipos ............................................................................................................................... 26 Heredoc em Strings ........................................................................................................ 27 Interpretao de variveis............................................................................................... 28 Coero de tipo............................................................................................................... 29 Constantes....................................................................................................................... 30 Operadores...................................................................................................................... 31 Operadores Aritmticos.................................................................................................. 31 Operadores de Atribuio............................................................................................... 31 Operadores de Comparao............................................................................................ 32 Operadores de controle de erro....................................................................................... 34 Operadores de Incremento/Decremento ......................................................................... 34 Operadores Lgicos........................................................................................................ 35 Operadores de String ...................................................................................................... 35 Operadores de Arrays ..................................................................................................... 35 Estruturas de Controle .................................................................................................... 36 Estruturas Condicionais.................................................................................................. 36 if...................................................................................................................................... 36 else .................................................................................................................................. 37 elseif ............................................................................................................................... 37

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


Sintaxe alternativa para estruturas de controle ............................................................... 38 Estruturas de Laos Condicionais (loops)..................................................................... 38 while ............................................................................................................................... 38 do...while ........................................................................................................................ 39 for ................................................................................................................................... 39 Um caso a parte a estrutura do switch ......................................................................... 40 switch.............................................................................................................................. 40 break ............................................................................................................................... 42 continue .......................................................................................................................... 42 return............................................................................................................................... 43 Criando bloco de cdigos reutilizveis........................................................................... 43 require( ) ......................................................................................................................... 43 include( )......................................................................................................................... 44 require_once( )................................................................................................................ 47 include_once( ) ............................................................................................................... 47 Funes........................................................................................................................... 47 Funes definidas pelo usurio ...................................................................................... 47 Argumentos de funes .................................................................................................. 47 Valores padro de argumentos ....................................................................................... 47 Funes definidas condicionalmente.............................................................................. 48 Funes dentro de funes ............................................................................................. 49 Funes com argumentos variveis................................................................................ 50 Retornando valores ......................................................................................................... 50 Escopo de variveis ........................................................................................................ 50 Variveis Estticas.......................................................................................................... 52 Enviando arquivos para o servidor ................................................................................. 53 Os cdigos de erro de envio de arquivos........................................................................ 55 Como fazer UPLOAD de mltiplos arquivos................................................................. 56 Orientao a Objetos com PHP 5 ................................................................................... 56 Classe.............................................................................................................................. 56 O nome da classe ............................................................................................................ 57 new ................................................................................................................................. 57 Arrays (Matrizes)............................................................................................................ 70 O que um array?........................................................................................................... 70 Arrays numericamente indexados .................................................................................. 70 Acessando o contedo de um array ................................................................................ 71 Uma outra maneira de criar arrays ................................................................................. 71 Utilizando loops para acessar o array ............................................................................. 71 Arrays Associativos........................................................................................................ 72 Utilizando loops com each( ) e list( ) ............................................................................. 72 foreach ............................................................................................................................ 74 Exemplo prtico do uso do foreach ................................................................................ 75 Arrays Bidimensionais ................................................................................................... 76 Classificando arrays........................................................................................................ 77 Utilizando sort( )............................................................................................................. 77 Reordenando arrays aleatoriamente................................................................................ 78 Redirecionando um usurio ............................................................................................ 78 Expresses Regulares (compatveis com o padro POSIX)........................................... 78 As expresses regulares.................................................................................................. 79 Validando formataes e verificando preenchimentos................................................... 80

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


A funo ereg( ).............................................................................................................. 80 A funo eregi( )............................................................................................................. 81 A funo ereg_replace( ) ................................................................................................ 81 A funo eregi_replace( ) ............................................................................................... 82 A funo str_replace( ) ................................................................................................... 82 A funo number_format( )............................................................................................ 83 A funo nl2br( ) ............................................................................................................ 83 A funo wordwrap( ) .................................................................................................... 83 A funo strip_tags( ) ..................................................................................................... 84 A funo htmlentities( ).................................................................................................. 84 Funes teis, mas no essenciais .................................................................................. 85 Enviando um e-mail........................................................................................................ 85 Funo mail( )................................................................................................................. 85 Trabalhando com arquivos ............................................................................................. 86 Armazenando e recuperando informaes ..................................................................... 87 Uma alternativa a escrita de arquivos............................................................................. 89 Uma alternativa a leitura de arquivos ............................................................................. 89 Trabalhando com Datas .................................................................................................. 90 MySQL ........................................................................................................................... 91 O que MySQL?............................................................................................................ 91 O que um banco de dados relacional? ......................................................................... 91 Instalando o banco de dados........................................................................................... 92 Instalando no Windows .................................................................................................. 92 Instalando o MySQL no Linux....................................................................................... 92 Acessando o banco de dados MySQL ............................................................................ 93 No Windows ................................................................................................................... 93 No Linux......................................................................................................................... 93 Os comandos CREATE e DROP ................................................................................... 93 O comando CREATE ..................................................................................................... 94 O comando USE ............................................................................................................. 94 O comando DROP .......................................................................................................... 94 Criando tabelas ............................................................................................................... 94 O comando SHOW......................................................................................................... 95 O comando DESCRIBE ................................................................................................. 96 IF NOT EXISTS............................................................................................................. 96 Criando uma cpia de uma tabela .................................................................................. 96 Alterando tabelas existentes ........................................................................................... 96 Alterando o nome da coluna........................................................................................... 97 Alterando o tipo de coluna ............................................................................................. 97 Renomeando uma tabela................................................................................................. 97 Excluindo / adicionando colunas e tabelas ..................................................................... 97 Eliminando tabelas e colunas ......................................................................................... 97 Adicionando colunas ...................................................................................................... 98 Adicionando colunas aps uma outra determinada ........................................................ 98 Utilizando ndices ........................................................................................................... 98 Decidindo quais colunas incluir no ndice...................................................................... 98 Criando um ndice .......................................................................................................... 98 Excluindo ndices ........................................................................................................... 99 Tipos de tabelas .............................................................................................................. 99 O tipo MyISAM ........................................................................................................... 100

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


O tipo Memory ............................................................................................................. 100 O tipo MERGE ............................................................................................................. 100 O tipo BDB................................................................................................................... 101 O tipo InnoDB .............................................................................................................. 101 Alterando o tipo de uma tabela..................................................................................... 102 Tipo de dados ............................................................................................................... 102 Tipos numricos ........................................................................................................... 102 Modificadores AUTO_INCREMENT, UNSIGNED e ZEROFILL ............................ 103 AUTO_INCREMENT.................................................................................................. 103 UNSIGNED.................................................................................................................. 103 ZEROFILL ................................................................................................................... 103 Tipos de caractere ou de dados de string...................................................................... 104 CHAR e VARCHAR.................................................................................................... 104 TEXT e BLOB ............................................................................................................. 104 Tipos variados .............................................................................................................. 105 Tipo ENUM.................................................................................................................. 105 Tipo SET ...................................................................................................................... 105 Modificadores adicionais de coluna ............................................................................. 106 Tipos de data e hora...................................................................................................... 106 Sintaxe bsica da SQL.................................................................................................. 107 Comando INSERT........................................................................................................ 107 Comando SELECT ....................................................................................................... 107 Um outro caso, a clusula WHERE ............................................................................. 108 Algumas funes que trabalham com a instruo SELECT......................................... 109 MAX( ) ......................................................................................................................... 109 MIN( )........................................................................................................................... 109 LIMIT ........................................................................................................................... 109 COUNT( )..................................................................................................................... 109 SUM( ).......................................................................................................................... 109 ORDER BY .................................................................................................................. 110 ORDER BY ... DESC................................................................................................... 110 AVG( ).......................................................................................................................... 110 LIKE ............................................................................................................................. 110 Um caso a parte: a unio do INSERT INTO ... SELECT ............................................ 110 Comando UPDATE...................................................................................................... 110 Comando DELETE ...................................................................................................... 111 Trabalhando com Junes ............................................................................................ 111 Criando uma juno com INNER JOIN ....................................................................... 111 Chaves variadas do MySQL ......................................................................................... 111 O que uma chave?...................................................................................................... 111 Princpios da Chave ...................................................................................................... 111 Como as chaves funcionam .......................................................................................... 112 Benefcios de usar uma chave ...................................................................................... 112 Suporte de chave do MySQL ....................................................................................... 112 Chaves primrias .......................................................................................................... 113 Chaves estrangeiras ...................................................................................................... 113 Excluindo uma chave estrangeira ................................................................................. 113 Transaes .................................................................................................................... 113 Usando transaes no MySQL ..................................................................................... 113 Stored Procedures ......................................................................................................... 114

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


Visualizando procedures criadas .................................................................................. 114 Visualizando a criao da procedure ............................................................................ 115 Criando um Stored Procedure com parmetros............................................................ 115 Criando um procedure com a clusula LIKE ............................................................... 115 Criando Views .............................................................................................................. 115 Visualizando a estrutura de uma view.......................................................................... 116 Visualizando a criao da view .................................................................................... 116 Excluindo uma view ..................................................................................................... 116 Criando Triggers (gatilhos) .......................................................................................... 116 Visualizando as triggers criadas ................................................................................... 117 Excluindo uma trigger .................................................................................................. 117 Administrando o MySQL ............................................................................................. 117 Entendendo o sistema de privilgios do MySQL ......................................................... 117 Configurando usurios.................................................................................................. 117 Confirmando o novo usurio ........................................................................................ 118 Revogando privilgios.................................................................................................. 118 Obtendo informaes com SHOW ............................................................................... 118 Integrando PHP e MYSQL........................................................................................... 119 Acessando seu banco de dados pelo PHP..................................................................... 119 Conectando ao MySQL e visualizando dados.............................................................. 119 Parmetros opcionais de mysql_fetch_array ................................................................ 120 Inserindo dados na tabela livros ................................................................................... 121 Alterando o cadastro de livros ...................................................................................... 123 Trabalhando com MySQL Improved Extension .......................................................... 128 Criando a conexo com o mysqli ................................................................................. 129 Criando o arquivo de funes....................................................................................... 129 Criando o Stored Procedure para inserir autores .......................................................... 130 Criando o cadastro de autores....................................................................................... 130 Selecionando os autores atravs de Stored Procedure.................................................. 132 Chamando a Stored Procedure para visualizar os autores............................................ 132 Atualizando os autores por Stored Procedure............................................................... 134 Criando a procedure que seleciona um autor em especfico ........................................ 134 Criando a pgina de atualizao de autores.................................................................. 134 Excluindo autores ......................................................................................................... 137 Lendo e manipulando o contedo de um diretrio ....................................................... 139 Criando arquivos em PDF ............................................................................................ 140 Arquivos de Excel ........................................................................................................ 144 Criando arquivos em RTF ............................................................................................ 146 Desenvolvendo aplicaes Web com PHP e Ajax ....................................................... 149 O que AJAX?............................................................................................................. 150 Como o AJAX trabalha ................................................................................................ 150 Criando uma pgina com Ajax ..................................................................................... 150 Entendendo o AJAX..................................................................................................... 154 Apndice A ................................................................................................................... 156 Bibliografia................................................................................................................... 166

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


O que PHP?
PHP (um acrnimo recursivo para "PHP: Hypertext Preprocessor") uma linguagem de script Open Source de uso geral, muito utilizada e especialmente guarnecida para o desenvolvimento de aplicaes Web embtivel dentro do HTML. uma linguagem que permite criar sites WEB dinmicos, possibilitando uma interao com o usurio atravs de formulrios, parmetros da URL e links. A diferena de PHP com relao a linguagens semelhantes a JavaScript que o cdigo PHP executado no servidor, sendo enviado para o cliente apenas html puro. Desta maneira possvel interagir com bancos de dados e aplicaes existentes no servidor, com a vantagem de no expor o cdigo fonte para o cliente. Isso pode ser til quando o programa est lidando com senhas ou qualquer tipo de informao confidencial. O que diferencia PHP de um script CGI escrito em C ou Perl que o cdigo PHP fica embutido no prprio HTML, enquanto no outro caso necessrio que o script CGI gere todo o cdigo HTML, ou leia de um outro arquivo.

Client Side scripts


So cdigos de programa que so processados pela estao cliente. Geralmente em aplicaes voltadas Internet, o cdigo que executado no cliente cuida apenas de pequenas consistncias de telas e validaes de entrada de dados. Em se tratando de pginas web, os client-side scripts tero de ser processados por um browser. O maior problema de se utilizar este tipo de artifcio em uma aplicao a incompatibilidade de interpretao da linguagem entre os browsers. O Microsoft Internet Explorer, por exemplo, capaz de interpretar o Visual Basic Script, porm o Netscape no o faz sem o auxlio de um plug in (que foi desenvolvido por terceiros). H ainda o problema de verses muito antigas de navegadores, que no conseguem interpretar nenhum script. Em grande parte das situaes, no possvel exigir que o usurio final disponha de determinado produto para acessar a aplicao. Portanto importante pesar todos estes fatores ao planejar alguma aplicao com client-side scripts. A linguagem script mais indicada para se construir client-side scripts o JavaScript, devido a sua compatibilidade com os dois browsers (Netscape e Microsoft Internet Explorer, que devem ser de verses iguais ou superiores a 3.0 e 4.0 respectivamente).

Server Side scripts


So cdigos de programa que so processados no servidor. Devido a este fato, no necessrio preocupar-se com a linguagem que o cdigo foi criado: o servidor quem se encarrega de interpret-lo e de devolver uma resposta para o cliente. Em pginas PHP, so esses cdigos os maiores responsveis pelos resultados apresentados.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


Ambiente de desenvolvimento de pginas PHP
Como os arquivos PHP so arquivos do tipo texto (ASCII), eles podem ser escritos em um editor de textos comum Edit, Notepad, Emacs, por exemplo. Existem tambm outros ambientes que proporcionam uma forma mais agradvel de desenvolvimento, mas exige os mesmos conhecimentos do programador.

O que pode ser feito com PHP?


Basicamente, qualquer coisa que pode ser feita por algum programa CGI pode ser feita tambm com PHP, como coletar dados de um formulrio, gerar pginas dinamicamente ou enviar e receber cookies. O PHP pode ser utilizado na maioria dos sistemas operacionais, incluindo Linux, vrias variantes Unix (incluindo HP-UX, Solaris e OpenBSD), Microsoft Windows, Mac OS X, RISC OS, e provavelmente outros. O PHP tambm suportado pela maioria dos servidores web atuais, incluindo Apache, Microsoft Internet Information Server, Personal Web Server, Netscape and iPlanet Servers, Oreilly Website Pro Server, Caudium, Xitami, OmniHTTPd, e muitos outros. O PHP pode ser configurado como mdulo para a maioria dos servidores, e para os outros como um CGI comum. Com o PHP, portanto, voc tem a liberdade para escolher o sistema operacional e o servidor web. Do mesmo modo, voc pode escolher entre utilizar programao estrutural ou programao orientada a objeto, ou ainda uma mistura deles. Mesmo no desenvolvendo nenhum recurso padro de OOP (Object Oriented Programming, Programao Orientada a Objetos) na verso atual do PHP, muitas bibliotecas de cdigo e grandes aplicaes (incluindo a biblioteca PEAR) foram escritos somente utilizando OOP. Com PHP voc no est limitado a gerar somente HTML. As habilidades do PHP incluem gerao de imagens, arquivos PDF e animaes Flash (utilizando libswf ou Ming) criados dinamicamente, on the fly. Voc pode facilmente criar qualquer padro texto, como XHTML e outros arquivos XML. O PHP pode gerar esses padres e os salvar no sistema de arquivos, em vez de imprimi-los, formando um cache dinmico de suas informaes no lado do servidor. Talvez a mais forte e mais significativa caracterstica do PHP seu suporte a uma ampla variedade de banco de dados. Escrever uma pgina que consulte um banco de dados incrivelmente simples. Os seguintes bancos de dados so atualmente suportados: Tabela de bancos suportados pelo PHP5 Adabas D Ingres dBase InterBase Empress FrontBase FilePro (read-only) mSQL Hyperwave Direct MS-SQL IBM DB2 MySQL Unix dbm Informix

Oracle (OCI7 and OCI8) Ovrimos PostgreSQL Solid Sybase Velocis ODBC

Tambm foi providenciada uma abstrao de banco de dados DBX permitindo a voc utilizar qualquer banco de dados transparentemente com sua extenso. Adicionalmente,

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


o PHP suporta ODBC (Open Database Connection, ou Padro Aberto de Conexo com Bancos de Dados), permitindo que voc utilize qualquer outro banco de dados que suporte esse padro mundial. O PHP tambm tem suporte para comunicao com outros servios utilizando protocolos como LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (em Windows) e incontveis outros. Voc pode abrir sockets de rede e interagir diretamente com qualquer protocolo. O PHP tambm suporta o intercmbio de dados complexos WDDX, utilizado em virtualmente todas as linguagens de programao para web. Falando de comunicao, o PHP implementa a instanciao de objetos Java e os utiliza transparentemente como objetos PHP. Voc ainda pode usar sua extenso CORBA para acessar objetos remotos. O PHP extremamente til em recursos de processamento de texto, do POSIX Estendido ou expresses regulares Perl at como interpretador para documentos XML. Para acessar e processar documentos XML, so suportados os padres SAX e DOM. Voc ainda pode usar nossa extenso XSLT para transformar documentos XML. Utilizando o PHP no campo do e-commerce, voc poder usar as funes especficas para Cybescash, CyberMUT, Verysign Payflow Pro e CCVS, prticos sistemas de pagamento online.

Como surgiu a linguagem PHP?


A linguagem PHP foi concebida durante o outono de 1994 por Rasmus Lerdorf. As primeiras verses no foram disponibilizadas, tendo sido utilizadas em sua home-page apenas para que ele pudesse ter informaes sobre as visitas que estavam sendo feitas. A primeira verso utilizada por outras pessoas foi disponibilizada em 1995, e ficou conhecida como Personal Home Page Tools (ferramentas para pgina pessoal). Era composta por um sistema bastante simples que interpretava algumas macros e alguns utilitrios que rodavam por trs das home-pages: um livro de visitas, um contador e algumas outras coisas. Em meados de 1995 o interpretador foi reescrito, e ganhou o nome de PHP/FI, o FI veio de um outro pacote escrito por Rasmus que interpretava dados de formulrios HTML (Form Interpreter). Ele combinou os scripts do pacote Personal Home Page Tools com o FI e adicionou suporte a mSQL, nascendo assim o PHP/FI, que cresceu bastante, e as pessoas passaram a contribuir com o projeto. Estima-se que em 1996 PHP/FI estava sendo usado por cerca de 15.000 sites pelo mundo, e em meados de 1997 esse nmero subiu para mais de 50.000. Nessa poca houve uma mudana no desenvolvimento do PHP. Ele deixou de ser um projeto de Rasmus com contribuies de outras pessoas para ter uma equipe de desenvolvimento mais organizada. O interpretador foi reescrito por Zeev Suraski e Andi Gutmans, e esse novo interpretador foi base para a verso 3.

A sintaxe
Quando o PHP interpreta um arquivo, ele simplesmente repassa o texto do arquivo at encontrar uma das tags especiais que lhe diz para comear a interpretar o texto como cdigo PHP. O interpretador ento executa todo o cdigo que encontra, at chegar em uma tag de fechamento PHP, que novamente o coloca simplesmente repassando texto novamente. Este o mecanismo que permite a incluso de cdigo PHP dentro do

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


HTML: qualquer coisa fora das tags PHP deixada como encontrado, enquanto tudo dentro interpretado e executado. H quatro conjuntos de tags que podem ser usadas para marcar blocos de cdigo PHP. Delas, somente duas (<?php. . .?> e <script language="php">. . .</script>) so sempre disponveis. As outras podem ser ativadas ou desativadas a partir do arquivo de configurao php.ini. Enquanto as formas reduzidas das tags ou no seu estilo ASP serem convenientes, elas no so portveis em todas as verses. Alm disso, se voc pretende incluir cdigo PHP em XML ou XHTML, voc precisar usar a forma <?php ... ?> para compatibilidade com o padro XML.

Delimitando o cdigo PHP


O cdigo PHP fica embutido no prprio HTML. O interpretador identifica quando um cdigo PHP pelas seguintes tags:
<?php comandos ?> <script language=php> comandos </script> <? comandos ?> <% comandos %>

O terceiro tipo consiste em uma abreviao do primeiro. Para utiliz-lo, necessrio habilitar a opo short_open_tag na configurao do PHP, tornando on. O ltimo tipo serve para facilitar o uso por programadores acostumados sintaxe de ASP. Para utiliz-lo tambm necessrio habilit-lo no PHP, atravs do arquivo de configurao php.ini, tornando on a opo asp_tags.

Alternagem avanada
<?php if ($expressao) { ?> <strong>Isso verdadeiro.</strong> <?php } else { ?> <strong>Isto falso.</strong> <?php } ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


Isso funciona como esperado porque quando o PHP encontra a tag de fechamento ?>, ele simplesmente comea a imprimir tudo at encontrar outra tag de abertura. Obviamente, o exemplo acima se aplica exibio de grandes blocos de texto, uma vez que sair do modo de interpretao do PHP geralmente mais eficiente que imprimir todo o texto atravs da construo de linguagem como o echo( ) ou funo print( ) e outras.

Separador de instrues
Instrues so separadas da mesma forma que o C ou o Perl - cada instruo termina com um ponto e vrgula. A tag de fechamento (?>) tambm implica no fim de uma instruo, ento os exemplos seguintes so equivalentes:
<?php echo "Isto um exemplo com vrgula"; ?> <?php echo "Isto um outro exemplo sem vrgula" ?>

Comentrios
O PHP suporta comentrios do 'C', 'C++' e Unix shell. Por exemplo:
<?php echo "Isto um exemplo"; //Comentrio de uma linha como no C++ /* Isto um comentrio de mais de uma linha e aqui temos outra linha como em C */ echo "Isto um outro exemplo"; echo "O ltimo exemplo"; #Comentrio no estilo Unix shell ?>

O comentrio de uma linha s tem efeito at o fim da linha ou fim do bloco de cdigo PHP atual, o que ocorrer primeiro.
<h1>Isto um <?php # echo " simples";?> exemplo.</h1> <p>No ttulo acima voc ler 'Isto um exemplo'.

Voc precisa ser cuidadoso com comentrios estilo 'C' encadeados, pois eles podem causar problemas em grandes blocos.
<?php /* echo "Isto um teste"; /* Este comentrio causar um erro */ */ ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

10

PHP 5 e MySQL 5 e Ajax


Nota: importante trabalhar com padres. Procure utilizar o formato C para comentrios e deixe de lado o formato shell.

Variveis
So cdigos em forma de palavras que carregam informaes que se alteram variam no decorrer de uma instruo. As variveis so muito teis, pois elas permitem uma flexibilidade na programao, onde no so possveis de antever determinadas situaes.

Regras para nomear as variveis


Para nomear suas variveis, preciso seguir algumas regras: Toda varivel em PHP tem seu nome composto pelo caractere $ e uma string, que deve iniciar por uma letra ou o caractere _. PHP case sensitive, ou seja, as variveis $integrator e $INTEGRATOR so diferentes. Por isso preciso ter muito cuidado ao definir os nomes das variveis. bom evitar os nomes em maisculas, pois como veremos mais adiante, o PHP j possui algumas variveis pr-definidas cujos nomes so formados por letras maisculas. Passagem por referncia O PHP 5 oferece um outro meio de atribuir valores a variveis: a atribuio por referncia. Isto significa que a nova varivel simplesmente referencia (em outras palavras, "torna-se um apelido para" ou "aponta para") a varivel original. Alteraes na nova varivel afetam a original e vice-versa. Isto significa tambm que nenhuma cpia realizada, de modo que a atribuio ocorre mais rapidamente. Entretanto, qualquer aumento de velocidade s ser realmente notado em loops complexos ou em atribuies de grandes matrizes (arrays) ou objetos.
<?php $item1 = 'Banana'; // Atribui o valor 'Banana' a varivel $item1 $item2 = &$item1; // Referecia $item1 atravs de $item2. $item2 = "O produto $item2"; // Altera $item2... echo $item2.'<br>'; echo $item1; // $item1 alterado tambm. ?> variaveis.php

Uma observao importante a se fazer: somente variveis nomeadas podem ser atribudas por referncia.

Variveis Predefinidas
O PHP oferece um grande nmero de variveis predefinidas para qualquer script que ele execute. Muitas destas variveis, entretanto, no podem ser completamente documentadas uma vez dependem de diversos fatores, como o servidor no qual scripts so executados, a verso e configurao deste servidor e outros.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

11

PHP 5 e MySQL 5 e Ajax


Variveis do servidor: $_SERVER
$_SERVER um array contendo informaes como headers, caminhos e localizaes do script. Os itens deste array so criados pelo servidor web. No h garantias que todos os servidores web gerem todas elas: alguns servidores talvez omitam algumas ou gerem outras que no esto listadas aqui. Mesmo assim, um grande nmero dessas variveis est de acordo com a especificao CGI 1.1, ento voc pode esperar encontr-las nesse array. Esta uma varivel superglobal, ou automaticamente global. Isto significa que ela disponvel em todos os escopos (nveis) de um script. Voc no precisa fazer um global $_SERVER; para poder acess-la dentro de funes ou mtodos, como era necessrio com $HTTP_SERVER_VARS (Disponvel em verses anteriores ao PHP 4.1.0). $HTTP_SERVER_VARS contm a mesmas informaes, mas ela no uma superglobal (note que $HTTP_SERVER_VARS e $_SERVER so variveis diferentes como tambm o PHP as manipula diferentemente). A seguir voc tem como exemplo algumas das utilizaes da varivel $_SERVER: 'PHP_SELF' O nome do arquivo do script atualmente em uso, relativo ao documento raiz. Por exemplo, $_SERVER['PHP_SELF'] em um script com o endereo http://integrator.com.br/php_self.php pode ser /php_self.php.
<?php echo $_SERVER['PHP_SELF']; ?> php_self.php

'SERVER_NAME' O nome host do servidor onde o script atual executado. Se o script est rodando em um host virtual, este ser o valor definido para aquele host virtual.
<?php echo $_SERVER['SERVER_NAME']; ?> server_name.php

'SERVER_SOFTWARE' A string de identificao do servidor, fornecida nos headers quando respondendo a requests.
<?php echo $_SERVER['SERVER_SOFTWARE']; ?> server_software.php

'SERVER_PROTOCOL'

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

12

PHP 5 e MySQL 5 e Ajax


Nome e nmero de reviso do protocolo de informao pelo qual a pgina foi requerida, por exemplo, HTTP/1.0.
<?php echo $_SERVER['SERVER_PROTOCOL']; ?> server_protocol.php

'REQUEST_METHOD' Contm o mtodo de request utilizando para acessar a pgina. Geralmente GET, HEAD, POST ou PUT. Com o exemplo abaixo, voc ter o retorno do mtodo de request GET, isso porque voc s est acessando a pgina, e os dados no vieram de um formulrio com mtodo POST.
<?php echo $_SERVER['REQUEST_METHOD']; ?> request_method.php

'QUERY_STRING' A query string (string de solicitao), se houver, pela qual a pgina foi acessada. Para a demonstrao do exemplo, a seguir, voc ira criar duas pginas:
<html> <head><title>Exemplo de variveis de servidor</title></head> <body> <a href="query_string.php?empresa=integrator">Vai at a pgina de query_string.php</a> </body> </html> env_query_string.php <?php echo $_SERVER['QUERY_STRING']; ?> query_string.php

O resultado ser empresa=integrator. Essas informaes foram recuperadas do cabealho http, da qual estava sendo passada pelo link. Veremos mais detalhes adiante, no uso de recuperao pelo mtodo GET. 'DOCUMENT_ROOT' O diretrio raiz sob onde o script atual executado, como definido no arquivos de configurao do servidor.
<?php echo $_SERVER['DOCUMENT_ROOT'];

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

13

PHP 5 e MySQL 5 e Ajax


?> document_root.php

'HTTP_ACCEPT_LANGUAGE' O contedo do header Accept-Language: da requisio atual, se houver. Exemplo pt-br.


<?php echo $_SERVER['HTTP_ACCEPT_LANGUAGE']; ?> http_accept_language.php

'HTTP_USER_AGENT' O contedo do header User_Agent: da requisio atual, se houver. uma string denotando o agente de usurio pelo qual a pgina acessada. Um exemplo tpico : Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586) ou Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0).
<?php echo $_SERVER['HTTP_USER_AGENT']; ?> http_user_agent.php

'REMOTE_ADDR' O endereo IP de onde o usurio est visualizado a pgina atual.


<?php echo $_SERVER['REMOTE_ADDR']; ?> remote_addr.php

Alm de outras coisas, o usurio pode ser bloqueado ou voc pode criar um contador personalizado. 'SCRIPT_FILENAME' O caminho absoluto o script atualmente em execuo.
<?php echo $_SERVER['SCRIPT_FILENAME']; ?> script_filename.php

'PATH_TRANSLATED' O caminho real do script relativo ao sistema de arquivos (no o document root), depois realizou todos os mapeamentos de caminhos (virtual-to-real). semelhante ao SCRIPT_FILENAME.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

14

PHP 5 e MySQL 5 e Ajax


No funcional no Windows.
<?php echo $_SERVER['PATH_TRANSLATED']; ?> path_translated.php

'SCRIPT_NAME' Contm o caminho completo do script atual. til para pginas que precisam apontar para elas mesmas (dinamicamente). Semelhante ao PHP_SELF.

<?php echo $_SERVER['SCRIPT_NAME']; ?> script_name.php

Usando strings de consulta


Uma string de consulta parte do URL que aparece depois de um ponto de interrogao. Por exemplo, o URL a seguir contm uma string de consulta: http://integrator.com.br/buscar/?p=Hypertext+Preprocessor Nesse exemplo, a string de consulta contm uma varivel denominada p cujo valor Hypertext Preprocessor. As strings de consulta so usadas para transmitir informaes do navegador para o servidor. Normalmente, voc no digita a string de consulta diretamente na barra de endereos do navegador. Ao contrrio, cria um link em uma pgina que contm a string de consulta. Veja um exemplo abaixo da utilizao de strings de consulta onde so oferecidas opes para o cliente:

<HTML> <HEAD><TITLE>Mas</TITLE></HEAD> <BODY> Pro favor, escolha o tipo de ma: <P><A HREF="string_cons_recebe.php?maca=vermelha">Vermelhas deliciosas</A> <P><A HREF="recebe_string_cons.php?maca=verde">Verdes maravilhosas</A> </BODY> </HTML> env_string_cons.php

No exemplo acima, vemos dois links de hipertexto para uma pgina denominada recebe_string_cons.php. O primeiro link transmite a string de consulta maca que contm o valor vermelha. A segunda string de consulta, tambm denominado maca, tm o valor de verde. Dentro da pgina recebe_string_cons.php, voc pode determinar o link escolhido pelo

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

15

PHP 5 e MySQL 5 e Ajax


cliente acessando o conjunto atravs de $HTTP_GET_VARS. Abaixo a pgina recebe_string_cons.php:
<HTML> <HEAD><TITLE>Sua ma escolhida</TITLE></HEAD> <BODY> <?php $maca = $HTTP_GET_VARS["maca"]; echo "Voc selecionou a ma $maca"; ?> </BODY> </HTML> recebe_string_cons.php

Variveis HTTP GET: $_GET


Contm um array associativo de variveis passadas para o script atual atravs do mtodo HTTP GET. Esta uma varivel 'superglobal', ou automaticamente global. Isto significa que ela disponvel em todos os escopos (nveis) de um script. O mesmo exemplo acima poderia ser feito da seguinte maneira:
<HTML> <HEAD><TITLE>Sua ma escolhida</TITLE></HEAD> <BODY> <?php $maca = $_GET["maca"]; echo "Voc selecionou a ma $maca"; ?> </BODY> </HTML> string_cons_recebe.php

Transmitindo diversas variveis de string de consulta


Voc pode transmitir diversas variveis de consulta em uma nica string. Para fazer isso, basta separ-las com o caractere &(e comercial). Veja o exemplo abaixo:
1. <HTML> 2. <HEAD><TITLE>Escola as frutas desejadas</TITLE></HEAD> 3. <BODY> 4. Pro favor, escolha o tipo de fruta: 5. <P><A HREF="rec_divs_str_cons.php?fruta=laranja&tipo=lima"> 6. Laranja Lima</A> 7. <P><A HREF="rec_divs_str_cons.php?fruta=maca&tipo=vermelho"> 8. Ma Vermelha</A> 9. <P><A HREF="rec_divs_str_cons.php?fruta=maca&tipo=verde"> 10. Ma Verde</A> 11. </BODY> 12. </HTML>

env_divs_str_cons.php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

16

PHP 5 e MySQL 5 e Ajax


Os links de hipertexto contm as strings de consulta que incluem duas variveis. Cada string de consulta contm tanto uma varivel denominada fruta, quanto uma varivel denominada tipo. Quando um usurio clica em um dos trs links, ambas as variveis de string de consulta so transmitidas para a pgina divs_str_cons.php. Veja o exemplo a seguir recuperando os valores passados pela pgina anterior:
<HTML> <HEAD><TITLE>Frutas escolhidas</TITLE></HEAD> <BODY> Voc selecionou: <P>Fruta: <?php echo $_GET["fruta"]?></P> <P>Tipo: <?php echo $_GET["tipo"]?></P> </BODY> </HTML> rec_divs_str_cons.php

Variveis da requisio: $_REQUEST


A varivel superglobal $_REQUEST usada para trabalhar tanto com requisies via mtodo POST, como com mtodos via GET e COOKIE.
<HTML> <HEAD><TITLE>Frutas escolhidas</TITLE></HEAD> <BODY> Voc selecionou: <P>Fruta: <?php echo $_REQUEST["fruta"]?></P> <P>Tipo: <?php echo $_REQUEST["tipo"]?></P> </BODY> </HTML> rec_divs_str_request.php

Transmitindo caracteres especiais em uma string de consulta


No permitido incluir espaos ou outros caracteres especiais no nome ou valor de uma varivel de string de consulta. Por exemplo, suponhamos que voc quisesse transmitir o conjunto de caracteres Laranja Lima em uma varivel de string de consulta. Voc pode fazer isso como mostrado abaixo:
<HTML> <HEAD><TITLE>Transmitindo caracteres especiais</TITLE></HEAD> <BODY> <A HREF="receb_caract_esp.php?fruta=Laranja Lima">Laranja Lima</A> </BODY> </HTML> trans_caract_esp.php

<HTML> <HEAD><TITLE>Transmitindo caracteres especiais</TITLE></HEAD>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

17

PHP 5 e MySQL 5 e Ajax


<BODY> <?php echo $_GET["fruta"]; ?> </BODY> </HTML> receb_caract_esp.php

Esta pgina contm um link de hipertexto com uma varivel de string de consulta denominada fruta. Entretanto, ao clicar sobre esse link, o valor da string de consulta no ser transmitido corretamente para a pgina receb_caract_esp.php em navegadores antigos. O valor da string de consulta ser truncado (retirado) no primeiro espao. Antes de transmitir uma string de consulta que contm caracteres especiais ou espaos, voc deve codificar como URL na string de consulta. Quando a string codificada, possveis caracteres problemticos sero substitudos. No exemplo a seguir veja a transmisso sendo codificada para ser enviada:
<html> <head><title> Transmitindo caracteres especiais</title></head> <body> <?php $string=urlencode("Laranja Lima"); ?> <A HREF="receb_caract_esp.php?fruta=<?php echo $string?>"> Laranja Lima </A> </body> </html> trans_caract_esp_cod.php

Um outro exemplo clssico ocorre quando as strings sero passadas em uma consulta. O usurio pode querer digitar caracteres especiais que causam problemas quando so tratados de maneira comum na URL. Como o caso do & e comercial. Veja abaixo o exemplo sem e com a codificao:
<html> <head><title> Transmitindo caracteres especiais</title></head> <body> <?php $string="Flambers&Noble Ltda."; ?> <A HREF="receb_caract_esp_novo.php?empresa= <?php echo $string?>">A empresa do momento</A> </body> </html> trans_caract_esp_novo.php <HTML> <HEAD><TITLE>Transmitindo caracteres especiais</TITLE></HEAD> <BODY> <?php echo $_GET["empresa"]; ?> </BODY>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

18

PHP 5 e MySQL 5 e Ajax


</HTML> receb_caract_esp_novo.php

No exemplo acima, voc nota nitidamente que parte dos caracteres no foram recebidos. Isso demonstra que importante o uso do mtodo urlencode( ).
1. <html> 2. <head><title> Transmitindo caracteres especiais </title></head> 3. <body> 4. <?php 5. $string=urlencode("Flambers&Noble Ltda."); 6. ?> 7. <A HREF="receb_caract_esp_novo.php?empresa= 8. <?php echo $string?>">A empresa do momento</A> 9. </body> 10. </html> trans_caract_esp_dec_novo.php

Array Associativo de recebimento de formulrio


Para permitir que um cliente se registre em seu site da Web, preencha um formulrio ou informe o nmero de seu carto de crdito, preciso usar um formulrio HTML. Para recuperar as informaes que o cliente inclui no formulrio HTML, voc utiliza um conjunto de Arrays Associativos: $_POST, $ _GET e $_FILES, por exemplo. O mtodo mais comum de envio de formulrios o POST.
<html> <head> <title>Usando Array Associativo pelo mtodo POST</title> </head> <body> <FORM METHOD="POST" ACTION="receb_met_post.php"> Seu nome: <INPUT TYPE="TEXT" NAME="nome" /><BR /> <INPUT TYPE="SUBMIT" VALUE="Enviar"/> </FORM> </body> </html> env_met_post.php

<HTML><HEAD> <TITLE>Recebendo dados via formulrio pelo mtodo POST</TITLE></HEAD> <BODY> <?php echo $HTTP_POST_VARS["nome"]; ?> </BODY> </HTML> receb_met_post.php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

19

PHP 5 e MySQL 5 e Ajax


Usando a superglobal $_POST voc tem o mesmo efeito:
<HTML> <HEAD><TITLE>Recebendo dados via formulrio pelo mtodo POST</TITLE></HEAD> <BODY> <?php echo $_POST ["nome"]; ?> </BODY> </HTML> receb_met_post.php

Usando o mtodo GET voc tem a mesma funcionalidade dos envios criados por strings diretas nos links:
<html> <head><title>Usando Array Associativo pelo mtodo GET</title></head> <body> <FORM METHOD="GET" ACTION="receb_met_get.php"> Seu nome: <INPUT TYPE="TEXT" NAME="nome" /><BR /> <INPUT TYPE="SUBMIT" VALUE="Enviar"/> </FORM> </body> </html> env_met_get.php <HTML> <HEAD><TITLE>Recebendo dados via formulrio pelo mtodo GET</TITLE></HEAD> <BODY> <?php echo $_GET["nome"]; ?> </BODY> </HTML> receb_met_get.php

Obs: As variveis de arrays longas como $HTTP_GET_VARS[ ] ou $HTTP_POST_VARS[ ] so consideradas depreciadas e, portanto no so de uso recomendvel, j que em verses posteriores podem vir desativadas por padro e com o tempo desaparecer. A partir da verso do PHP 5.0.0 pode-se desativar com a diretiva register_long_arrays=Off no arquivo PHP.INI.

Problemas com migraes em verses inferiores ao PHP 4.2


Em verses anteriores ao PHP 4.2, existia uma forma de requisitar dados POST, GET e outros de forma global, sem necessidade de declarao de variveis pr-definidas. Isso deixou de ser possvel graas diretiva register_globals=Off no PHP.INI, que, por motivos de segurana, passou a ficar desativada.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

20

PHP 5 e MySQL 5 e Ajax


Cotas mgicas no PHP
A diretiva de configurao do PHP magic_quotes_gpc afeta os valores de GET, POST e Cookies. Se estiver ativada, o valor (Marca Dgua Verso 2006) se tornar automaticamente (Marca D\gua \Verso 2006\). Escaping necessrio para insero em bancos de dados. Abaixo um exemplo:
1. 2. 3. 4. 5. <html> <head><title>Usando caracteres de escape</title></head> <body> <FORM METHOD="POST" ACTION="receb_met_post_esc.php"> Dados: <INPUT TYPE="TEXT" NAME="dados" VALUE= "Marca d gua" /><BR /> 6. <INPUT TYPE="SUBMIT" VALUE="Enviar"/> 7. </FORM> 8. </body> 9. </html> env_met_post_esc.php <HTML> <HEAD><TITLE>Usando caracteres de escape</TITLE></HEAD> <BODY> <?php echo $_POST ["dados"]; ?> </BODY> </HTML> receb_met_post_esc.php

stripslashes( )
Ao receber informaes com apstrofo ou aspas, as cotas mgicas automaticamente colocam caracteres de escape. Para que estes caracteres de escape no apaream, utilize o mtodo stripslashes( ). Abaixo o mesmo exemplo de recebimento s que com a utilizao do mtodo.
<HTML> <HEAD><TITLE>Usando caracteres de escape</TITLE></HEAD> <BODY> <?php echo stripslashes($_POST ["dados"]); ?> </BODY> </HTML> receb_met_post_esc.php

addslashes( )
Caso as informaes estejam sendo enviadas para uma base de dados, importante se previnir com o mtodo addslashes( ). Assim, os caracteres de escape so forados,

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

21

PHP 5 e MySQL 5 e Ajax


evitando erros possveis causados pelas aspas e apstrofos, principalmente quando as cotas mgicas no foram configuradas por voc e sim, pelo administrador, onde hospedado seu site PHP.
<HTML> <HEAD><TITLE>Usando caracteres de escape</TITLE></HEAD> <BODY> <?php $dados=addslashes($_POST ["dados"]); echo $dados; ?> </BODY> </HTML> receb_met_post_esc.php

Usando objetos de aplicao e sesso


A capacidade de identificar os clientes e personalizar contedo importante porque pode ser usada para aumentar as vendas. Um exemplo simples: talvez voc queira exibir anncios distintos para clientes diferentes, de acordo com seus interesses. Se voc registrou o fato de que um determinado cliente gosta de visitar as pginas de seu site da Web que mostram varas de pescar, pode mostrar automaticamente a esse cliente mais anncios relacionados a material de pesca.

Usando cookies para monitorar os clientes


Os cookies receberam grande ateno da mdia nos ltimos tempos pelo medo de que poderiam representar uma ameaa privacidade das pessoas. Voc pode usar um cookie para armazenar informaes no computador de um cliente quando ele visitar seu site da Web. Essas informaes podem ser usadas para identificar o cliente quando ele retornar ao seu site. Os cookies foram desenvolvidos pela Netscape para corrigir uma deficincia observada na interao entre servidores da Web e navegadores. Sem os cookies, a interao entre os servidores e navegadores sairiam do controle.
Curiosidade: De onde vem o termo cookie? Lou Montulli, que programou a especificao original do cookie para a Netscape, explica: Cookie um termo bastante conhecido em computao, utilizado quando se descreve uma parte opaca de dados mantida por um intermedirio. O termo se aplica perfeitamente ao uso; simplesmente no muito conhecido fora da rea da computao.

H dois tipos de cookies: cookies de sesso e cookies persistentes. Os cookies de sesso so armazenados na memria. Permanecem no computador do cliente somente enquanto ele est visitando o seu site da Web. O cookie persistente, por outro lado, podem durar meses ou at anos. Os cookies persistentes so armazenados em um arquivo de texto no computador do cliente. Esse arquivo de texto denominado arquivo Cookie nos computadores com sistema operacional Windows e arquivo Magic Cookie nos computadores Macintosh.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

22

PHP 5 e MySQL 5 e Ajax


O Netscape Navigator e o Internet Explorer armazenam cookies persistentes de forma um pouco diferente. O Netscape armazena todos os cookies de todos os sites da Web em um arquivo denominado Cookies.txt. Esse arquivo fica no diretrio/Netscape ou /Netscape/User/Nomedousuario.. J o Microsoft Internet Explorer cria um arquivo cookie independente para cada site da Web. Todos esses arquivos esto armazenados na pasta root:\Documents and Settings\Administrador\Cookies. importante entender que um site da Web s consegue ler os cookies que ele cria. Tambm importante compreender que nem todos os navegadores suportam cookies. Jamais pressuponha que o navegador de um cliente suporta cookies. Um uso perfeitamente legtimo dos cookies promover o login automtico de um usurio ao seu site da Web. Entretanto, se voc fizer isso, deve permitir que os usurios cujos computadores que no suportam cookies tambm faam o login. O PHP suporta transparentemente cookies HTTP como os definidos pela especificao da Netscape. Cookies so um mecanismo de armazenamento de dados no browser cliente e permite o rastreamento ou identificao do retorno de usurios. Voc pode criar cookies com a funo setcookie( ). Cookies so parte do cabealho HTTP, ento, a funo setcookie( ) precisa ser chamada antes de qualquer sada ser enviada ao browser. Esta a mesma restrio da funo header( ). Quaisquer cookies enviados para voc do cliente sero automaticamente transformados em variveis PHP assim como os dados postados via GET ou POST. A funo tem o seguinte escopo:
int setcookie ( string nome [, string valor [, int expirao [, string caminho [, string domnio [, int segurana]]]]])

Todos os argumentos, exceto o nome so opcionais. A expirao um argumento de tempo em inteiro regular do Unix, portanto somente poder ser retornado pelas funes time( ) ou mktime( ).
<?php setcookie("MeuCookie", "Testando", time()+3600); ?> <html> <head> <title>Exemplo de Cookie</title> </head> <body> <h1>Seu cookie foi enviado com sucesso</h1> </body> </html> env_cookie.php

Neste exemplo mostro claramente que o cookie deve ser enviado para o cliente antes de qualquer sada. Este um exemplo de cookie com erro:
<html> <head> <?php setcookie("MeuCookie", "Testando", time()+3600);

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

23

PHP 5 e MySQL 5 e Ajax


?> <title>Exemplo de Cookie</title> </head> <body> <h1>Seu cookie foi enviado com sucesso</h1> </body> </html> env_cookie_err.php

Este exemplo ter uma sada com o seguinte erro: Warning: Cannot modify header information - headers already sent by (output started at $PATH\ env_cookie_err.php:3) $PATH\ env_cookie_err.php in on line 4 Se voc precisa armazenar mltiplos valores em um nico cookies, basta apenas acrescentar [ ] ao nome do cookie. Por exemplo: setcookie("MeuCookie[ ]", "Testando", time( )+3600); Note que um cookie substituir um anterior com o mesmo nome em seu browser mesmo se o nome ou o caminho for diferente. Para exibir o cookie criado:
<HTML> <HEAD><TITLE>Recebendo Cookie</TITLE></HEAD> <BODY> <?php echo $HTTP_COOKIE_VARS["MeuCookie"]; ?> </BODY> </HTML> rec_cookie.php

Mas voc tambm pode obter o valor do Cookie usando o mtodo abreviado:
echo $_COOKIE["MeuCookie"];

Removendo um cookie criado Para remover um cookie criado, voc deve retroceder o tempo utilizado na criao do mesmo.
<? setcookie ("MeuCookie", "", time() - 3600); ?> remove_cookie.php

Usando variveis de sesso para controlar clientes


Voc pode usar variveis Session como um mtodo para controlar as informaes sobre os clientes quando eles se movimentam de uma pgina para outra dentro do seu site da Web. As variveis Session esto intimamente relacionadas aos cookies. Na verdade, as

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

24

PHP 5 e MySQL 5 e Ajax


variveis Session baseiam-se nos cookies. Voc pode usar as variveis Session para armazenar qualquer tipo de informao. Para que a sesso funcione no Sistema Operacional Windows, voc deve editar o caminho para que seja guardada corretamente no sistema. Para isso, v at o PHP.INI e altere a seguinte informao: PHP.INI no sistema operacional Windows
[Session] ;Neste local, por padro, o arquivo est configurado para ;trabalhar no UNIX/LINUX. ;altere o path para o caminho do Windows. session.save_path = C:\temp <?php session_start(); $_SESSION['nome']="Edson"; ?> <html> <head><title>Exemplo da utilizao da Sessio<title></head> <body> <A HREF="session_recup.php">Prxima Pgina</A> </body> </html> session_inicio.php <? session_start(); if(!isset($_SESSION["nome"])) header("location:session_inicio.php"); ?> <HTML> <HEAD><TITLE>Recuperando uma Session</TITLE></HEAD> <BODY> <?php echo "Ol ".$_SESSION["nome"].", como vai?"; ?> <BR /><A HREF="session_finalizar.php">Fechar a sesso</A> </BODY> </HTML> session_recup.php

No exemplo acima, na recuperao da Session, temos a construo da linguagem isset( ) que responsvel pela verificao de existir ou no um valor na session. Se existir ele retorna true(verdadeiro), caso no aja nada, ele retornar false(falso).

<?php session_start(); unset($_SESSION['nome']); ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

25

PHP 5 e MySQL 5 e Ajax


<html> <head><title>Finalizando uma Sesso</title></head> <body> A varivel <?php echo $_SESSION['nome']?> foi finalizada. </body> </html> session_finalizar.php

Para finalizar uma sesso, a construo da linguagem unset( ) destri a varivel especfica. Nota: Tanto isset( ) como unset( ) no so apenas usadas em sesses.

Tipos
O PHP suporta os oitos tipos primitivos. So quatros tipos bsicos: boolean integer float (nmero de ponto flutuante, ou tambm 'double') string Dois tipos compostos: array object E finalmente dois tipos especiais: resource NULL Voc tambm pode encontrar algumas referncias ao tipo double. Considere o tipo double como sendo o float, e os dois nomes existem por razes histricas. <?php $i = 10; // Inteiro $nome = "Edson"; // String $falso = FALSE; // Booleano $valor = 100.50; /// Ponto flutuante $nulo = NULL; echo '$i do Tipo ' . gettype($i) . '<br>'; echo '$nome do Tipo ' . gettype($nome) . '<br>'; echo '$falso do Tipo ' . gettype($falso) . '<br>'; echo '$nulo do Tipo ' . gettype($nulo) . '<br>'; echo '$valor do Tipo ' . gettype($valor); ?> tipos_no_php5.php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

26

PHP 5 e MySQL 5 e Ajax


Booleanos Para especificar um literal booleano, use as palavras chave TRUE ou FALSE. Ambas so insensitivas ao caso. Inteiros Inteiros podem ser especificados em notao decimal (base 10), hexadecimal (base 16) ou octal (base 8), opcionalmente precedido de sinal (- ou +). O tamanho de um inteiro dependente de plataforma, sendo um numero aproximado a 2 bilhes o valor mais comum (nmero de 32 bits com sinal). Overflow de inteiros Se voc especifica um nmero alm dos limites do tipo inteiro, ele ser interpretado como um ponto flutuante. Nmeros de pontos flutuantes O tamanho de um nmero de ponto flutuante dependente de plataforma, sendo o mximo com uma preciso de 14 decimais digitais. Strings Uma string uma srie de caracteres. No PHP, um caracter o mesmo que um byte, ou seja, h exatamente 256 caracteres diferentes possveis. No h nenhum problema se as strings se tornarem muito grandes. No h nenhum limite para o tamanho de strings imposta pelo PHP, ento no h razo para se preocupar com strings longas. Arrays Um array no PHP atualmente um mapa ordenado. Um mapa um tipo que relaciona valores para chaves. Este tipo otimizado de vrias maneiras, ento voc pode us-lo como um array real, ou uma lista (vetor), hashtable (que uma implementao de mapa), dicionrio, coleo, pilha, fila e provavelmente mais. Como voc pode ter outro array PHP como um valor, voc pode facilmente simular rvores. Arrays sero abordados mais adiante em matrizes. Objetos Mais adiante sero abordados objetos. Resource Recurso uma varivel especial, mantendo uma referncia de recurso externo. Recursos so criados e utilizados por funes especiais. Mais adiante voc aprender a usar resource com conexo a banco de dados MySQL (essa uma das formas). NULL O valor especial NULL representa que a varivel no tem valor.

Heredoc em Strings
Outra maneira para delimitar strings utilizando a sintaxe heredoc ("<<<"). informado um identificador depois de <<<, ento a string, e ento o mesmo identificador para fechar a delimitao. O identificador de fechamento precisa comear na primeira coluna da linha. Alm, o identificador utilizado precisa seguir as mesmas regras de nomeao que qualquer outro

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

27

PHP 5 e MySQL 5 e Ajax


rtulo no PHP: s pode conter caracteres alfanumricos e sublinhados, e precisa comear com um caracter no numrico ou sublinhado. <?php $var1="Exemplo de string"; $var_string = <<< DOC Exemplo da sintaxe heredoc, os caracteres escape Funcionam, por exemplo, \\ (barra invertida) e \$, alm disso, funciona tambm: \$var1 = $var1 DOC; echo "<pre>$var_string</pre>"; ?> heredoc.php

Interpretao de variveis
Quando uma string especificada dentro de aspas ou heredoc, variveis so interpretadas dentro delas. H dois tipos de sintaxe: um simples e um complexo. A sintaxe simples a mais comum e conveniente, provendo uma maneira de interpretar uma varivel, um valor de array ou uma propriedade de object. A sintaxe completa foi introduzida no PHP 4, e pode ser reconhecida por chaves ({}) envolvendo a expresso. <?php $cerveja = 'Heineken'; echo "O sabor das '$cerveja's timo <br />"; // funciona, " ' " um caracter invlido para nome de variveis echo "Ele bebeu algumas $cervejas <br />"; // no funciona, 's' um caracter vlido para nome de variveis echo "Ele bebeu algumas ${cerveja}s <br />"; // funciona ?> interp_vars.php Uma outra utilidade desse tipo de interpretao est na impresso de variveis como $_GET, $_POST e etc: Veja o exemplo dessa utilizao aplicada a um exemplo anterior:
<HTML> <HEAD><TITLE>Mas</TITLE></HEAD> <BODY> Pro favor, escolha o tipo de ma: <P><A HREF="recebe_string_cons.php?maca=vermelha"> Vermelhas deliciosas</A> <P><A HREF="recebe_string_cons.php?maca=verde"> Verdes maravilhosas</A> </BODY> </HTML> env_string_cons.php <HTML>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

28

PHP 5 e MySQL 5 e Ajax


<HEAD><TITLE>Sua ma escolhida</TITLE></HEAD> <BODY> <?php echo "Voc selecionou a ma {$_GET['maca']}"; ?> </BODY> </HTML> recebe_string_cons.php

Sem os colchetes haveria um erro: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in $PATH\recebe_string_cons.php on line 5

Coero de tipo
O PHP possui a converso automtica de tipo, chamada tambm de coero de tipo automtica. O PHP no requer (ou suporta) a definio de tipo explicita na declarao de variveis: o tipo de uma varivel determinado pelo contexto em que a varivel utilizada. Isto significa que, se voc assimila um valor string para a varivel $var, $var se torna uma string. Se voc ento assimila um valor inteiro para $var, ela se torna um inteiro. <?php $var1 = "0"; // $var1 string (ASCII 48) echo $var1."<br />"; $var1 += 2; // $var1 agora um inteiro (2) echo $var1."<br />"; $var1 = $var1 + 1.3; // $var1 agora um float (3.3) echo $var1."<br />"; $var1 = 5 + "10 pequenos porcos"; // $var1 inteiro (15) echo $var1."<br />"; $var1 = 5 + "10 minsculos porcos"; // $var1 inteiro (15) echo $var1."<br />"; ?> var_tipos.php

Type Casting Coero de tipo


A coero de tipos no PHP funciona como no C: o nome de um tipo desejado escrito entre parnteses antes da varivel em que se deseja a coero. <?php echo (int)((0.1+0.7)*10.10)?><br /> <!--retorna o valor 8--> <?php echo ((0.1+0.7)*10.10)?> <!--retorna o valor 8.08--> type_casting.php Nos dois casos, o resultado seria o mesmo, se no houvesse a coero de tipo para (int). O valor flutuante truncado, restando apenas o valor inteiro. As coeres permitidas so: (int), (integer) - coero para inteiro (bool), (boolean) - coero para booleano

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

29

PHP 5 e MySQL 5 e Ajax


(float), (double), (real) - coero para nmero de ponto flutuante (string) - coero para string (array) - coero para array (object) - coero para objeto

Nota: Caso a sua inteno no seja fazer a coero, mas arredondar o valor, use o mtodo round( ). Com o mtodo gettype( ) voc consegue pegar o tipo. Usando o mtodo var_dump( ) voc consegue receber o valor e tambm saber o seu tipo, mostrando assim informaes sobre a varivel. <?php $numero = 2147483647; $numero2 = $numero * 10; echo gettype($numero2) . "<br>"; $numero3 = 1000; var_dump($numero*$numero3); ?> usando_var_dump.php

Constantes
Como j foi visto anteriormente, podemos alterar o valor de uma varivel armazenada. Tambm podemos declarar constantes. Uma constante armazena um valor como uma varivel, mas seu valor configurado uma vez e, ento, no pode mais ser alterado em outra parte do script. Por isso o nome Constante.
<?php define("EXEMPLO","Texto que acompanha a constante"); define("EXEMPLO2",12); //valor que acompanha a constante ?> <html> <head> <title>Constantes</title> </head> <body> <?php echo EXEMPLO?><br> <?php echo EXEMPLO2?> </body> </html> constante.php

Voc notar que os nomes da constante esto inteiramente em letras maisculas. Essa uma conveno emprestada de C que facilita distinguir rapidamente entre variveis e constantes. Uma diferena importante entre constantes e variveis que quando voc referencia a uma constante, ela no tem um sinal de cifro na sua frente. Se quiser utilizar o valor de uma constante, utilize somente seu nome. A regra para uma constante simples:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

30

PHP 5 e MySQL 5 e Ajax


Constantes no podem ter um sinal de cifro ($) antes delas; Constantes s podem ser definidas utilizando a funo define( ), e no por simples assimilao; Constantes podem ser definidas e acessadas de qualquer lugar sem que as regras de escopo de variveis sejam aplicadas; Constantes no podem ser redefinidas ou eliminadas depois que elas so criadas; e Constantes s podem conter valores escalares.

As constantes tambm podem ser configuradas, para que, sejam lidas sem ser case sensitive, passando um terceiro parmetro, como mostra o exemplo a seguir em destaque: <?php define("VALOR",10); define("FRUTA","Manga",True); echo "Fruta = " . fruta . "<br />"; // ou Fruta ou FRUTA , tanto faz echo "Valor = " . VALOR . "<br />"; // Ok echo "Valor = " . Valor . "<br />"; // No ir funcionar, pois no h terceiro parmetro define("VALOR",990); // Provocar um erro ?> outros_ex_contantes.php

Operadores
Os operadores so smbolos que voc pode utilizar para manipular valores e variveis realizando uma operao neles. Em geral, os operadores podem aceitar um, dois ou trs argumentos, com a maioria aceitando dois. Por exemplo, o operador de atribuio aceita dois a posio de memria no lado esquerdo do smbolo "=" e uma expresso no lado direito. Esses argumentos so chamados de operandos, isto , aquilo que est sendo operado.

Operadores Aritmticos
Lembra-se da aritmtica bsica da escola? Estes operadores funcionam exatamente como aqueles. Tabela dos Operadores Aritmticos exemplo nome Resultado $a + $b Adio Soma de $a e $b. $a - $b Subtrao Diferena entre $a e $b. $a * $b Multiplicao Produto de $a e $b. $a / $b Diviso Quociente de $a por $b. $a % $b Mdulo Resto de $a dividido por $b.

Operadores de Atribuio
O operador bsico de atribuio "=". A sua primeira inclinao deve ser a de pensar nisto como " igual". No. Isto quer dizer, na verdade, que o operando da esquerda

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

31

PHP 5 e MySQL 5 e Ajax


recebe o valor da expresso da direita (ou seja, " setado para"). O valor de uma expresso de atribuio o valor atribudo. Ou seja, o valor de "$a = 3" 3. Isto permite que voc faa alguns truques:
$a = ($b = 4) + 5; // $a igual a 9 agora // e $b foi setado para 4.

Alm do operador bsico de atribuio, h "operadores combinados" para todos os operadores binrios, aritmticos e de string que permitem a voc usar um valor em uma expresso e ento setar seu valor para o resultado daquela expresso. Por exemplo:
$a $a $b $b = 3; += 5; // seta $a para 8, como se dissssemos: $a = $a + 5; = "Ol "; .= "voc a!"; // seta $b para "Ol voc a!"

Nota: O ponto aqui se destina concatenao (unio de strings).

Operadores de Comparao
Operadores de comparao, como os seus nomes implicam, permitem que voc compare dois valores. Tabela de Operadores de comparao exemplo nome Resultado $a == $b Igual Verdadeiro se $a igual a $b. $a === $b Idntico Verdadeiro se $a igual a $b, e eles so do mesmo tipo. $a != $b Diferente Verdadeiro se $a no igual a $b. $a < $b Menor que Verdadeiro se $a estritamente menor que $b. $a > $b Maior que Verdadeiro se $a estritamente maior que $b. $a <= $b Menor ou igual Verdadeiro se $a menor ou igual a $b. $a >= $b Maior ou igual Verdadeiro se $a maior ou igual a $b. Veja abaixo alguns exemplos de suas utilizaes:
<?php $a=5; $b=5.0; if($a==$b) echo "So iguais"; // Estes valores so iguais ?> util_igualdade.php <?php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

32

PHP 5 e MySQL 5 e Ajax


$a=5; $b=5.0; if($a===$b) echo "So iguais"; else echo "So de tipos diferentes"; //Neste so de tipos diferentes ?> util_identico.php

O util_identico.php ilustra a utilizao de idntico === onde no s comparado a igualdade como tambm o tipo de valor que cada varivel carrega, isso , se Inteiro ou nmero de ponto Flutuante. Neste caso ele ir imprimir na tela "So de tipos diferentes".
<?php $a=5; $b=7; if($a!=$b) echo "So diferentes"; //So diferentes um do outro ?> util_diferente.php <?php $a=5; $b=3; if($a>$b) echo 'A varivel $a maior do que $b'; //No caso uma varivel tem valor maior que a outra ?> util_maior.php <?php $a=5; $b=7; if($a<$b) echo 'A varivel $a menor do que $b'; //No caso uma varivel tem valor menor que a outra ?> util_menor.php <?php $a=5; $b=3; if($a>=$b) echo A varivel $a maior ou igual a $b; // Uma varivel pode ter valor maior ou igual outra ?> util_maior_igual.php <?php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

33

PHP 5 e MySQL 5 e Ajax


$a=4; $b=8; if($a<=$b) echo A varivel $a menor ou igual a $b; // Uma varivel pode ter valor menor ou igual outra ?> util_menor_igual.php

Operadores de controle de erro


O PHP suporta um operador de controle de erro: o sinal 'em' (@). Quando ele precede uma expresso em PHP, qualquer mensagem de erro que possa ser gerada por aquela expresso ser ignorada.
<html> <head><title>Operador de controle de erro</title></head> <body> <?php @session_start(); ?> </body> </html> ocultando_erro.php

No exemplo acima, voc tentou criar a abertura da sesso dentro de sadas de HTML. Isso no possvel, portanto gera um erro. Com o arroba na frente, essa possibilidade fica nula, no gerando assim sada de erros. No uma boa prtica ocultar erros na criao de seus scripts. Isso porque voc pode ocultar problemas que de certa forma ficam complexos de serem detectados devido essa ocultao.

Operadores de Incremento/Decremento
O PHP suporta operadores de pr e ps-incremento e decremento no estilo C. Tabela de Operadores de Incremento/Decremento exemplo Nome Efeito ++$a Pr-incremento Incrementa $a de um, e ento retorna $a. $a++ Ps-incremento Retorna $a, e ento incrementa $a de um. --$a Pr-decremento Decrementa $a de um, e ento retorna $a. $a-Ps-decremento Retorna $a, e ento decrementa $a de um. Aqui est um script de exemplo simples:
<HTML> <HEAD><TITLE>Incremento e decremento</TITLE></HEAD> <BODY> <?php echo "<h3>Ps-incremento</h3>"; $a = 5; echo "Deve ser 5: " . $a++ . "<br>\n";

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

34

PHP 5 e MySQL 5 e Ajax


echo "Deve ser 6: " . $a . "<br>\n"; echo $a = echo echo echo $a = echo echo "<h3>Pr-incremento</h3>"; 5; "Deve ser 6: " . ++$a . "<br>\n"; "Deve ser 6: " . $a . "<br>\n"; "<h3>Ps-decremento</h3>"; 5; "Deve ser 5: " . $a-- . "<br>\n"; "Deve ser 4: " . $a . "<br>\n";

echo "<h3>Pr-decremento</h3>"; $a = 5; echo "Deve ser 4: " . --$a . "<br>\n"; echo "Deve ser 4: " . $a . "<br>\n"; ?> </BODY> </HTML> incremento_decremento.php

Operadores Lgicos
Tabela de Operadores Lgicos exemplo nome resultado $a and $b E Verdadeiro se tanto $a quanto $b so verdadeiros. $a or $b OU Verdadeiro se $a ou $b so verdadeiros. $a xor $b XOR Verdadeiro se $a ou $b so verdadeiros, mas no ambos. ! $a NO Verdadeiro se $a no verdadeiro. $a && $b E Verdadeiro se tanto $a quanto $b so verdadeiros. $a || $b OU Verdadeiro se $a ou $b so verdadeiros. A razo para as duas variantes dos operandos "and" e "or" que eles operam com precedncias diferentes.

Operadores de String
H dois operadores de string. O primeiro o operador de concatenao '.' (ponto), que retorna a concatenao dos seus argumentos direito e esquerdo. O segundo o operador de atribuio de concatenao '.=' (ponto-igual).

Operadores de Arrays
Tabela de Operadores de Arrays Exemplo Nome Resultado $a + $b Unio Unio de $a e $b. $a == $b Igualdade TRUE se $a e $b tem os mesmos elementos. TRUE se $a e $b tem os mesmos elementos na mesma $a === $b Identidade ordem.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

35

PHP 5 e MySQL 5 e Ajax


Tabela de Operadores de Arrays Exemplo Nome Resultado $a != $b Desigualdade TRUE se $a no igual a $b. $a <> $b Desigualdade TRUE se $a no igual a $b. $a !== $b No identidade TRUE se $a no idntico a $b. O operador + acrescenta o array da direita no array da esquerda, contudo, chaves duplicadas NO so sobrescritas. Veja Matrizes mais adiante.

Estruturas de Controle
Qualquer script PHP construdo por uma srie de instrues. Uma instruo pode ser uma atribuio, uma chamada de funo, um 'loop', uma instruo condicional, ou mesmo uma instruo que no faz nada(um comando vazio). Instrues geralmente terminam com um ponto e vrgula. Alm disso, as instrues podem ser agrupadas em um grupo de comandos atravs do encapsulamento de um grupo de comandos com chaves. Um grupo de comandos uma instruo tambm.

Estruturas Condicionais if
A construo if uma das mais importantes implementaes de muitas linguagens, incluindo o PHP. Ela permite a execuo condicional de fragmentos de cdigo. O PHP implementa uma estrutura if que similar quela do C:
if (expressao) instrues

A condio expressao avaliada por seu contexto Booleano. Se expressao for avaliado como TRUE (verdadeiro), o PHP executar instrues, e se for avaliado como FALSE (falso), ele ser ignorado. Os exemplos a seguir mostrariam que a maior que b se $a for maior que $b:

if ($a > $b) echo "a maior que b";

Freqentemente voc vai querer ter mais que uma instruo seja executada condicionalmente. E claro, no h necessidade de englobar cada instruo com uma clusula if. Em vez disso, voc pode colocar vrias instrues em um agrupamento de comandos. Por exemplo, este cdigo mostraria a maior que b se $a for maior que $b, e ento atribuiria o valor de $a para $b:
if ($a > $b) { echo "a maior que b"; $b = $a; }

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

36

PHP 5 e MySQL 5 e Ajax


Comandos if podem ser aninhados indefinidamente dentro de outros comandos if, o que faz com que voc complete a flexibilidade para a execuo condicional de vrias partes do seu programa.

else
Freqentemente voc vai querer executar uma instruo se uma certa condio for encontrada, e uma instruo diferente se a condio no for encontrada. Isto o que o else faz. else estende um comando if para executar uma instruo caso a expresso no comando if seja avaliada como FALSE (falso). Por exemplo, o cdigo a seguir mostraria a maior que b se $a for maior que $b, e a NO maior que b caso contrrio:
if ($a > $b) { echo "a maior que b"; } else { echo "a NO maior que b"; }

O comando else s executado se a expresso if for avaliada como FALSE(falso), e se havendo qualquer expresso elseif, somente se todas elas forem avaliadas como FALSE(falso).

elseif
O comando elseif, como seu nome sugere, uma combinao de if e else. Da mesma forma que o else, ele estende um comando if para executar uma instruo diferente no caso de a expresso if original ser avaliada como FALSE (falso). Porm, ao contrrio de else, ele executar aquela expresso alternativa somente se a expresso condicional do elseif for avaliada como TRUE (verdadeiro). Por exemplo, o cdigo a seguir mostraria a maior que b, a igual a b ou a menor que b:
$a=5; $b=7; if ($a > echo } elseif echo } else { echo }

$b) { "a maior que b"; ($a == $b) { "a igual a b"; "a menor que b";

Podem haver vrios elseifs dentro da mesma instruo if. A primeira expresso elseif (se houver) que for avaliada como TRUE (verdadeiro) ser executada. No PHP, voc tambm pode escrever 'else if' (em duas palavras) e o comportamento ser idntico a um 'elseif' (em uma s palavra). O significado sinttico ligeiramente diferente (se voc est familiarizado com C, eles tem o mesmo comportamento), mas no final de contas ambos teriam exatamente o mesmo comportamento. O comando elseif s executado se a expresso if precedente e quaisquer expresses elseif anteriores forem avaliadas como FALSE (falso), e a expresso elseif atual for avaliada como TRUE(verdadeiro).

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

37

PHP 5 e MySQL 5 e Ajax


Sintaxe alternativa para estruturas de controle
O PHP oferece uma sintaxe alternativa para algumas das suas estruturas de controle: if, while, for, foreach e switch. Em cada caso, a forma bsica da sintaxe alternativa mudar o sinal de abertura para dois-pontos (:) e o sinal de fechamento para endif;, endwhile;, endfor;, endforeach; ou endswitch;, respectivamente.
<?php if ($a == 5): ?> A igual a 5 <?php endif; ?>

No exemplo acima, o bloco HTML "A igual a 5" est aninhado dentro de uma instruo if escrito na sintaxe alternativa. O bloco HTML ser mostrado somente se $a igual ao valor de 5. A sintaxe alternativa se aplica a else e elseif tambm. A seguir temos uma estrutura if com elseif e else no formato alternativo:
$a=7; if ($a == 5): echo "a igual a 5"; elseif ($a == 6): echo "a igual a 6"; else: echo "a no nem 5 nem 6"; endif;

Outra maneira de trabalhar com estruturas condicionais utilizando o switch. Mais adiante voc ter contato com a sintaxe.

Estruturas de Laos Condicionais (loops) while


Loops while so o tipo mais simples de criar um 'loop' em PHP. Eles se comportam como seus compatveis em C. O formato bsico de um comando while :
while (expressao) instrues

O significado de um comando while simples. Ele pede que o PHP execute os comandos aninhados repetidamente, enquanto a expresso do while avaliada como TRUE (Verdadeiro). O valor da expresso verificada cada vez que se passa no comeo do 'loop', desta forma, mesmo que esse valor mude durante a execuo do(s) comando(s) aninhado(s), a execuo no parar at que o fim da iterao (cada vez que o PHP executa os comandos dentro do 'loop' uma iterao). s vezes, se a expresso while avaliada como FALSE(Falso) logo no incio, o(s) comando(s) aninhado(s) no ser(o) rodado(s) nem uma vez sequer. Como no comando if, voc pode agrupar mltiplos comandos dentro do mesmo lao while englobando um grupo de instrues com chaves, ou usando a sintaxe alternativa:
while (expressao): instrucoes ... endwhile;

Os exemplos a seguir so idnticos, e ambos imprimem nmeros de 1 to 10:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

38

PHP 5 e MySQL 5 e Ajax


$i = 1; while ($i <= 10) { //enquanto $i for menor ou igual a 10 echo $i++; /* o valor impresso ser $i depois do acrscimo (ps-incremento) */ } $i = 1; while ($i <= 10): echo $i; $i++; endwhile;

do...while
Loops do..while so bem similares aos loops while, exceto pelo fato de que a condio verificada no fim de cada iterao em vez de no comeo. A diferena principal dos loops while regulares que a primeira iterao de um loop do..while garantidamente executada (a condio s verificada no fim da iterao) enquanto que ele pode no rodar necessariamente em um loop while normal (a condio verificada no comeo de cada iterao, se ela avaliada como FALSE (falsa) logo no comeo, a execuo do loop terminaria imediatamente). H apenas uma sintaxe para loops do..while:
$i = 0; do { echo $i; } while ($i>0);

O loop acima rodaria exatamente uma vez, desde que depois da primeira iterao, quando a condio verificada, ela avaliada como FALSE (falsa) ($i no maior que zero 0) e a execuo do loop termina.

for
Loops for so os laos mais complexos em PHP. Eles se comportam como os seus compatveis em C. A sintaxe de um loop for :
for (expressao1; expressao2; expressao3) instrues

A primeira expresso (expressao1) avaliada (executada) uma vez incondicionalmente no comeo do loop. No comeo de cada iterao, expressao2 avaliada. Se ela avaliada como TRUE (verdadeira), o loop continua e o(s) comando(s) aninhado(s) (so) executado(s). Se avaliada como FALSE (falsa), a execuo do 'loop' termina. No fim de cada iterao, expressao3 avaliada (executada). Cada uma das expresses pode ser vazia. expressao2 vazia significa que o loop pode rodar indefinidamente (PHP considera-a implicitamente como TRUE (verdadeira), como em C). Isto pode no ser to intil quanto voc pode pensar, pois freqentemente voc pode querer terminar o 'loop' usando uma instruo condicional em vez de usar a

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

39

PHP 5 e MySQL 5 e Ajax


expresso-verdade do for. Considere os seguintes exemplos. Todos eles mostram nmeros de 1 a 10:
for ($i = 1; $i <= 10; $i++) { echo $i; } for ($i = 1;;$i++) { if ($i > 10) { break; } echo $i; } $i = 1; for (;;) { if ($i > 10) { break; } echo $i; $i++; } for ($i = 1; $i <= 10; echo $i, $i++);

Obviamente, o primeiro exemplo parece ser o mais bonito (ou talvez o quarto), mas voc pode perceber que a possvel utilizao de expresses vazias em laos for se torna prtico em algumas ocasies. O PHP tambm suporta a "sintaxe de dois-pontos" alternativa para laos for:
for (expressao1; expressao2; expressao3): instrucoes; ...; endfor;

Existe ainda um outro tipo de loop que dotado para trabalhar com colees. Voc ver isso mais adiante.

Um caso a parte a estrutura do switch switch


A instruo switch similar a uma srie de instrues IFs seguidas. Em muitas ocasies, voc poder ter que comparar a mesma varivel (ou expresso) com muitos valores diferentes, executando cdigos diferentes dependendo com qual valor ele se encaixar. exatamente para isso que a instruo switch faz. Os exemplos seguintes mostram duas maneiras diferentes de escrever a mesma coisa, uma utilizando uma srie de ifs e a outra utilizando a instruo switch:
if ($i == 0) { echo "i igual a 0"; } if ($i == 1) { echo "i igual a 1";

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

40

PHP 5 e MySQL 5 e Ajax


} if ($i == 2) { echo "i igual a 2"; } switch ($i) { case 0: echo "i igual a 0"; break; case 1: echo "i igual a 1"; break; case 2: echo "i igual a 2"; break; }

importante entender como a instruo switch funciona para evitar enganos. A instruo switch executa linha a linha (atualmente, instruo a instruo). No incio, nenhum cdigo executado. Somente quando uma instruo case encontrada com um valor que combina com a expresso do switch faz com que o PHP execute as instrues a partir da. O PHP continua executando as instrues at o fim do bloco switch ou na primeira vez que encontrar uma instruo break. Se voc no escrever uma instruo break no fim das instrues case, o PHP continuar executando os cases seguintes. Exemplo:
switch ($i) { case 0: echo "i igual a 0"; case 1: echo "i igual a 1"; case 2: echo "i igual a 2"; }

Aqui, se $i igual a zero, o PHP executar todas as instrues echo. Se $i igual a 1, o PHP executar as ltimas duas instrues echo, e somente se $i for igual a 2, voc ter o comportamento 'esperado' apenas onde 'i igual a 2' ser mostrado. Ento importante no se esquecer das instrues break (e s vezes no coloc-las para esse resultado em certas circunstncias). Em uma instruo switch, a condio somente ser avaliada e resultado comparado para cada instruo case. Em uma instruo elseif, a condio avaliada novamente. Se sua condio mais complicada que uma simples comparao e/ou e dentro de um loop, um switch mais rpido. Um case pode no ter nenhuma instruo dentro, o que simplesmente passa o controle para o prximo case.
switch ($i) { case 0: case 1: case 2: echo "i menor que 3 mas no negativo";

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

41

PHP 5 e MySQL 5 e Ajax


break; case 3: echo "i 3"; }

Um case especial o default. Esse case executado quando nenhum outro case combina. Ele precisa ser a ltima instruo case. Por exemplo:
switch ($i) { case 0: echo "i break; case 1: echo "i break; case 2: echo "i break; default: echo "i }

igual a 0";

igual a 1";

igual a 2";

no igual a 0, 1 ou 2";

A expresso avaliada pelo case precisa ser um tipo simples, ou seja, inteiros, nmeros de ponto flutuante e strings. Arrays ou objetos no podem ser utilizados a no ser que eles impliquem num tipo simples. A sintaxe alternativa para estruturas de controle suportada para os switches. Sintaxe alternativa para estruturas de controle
switch ($i): case 0: echo "i break; case 1: echo "i break; case 2: echo "i break; default: echo "i endswitch;

igual a 0";

igual a 1";

igual a 2";

no igual a 0, 1 ou 2";

break
break cancela a execuo do comando for, foreach while, do..while ou switch atual. break aceita um argumento numrico opcional que diz a ele quantas estruturas aninhadas englobadas devem ser quebradas.

continue
continue usado dentro de estruturas de loops para saltar o resto da iterao do loop atual e continuar a execuo no incio da prxima iterao.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

42

PHP 5 e MySQL 5 e Ajax


continue aceita um argumento numrico opcional que diz a ele de quantos nveis de loops aninhados ele deve saltar at o fim.
<?php $i = 0; while ($i++ < 5) { echo "Fora<br>\n"; while (1) { echo "&nbsp;&nbsp;Meio<br>\n"; while (1) { echo "&nbsp;&nbsp;Dentro<br>\n"; continue 3; } echo "Isto nunca ser exibido.<br>\n"; } echo "Nem isso.<br>\n"; } ?> ex_continue.php

return
Se chamada em uma funo, a instruo return( ) termina imediatamente a execuo da funo atual e retorna seu argumento como o valor da funo. return( ) tambm termina a execuo de uma instruo eval( ) ou de um script. Se chamada no escopo global, a execuo do script atual ser terminada. Se o arquivo do script atual foi includo com include( ), require( ) ento a execuo devolvida para o arquivo chamador. Especificamente para arquivos de script includos com include( ), o valor fornecido para return( ) ser devolvido como o valor da chamada include(). Nota: Note que return( ) um construtor de linguagem e no uma funo, e parnteses em volta do seus argumentos no so necessrios -- de fato, mais comum no coloclos que us-los, sem, entretanto, haver diferena de um jeito ou de outro.

Criando bloco de cdigos reutilizveis


Quando estiver projetando seu site da Web, voc apontar alguns elementos encontrados em muitas pginas em todo o site. Tais elementos podem ser barras de navegao ou uma linha de base com o endereo de e-mail do seu webmaster. Outros elementos podem ser fragmentos de cdigos para exibir o dia, dados computados financeiros padro e muitos outros cdigos padronizados de HTML ou PHP, como por exemplo, constantes.

require( )
A instruo require( ) e include( ) so idnticos em todas as formas exceto pela manipulao de erros. include( ) produz Warning enquanto require( ) produzir um Fatal Error. Em outras palavras, no hesite em utilizar require( ) se na falta de um arquivo quiser parar o processamento da pgina. include( ) no se comporta da mesma maneira, e o script poder continuar nessa situao.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

43

PHP 5 e MySQL 5 e Ajax


Veja os exemplos abaixo de sua utilizao:
<?php require 'teste.php'; require $arquivo; require ('arquivo.txt'); ?>

Nota: At o PHP 4.0.2, havia o seguinte comportamento: require( ) ocorre mesmo que a linha onde ele est nunca seja executada. por isso que instrues condicionais no afetam require( ). Entretanto, se a linha onde ocorre o require( ) no for executada, nada do cdigo includo do arquivo tambm ser. Similarmente, estruturas de loop no afetam o funcionamento do require( ). Mas o cdigo includo pela funo ser submetido ao loop. A instruo require( ) apenas ocorre uma vez.

include( )
A instruo include( ) inclui e avalia o arquivo informado. Sua semelhana com o require dispensa maiores explicaes. Qualquer varivel disponvel da linha onde a chamada da incluso ocorre estar disponvel para o arquivo includo, daquele ponto em diante. Veja os exemplos de include( ):
<?php $nome = 'Leonardo'; $apelido = 'Leo'; ?> includ.php <?php echo "O nome $nome e seu apelido $apelido"; //As variveis esto vazias include 'includ.php'; echo " O nome $nome e seu apelido $apelido"; // As variveis neste caso contm as informaes inclusas ?> ex_include.php

Se o include ocorre dentro de uma funo do arquivo principal, ento todo o cdigo includo ser executado como se ele tivesse sido definido dentro daquela funo. Da

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

44

PHP 5 e MySQL 5 e Ajax


mesma forma, ele seguir o escopo de variveis da funo.
<?php function teste() { global $nome; include 'includ.php'; echo " O nome $nome e seu apelido $apelido"; } /* includ.php est no escopo da funo teste( ),ento $apelido NO est disponvel fora de seu escopo. $nome estar porque ela foi declarada como global */ teste( );// Imprime o contedo da varivel $nome e da varivel $apelido echo "O nome $nome e o apelido $apelido"; //Imprime somente $nome ?> ex_include_2.php

Quando um arquivo includo, o interpretador sai do modo PHP e entra no modo HTML (no comeo do arquivo includo), e alterna novamente no seu fim. Por isso, qualquer cdigo dentro do arquivo includo que precisa ser executado como cdigo PHP tem de ser delimitado por tags lidas de abertura e fechamento. Se "URL fopen wrappers" esto ativas no PHP (normalmente na configurao padro), voc pode especificar um arquivo utilizando uma URL (via HTTP) em vez de um caminho local. Se o servidor apontado interpreta o arquivo informado como cdigo PHP, variveis podem ser passadas ao arquivo includo na URL de requisio como num HTTP GET. Isto no necessariamente a mesma coisa que incluir o arquivo e compartilhar o escopo de varivel do arquivo principal: o script ser executado no servidor remoto e apenas seu resultado ser includo no script local.
<?php /* Este exemplo assume que www.exemplo.com est configurado para interpretar arquivos .php mas no .txt. Alm, 'Funciona' aqui significa que as variveis $teste e $teste2 esto disponveis no arquivo includo*/ /*No funciona: arquivos .txt no so manipulados em www.exemplo.com como PHP */ include 'http://www.exemplo.com/arquivo.txt?teste=1&teste2=2'; /* No funciona: procura por um arquivo chamado arquivo.php?teste=1&teste2=2' no sistemas de arquivo local. */ include 'arquivo.php?teste=1&teste2=2'; // Funciona. include 'http://www.exemplo.com/arquivo.php?teste=1&teste2=2'; $teste = 1; $teste2 = 2;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

45

PHP 5 e MySQL 5 e Ajax


include 'arquivo.txt'; include 'arquivo.php'; ?> // Funciona. // Funciona.

Por serem include( ) e require( ) dois construtores de linguagem especiais, voc precisa delimit-los como um bloco de instrues quando utilizados dentro de instrues condicionais.
<?php // Isto est errado e no funcionar como desejado if ($condicao) include $arquivo; else include $outro;

// E este est correto if ($condicao) { include $arquivo; } else { include $outro; } ?>

Tambm possvel executar uma instruo return( ) dentro de um arquivo includo de maneira a finalizar o processamento daquele arquivo e retornar para o script que o chamou. Tambm possvel retornar valores de arquivos includos. Voc pode pegar o valor de retorno de um include como faria com uma funo normal. return( ) se aplica apenas para a funo e no para todo o arquivo.
<?php $var = 'PHP'; return $var; ?> ex_return_inc.php <?php $var = 'PHP'; ?> ex_return_inc_2.php <?php $teste = include ' ex_return_inc.php'; echo $teste; // imprime 'PHP' $teste2 = include ' ex_return_inc_2.php'; echo $teste2; // imprime 1 ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

46

PHP 5 e MySQL 5 e Ajax


ex_return_inc_3.php

$teste2 assimila o valor 1 porque a incluso foi realizada com sucesso. Verifique a diferena entre os exemplos. O primeiro utiliza return( ) dentro do arquivo includo enquanto que o outro no. H outras maneiras de "incluir" arquivos dentro de variveis, com fopen( ), file( ) ou utilizando include( ) atravs das Funes de Controle de Sada.

require_once( )
A instruo require_once( ) avalia o arquivo especificado durante a execuo do script. Seu comportamento similar ao da instruo require( ), a no ser que o arquivo informado j tenha sido includo, no refazendo a operao novamente.

include_once( )
A instruo include_once( ) inclui e avalia o arquivo especificado durante a execuo de um script. Seu comportamento similar instruo include( ), a no ser que o arquivo informado j tenha sido includo, no refazendo a operao novamente. Como o nome sugere, ele ser includo apenas uma vez.

Funes Funes definidas pelo usurio


Uma funo pode ser definida usando-se a sintaxe como a seguinte:
function teste($argumento1, $argumento2, ..., $argumentoN) { echo "Funo de exemplo.<Br>\n"; return $retonaValor; }

Qualquer cdigo PHP vlido aparece dentro de uma funo, mesmo outras funes e definies de classes. O PHP no suporta sobrecarga de funes, e tambm no possvel cancelar ou alterar a definio de funes previamente declaradas.

Argumentos de funes
Informao pode ser passada para funes atravs da lista de argumentos, que uma lista de variveis e/ou constantes delimitados por vrgulas. O PHP suporta a passagem de argumentos por valor (o padro), passagem por referncia valores padro de argumento.

Valores padro de argumentos


Uma funo pode definir valores padro no estilo C++ para argumentos escalares, como a seguir:
<?php function argumento ($tipo = "exemplo") { return "Este somente um $tipo.<br>\n"; }

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

47

PHP 5 e MySQL 5 e Ajax


echo argumento ( );// sada: Este somente um exemplo. echo argumento ("outro exemplo"); // sada: Este somente um outro exemplo. ?> func_val_padrao.php

O valor padro precisa ser uma expresso constante, no (por exemplo) uma varivel ou um membro de classe. Note que usando argumentos padro, qualquer padro dever estar do lado direito de argumentos no-padro; caso contrrio, as coisas no funcionaro como esperado. Considere o seguinte trecho de cdigo:
<?php function arg_errado ($tipo = "exemplo", $argumento2) { return "Este um $tipo de $argumento2.\n"; } echo arg_errado ("texto"); ?> func_arg_err.php // sada: Ir gerar um erro

A sada do exemplo acima ter um erro como o mostrado abaixo: Warning: Missing argument 2 /var/www/aulaphp/func_arg_err.php on line 9 Este um texto de . Agora, compare o que est acima com este:
<?php function arg_certo ( $argumento2,$tipo = "exemplo") { return "Este um $tipo de $argumento2.\n"; } echo arg_certo ("texto"); ?> func_arg_certo.php // sada: Ir ter a sada correta

for

arg_errado(

in

A sada deste exemplo : Este um exemplo de texto.

Funes definidas condicionalmente


Aqui voc percebe que podemos ter funes chamadas antes de serem construdas e condies para chamar uma funo. <?php $chamar = true; /* Nos nao podemos chamar exemplo( ) daqui

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

48

PHP 5 e MySQL 5 e Ajax


porque ela ainda no existe, mas nos podemos chamar exemplo2( ) */ exemplo2( ); if ($chamar) { function exemplo ( ) { echo "Eu no existo at que o programa passe por aqui.<br />"; } } /* Agora nos podemos chamar exemplo( ) porque $chamar foi avaliado como true */ if ($chamar) exemplo( ); function exemplo2( ) { echo "Eu existo imediatamente desde o incio.<br />"; } ?> func_def_cond.php

Funes dentro de funes


<?php function exemplo( ) { function exemplo2() { echo "Eu no existo at exemplo( ) ser chamado.<br />"; } } /* Ns no podemos chamar exemplo2( ) ainda porque essa funo ainda no foi definida. */ exemplo( ); /* Agora ns podemos chamar exemplo2( ), porque o processamento de exemplo( ) tornou a primeira acessvel */ exemplo2( ); ?> func_dentro_func.php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

49

PHP 5 e MySQL 5 e Ajax


Funes com argumentos variveis
Imagine a situao: Seu chefe lhe pediu para criar uma funo, de somar valores, mas infelizmente ele lhe disse que no existe uma quantidade precisa para transmitir os valores a serem somados. Isso realmente um problema, pois voc precisa de uma matriz para que a funo saiba quantos itens sero transmitidos. Alguma semelhana com as funes do Excel ou Calc? <?php function somar( ) { $numargs = func_num_args( ); echo "Nmero de argumentos passados: $numargs<br />\n"; if ($numargs >= 2) { echo "Selecionando apenas um argumento em especial: " . func_get_arg (1) . "<br />\n"; } $arg_list = func_get_args( ); for ($i = 0; $i < $numargs; $i++) { $total+=$arg_list[$i]; } echo "O resultado : " . $total; } somar (5, 2, 3, 5, 3); ?> args_variaveis.php O mtodo func_num_args( ) retorna o nmero de argumentos total. O mtodo func_get_arg( ) pega o valor de um argumento em especial. J o mtodo estrela da funo somar( ) criada o func_get_args( ), capaz de reunir os valores em uma matriz, podendo assim, voc passar uma quantidade ilimitada de argumentos, sem se preocupar em declar-los ou no.

Retornando valores
Valores so retornados pelo uso de comandos opcionais de retorno. Qualquer tipo pode ser retornado, incluindo listas e objetos.
<?php function teste ($numero) { return $numero+$numero*2; } echo teste (7); // imprime '21'. ?> func_return_val.php

Escopo de variveis
O escopo de uma varivel o contexto onde ela foi definida. A maior parte das variveis do PHP tem somente escopo local. Este escopo local inclui os arquivos

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

50

PHP 5 e MySQL 5 e Ajax


includos. Por exemplo:
$a = 1; include "b.inc";

Aqui a varivel $a estar disponvel no script includo b.inc. Entretanto, com as funes definidas pelo usurio, um escopo local introduzido. Quaisquer variveis utilizadas dento da funo por padro limitada dentro do escopo local da funo. Por exemplo:
<?php $a = 1; /* escopo global */ function Teste() { echo $a; /* referencia uma varivel do escopo local (no definida) */ } Teste(); ?> ex_esc_err.php

Este script no produz nenhuma sada porque a instruo echo( ) refere-se a uma verso local da varivel $a, e ela no tem nenhum valor assimilado nesse escopo. Essa uma pequena diferena da linguagem C quando variveis globais so automaticamente disponveis para funes sem sobrescrever uma eventual definio local. Isto causa problemas quando as pessoas mudam inadvertidamente uma varivel global. No PHP, as variveis globais precisam ser declaradas globais dentro de uma funo se ela vai ser utilizada naquela funo. Um exemplo:
<?php $a = 1; $b = 2; function Soma() { global $a, $b,$c; $c = $a + $b; } Soma(); echo $c; ?> ex_esc_global.php

O script acima imprimir "3". Declarando $a e $b globais na funo, todas as referncias a essas variveis referem-se verso global. No h um limite para o nmero de variveis globais que podem ser manipuladas por uma funo. Uma segunda maneira de acessar variveis do escopo global utilizando o array especial $GLOBALS definido pelo PHP. O exemplo anterior poderia ser rescrito como:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

51

PHP 5 e MySQL 5 e Ajax


<?php $a = 1; $b = 2; function Soma() { $GLOBALS["c"] = $GLOBALS["a"] + $GLOBALS["b"]; } Soma(); echo $c; ?> ex_arr_globals.php

$GLOBALS um array associativo em que o nome das variveis globais so suas chaves e o contedo dessas variveis so os valores do elemento do array. Outro recurso importante do escopo de variveis a varivel esttica. Uma varivel esttica existe somente no escopo local da funo, mas ela no perde seu valor quando o nvel de execuo do programa deixa o escopo. Considere o seguinte exemplo:

Variveis Estticas
<?php function Teste () { $a = 0; echo $a; $a++; } for($i=0;$i<10;$i++) Teste(); ?>

Essa funo intil partindo de que cada vez que ela chamada, ela coloca em $a o valor 0 e imprime "0". A instruo $a++ , que aumenta o valor da varivel no tem sentido desde que a funo sai e a varivel $a desaparece. Para faz-la mais til como contadora sem deixar de perder o sua conta atual, a varivel $a declarada como esttica:
<?php function Teste() { static $a = 0; echo $a; $a++; } for($i=0;$i<10;$i++) Teste(); ?>

Agora, cada vez que a funo Teste( ) for chamada ele imprimir o valor de $a e o incrementar.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

52

PHP 5 e MySQL 5 e Ajax


Variveis estticas fornecem uma soluo ideal para funes recursivas. Uma funo recursiva aquela que chama a si mesma. Cuidados especiais precisam ser tomados quando escrevendo funes recursivas porque possvel que ela continue na recurso indefinidamente. Voc tem de ter certeza que h uma maneira segura de terminar a recurso. A seguinte funo recursiva conta at 10, utilizando a varivel esttica $contar para saber quando parar:
<?php function Teste() { static $contar = 0; $contar++; echo $contar; if ($contar < 10) { Teste(); } $contar--; } Teste(); ?> ex_var_statics.php

Uma outra maneira de utilizar variveis estticas dentro de instrues de loops.


<?php while($i<10){ static $i=0; $i++; echo $i."<br />"; } ?> ex_var_statics_2.php

Seria impossvel ter a varivel dentro do bloco e esperar a finalizao do loop, sabendo que esta varivel sempre voltar a zero, tornando-o infinito.

Enviando arquivos para o servidor


Algumas vezes voc precisa enviar arquivos ao servidor e para fazer isso, voc precisar de um formulrio preparado para essa situao e o cdigo PHP para receber os dados: <html> <head> <title>Enviando Arquivos para o Servidor</title> </head> <body> <form action="recebe_arq.php" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input name="arquivo" type="file" id="arquivo" /> <input name="bt_env" type="button" value="Enviar" /> </form>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

53

PHP 5 e MySQL 5 e Ajax


</body> </html> form_env_arqs.php Uma situao importante a se observar na criao do formulrio que voc deve colocar o atributo enctype="multipart/form-data". Se voc no fizer isso, o formulrio no enviar arquivos para a pgina PHP que ser responsvel por receb-lo. <?php // o tamanho mximo necessrio $tamanho_maximo = 1024*100; // 100 KB $tipos_aceitos = array("image/gif", "image/pjpeg", "image/x-png", "image/bmp", "image/jpg"); // validar o arquivo enviado $arquivo = $_FILES['arquivo']; if($arquivo['error'] != 0) { echo '<p><b>Erro no Upload do arquivo<br>'; switch($arquivo['erro']) { case UPLOAD_ERR_INI_SIZE: echo 'O Arquivo excede o tamanho mximo permitido'; break; case UPLOAD_ERR_FORM_SIZE: echo 'O Arquivo enviado muito grande'; break; case UPLOAD_ERR_PARTIAL: echo 'O upload no foi completo'; break; case UPLOAD_ERR_NO_FILE: echo 'Nenhum arquivo foi informado para upload'; break; } echo '</b></p>'; exit; } if($arquivo['size']==0 || $arquivo['tmp_name']==NULL) { echo '<p><b>Envie um arquivo</b></p>'; exit; } if($arquivo['size']>$tamanho_maximo) { echo '<p><b>O Arquivo enviado maior que o limite: ' . round($tamanho_maximo/1024) .'KB</b></p>'; exit; } if(array_search($arquivo['type'],$tipos_aceitos)===FALSE) { echo '<p><b>O Arquivo enviado no do tipo (' . $arquivo['type'] . ') aceito para upload.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

54

PHP 5 e MySQL 5 e Ajax


Os Tipos Aceitos So:</b></p>'; echo '<pre>'; print_r($tipos_aceitos); echo '</pre>'; exit; } // copiando o arquivo enviado $destino = realpath('arquivos') ."\\".$arquivo['name']; if(move_uploaded_file($arquivo['tmp_name'],$destino)) { // Tudo Ok, mostramos os dados echo '<p><b>'; echo 'O Arquivo foi recebido com sucesso!</b></p>'; echo "<img src='$destino' border=0>"; } else { echo '<p><b>Ocorreu um erro durante o upload</b></p>'; } ?> recebe_arq.php O tamanho mximo do arquivo a ser feito UPLOAD colocado em destaque no incio do cdigo. O array $tipos_aceitos traz os tipos MIME aceitos pelo sistema de UPLOAD que voc construiu. Os contedos de $_FILES do script de exemplo atribudo a $arquivo. Note que isso assume que o nome do upload do arquivo arquivo, como o usado no exemplo anterior. Pode ser qualquer nome. A seguir voc tem o significado de cada item do array $_FILES: $_FILES['arquivo']['name'] - O nome original do arquivo no computador do usurio. $_FILES['arquivo']['type'] - O tipo MIME do arquivo, se o browser deu esta informao. Um exemplo pode ser "image/gif". $_FILES['arquivo']['size'] - O tamanho, em bytes, do arquivo. $_FILES['arquivo']['tmp_name'] - O nome temporrio do arquivo, como foi guardado no servidor. $_FILES['arquivo']['error'] Retorna os erros encontrados ao fazer o UPLOAD do arquivo. Os cdigos de erro de envio de arquivos Os cdigos de erro so explicados a seguir: UPLOAD_ERR_OK Valor: 0: no houve erro, o upload foi bem sucedido.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

55

PHP 5 e MySQL 5 e Ajax


UPLOAD_ERR_INI_SIZE Valor 1: O arquivo no upload maior do que o limite definido em upload_max_filesize no php.ini. UPLOAD_ERR_FORM_SIZE Valor: 2: O arquivo ultrapassa o limite de tamanho em MAX_FILE_SIZE que foi especificado no formulrio HTML. UPLOAD_ERR_PARTIAL Valor: 3: o upload do arquivo foi feito parcialmente. UPLOAD_ERR_NO_FILE Valor: 4: No foi feito o upload do arquivo.

Como fazer UPLOAD de mltiplos arquivos


<html> <head> <title>Enviando Mltiplos Arquivos para o Servidor</title> </head> <body> <?php $arquivo = $_FILES['arquivo']; for($i=0;$i<count($arquivo);$i++) echo "{$arquivo['name'][$i]}<br />"; ?> <form action="" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input name="arquivo[ ]" type="file" /> <br /> <input name="arquivo[ ]" type="file" /> <br /> <input name="arquivo[ ]" type="file" /> <br /> <input name="arquivo[ ]" type="file" /> <br /> <br /> <input name="bt_env" type="submit" value="Enviar" /> </form> </body> </html> form_env_mult_arqs.php

Orientao a Objetos com PHP 5 Classe


Classe o termo tcnico utilizado em linguagens orientadas a objetos que descreve um

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

56

PHP 5 e MySQL 5 e Ajax


conjunto de dados estruturados que so caracterizados por propriedades comuns. Tambm pode ser interpretado como uma estrutura modular completa que descreve as propriedades estticas e dinmicas dos elementos manipulados pelo programa. Podem-se definir classes de objetos como a descrio de um grupo de objetos por meio de um conjunto uniforme de atributos e servios. Uma classe um conjunto de objetos que compartilham as mesmas operaes. Enquanto um objeto individual uma entidade concreta que executa algum papel no sistema como um todo, uma classe captura a estrutura e o comportamento comum a todos os objetos que so relacionados. Um objeto possui uma identidade e suas caractersticas sero definidas para a classe. Uma classe definida por: um nome da classe; o nome da sua superclasse; o nome de suas variveis; os nomes e as definies de todas as operaes associadas a esta classe;

O nome da classe
Toda definio de classe comea com a palavra-chave class, seguido por um nome da classe, que pode ser qualquer nome que no seja uma palavra reservada no PHP. A seguir voc tem a definio de uma classe simples: <?php class Classe { /* declarao de membro */ public $var = 'um valor padro de acesso pblico'; /* declarao de mtodo pblico mostrar*/ public function mostrar( ) { echo $this->var; } } ?> class_simp.php

new
Para criar uma instncia de um objeto, um novo objeto deve ser criado e atribudo a uma varivel. Um objeto sempre ser atribudo quando um novo objeto for criado a no ser que o objeto tenha um construtor definido que dispara uma exceo por um erro. <?php require("class_simp.php"); ?> <html> <head> <title>Utilizando uma classe simples</title> </head> <body> <?php $instancia = new Classe( ); $instancia->mostrar( );

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

57

PHP 5 e MySQL 5 e Ajax


?> </body> </html> util_class_simp.php

A classe Caixa
A seguir, voc tem mais um exemplo. A idia fixar a utilizao de orientao a objetos com PHP5. A classe Caixa teria como atributos caractersticas como as dimenses, cor, contedo e coisas semelhantes. As funes ou mtodos que poderamos incorporar a classe "Caixa" so as funcionalidades que queremos que a caixa realize, por exemplo: introduz( ), mostra_conteudo( ), comprova_se_cabe( ), esvaziar( )... <?php class Caixa{ private $conteudo; public function introduz($coisa){ $this->conteudo = $coisa; } public function mostra_conteudo( ){ echo $this->conteudo; } } ?> class_caixa.php Neste exemplo criou-se uma classe de nome Caixa, indicando como atributo o contedo. Para comear, um par de mtodos foram criados, 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 explicado mais adiante.

Atributos
Um atributo um dado para o qual cada objeto tem seu prprio valor. Atributos so, basicamente, a estrutura de dados que vai representar a classe. Exemplo de atributos, usando a classe fila: private $fila;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

58

PHP 5 e MySQL 5 e Ajax


private $primeiro; private $ultimo;

Mtodos
Mtodos so declarados dentro de uma classe para representar as operaes que os objetos pertencentes a esta classe podem executar. Um mtodo a implementao de uma rotina, ou seja, o cdigo propriamente dito. Pode ser comparado a um procedimento ou funo das linguagens imperativas. Exemplo de mtodos, utilizando a classe fila: public function iniciar ( ) { $this->primeiro = 0; $this->ultimo = 0; }

Como utilizar a classe Caixa


As classes so definies. Se quisermos utilizar uma classe temos de criar uma cpia dessa classe, o que normalmente se chama instanciar um objetos de uma classe. $minhacaixa = new Caixa( ); Com isto instanciamos um objeto da classe Caixa chamado $minhacaixa: $minhacaixa->introduz("algo"); $minhacaixa->mostra_conteudo( ); Com estas duas sentenas estamos inserindo a string "algo" na caixa e depois estamos mostrando esse contedo no texto da pgina. Repare que os mtodos que o objeto chama utiliza o cdigo "->". nome_do_objeto->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 objeto sobre o qual invocamos o mtodo. Na invocao $minhacaixa->introduz("algo") voc est chamando o mtodo introduzido sobre o objeto $minhacaixa. Quando executar esse mtodo, passa-se o valor que recebe por parmetro ao atributo contido. Neste caso $this->conteudo faz referncia ao atributo contido no objeto $minhacaixa, que sobre o que se invocava no mtodo.

Visibilidade
PHP 5 & MySQL 5 for Web www.integrator.com.br/php
59

PHP 5 e MySQL 5 e Ajax


A visibilidade de uma propriedade ou mtodo pode ser definida prefixando a declarao com as palavras-chave: public, protected ou private. Itens declarados como public podem ser acessados por todo mundo. Protected limita o acesso a classes herdadas (e para a classe que define o item). Private limita a visibilidade para apenas a classe que define o item. Para que voc entenda o que isso significa, vamos fazer um exemplo: <?php require("class_caixa.php"); ?> <html> <head> <title>Utilizando a classe Caixa</title> </head> <body> <?php $minhacaixa = new Caixa( ); $minhacaixa->introduz("algo"); $minhacaixa->mostra_conteudo( ); ?> </body> </html> util_class_caixa.php O exemplo mostrado acima demonstra a utilizao da classe Caixa como se encontra. Modificaremos essa chamada, tentando acessar o atributo $conteudo: <?php $minhacaixa = new Caixa( ); $minhacaixa->introduz("algo"); $minhacaixa->conteudo; ?> util_class_caixa.php Ao fazer isso, voc ter um erro como o mostrado a seguir: Fatal error: Cannot access private property $PATH\util_class_caixa.php on line 15

Caixa::$conteudo

in

Esse erro indica que voc est tentando acessar um membro private. Agora vamos modificar a classe Caixa, tornando o membro $conteudo public: <?php class Caixa{ public $conteudo; ... class_caixa.php Ao fazer isso, voc notar que acessar esse membro no causar erro. Se voc desejar ecoar o valor do membro $conteudo, voc ter que alterar a pgina

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

60

PHP 5 e MySQL 5 e Ajax


util_class_caixa.php: <?php $minhacaixa = new Caixa( ); $minhacaixa->introduz("algo"); echo $minhacaixa->conteudo; ?>

Objeto
O que caracteriza a programao orientada a objetos so os objetos. De um modo geral podemos encarar os objetos como sendo os objetos fsicos do mundo real, tais como: carro, avio, casa, telefone, computador, etc., por isso que s vezes dito que orientao a objetos representa os problemas mais prximos ao mundo real, dando assim mais facilidade a programao como um todo, mais isso no sempre verdade, porque s vezes temos problemas que so extremamente funcionais. Nesses problemas funcionais difcil representar a estrutura lgica em torno de objetos. Com isso, no so todos os problemas que giram em torno dos objetos facilmente visveis. De maneira simples, um objeto uma entidade lgica que contm dados e cdigo para manipular esses dados. Os dados so denominados como sendo atributos do objeto, ou seja, a estrutura que o objeto tem, e o cdigo que o manipula denominamos mtodo. Um mtodo uma funo que manipula a estrutura de dados do objeto.

Construtores em PHP
Os construtores so funes, ou mtodos, que se encarregam de realizar as tarefas de iniciao dos objetos ao serem instanciados. Isto , quando se criam os objetos a partir das classes, chama-se um construtor que se encarrega de iniciar os atributos do objeto e realizar qualquer outra tarefa de inicializao que seja necessria. No obrigatrio dispor de um construtor, mas so muito teis e a sua utilizao muito habitual. No exemplo da caixa, 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 objetos. O construtor se define dentro da prpria classe, como se fosse outro mtodo. O nico detalhe que o construtor deve ser chamado como __construct . Para a classe Caixa definida anteriormente, poderia declarar-se este construtor, como mostrado em destaque a seguir: <?php class Caixa{ private $altura; private $espessura; private $largura; private $conteudo; private $cor; function __construct($altura=1,$espessura =1,$largura=1,$cor="preto"){ $this->altura=$altura; $this->espessura=$espessura; $this->largura=$largura; $this->cor=$cor;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

61

PHP 5 e MySQL 5 e Ajax


$this->conteudo=""; } public function introduz($coisa){ $this->conteudo = $coisa; } public function mostra_conteudo( ){ echo $this->conteudo; } } ?> class_caixa.php muito til definir 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 parmetro, esse iniciar com os valores pr-definidos. importante assinalar que nos construtores no se tem porque receber todos os valores para iniciar o objeto. H alguns valores que se podem iniciar com valores vazios (NULOS) ou qualquer outro valor fixo, como neste caso, o contedo da caixa, que inicialmente propusemos que estar vazia.

Destrutores
PHP 5 introduz um conceito de destrutor similar ao de outras linguagens orientadas a objeto, como o Java. O mtodo destrutor ser chamado assim que todas as referncias a um objeto particular forem removidas ou quando o objeto for explicitamente destrudo. <?php class MinhaClasseDestruivel { function __construct( ) { print "No construtor\n"; $this->name = "MinhaClasseDestruivel<br />"; } function __destruct( ) { print "Destruindo " . $this->name . "\n"; } } $obj = new MinhaClasseDestruivel( ); ?> class_destruct.php Como os construtores, destrutores pais no sero chamados implicitamente pelo engine.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

62

PHP 5 e MySQL 5 e Ajax


Para executar o destrutor pai, deve-se fazer uma chamada explicitamente a parent::__destruct( ) no corpo do destrutor.

Herana em PHP
A programao orientada a objetos 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 dizendo, que derivam de outra classe, chamam-se classes derivadas. As classes derivadas herdam todos os atributos e mtodos da classe base, que podem ter tantos atributos e mtodos novos como quiser. Para ampliar o exemplo, da classe Caixa, vamos criar uma classe derivada chamada Caixa_Tipo. Esta classe herda de caixa, mas tem um "tipo", que a descrio do tipo de coisas que colocamos na caixa. Com isto podemos ter varias caixas, cada uma com coisas diferentes. <?php require("class_caixa.php"); class Caixa_Tipo extends Caixa{ private $tipo; function define_tipo($novo_tipo){ $this->tipo = $novo_tipo; } } ?> class_caixa_tipo.php Na construo dessa classe, herdamos de Caixa todos os atributos e mtodos da classe base. Tambm se definiu um novo atributo, chamado $tipo, e um mtodo, chamado define_tipo( ), que recebe o tema com o que se deseja inserir na caixa. Poderamos utilizar a classe Caixa_Tipo de maneira similar como fazamos com a classe Caixa original: <?php require("class_caixa_tipo.php"); ?> <html> <head> <title>Utilizando a classe caixa tipo</title> </head> <body> <?php $minhacaixa_tematica = new Caixa_Tipo( ); $minhacaixa_tematica->define_tipo("Cabos e conectores"); $minhacaixa_tematica->introduz("Cabo de rede");

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

63

PHP 5 e MySQL 5 e Ajax


$minhacaixa_tematica->mostra_conteudo( ); echo "<br />"; $minhacaixa_tematica->introduz("Conector RJ45"); $minhacaixa_tematica->mostra_conteudo( ); ?> </body> </html> util_class_caixa_tipo.php 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 indicasse tambm o tipo de objetos que contem o tipo de caixa. Para isso, temos que redefinir o mtodo mostra_conteudo( ).

Redefinir mtodos em classes derivadas


Redefinir mtodos significa voltar a codific-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 tipo 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->tipo . "</b>: " . $this->conteudo; } Neste exemplo codificamos de novo o mtodo inteiro para mostrar os dados completos. Em algumas ocasies muito til basear-se na definio de um mtodo da classe base para realizar as aes da classe derivada. Por exemplo, temos que definir um construtor para a classe Caixa_Tipo, para que tambm se inicie o tipo da caixa. Como j existe um mtodo construtor na classe base, no vale a pena reescrever o cdigo deste, o melhor chamar ao construtor que tnhamos definido na classe Caixa original, com o qual 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 redefinindo, utilizamos uma sintaxe como esta:
<?php require("class_caixa.php"); class Caixa_Tipo extends Caixa{ private $tipo; function __construct($altura=1,$espessura=1,$largura=1,$cor="preto",$tipo="Sem classificao"){ parent::__construct($altura,$espessura,$largura,$cor);

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

64

PHP 5 e MySQL 5 e Ajax


$this->tipo=$tipo; } function define_tipo($novo_tipo){ $this->tipo = $novo_tipo; } } ?>

class_caixa_tipo.php Aqui vemos a redefinio de construtor, da classe Caixa, para a classe Caixa_Tipo. O construtor faz primeiro uma chamada ao construtor da classe base, atravs de uma referncia a parent. Depois inicia o valor do atributo $tipo, que especifico da Caixa_Tipo. Na mesma linha de trabalho, podemos redefinir o mtodo mostra_conteudo( ) baseandonos no que foi declarado para a classe base. O cdigo ficaria assim:
<?php require("class_caixa.php"); class Caixa_Tipo extends Caixa{ private $tipo; function __construct($altura=1,$espessura=1, $largura=1,$cor="preto", $tipo="Sem classificao") { parent::__construct($altura,$espessura,$largura,$cor); $this->tipo=$tipo; } function define_tipo($novo_tipo){ $this->tipo = $novo_tipo; } function mostra_conteudo( ){ echo "Conteudo da caixa de <b>" . $this->tipo . "</b>: "; parent::mostra_conteudo( ); } } ?>

class_caixa_tipo.php Operador de Resoluo de Escopo (::) O Operador de Resoluo de Escopo, tambm chamado de Paamayim Nekudotayim (significa dois pontos duplos - em Hebreu), ou em termos mais simples, dois pontos

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

65

PHP 5 e MySQL 5 e Ajax


duplos, um token que permite acesso a mtodos ou membros estticos, constantes, e sobrecarregados de uma classe. Quando referenciando esses itens de fora da definio da classe, voc usa o nome da classe. Palavra-Chave 'static' Declarando membros ou mtodos de uma classe como estticos, faz com que esses sejam "chamveis" de fora do contexto do objeto. Um membro ou mtodo declarado com static no pode ser acessado com uma varivel que uma instncia do objeto e no pode ser redefinido em uma subclasse. A declarao static deve estar depois da declarao de visibilidade. Por compatibilidade com o PHP 4, se nenhuma declarao de visibilidade for usada, ento o membro ou mtodo ser tratado como se fosse declarado como public static. Como mtodos estticos podem ser chamados sem uma instncia do objeto ter sido criada, a pseudovarivel $this no disponvel dentro do mtodo declarado como esttico. De fato, chamadas a mtodos estticos so resolvidas em tempo de compilao. Quando usando um nome de classe explcito o mtodo j identificado completamente e nenhuma das regras de herana se aplicam. Se a chamada for feita por self ento self traduzido para a classe atual, isso , a classe qual o cdigo pertence. Aqui tambm no se aplicam as regras de herana. Propriedades estticas no podem ser acessadas pelo objeto usando o operador seta ->. <?php class Primeira { public static $meu_estatico = 'Valor esttico'; public function valorEstatico( ) { return self::$meu_estatico; } } class Segunda extends Primeira { public function PrimeiraValorEstatico( ) { return parent::$meu_estatico; } } print Segunda::$meu_estatico . "<br />"; $segunda = new Segunda( ); print $segunda->PrimeiraValorEstatico( ) . "<br />";

print Primeira::$meu_estatico . "<br />"; $primeira = new Primeira( ); print $primeira->valorEstatico( ) . "<br />"; // "Propriedade" Indefinida $meu_estatico print $primeira->$meu_estatico . "<br />";

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

66

PHP 5 e MySQL 5 e Ajax


?> util_static.php Constantes do Objeto possvel definir valores constantes em cada classe permanecendo a mesma imutvel. Constantes diferem de variveis normais no no uso do smbolo $ para declar-las ou us-las. Como membros estticos (static) , valores constantes no podem ser acessados a partir de uma instncia de um objeto. <?php class MinhaClasse{ const constante = 'valor constante'; function mostrarConstante( ) { echo self::constante . "<br />"; } } echo MinhaClasse::constante . "<br />"; $classe = new MinhaClasse( ); $classe->mostrarConstante( ); /* echo $classe::constante; no permitido */ ?> util_const.php Abstrao de um Objeto Quando pensamos em um tipo de classe, supomos que os programas criam objetos desse tipo. Em alguns casos, porm, til declarar classes para as quais o programador nunca pensar em instanciar objetos. Essas classes so chamadas de classes abstratas. Essas classes no podem ser utilizadas para instanciar objetos, porque, classes abstratas so incompletas. As subclasses devem declarar as partes ausentes. No permitido criar uma instncia de uma classe que foi definida como abstrata. Qualquer classe que contm pelo menos um mtodo abstrato deve tambm ser abstrata. Mtodos definidos como abstratos simplesmente declaram a assinatura do mtodo, eles no podem definir a implementao. A classe que implementa o mtodo abstrato deve definir com a mesma visibilidade ou mais fraca. Se o mtodo abstrato definido como protected, a implementao da funo deve ser definida ou como protected ou como public. <?php //superclasse abstrata Empregado abstract class Empregado{ private $nomeEmp; private $sobrenomeEmp; private $cpfEmp; protected $dados;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

67

PHP 5 e MySQL 5 e Ajax


//construtor com trs argumentos protected function __construct($nome, $sobrenome, $cpf){ $this->nomeEmp = $nome; $this->sobrenomeEmp = $sobrenome; $this->cpfEmp = $cpf; }// fim do construtor //retorna o nome public function getNome( ) { return $this->nomeEmp; } //fim do mtodo getNome //retorna o sobrenome public function getSobrenome( ) { return $this->sobrenomeEmp; } //fim do mtodo getSobrenome //retorna o cpf public function getCpf( ) { return $this->cpfEmp; } //fim do mtodo getSobrenome //mtodo abstrato responsvel por salvar os dados abstract protected function salvar( ); } ?> class_abstract_emp.php A seguir voc tem a classe que extender a classe abstrata: <?php require("class_abstract_emp.php"); //classe SalarioEmpregado que estende Empregado class SalarioEmpregado extends Empregado{ private $salarioEmp; //construtor com quatro argumentos public function __construct($nome, $sobrenome, $cpf, $salario){ //passa para o construtor Empregado parent::__construct($nome,$sobrenome,$cpf); $this->setSalario($salario);//valida e armazena o salrio }//fim do construtor SalarioEmpregado

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

68

PHP 5 e MySQL 5 e Ajax


//configura o salrio public function setSalario($salario){ //se o salrio for negativo, configura-o em zero $this->salarioEmp = $salario <0 ? 0 : $salario; }//fim do mtodo setSalario //retorna o salrio public function getSalario( ){ return $this->salarioEmp; }//fim do mtodo getSalario //salva o salrio public function salvar( ){ //abre ou cria e abre o arquivo salarios.txt //coloca o ponteiro no fim do arquivo (letra a) if(!$fp=fopen('salarios.txt','a')){ throw new Exception('Erro ao abrir o caminho do arquivo'); } $dados = $this->getNome( )." "; $dados .= $this->getSobrenome( )."|"; $dados .= $this->getCpf( )."|"; $dados .= $this->getSalario( )."\n"; fwrite($fp,$dados); //escreve os dados no arquivo fclose($fp);//fecha o arquivo }//fim do mtodo salvar } ?> class_salario_empregado.php O arquivo seguinte utiliza a classe para salvar os dados do empregado: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Utilizando classes abstratas</title> </head> <body> <?php require("class_salario_empregado.php"); //cria objetos da subclasse
try{
$salarioEmpregado = new SalarioEmpregado("Edson ","Gonalves","222.123.145-01", 800.00);

$salarioEmpregado->salvar( ); $salarioEmpregado = new SalarioEmpregado("Edna ","Gonalves","222.123.145-01", -5);

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

69

PHP 5 e MySQL 5 e Ajax


$salarioEmpregado->salvar( ); } catch(Exception $e){ echo $e->getMessage( ); }

?> </body> </html> main_sal_emp.php Para ilustrar seu aprendizado, construa uma classe de lixeira, onde haver tipos como reciclveis: vidros, plstico e papel e no reciclveis: lixo orgnico e no orgnico.

Arrays (Matrizes)
Umas das construes mais importantes da programao so chamadas de arrays. At agora, as variveis que voc viu e utilizou so chamadas de variveis escalares, que armazenam um nico valor. Um array uma varivel que armazena um conjunto ou seqncia de valores. Um array pode conter muitos elementos. Cada elemento pode armazenar um nico valor, como texto ou nmeros ou outro array. Um array contendo outro array conhecido como array multidimensional.

O que um array?
Um array um lugar identificado para armazenar um conjunto de valores, permitindo assim armazenar variveis escalares comuns. Veja um exemplo simples: Digamos que voc tenha trs produtos para vender e quer list-los. Esses produtos so considerados trs valores dentro de uma matriz. Assim teramos a tabela abaixo: Monitor Teclado produto Depois de ter as informaes como uma matriz, podemos utilizar um loop para realizar a varredura no array e obter os produtos guardados. Com a utilizao de funes especficas do PHP, voc pode ter, por exemplo, os produtos listados em ordem alfabtica. Mouse

Arrays numericamente indexados


Suportados pela grande parte das linguagens de programao, os ndices indicam de forma numrica qual o primeiro produto e qual o ltimo. Uma coisa a ser colocada em pauta que o primeiro produto considerado numericamente como zero.
<html> <head><title>Exemplos de PHP</title></head> <body> <?php $produto=array('Monitor','Teclado','Mouse');

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

70

PHP 5 e MySQL 5 e Ajax


$imprimir= "Primeiro Produto - $produto[0]<br />"; $imprimir.="Segundo Produto - $produto[1]<br />"; $imprimir.="Terceiro Produto - $produto[2]"; echo $imprimir; ?>

</body> </html> ex_cria_matriz_linear.php

Acessando o contedo de um array


Para acessar o contedo de uma varivel, utilize o nome dela. Se a varivel for uma matriz, acesse o contedo dela utilizando o nome e a chave ou ndice. A chave ou ndice indica quais valores armazenados voc deseja acessar. O ndice colocado entre colchetes depois do nome da varivel seguido de um nmero. O primeiro elemento de um array o zero, como j dito anteriormente. Essa conveno a mesma utilizada por C, C++, Java entre outras linguagens. Talvez isso seja um pouco confuso no comeo, se voc no est familiarizado com isso, mas basta entender que se voc quiser acessar o valor Monitor dentro da matriz, basta digitar $produto[0]. Para que haja um array como o mostrado anteriormente, voc deve usar a construo da linguagem array( ).

Uma outra maneira de criar arrays


Uma outra maneira de se criar arrays fazer a construo direta, como mostrado no exemplo abaixo:
<?php $produto[0]="Monitor"; $produto[1]="Teclado"; $produto[2]="Mouse"; echo $produto[0]; ?>

Utilizando loops para acessar o array


Como o array est indexado por uma seqncia de nmeros, podemos utilizar um loop para exibir todo o contedo mais eficientemente:
<html> <head><title>Exemplos de PHP</title></head> <body> <?php $produto[0]="Monitor"; $produto[1]="Teclado"; $produto[2]="Mouse"; for($i=0;$i<3;$i++){

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

71

PHP 5 e MySQL 5 e Ajax


echo "O produto $i : $produto[$i]<br />"; } ?> </body> </html> ex_matriz_ac_loop.php

A diferena que este loop exigir menos digitao. Isso torna seu cdigo mais vivel e rpido.

Arrays Associativos
Arrays associativos so chaves ou ndices que usamos para acessar cada valor armazenado. O cdigo a seguir mostra um exemplo de um array associativo:
<html> <body> <?php $preco=array('Monitor'=>550,'Teclado'=>48,'Mouse'=>15); echo $preco ['Monitor']; ?> </body> </html> ex_arr_ass.php

Note que ao testar o cdigo, voc ter na sua tela o valor de 550, que o valor que est atribudo chave Monitor. Uma outra maneira de se acessar as informaes do array utilizando esta forma ligeiramente diferente do numrico:
<?php $produto["Monitor"]=550; $produto["Teclado"]=48; $produto["Mouse"]=15; echo $produto["Monitor"]; ?>

Utilizando loops com each( ) e list( )


Como os ndices nesse array associativo no so nmeros, no podemos utilizar um contador simples em um loop for para trabalhar com a matriz. Veja abaixo um cdigo funcional:
<?php $precos=array('Monitor'=>550,'Teclado'=>48,'Mouse'=>15); while($dados = each($precos)){ echo $dados["key"]." - ".$dados["value"]."<br />"; } ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

72

PHP 5 e MySQL 5 e Ajax


Com a instruo each( ), temos as localizaes key que contm a chave do elemento atual e as localizaes value que contm o valor do elemento atual. Uma outra maneira utilizar valores numricos, onde key equivale a 0 e value equivale a 1.
<?php $precos=array('Monitor'=>550,'Teclado'=>48,'Mouse'=>15); while($dados = each($precos)){ echo $dados[0]." - ".$dados[1]."<br />"; } ?>

No caso acima fora utilizado localizaes identificadas no nomeadas e sim numeradas. O script a seguir demonstra uma maneira diferente de se ler os dados de um array de maneira simples e mais compreensvel. A funo list( ) pode ser utilizada para dividir um array em vrios valores. Neste caso, podemos separar dois dos valores que a funo each( ) oferece:
<?php $precos=array('Monitor'=>550,'Teclado'=>48,'Mouse'=>15); while(list($produto,$preco) = each($precos)){ echo "$produto - $preco<br />"; } ?>

Um caso bem comum o de voc desejar criar dois loops em um mesmo script. Para isso utilize a funo reset( ) para reiniciar o array. Isso acontece porque o cursor aps a execuo de um loop se encontra no fim do array. O script completo seria:
<html> <body> <?php $precos=array('Monitor'=>550,'Teclado'=>48,'Mouse'=>15); while($dados = each($precos)){ echo $dados["key"]." - ".$dados["value"]."<br />"; } reset($precos); while(list($produto,$preco) = each($precos)){ echo "$produto - $preco<br />"; } ?> </body> </html> ex_loop_each_list.php

Com uma variao do loop for, temos com a juno de each ao loop, fora criado um

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

73

PHP 5 e MySQL 5 e Ajax


loop especial para colees, que funciona muito bem nestes casos. Seu nome ...

foreach
O PHP5 inclui uma construo foreach, muito parecido com o PERL e outras linguagens. Isto simplesmente oferece uma maneira fcil de interar sobre matrizes. H duas sintaxes; a segunda uma abreviatura, mas til, da primeira:
foreach(expressao_matriz as $valor) instrucoes foreach(expressao_matriz as $chave => $valor) instrues

A primeira forma varre um array dado por expressao_matriz. Em cada 'loop', o valor do elemento corrente atribudo a $valor e o ponteiro interno da matriz avanado em uma posio (assim, na prxima iterao, voc estar olhando para o prximo elemento). A segunda forma faz a mesma coisa, exceto pelo fato de que a chave do elemento atual ser atribuda varivel $chave em cada iterao. Obs.: Quando o foreach inicia sua primeira execuo, o ponteiro interno da matriz zerado automaticamente, posicionando-o no incio. Isto significa que voc no precisa chamar reset( ) antes de um loop foreach . Obs 2.: Note tambm que foreach opera sobre uma cpia do array especificado, no o prprio array, portanto o ponteiro do array no modificado como na instruo each( ), que altera o elemento do array selecionado, mas isso no se reflete o array original. Obs 3.: foreach tem a habilidade de evitar mensagens de erro com o @. Voc pode ter notado que os seguintes itens so funcionalmente idnticos:
reset ($matriz); //a funo reset() reinicia a matriz while (list(, $valor) = each ($matriz)) { echo "Valor: $valor<br />\n"; }//exemplo de utilizao do loop while com a funo each() foreach ($matriz as $valor) { echo "Valor: $valor<br />\n"; } //exemplo do loop foreach()

Os seguintes tambm so funcionalmente idnticos:


foreach ($matriz as $chave => $valor) { echo "Chave: $chave; Valor: $valor<br>\n"; }

Mais alguns exemplos para demonstrar os usos:


<?php $a = array ("Roberto", "Joo", "Luana", "Lilian"); foreach ($a as $v) { echo 'O nome atual de $a : '.$v.'<br>'; }

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

74

PHP 5 e MySQL 5 e Ajax


?> ex_foreach.php <?php $a = array ("Roberto", "Joo", "Luana", "Lilian"); $i = 0; foreach($a as $v) { echo "\$a[$i] => $v.<br>\n"; $i++; } ?> ex_foreach_2.php <?php $a = array ( "primeiro" => 'Roberto', "segundo" => 'Joo', "terceiro" => 'Luana', "quarto" => 'Lilian' ); foreach($a as $c => $v) { echo "$c => $v.<br>"; } ?> ex_foreach_3.php <?php $a[0][0] $a[0][1] $a[1][0] $a[1][1]

= = = =

"Roberto"; "Joo"; "Luana"; "Lilian";

foreach($a as $v1) { foreach ($v1 as $v2) { echo "$v2<br>"; } } //exemplo da utilizao do loop com array multidimensional ?> ex_foreach_arr_mult.php 1. <?php 2. foreach(array('Roberto', 'Joo', 'Luana', 'Lilian', 'Roberta') as $v) { 2.1.1. echo "$v<br>"; 3. }// exemplo da utilizao do loop com array dinmico 4. ?> ex_foreach_arr_dinam.php

Exemplo prtico do uso do foreach


PHP 5 & MySQL 5 for Web www.integrator.com.br/php
75

PHP 5 e MySQL 5 e Ajax


Considere a seguinte situao: Voc tem um formulrio de informaes e gostaria de varr-lo para saber quais foram escolhidos pelo usurio. Veja o caso:
<html> <head> <title>Utilizando o loop Foreach</title> </head> <body> <?php if(count($_POST["musica"])>0){ echo "<h2>Voc escolheu as msicas</h2>"; foreach($_POST["musica"] as $musica) { echo "$musica<br>"; } } ?> <form name="form1" method="post" action="<?=$PHP_SELF?>"> <h2>Escolha as msicas</h2> <p> <input name="musica[]" type="checkbox" id="musica[]" value="rock"> Rock<br> <input name="musica[]" type="checkbox" id="musica[]" value="pop"> POP<br> <input name="musica[]" type="checkbox" id="musica[]" value="dance"> Dance<br> <input name="musica[]" type="checkbox" id="musica[]" value="mpb"> MPB<br> <input name="musica[]" type="checkbox" id="musica[]" value="sertanejo"> Sertanejo</p> <p> <input type="submit" name="Submit" value="Escolher"> </p> </form> </body> </html>

ex_prat_foreach.php

Arrays Bidimensionais
As matrizes no tm de ser uma lista simples de chaves e valores cada localizao na matriz pode armazenar outra matriz. Dessa maneira, podemos criar uma matriz bidimensional. Voc pode pensar em uma matriz de duas dimenses como sendo uma grade, com largura e altura ou linhas e colunas. Veja no quadro abaixo: Cdigo MO TE MS Descrio Monitor Teclado Mouse Preo 550,00 48,00 15,00

No exemplo abaixo, voc tem um array bidimensional com a seqncia que o acessa. <?php $produtos=array(

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

76

PHP 5 e MySQL 5 e Ajax


array("MO","Monitor",550), array("TE","Teclado",48), array("MS","Mouse",15) ); echo "| ".$produtos[0][0]." | ".$produtos[0][1]." | ".$produtos[0][2]." | <br /> | ".$produtos[1][0]." | ".$produtos[1][1]." | ".$produtos[1][2]." | <br /> | ".$produtos[2][0]." | ".$produtos[2][1]." | ".$produtos[2][2]." |"; ?> arr_bid.php Conclui-se que o primeiro valor a linha e o segundo a coluna, logo: $produtos[$linha][$coluna]; Para fazer uma varredura no array bidimensional, essas informaes so imprescindveis.
<?php $produtos=array( array("MO","Monitor",550), array("TE","Teclado",48), array("MS","Mouse",15) ); for($linha=0;$linha<3;$linha++){ for($coluna=0;$coluna<3;$coluna++){ echo "| ".$produtos[$linha][$coluna]." "; }//fim do loop da coluna echo "|<br />"; }//fim do loop da linha ?> loop_arr_bid.php

Classificando arrays
Freqentemente til classificar os dados relacionados armazenados em um array. Pegar um array dimensional e classific-lo no pedido bem fcil.

Utilizando sort( )
O seguinte cdigo resulta no array sendo classificado em ordem alfabtica crescente:
<?php $produtos=array("Monitor","Teclado","Mouse","Armrio"); sort($produtos); for($i=0;$i<4;$i++){ echo $produtos[$i]."<br>"; } ?>

arr_func_sort.php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

77

PHP 5 e MySQL 5 e Ajax


A funo sort( ) faz distino de letras maisculas e minsculas. Todas as letras maisculas vm antes de todas as letras minsculas. Ento A menor que Z, mas Z menor que a. O inverso seria rsort( ).

Reordenando arrays aleatoriamente


Para alguns sites, talvez voc queira manipular a ordem do array de outras maneiras. A funo shuffle( ) reordena aleatoriamente os elementos de um array( ).
<?php $produtos=array("Monitor","Teclado","Mouse","Armrio"); shuffle($produtos); for($i=0;$i<4;$i++){ echo $produtos[$i]."<br>"; } ?>

arr_func_shuffle.php

Redirecionando um usurio
Para redirecionar um usurio indesejado, utilize a funo header( ).
header("Location: http://www.integrator.com.br");

Nota: A funo header( ) deve ser usada antes de lanado qualquer informao no browser, caso contrrio, esta retornar um erro.

Expresses Regulares (compatveis com o padro POSIX)


Expresses regulares so usadas para manipulaes complexas de strings no PHP. Algumas das funes que suportam as expresses regulares: ereg( ) ereg_replace( ) eregi( ) eregi_replace( )

Um exemplo mostrado a seguir: <?php $string="Texto"; // Retorna true se "Te" existir em qualquer lugar de $string. if(ereg ("Te", $string)) echo "existe em qualquer lugar<br />"; // Retorna true se "te" existir no incio de $string.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

78

PHP 5 e MySQL 5 e Ajax


if(eregi ("^te", $string)) echo "existe no incio<br />"; // Retorna true se "to" existir no final de $string. if(ereg ("to$", $string)) echo "existe no final<br />"; // Retorna true se o navegador do cliente for Netscape 2, 3 ou MSIE 6. if(eregi ("(ozilla.[23]|MSIE.6)", $_SERVER['HTTP_USER_AGENT'])) echo "A verso a {$_SERVER['HTTP_USER_AGENT']} <br />"; echo "<br />"; // Acrescenta o texto no incio de $string. echo $string = ereg_replace ("^", "Esse ", $string); echo "<br />"; // Acrescenta o texto no final de $string. echo $string = ereg_replace ("$", " aqui", $string); echo "<br />"; // Remove todos caracteres t em $string. echo $string = eregi_replace ("t", "", $string); ?> expressoes_regulares.php

As expresses regulares
Tabela de expresses regulares
Smbolo ^ $ n? n* n+ n{2} n{2,} n{2,4} . () (.*) (n|a) [1-6] [c-h] [D-M] [^a-z] O que significa? Incio da linha Fim da linha Zero ou somente uma nica ocorrncia de caracteres 'n' Zero ou mais ocorrncia de caracteres 'n' Pelo menos um ou mais ocorrncias de caracteres 'n' Exatamente duas ocorrncias de 'n' Pelo menos 2 ou mais ocorrncias de 'n' De 2 at 4 ocorrncias de 'n' Qualquer caractere nico Parnteses para agrupar expresso Zero ou mais ocorrncias de qualquer caractere nico Ou 'n' ou 'a' Qualquer dgito nico entre 1 e 6 Qualquer letra nica em minscula entre c e h Qualquer letra nica em maiscula entre D e M Qualquer caractere nico EXCETO qualquer letra que esteja entre a seqncia at z.

Um exemplo da aplicao de expresses regulares


^.{2}[a-z]{1,2}_?[0-9]*([1-6]|[a-f])[^1-9]{2}a+$
^.{2} [az]{1,2} _? [0-9]* O comeo da linha com dois quaisquer caracteres Seguido por 1 ou 2 letras em minsculo, Seguido por um sublinhado (underline) opcional, Seguido por zero ou mais dgitos,

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

79

PHP 5 e MySQL 5 e Ajax


([16]|[af]) [^19]{2} a+$ Seguido por um ou outro dgito entre 1 e 6 OU uma letra em minsculo entre a e f, Seguido por dois quaisquer caracteres EXCETO dgitos entre 1 e 9 (0 possvel), seguida por pelo menos um ou mais ocorrncias de 'a' at o fim da linha.

Validando formataes e verificando preenchimentos


Algumas vezes voc ser obrigado a fazer algumas verificaes a fim de evitar problemas na hora de inserir dados em um banco de dados, tornando assim o seu site estvel. Os exemplos a seguir demonstram como voc pode facilitar sua vida adicionando apenas algumas pequenas funes que validam e verificam.

A funo ereg( )
A funo ereg( string expressao, string variavel [, array registros] ) uma funo booleana, ou seja, retorna TRUE, caso tenha sucesso em sua verificao: Verifica se a varivel similar com a expresso regular definida em expressao em um modo sensvel a distino de caracteres (case sensitive). Se existirem parnteses de substrings na expressao e for passado o terceiro parmetro registros para a funo, a execuo guardar os elementos resultantes na matriz registros. $registros[1] ir conter a substring indicada pelo primeiro parnteses da esquerda; $registros[2] contm a segunda substring, e assim por diante. $registros[0] conter uma cpia completa da varivel casada. <?php function valida_cep($_cep) { // Valida um CEP no formato 99999-999 ou 99999999 if(ereg("^([0-9]){5}-?([0-9]){3}$",$_cep,$_c)) { return Array($_c[1],$_c[2]); } else { return FALSE; } } $_cp = array("05735-010","03578000","A0010-000","98120"); foreach($_cp as $_cep) { if(($_r=valida_cep($_cep))===FALSE) { echo "$_cep: CEP Incorreto"; } else { echo "$_cep: CEP OK"; } echo "<br/>"; } ?> ereg_valida_cep.php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

80

PHP 5 e MySQL 5 e Ajax


A funo eregi( )
A funo eregi ( string expressao, string variavel [, array registros] ) retorna valores booleanos assim como a funo ereg( ) . Essa funo idntica funo ereg ( ) com exceo de no fazer distines alfabticas entre caracteres (case insensitive) na hora de casar resultados. <?php function valida_email($_email) { // Valida um e-mail no formato maisculo ou minsculo if (eregi("^[a-zA-Z0-9_\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$", $_email,$_e)) { return Array($_e[1],$_e[2],$_e[3] ); } else { return FALSE; } } $_emails = Array("edson@integrator.com.br","EDSON.g@gmail.com", "edgonn@aaa","edsonaaa.com"); foreach($_emails as $_email) { if(($_r=valida_email($_email))===FALSE) { echo "$_email: e-mail Incorreto"; } else { echo "$_email: e-mail OK"; } echo "<br/>"; } ?> eregi_valida_email.php

A funo ereg_replace( )
A funo ereg_replace ( string expressao, string substituicao, string variavel ) busca em varivel resultados para a expressao, substituindo se casar pelo texto em substituio. A varivel modificada ser retornada (poder ocorrer da string original ser retornada caso no acontea nenhuma substituio). Se a expressao contiver parnteses de substrings, a substituicao ser realizada atravs do formato \\digit, que indicar qual parte do texto substitudo dever ser retornada; \\0 retornar a string na integra. At nove substrings podem ser usadas. Os parnteses podem ser aninhados, sendo que a contagem ser feita atravs da quantidade de parnteses abertos. Se no tiverem valores que casem com o parmetro variavel, o resultado ser a varivel inalterada. <?php $_str = "http://www.integrator.com.br"; echo ereg_replace("http://www", "ftp://ftp", $_str); echo "<br/>";

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

81

PHP 5 e MySQL 5 e Ajax


echo ereg_replace("(http):", "\\1s:", $_str);//contagem com um parnteses echo "<br/>"; echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>", $_str); //retorna na integra \\0 echo "<br/>"; $string = "Esse um teste"; echo ereg_replace (" um", " est sendo", $string); echo "<br/>"; echo ereg_replace ("( )", "\\1foi", $string); echo "<br/>"; echo ereg_replace ("(( ))", "\\2ser", $string);//contagem com dois parnteses ?> ereg_replace.php Metacaracteres em expresses regulares
[:digit:] [:alnum:] [:alpha:] [:blank:] [:xdigit:] [:punct:] [:print:] [:space:] [:graph:] [:upper:] [:lower:] [:cntrl:] Dgitos de 0 at 9 Caracteres alfanumricos de 0 at 9 ou A at Z ou a at z. Caracteres alfabticos de A at Z ou a at z. Caracteres de espao e tabulao. Dgitos hexadecimais Smbolos de pontuao . , " ' ? ! ; : Todos os caracteres que podem ser impressos. Caracteres de espao. Todos os caracteres impressos, menos espao. Caracteres alfabticos maisculos de A at Z. Caracteres minsculos de a at z. Caracteres de control.

Tabela de smbolos de caracteres


\a \b \f \n \r \t \v caractere control Backspace form feed line feed carriage return horizontal tab vertical tab

A funo eregi_replace( )
No ser colocado um exemplo nessa apostila por ser idntica a ereg_replace( ), diferenciando-se apenas por ser insensvel a maisculas e minsculas.

A funo str_replace( )
A funo str_replace ( mixed pesquisa, mixed substitui, mixed assunto [, int &count] ) substitui todas as ocorrncias da string de procura com a string de substituio. Esta funo retorna uma string ou um array com todas as ocorrncias de pesquisa em assunto substitudas com a o valor dado para substituir. <?php $str_inv = array("/", "\\", "'");//lista de strings invlidas $_str="Esse/ um exemplo de\\informao invlida'//como voc pode ver<br>"; echo $str_retornada = str_replace($str_inv, " ", $_str, $c); echo $c; ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

82

PHP 5 e MySQL 5 e Ajax


str_replace.php

A funo number_format( )
A funo number_format ( float number [, int decimals] ) ou number_format ( float number, int decimals, string dec_point, string thousands_sep ) formata um nmero com os milhares agrupados. A funo number_format( ) retorna uma verso formatada de number. Esta funo aceita um, dois ou quatro parmetros (no trs): Se apenas um parmetro dado, number ser formatado sem decimais, mas com uma virgula (",") entre cada grupo de milhar. Se dois parmetros so dados, number ser formatado com o nmero de casas decimais especificadas em decimals com um ponto (".") na frente, e uma vrgula (",") entre cada grupo de milhar. Se todos os quatro parmetros forem dados, number ser formatado com o nmero de casas decimais em decimals, dec_point ao invs do ponto (".") antes das casas decimais e thousands_sep ao invs de uma vrgula (",") entre os grupos de milhares. <?php $numero = 125456.72; $f1 = number_format($numero); $f2 = number_format($numero,3); $f3 = number_format($numero,2,",","."); echo "number_format, com 1 parmetro: $f1 "; echo "<br>com 2 parmetros: $f2"; echo "<br>com todos os parmetros: $f3"; ?> number_format.php

A funo nl2br( )
A funo nl2br ( string ) insere quebras de linha HTML antes de todas newlines em uma string. Como essa funo retorna string com '<br />' inserido antes de todas as newlines, excelente em uso com a tag <TEXTAREA> do HTML. <?php $texto = "Este um texto\ncom line-feed como quebra\n de pgina"; echo "sem nl2br( ):<br />$texto<br /><br />Com nl2br( ):<br />" . nl2br($texto); ?> nl2br.php

A funo wordwrap( )
A funo wrodwrap( string string [, int largura [, string quebra [, boolean corte]]] ) insere na string informada o caracter de quebra de linha \\n (ou um outro caracter qualquer, por exemplo <BR>), a cada n caracteres (o padro 75). O parmetro corte serve para forarmos a quebra mesmo para palavras extremamente grandes. Essa funo excelente quando temos um site formatado em determinada largura (dentro ou no de uma tabela), mas por ser dinmico, as informaes postas podem ser grandes por erros na digitao, bagunando assim o layout criado. <?php $texto = "A funo wrodwrap insere na string informada o caracter de

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

83

PHP 5 e MySQL 5 e Ajax


quebra de linha \\n (ou um outro caracter qualquer, por exemplo <BR>), a cada n caracteres (o padro 75). O parmetro corte serve para forarmos a quebra mesmo para palavras extremamente exxxxxxxxteeeeeeeeeeeeenssssssssssssssaaaaaaaaaaasssssssss."; $texto = htmlentities($texto); echo wordwrap($texto); echo "<br><br><b>Sem o parmetro corte:</b><br>"; echo wordwrap($texto,30,"<br/>"); echo "<br><br><b>Sem o parmetro corte:</b><br>"; echo wordwrap($texto,30,"<br/>",TRUE); ?> wordwrap.php

A funo strip_tags( )
Extremamente til em um sistema dinmico, principalmente de uso pblico como fruns e livro de visitas. A funo strip_tags ( string str [, string allowable_tags] ) retira tags HTML e PHP de uma string. Voc pode utilizar o segundo parmetro, que opcional, para indicar tags que no devem ser retiradas. <?php $texto = "<b>Exemplo de Strig_tags</b> <script>alert('Este um Java script embutido no texto')</script>"; echo $texto . "<br>"; echo strip_tags($texto," <b>"); ?> strip_tags.php

A funo htmlentities( )
Tambm muito til, a funo htmlentities( string string [, int quote_style [, string charset]] ) tem a habilidade de converter as tags para entidades HTML, no causando formataes indesejadas em sites dinmicos, principalmente os de insero de contedo pblico. <?php $valor = "<B><FONT COLOR='RED'> Exemplo de htmlentities( ) </B></FONT><BR>"; echo $valor; echo htmlentities($valor); ?> htmlentities.php O inverso dessa funo html_entity_decode( ). <?php $string = "&lt;B&gt;&lt;FONT COLOR= &#039;RED&#039;&gt;Exemplo de htmlentities()&lt;/B&gt;&lt;/FONT&gt;&lt;BR&gt;";

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

84

PHP 5 e MySQL 5 e Ajax


echo html_entity_decode($string); ?> html_entity_decode.php

Funes teis, mas no essenciais


As funes mostradas a seguir so teis em alguns casos, mas no sero explicadas, pois so compreensveis em seus exemplos: <?php $str_m="esse um texto que ser manipulado<br>"; $str_M="VEJA S ESSE TEXTO<br>"; echo strtolower($str_M);//converte para minsculo echo strtoupper($str_m);//converte para maisculo echo ucwords($str_m);//capitula a primeira letra de cada palavra echo ucfirst($str_m);//capitula apenas a primeira letra da frase ?> diversas_func_str.php

Enviando um e-mail Funo mail( )


Envia um e-mail de um formulrio ou diretamente por uma pgina em PHP. Escopo da funo:
bool mail ( string para, string assunto, string mensagem [, string cabealhos_adicionais [, string parametros_adicionais]])

<?php $para="integrator@integrator.com.br"; $assunto="Envio de e-mail"; $mensagem="Testando o e-mail pelo PHP"; mail( $para,$assunto,$mensagem); ?>

O exemplo acima envia e-mail diretamente para o e-mail do integrator. Abaixo voc tem um exemplo de envio de html:
<? $para="integrator@integrator.com.br"; $assunto=Envio de e-mail em HTML; $mensagem=<h2>Esta uma mensagem em formato HTML</h2> <strong>Estas informaes so enviadas como esto formatadas</strong>; $headers = "MIME-Version: 1.0\r\n"; $headers .="Content-Type: text/html; charset=iso-8859-1\n";

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

85

PHP 5 e MySQL 5 e Ajax


$headers .= "From: \"Edson\" <edson@integrator.com.br>\r\n"; $headers .= "Cc:contato@integrator.com.br\r\nCc:webmaster@integrator.com.br\r\n";//cpias carbono $headers .= "Bcc:webmaster@cestashow.com\r\n";//Cpia carbono oculta mail($para, $assunto, $mensagem, $cabecalho); //envio do e-mail ?> Nota: Este exemplo s configurado para apontar computador. funciona onde o PHP.INI estiver para o servidor de e-mail do seu

Trabalhando com arquivos


At agora, voc trabalhou com envio e recebimento de informaes que no eram armazenadas. Mas antes de voc conhecer o bancos de dados, voc ter uma breve inicializao por manipulao de arquivos de texto simples flat file. As funes que iremos utilizar so fopen( ), fwrite( ) e fclose( ). Descrio: Funo fopen( ) fwrite( ) fclose( ) O que faz abre um arquivo escreve em um arquivo fecha um arquivo

<?php // Abre ou cria o arquivo exemplo1.txt // "a" representa que o arquivo aberto para ser escrito $fp = fopen("exemplo1.txt", "a"); // Escreve "primeiro exemplo" no exemplo1.txt $escreve = fwrite($fp, "primeiro exemplo"); // Fecha o arquivo fclose($fp); ?>

ex_cria_escreve.php

Como resultado criado um arquivo chamado exemplo1.txt, escrito "primeiro exemplo". Se voc repetir a ao, "primeiro exemplo" ser escrito novamente no fim desse arquivo. importante notar que voc tem diversas maneiras de abrir um arquivo, que so representadas por letras. No exemplo acima utilizamos o modo "a", veja abaixo a lista de todos os modos e suas descries: Tabela de Cdigos e Significados da funo fopen( ) Cd. Significado Informaes Adicionais

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

86

PHP 5 e MySQL 5 e Ajax


'r' 'r+' 'w' Abre somente para leitura Abre para leitura e gravao Abre somente para gravao Abre para leitura e escrita Coloca o ponteiro no comeo do arquivo. Coloca o ponteiro no comeo do arquivo. coloca o ponteiro no comeo do arquivo e apaga o contedo que j foi escrito. Se o arquivo no existir, tentar cri-lo. coloca o ponteiro no incio do arquivo e apaga o contedo que j foi escrito. Se o arquivo no existir, tentar cri-lo. coloca o ponteiro no fim do arquivo. Se o arquivo no existir, tentar cri-lo. coloca o ponteiro no fim do arquivo. Se o arquivo no existir, tentar cri-lo. coloca o ponteiro no incio do arquivo. Se o arquivo j existe, a chamada a fopen( ) ir falhar, retornando FALSE e gerando um erro nvel E_WARNING. Se o arquivo no existe, tenta cri-lo. coloca o ponteiro no incio do arquivo. Se o arquivo j existe, a chamada a fopen( ) ir falhar, retornando FALSE e gerando um erro nvel E_WARNING. Se o arquivo no existe, tenta cri-lo.

'w+'

'a' 'a+' 'x'

Abre o arquivo somente para escrita Abre o arquivo para leitura e gravao Cria e abre somente para gravao

'x+'

Cria e abre para leitura e escrita

Com estas trs funes voc pode criar, escrever e fechar um arquivo facilmente. Voc tambm pode usar a funo fputs( ). fputs( ) uma funo sinnima (alias) para fwrite( ), e idntica em todas as maneiras.

Armazenando e recuperando informaes


Como ocorre com o banco de dados, aps armazenar as informaes voc deve reaproveit-las. Para isso voc dever usar algumas funes extras. Funo explode( ) opendir( ) readdir( ) closedir( ) file_exists( ) O que faz Divide uma string abre um diretrio l os arquivos de um diretrio fecha um diretrio verifica se um arquivo existe

<html> <head><title>Cadastro de usurios</title></head> <body> <form method="POST" action="cad_dados_txt.php"> Nome: <input type="text" size="10" name="nome"><br> E-mail: <input type="text" size="10" name="email"><br> Endereo: <input type="text" size="10" name="endereco"><br> Telefone: <input type="text" size="10" name="telefone"><br>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

87

PHP 5 e MySQL 5 e Ajax


<br><input type="submit" value="cadastrar"> </form> </body> </html> form_cad_dados.php <?php // Verifica se todos os campos foram preenchidos if (!$nome || !$email || !$endereco || !$telefone) { echo "preencha todos os campos"; } else { // Verifica se um usurio com o mesmo nome ja foi cadastrado if(!file_exists($nome . ".txt")) { // Criamos o arquivo do usurio com w+ $cria = fopen($nome . ".txt", "w+"); // Aqui iremos declarar as informaes do usurio // So separadas por | para depois podemos recupera-las com explode $dados .= "$nome|"; $dados .= "$email|"; $dados .= "$endereco|"; $dados .= "$telefone"; // Agora escrevemos estes dados no arquivo $escreve = fwrite($cria,$dados); // Fechando o arquivo fclose($cria); // Exibe a mensagem de usurio cadastrado echo "usurio cadastrado com sucesso!"; } else { // Se ja houver um usurio cadastrado com o mesmo nome echo "um usurio chamado $nome ja foi cadastrado"; } } ?> cad_dados_txt.php <?php // Primeiro definiremos onde esto os arquivos // ./ significa que os arquivos esto no diretrio atual $dir = "./"; // Abre o diretorio $dir $abredir = opendir($dir); // Faz o loop para a exibio de usurios while ($arqs = readdir($abredir)) { // Aqui fazemos o php tirar "." e ".." que so "bugs" do readdir() // Tambm faz com que s sejam abertos arquivos de texto if ($arqs != "." && $arqs != ".." && is_file($arqs) &&

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

88

PHP 5 e MySQL 5 e Ajax


ereg(".txt", $arqs)) { // Agora iremos abrir arquivo por arquivo, e exibir os dados do usurio // Usamos o "r" pois somente queremos ler o arquivo $abre = fopen($arqs,"r"); // Usamos fread agora para ler o arquivo $le = fread($abre,filesize($arqs)); // Agora vem o grande truque, separamos os dados pelo "|" com explode $dado = explode("|",$le); // Define os registros $nome = $dado['0']; $email = $dado['1']; $endereco = $dado['2']; $telefone = $dado['3']; // Vamos mostrar os dados que obtivemos echo "Usurio: <b>$nome</b><br>"; echo "nome: $nome<br>"; echo "e-mail: $email<br>"; echo "endereo: $endereco<br>"; echo "telefone: $telefone<br><br>"; } } // Fecha o diretorio closedir($abredir); ?>
ver_dados.php

Uma alternativa a escrita de arquivos


No PHP5, voc tem uma alternativa para escrever arquivos, saindo do tradicional fopen( ), fwrite( ) e fclose( ), chamado de file_put_contents ( ). <?php $_str = "Escrevendo arquivos com file_put_contents( )"; file_put_contents("arquivo.txt",$_str); $_str = "<P>Data: <?php echo date(\"d-m-Y H:i:s\")?></P>"; //acrescentando ao final do arquivo com o parmetro FILE_APPEND file_put_contents("arquivo.txt",$_str, FILE_APPEND); echo htmlentities(file_get_contents("arquivo.txt")); include_once("arquivo.txt"); ?>
file_put_contents.php

Uma alternativa a leitura de arquivos


Em substituio da funo fread( ) voc pode usar a funo file_get_contents( ). <?php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

89

PHP 5 e MySQL 5 e Ajax


echo file_get_contents("arquivo.txt"); ?> file_get_contents.php

Trabalhando com Datas


Com a funo date( ), voc pode retornar valores de datas nos seus scripts PHP. A funo date( ) aceita dois parmetros, sendo que um deles opcional.
<?php echo date("d/m/Y");

?> data_formatada.php

O exemplo acima retornar a data atual do sistema no formato dd/mm/aaaa. Uma coisa a ser levada em considerao que como a linguagem est em ingls, algumas opes no esto no formato desejado. Abaixo veja a tabela:
Cdigo Descrio

aABdDFgGhHiIjlLmMnOrsStTUwWYyz-

"am" ou "pm" "AM" ou "PM" Swatch Internet time dia do ms, 2 digitos com zeros esquerda; i.e. "01" at "31" dia da semana, texto, 3 letras; e.g. "Fri" ms, texto, longo; e.g. "January" hora, Forma com 12-horas sem zeros esquerda; i.e. "1" at "12" hora, Forma com 24-horas sem zeros esquerda; i.e. "0" at "23" hora, Forma com 12-horas; i.e. "01" at "12" hora, Forma com 24-horas; i.e. "00" at "23" minutos; i.e. "00" at "59" "1" Se no horrio de vero, seno "0". Dia do ms sem zeros esquerda; i.e. "1" at "31" dia da semana, texto longo; e.g. "Friday" booleano se um ano bissexto; i.e. "0" ou "1" ms; i.e. "01" at "12" ms, texto, 3 letras; e.g. "Jan" ms sem zeros esquerda; i.e. "1" at "12" Diferena entre o horrio de Greenwich em horas; e.g. "+0200" RFC 822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" segundos; i.e. "00" at "59" Sufixo ordinal para o dia do ms, 2 caracteres; i.e. "st", "nd", "rd" or "th" nmero de dias do dado ms; i.e. "28" at "31" Timezone setting desta mquina; e.g. "EST" or "MDT" segundos desde a poca Unix (January 1 1970 00:00:00 GMT) dia da semana, numrico, i.e. "0" (domingo) at "6" (Sbado) ISO-8601 nmeros de semanas do ano, semana comea na segunda-feira ano, 4 dgitos; e.g. "1999" ano, 2 dgitos; e.g. "99" dia do ano; i.e. "0" at "365" 90

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


Ztimezone offset em segundos (i.e. "-43200" to "43200"). O offset para as timezones oeste de UTC sempre negativa, e para as leste de UTC sempre positiva.

Existem alguns casos em que voc poder inserir dados em formato de data no MySQL. Se isso acontecer, voc ter o seguinte formato: aaaa/mm/dd.

MySQL
At agora, voc est em contato somente com o PHP, mas em si, o PHP no teria grande serventia se no houvesse uma integrao com banco de dados. Utilizar um banco de dados a melhor deciso que voc poder tomar, mesmo porque, o acesso a dados bem mais rpido que o acesso a arquivos simples (flat files). Em termos mais concretos, utilizar um banco de dados relacional permite rpida e facilmente responder consultas a respeito de onde so seus clientes, qual de seus produtos est vendendo melhor ou que tipo de clientes gastam mais. O banco de dados que utilizaremos nesta seo o MySQL. Essa escolha no ao acaso, pois sabemos que existem grandes sistemas de banco de dados espalhados no mercado. Mas como o PHP pertence comunidade livre, fica claro que seus desenvolvedores tenham tambm a preferncia por um sistema de banco de dados livre. Mas voc no precisa cruzar os braos e ficar parado s porque no conhece o MySQL e trabalha com Oracle ou MSSQL. O PHP tambm tem suporte para esses bancos de dados.

O que MySQL?
MySQL um sistema de gerenciamento de banco de dados relacional, multiencadeado, de cdigo-fonte aberto e nvel corporativo. O MySQL foi desenvolvido por uma empresa de consultoria na Sucia chamada inicialmente de TcX, depois, com a popularidade do MySQL, passou a se chamar MySQL AB. Seu desenvolvimento ocorreu quando estavam precisando de um sistema de banco de dados que fosse extremamente rpido e flexvel. Foi, assim ento, que eles criaram o MySQL, que vagamente baseado em outro sistema de gerenciamento de banco de dados chamado de mSQL. O MySQL rpido, flexvel e confivel. utilizado em muitos lugares por todo o mundo. Obs.: A propsito, parte ''AB'' do nome da companhia o acrnimo para a palavra sueca ''aktiebolag'', ou ''sociedade annima''. Ela traduzida para ''MySQL, Inc.'' De fato, MySQL Inc. e MySQL GmbH so exemplos de subsidirias da MySQL AB. Elas esto localizadas nos EUA e Alemanha, respectivamente.

O que um banco de dados relacional?


Um banco no mundo de cimento e tijolo o lugar onde guardamos dinheiro. Um banco de dados tambm guarda, s que neste caso so dados.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

91

PHP 5 e MySQL 5 e Ajax


Chamamos de dados tudo que possamos inserir no computador, nmeros, letras, caracteres, imagens e etc. Um banco de dados relacional uma composio de tabelas e colunas que se relacionam entre si. Esses relacionamentos so baseados em um valor-chave que contido em cada tabela, em uma coluna.

Instalando o banco de dados


O MySQL tem diferentes formas de instalao quando se trata de sistemas operacionais. No caso do Windows, voc pode baixar a ltima distribuio atravs do site: http://www.mysql.com/downloads.

Instalando no Windows
Procure pelo formato executvel. O arquivo vem compactado no formato .zip. Descompacte e instale. A instalao, como no poderia deixar de ser, feita por um assistente. Siga os passos at a finalizao. Caso sua mquina tenha o sistema operacional Windows pertencente a famlia NT( NT, 2000 ou XP), o MySQL instalado como servio. Ento basta iniciar ou parar o servio, encontrado no Painel de Controle>Ferramentas Administrativas>Servios. Voc tambm pode utilizar o comando pelo prompt, desde que voc saiba o nome do servio do seu MySQL: Para iniciar o servio net start mysql Para parar o servio net stop mysql

Instalando o MySQL no Linux


O MySQL Server pode ser instalado no Linux de vrias formas. A forma recomendada a que est em formato RPM. Voc deve baixar dois arquivos para instalar o MySQL na sua mquina. Esses arquivos so: MySQL-server-[verso].i386.rpm para instalar o servidor mysqld no Linux MySQL-client-[verso].i386.rpm para instalar o cliente mysql para executar os comandos no Linux. A instalao poder ser feita atravs do comando rpm, no Shell do seu Linux. Um exemplo seria: Shell> rpm ivh MySQL-server-5.0.1.i386.rpm MySQL-client-5.0.1.i386.rpm

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

92

PHP 5 e MySQL 5 e Ajax


A verso RPM j vem com pr-configuraes e assim que ocorrer a instalao, para iniciar ou parar o servidor, a seguinte sintaxe poder ser feita: Shell>/etc/init.d/./mysql start para iniciar o servidor MySQL Shell>/etc/init.d/./mysql stop para parar o servidor MySQL

Acessando o banco de dados MySQL No Windows


Se voc estiver usando o sistema operacional Windows e utilizou a instalao padro do programa, abra o prompt de comando e digite a seqncia:

cd\mysql\bin

Lembrando que voc deve estar no drive em que o MySQL est instalado. Por padro voc o instala no drive C. Digitando o comando a seguir voc entra no MySQL.

mysql u root -p Tecle ENTER e receber o pedido de senha: password Digite a senha que voc configurou na instalao e tecle ENTER novamente. Nota: Verses mais modernas do MySQL para o sistema operacional Windows no necessitam de tantos passos para iniciar, bastando ir at o atalho encontrado no menu Iniciar do sistema e no atalho do MySQL iniciar o prompt de comando encontrado neste local.

No Linux
Se voc utilizou a instalao binria, em rpm (recomendado), basta abrir o terminal e digitar a seqncia:

shell>mysql u root Se j estiver logado como root, no seu sistema operacional, no h necessidade de colocar o u root depois do comando mysql.

Os comandos CREATE e DROP


Quando pensar nos comandos CREATE e DROP, voc deve imaginar equipamentos de terraplanagem, caminhes basculantes e guindastes, porque so ferramentas que voc utiliza para criar o seu banco de dados. Esses comandos, embora raramente utilizados, so os mais importantes.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

93

PHP 5 e MySQL 5 e Ajax


O comando CREATE
H muitas maneiras diferentes de criar banco de dados no MySQL. Ao criar um banco de dados, voc normalmente ter o layout inteiro pronto. Normalmente adicionaria as tabelas imediatamente depois de criar o banco de dado, mas, teremos uma etapa por vez. A primeira etapa para criar um banco de dados no MySQL inserir o comando CREATE DATABASE nome_banco_de_dados da SQL (Structured Query Language) no monitor MySQL, onde nome_banco_de_dados o nome do banco de dados que voc est criado. No prompt de comando, no monitor do MySQL, insira o seguinte comando:

mysql> CREATE DATABASE livraria;

Note que no foi utilizado acentuao e em casos de palavras compostas no insira espaos, se for o caso insira sublinhado _ .

O comando USE
Depois de confirmado a criao do banco de dados, voc dever utilizar o comando USE para utilizar o banco de dados livraria.

USE livraria;

Um ponto importante que o MySQL no torna ativo o banco de dados que voc criou, isso deve ser implcito.

O comando DROP
O comando DROP semelhante ao comando CREATE. Enquanto o ltimo cria um banco de dados, o primeiro exclui. O comando DROP do SQL imperdovel. No h caixas de confirmao para ver se voc tem certeza. Este comando exclui o banco de dados e tudo o que estiver nele. s ir at o prompt de comando e no monitor do MySQL e digitar:

mysql> DROP DATABASE livraria;

Isso excluir o banco de dados veculos e tudo o que estiver nele.

Criando tabelas
PHP 5 & MySQL 5 for Web www.integrator.com.br/php
94

PHP 5 e MySQL 5 e Ajax


Criar tabela no MySQL uma tarefa relativamente fcil. Para se criar uma tabela basta usar a seqncia: shell>mysql u root Aps estar no monitor do MySQL digite a seguinte seqncia:

mysql> CREATE DATABASE livraria; mysql> USE livraria;


mysql> CREATE TABLE autores( -> autor_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, -> nome VARCHAR(100), -> dt_nasc DATE); mysql> CREATE TABLE editora( -> editora_id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, -> editora_nome VARCHAR(100) -> ); mysql> CREATE TABLE publicacao( -> isbn CHAR(13), -> autor_id INT UNSIGNED, -> editora_id INT UNSIGNED -> );

mysql> CREATE TABLE livros( -> isbn CHAR(13) NOT NULL PRIMARY KEY, -> titulo VARCHAR(50), -> edicao_num TINYINT(2), -> ano_publicacao YEAR, -> descricao TEXT);

O comando SHOW
Assim que criada sua primeira tabela. Para ver o resultado basta digitar a seqncia:

SHOW TABLES FROM livraria;

Para ver as colunas que existem na sua tabela digite:

SHOW COLUMNS FROM livros;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

95

PHP 5 e MySQL 5 e Ajax


Ou DESCRIBE.

O comando DESCRIBE
Se preferir, o comando DESCRIBE faz a mesma coisa que SHOW, mostrando as colunas existentes em sua tabela.

DESCRIBE livros;

Ou simplesmente:

DESC livros;

IF NOT EXISTS
Uma maneira de se ter certeza de se no est criando uma tabela novamente fazer o comando IF NOT EXISTS:

mysql> CREATE TABLE IF NOT EXISTS livros( -> isbn CHAR(13) NOT NULL PRIMARY KEY, -> titulo VARCHAR(50), -> edicao_num TINYINT(2), -> ano_publicacao YEAR, -> descricao TEXT);

Criando uma cpia de uma tabela


A partir da verso 4.1 voc pode copiar uma tabela com sua estrutura da seguinte maneira:

CREATE TABLE copia_livros LIKE livros;

Alterando tabelas existentes


Agora que voc criou a sua tabela o que aconteceria se voc precisasse alterar algo que fez? Confira os seguintes exemplos para alterar o nome da tabela, tipo de dados e o nome da coluna:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

96

PHP 5 e MySQL 5 e Ajax


Alterando o nome da coluna
ALTER TABLE copia_livros CHANGE titulo titulo_do_livro VARCHAR(50);

DESC copia_livros; # descreva as colunas de clientes Nota: # (sustenido) o inicio de um comentrio e no interfere em uma execuo de comando.

Alterando o tipo de coluna


mysql> ALTER TABLE copia_livros -> MODIFY titulo_do_livro VARCHAR(30) NOT NULL;

Renomeando uma tabela


ALTER TABLE copia_livros RENAME livros2;

Excluindo / adicionando colunas e tabelas


Como voc pode ver quando uma coluna criada ou uma tabela estas no so escritas na pedra e podem ser alteradas facilmente. Isso tambm implica em adicionar colunas em uma tabela existente ou exclu-la.

Eliminando tabelas e colunas


O comando DROP tambm utilizado para eliminar as colunas de uma tabela. Para excluir uma tabela existente execute a seguinte seqncia:

DROP TABLE livros2;

Para excluir somente uma coluna execute a seguinte seqncia:

ALTER TABLE livros2 DROP editora_id;

Isso excluir a coluna e todas as informaes que voc armazenou.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

97

PHP 5 e MySQL 5 e Ajax


Adicionando colunas
O comando ADD o responsvel pela insero de uma nova coluna.

ALTER TABLE livros2 ADD editora_id INT; #onde ADD adicionar

Adicionando colunas aps uma outra determinada


O comando AFTER adiciona a nova coluna na tabela aps o nome mencionado.

ALTER TABLE livros2 ADD editora_id INT AFTER edicao_num;

Utilizando ndices
Um ndice um arquivo estruturado que facilita o acesso a dados. Isso significa que um ndice na coluna correta aumentar a velocidade de uma consulta consideravelmente. Um ndice trabalha da mesma forma que pastas com separador alfabtico em um gabinete de arquivo ele permite pular para a parte do alfabeto que voc est procurando.

Decidindo quais colunas incluir no ndice


Voc deve colocar um ndice na(s) coluna(s) que utilizar com mais freqncia como filtro em suas consultas. Os ndices tambm funcionam melhor em colunas que contm dados nicos. Essa uma das razes pela as quais chaves so normalmente suas melhores escolhas para ndices. Essa tambm pode ser uma das razes que as pessoas confundem chaves e ndices. Uma chave ajuda a definir a estrutura de um banco de dados, ao passo que ndice apenas aprimora o desempenho. Um ndice pode ser composto de uma ou mais colunas. Voc tambm pode ter mais de um ndice em uma tabela.

Criando um ndice
Por padro, o MySQL cria um ndice se voc declara uma coluna como uma chave primria. No h necessidade de criar um ndice nessa coluna; caso contrrio voc teria dois ndices em uma mesma coluna. A sintaxe para criar um ndice em uma coluna:

ALTER TABLE livros ADD INDEX idx_titulo(titulo);

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

98

PHP 5 e MySQL 5 e Ajax


Excluindo ndices
Excluir um ndice to simples quanto criar. A sintaxe a mesma que excluir uma coluna ou uma tabela:

DROP INDEX nomedoindice ON nomedatabela;

Ou...

ALTER TABLE nomedatabela DROP INDEX nomedoindice;

Para alterar uma tabela eliminando uma chave primria, utilize a seguinte sintaxe:

ALTER TABLE nomedatabela DROP PRIMARY KEY;

Nota: Se voc estiver usando uma coluna com AUTO_INCREMENT, voc no excluir a chave primria enquanto no retirar esse modificador.

Tipos de tabelas
O MySQL possui uma caracterstica um pouco diferente dos outros sistemas gerenciadores de banco de dados, uma vez que no MySQL possvel escolher o tipo da tabela no momento da criao. O formato de armazenamento dos dados, bem como alguns recursos do banco de dados so dependentes do tipo de tabela escolhido. A definio do tipo de tabela pode ser feita na criao da tabela, como voc pode ver a seguir: CREATE TABLE teste ( id INT NOT NULL, nome VARCHAR(30) NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;

No comando criado, o tipo da tabela, indicado em TYPE=MyISAM, significa que voc est criando uma tabela com o tipo MyISAM, que o padro das tabelas, caso no seja informado o TYPE. A partir da verso 4.0.18 voc pode utilizar ENGINE como sinnimo de TYPE. A seguir voc tem alguns dos tipos de tabelas no qual voc pode criar:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

99

PHP 5 e MySQL 5 e Ajax


O tipo MyISAM
Este o tipo de tabela padro do MySQL. Caso no seja informado o tipo de tabela, o MySQL criar a tabela do tipo MyISAM. O tipo de tabela padro pode ser alterado incluindo-se no arquivo de configurao, chamado de my.cnf (no Linux) ou my.ini (no Windows), a opo a seguir: default-storage-engine=INNODB As tabelas MyISAM so armazenadas em 3 arquivos, com o mesmo nome da tabela, mas com extenses diferentes: .FRM que armazena a definio da tabela. .MYD que contm os dados. .MYI contendo os ndices.

Estas tabelas so de grande desempenho para leitura, uma vez que os seus ndices so armazenados em rvores binrias balanceadas, o que prov um ganho para o acesso s informaes. O MyISAM no trabalha com transaes (commit ou rollback) e tambm no possui integridade referencial, isto , ao incluir uma chave estrangeira com alguns constraints, esta servir apenas como documentao, mas as restries no sero respeitadas pelo banco.

O tipo Memory
Tabelas do tipo MEMORY (conhecida anteriormente como HEAP) so armazenadas em memria e, graas a isso, so extremamente rpidas. Em contrapartida, o seu contedo voltil, uma vez que no so gravadas em disco. Caso haja uma queda do SGBD os dados destas tabelas sero perdidos. Alm disto, necessrio um processo para dar a carga inicial nos dados quando o servidor de banco iniciar e sua execuo. A principal aplicao das tabelas MEMORY seria para tabelas que so consultadas com muita freqncia, mas que no sofrem muitas alteraes (lookup tables).

O tipo MERGE
As tabelas do tipo MERGE so colees de tabelas MyISAM idnticas. Este recurso permite a diviso de uma tabela grande em vrias partes menores, e ainda assim permite acesso ao contedo de todas elas como se fossem uma nica tabela. Veja um exemplo de como utiliz-la: CREATE TABLE exemplo1 ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, exemplo VARCHAR(20) ); CREATE TABLE exemplo2 ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, exemplo VARCHAR(20) );

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

100

PHP 5 e MySQL 5 e Ajax


INSERT INTO exemplo1 VALUES (null, 'Exemplo1'),(null,Teste1'); INSERT INTO exemplo2 VALUES (null, 'Exemplo2'),(null, 'Teste2'); CREATE TABLE mesclar ( ids INT NOT NULL AUTO_INCREMENT, exemplos VARCHAR(20), INDEX(ids) )TYPE=MERGE UNION=(exemplo1,exemplo2); SELECT * FROM mesclar;
ids 1 2 1 2 Exemplos Exemplo1 Teste1 Exemplo2 Teste2

Resultado da Mesclagem

O tipo BDB
O tipo de tabela BDB vem de BerkeleyDB, e desenvolvido pela Sleepycat (http://www.sleepycat.com). O tipo BDB prov ao MySQL um manipulador de tabelas com controle de transao, dando assim a voc a possibilidade de usar os comandos COMMIT e ROLLBACK, alm de fornecer a recuperao automtica de dados em caso de queda do sistema. O BDB apresenta um mecanismo de lock em nvel de pgina, onde apenas os dados de uma mesma pgina ficaro bloqueados durante um perodo de lock.

O tipo InnoDB
O tipo InnoDB do tipo de tabela transacional, desenvolvido pela InnoDBase Oy. A partir da verso 4.0 do MySQL ele passa a ser parte integrante das distribuies do MySQL. O InnoDB apresenta, alm da capacidade transacional, outros recursos que so realmente teis na utilizao de tabelas: Integridade referencial, com implementao dos constraints SET NULL, SET DEFAULT, RESTRICT e CASCADE; Ferramenta de backup on-line (ferramenta comercial, no GPL); Lock de registro, como Oracle, DB2, etc; Nveis de isolamento; Armazenamentos de dados em tablespace.

Por se tratar de um tipo de tabela com recursos mais avanados, requer mais espao em memria e disco, alm de se apresentar, em determinadas situaes, um pouco mais lento que tabelas do tipo MyISAM. Apesar disto, o tipo InnoDB tem se mostrado extremamente rpido se comparado com outros SGBDs transacionais.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

101

PHP 5 e MySQL 5 e Ajax


Alterando o tipo de uma tabela
Com o comando ALTER TABLE no possvel alterar o tipo da tabela, por isso, voc pode alterar da seguinte maneira: ALTER TABLE livros ENGINE=INNODB;

Tipo de dados
Como a maioria dos sistemas de gerenciamento de banco de dados relacional (Relational Database Management Systems RDBMS), o MySQL tem tipos de dados especficos de coluna. O MySQL tem vrios tipos de dados que suportam funes diferentes. Um tipo de dados a definio das informaes que uma coluna armazenar. Pode haver muitos tipos de dados em uma tabela, mas cada coluna armazenar seu prprio tipo de informaes especficas. H quatro tipos de grupos de formatos de dados. O primeiro o numrico. O segundo tipo o formato de caractere ou string. Esse formato consiste em letras e nmeros ou qualquer coisa que voc coloque entre aspas. O terceiro grupo formado por datas e horas. O tipo final uma forma de miscelnea. Ele consiste em tudo que no se encaixa em qualquer uma das outras categorias.

Tipos numricos
Os tipos numricos destinam-se somente a nmeros. Os diferentes tipos de nmeros ocupam uma quantidade diferente de espao na memria. Um bom exemplo voc tentando comprar um chocolate em uma loja e ao passar no caixa a voc descobre que deve pagar pela caixa inteira. Voc diz que no precisa de tudo, mas atacado e s e vendido de caixa. Se voc vai utilizar 3 nmeros, por que ocupar um espao na memria como se estivesse utilizando 100? Lembre-se: voc s deve pagar pelo que vai usar. Armazenamento numrico Nome do tipo TINYINT SMALLINT MEDIUMINT INT BIGINT FLOAT(Inteiro,Decimal) DOUBLE(Inteiro,Decimal) DECIMAL(Inteiro,Decimal)

Espao na memria 1 byte 2 bytes 3 bytes 4 bytes 8 bytes 4 bytes 8 bytes O valor de bytes Inteiro + 2

Se a coluna numrica e declarada UNSIGNED, o intervalo dobra para o tipo dado. Por exemplo, se voc declara que uma coluna que UNSIGNED TINYINT, o intervalo dessa coluna de 0 a 255. Declarando dessa forma voc faz com que essa coluna tenha somente valores positivos.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

102

PHP 5 e MySQL 5 e Ajax


Tipos numricos Nome do tipo
TINYINT SMALLINT MEDIUMINT INT BIGINT FLOAT(Inteiro,Decimal) DOUBLE(Inteiro,Decimal) DECIMAL(Inteiro,Decimal)

Intervalo de valor
-128 a 127 -32768 a 32767 -8388608 a 83888607 -2147483648 a 2147483647 -9223372036854775808 a 9223372036854775807 Varia dependendo dos valores Varia dependendo dos valores Varia dependendo dos valores

Sem sinal
0 255 0 65535 0 - 16777215 0 - 4294967295 0 - 18446744073709550615

FLOATs, DOUBLEs e DECIMALs so tipos numricos que podem armazenar fraes. Os outros no. Utilize DECIMAL para nmeros realmente grandes. DECIMALs so armazenados de maneira diferente e no tm limites.

Modificadores AUTO_INCREMENT, UNSIGNED e ZEROFILL


Esses modificadores s podem ser utilizados com tipos de dados numricos. Eles utilizam operaes que somente podem ser feitas com nmeros.

AUTO_INCREMENT
O modificador de coluna AUTO_INCREMENT automaticamente aumenta o valor de uma coluna adicionando 1 ao valor mximo atual. Ele fornece um contador que timo para criar valores nicos. Voc tambm pode incluir um nmero. Se quiser que uma coluna AUTO_INCREMENT inicie com 9.000, por exemplo, s declarar explicitamente um ponto inicial utilizando a seguinte sintaxe:

mysql> CREATE TABLE teste ( -> id INT NOT NULL PRIMARY KEY AUTO_INCREMENT -> ) AUTO_INCREMENT=9000;

UNSIGNED
UNSIGNED depois de um tipo inteiro significa que ele s pode ter um zero ou valor positivo.

ZEROFILL
O modificador de coluna ZEROFILL utilizado para exibir zeros esquerda de um nmero com base na largura de exibio. Como todos os tipos de dados numricos tm uma largura de exibio opcional, se voc declara um INT(8) ZEROFILL e o valor armazenado 23, ele ser exibido como 00000023. Para isso utilize a seguinte sintaxe:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

103

PHP 5 e MySQL 5 e Ajax


mysql>CREATE TABLE teste (id INT(4) ZEROFILL);

Tipos de caractere ou de dados de string


O outro grupo importante de tipo de dados so os tipos de strings ou de caractere. Uma string um conjunto de caracteres. Um tipo de string pode armazenar dados como So Paulo ou Avenida So Joo, n. 255. Qualquer valor pode ser armazenado em um tipo de dados de string. Tipos string Nome de tipo CHAR(X) VARCHAR(X) TINYTEXT TINYBLOB TEXT BLOB MEDIUMTEXT MEDIUMBLOB LONGTEXT LONGBLOB

Tamanho mximo 255 bytes 255 bytes 255 bytes 255 bytes 65.535 bytes 65.535 bytes 1,6 MB 1,6 MB 4,2 GB 4,2 GB

Espao de armazenamento X bytes X + 1 byte X + 1 byte X + 2 bytes X + 2 bytes X + 2 bytes X + 3 bytes X + 3 bytes X + 4 bytes X + 4 bytes

CHAR e VARCHAR
Fora todos esses tipos, os tipos VARCHAR e CHAR so os mais utilizados. A diferena entre eles que o VARCHAR tem um comprimento varivel e o CHAR no. Os tipos CHAR so utilizados para comprimentos fixos. Voc utilizar esse tipo quando os valores no variam muito. Se voc declara um CHAR(10), todos os valores armazenados nessa coluna tero 10 bytes de comprimento, mesmo se ele tiver 3 bytes de comprimento. O MySQL preenche esse valor para ajustar o tamanho que foi declarado. O tipo VARCHAR faz o contrrio. Se voc declara um VARCHAR(10) e armazena um valor que tem somente 3 caracteres de comprimento, a quantidade total de espao de armazenamento de 4 bytes (o comprimento mais um). A vantagem de utilizar os tipos CHAR que as tabelas que contm esses valores fixos so processadas mais rapidamente que aquelas que so compostas pelo tipo VARCHAR. A desvantagem de utilizar o tipo CHAR o espao desperdiado. De um modo geral no se pode utilizar os dois na mesma tabela, pois quando feito o MySQL converte automaticamente uma coluna com o tipo CHAR em VARCHAR. A nica exceo quando voc declara uma coluna como VARCHAR(3), o MySQL converte automaticamente em CHAR(3). Isso acontece porque valores de 4 caracteres ou menores so muito pequenos para o tipo VARCHAR.

TEXT e BLOB
TEXT e BLOB(Binary Large Object) so tipos variveis de comprimento que podem armazenar grandes quantidades de dados. Voc utilizar esses tipos quando quiser armazenar imagens, sons ou grandes quantidades de textos, como pginas da Web ou

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

104

PHP 5 e MySQL 5 e Ajax


documentos. Um bom exemplo se voc estiver querendo armazenar valores de uma <TEXTAREA> de uma sesso de comentrios em uma pgina da Web, o tipo TEXT seria uma boa escolha.

Tipos variados
H basicamente trs tipos variados; os tipos ENUM, SET e DATE/TIME.

Tipo ENUM
O tipo ENUM uma lista ENUMerada. Significa que essa coluna pode armazenar apenas um dos valores que esto declarados na lista dada. A sintaxe para criar uma coluna ENUMerada como segue: mysql> CREATE TABLE coluna_enum ( -> estados ENUM(SP,RJ,MG,RS) -> );

Voc pode ter at 65.535 itens em sua lista enumerada. uma boa escolha para caixas de combinao.

Tipo SET
O tipo SET muito parecido com o tipo ENUM. O tipo SET, como o tipo ENUM, armazena uma lista de valores. A diferena que no tipo SET, voc pode escolher mais de uma opo para armazenar. Um tipo SET pode conter at 64 itens. O tipo SET uma boa escolha para opes em uma pgina da Web em que o usurio pode escolher mais de um valor. A sintaxe para criar um tipo SET:

mysql>CREATE TABLE teste ( -> passatempo SET(Televiso,Futebol,Vdeo Game,Cinema) -> );

A coluna criada seria capaz de armazenar uma ou mais escolhas, como por exemplo: Futebol #como uma escolha Futebol, Vdeo Game # como mais de uma escolha. Quando se inserem os valores em uma coluna do tipo SET, se coloca entre aspas ou apstrofos e separados por vrgula:

mysql>INSERT INTO teste (passatempo) VALUES (Futebol,Vdeo Game);

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

105

PHP 5 e MySQL 5 e Ajax


Modificadores adicionais de coluna
O MySQL tem vrias palavras-chave que modificam a maneira como uma coluna funciona. Como vimos acima, temos AUTO_INCREMENT e ZEROFILL e como eles afetam a coluna em que so utilizados. Alguns modificadores se aplicam apenas em colunas de um certo tipo de dado. Tabela de Modificadores Nome de modificador AUTO_INCREMENT BINARY DEFAULT NOT NULL NULL PRIMARY KEY UNIQUE UNSIGNED ZEROFILL

Tipos aplicveis Todos os tipos INT CHAR, VARCHAR Todos, exceto BLOB, TEXT Todos os tipos Todos os tipos Todos os tipos Todos os tipos Tipos numricos Tipos numricos

O modificador BINARY faz com que os valores armazenados sejam tratados como strings binrias, fazendo-os distinguir letras maisculas e minsculas. Ao classificar ou comparar essas strings, a distino entre maisculas e minsculas ser considerada. Por padro os tipos CHAR e VARCHAR no so armazenados como binrios. O modificador DEFAULT permite especificar o valor de uma coluna se no existir um valor. Os modificadores NULL e NOT NULL especifica se na coluna deve haver um valor ou no. Por exemplo; se voc especificar a coluna como NOT NULL voc forado a colocar um valor, pois esse campo requerido. PRIMARY KEY um ndice que no deve conter valores nulos (NULL). Cada tabela deve conter uma chave primria, isso facilita uma consulta de dados. Abordarei essa questo mais adiante. O modificador UNIQUE impe a regra que todos os dados dentro da coluna declarada devem ser nicos. Por exemplo; se voc declarar (no faa isso) que a coluna nome deve ser UNIQUE(nica), no pode haver valores duplicados, caso contrrio gerar um erro. A sintaxe para sua criao :

mysql>CREATE TABLE IF NOT EXISTS teste (nome VARCHAR(30)UNIQUE NOT NULL);

Tipos de data e hora


O MySQL suporta vrios tipos de data e hora. Esses so mostrados na tabela a seguir:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

106

PHP 5 e MySQL 5 e Ajax


Tabela de data e hora Tipo Intervalo
DATE TIME DATETIME 1000-01-01 a 9999-12-31 -838:59:59 a 838:59:59

Descrio
Datas. Ser exibida como YYYYMM-DD Hora. Ser exibida como HH:MM:SS Data e Hora. Ser exibida como YYYY-MM-DD HH:MM:SS Um registro de data/hora, til para relatrio de transao. O formato de exibio depende do formato de F. Um ano. Voc pode especificar 2 ou 4 formatos de dgitos. Cada um desses tem um intervalo diferente, como mostrado.

1000-01-01 00:00:00 a 9999-12-31 23:59:59 TIMESTAMP[(F)] 1970-01-01 00:00:00

YEAR[(2 | 4)]

70-69 (1970-2069) 1901-2155

Sintaxe bsica da SQL


A primeira coisa que devemos fazer quando criamos um banco de dados e depois uma tabela e utiliz-la inserindo dados.

Comando INSERT
O comando INSERT INTO adiciona dados em uma tabela. A sua sintaxe :

mysql> INSERT INTO livros VALUES ( -> '85-7585-120-5', ->'Core Java Fundamental', ->6, ->2004, ->'Desenvolva Java com vrios exemplos');

O nome da tabela em que voc ir inserir dever ser declarada logo no incio INSIRA DENTRO nomedatabela (colunas) VALORES (valores inseridos dentro de cada coluna); importante salientar que strings ficam entre aspas ou apstrofos e valores numricos (declarados como tipo de dados numricos) no precisam de aspas ou apstrofos. Para inserir mais de um valor separe-os por vrgula:

mysql> INSERT INTO nomedatabela(colunas) VALUES (valores inseridos 1), ->(valores inseridos 2), ->(e assim por diante);

Comando SELECT
PHP 5 & MySQL 5 for Web www.integrator.com.br/php
107

PHP 5 e MySQL 5 e Ajax


A instruo SELECT provavelmente a mais utilizada de todas as instrues de SQL. A instruo SELECT somente retornar os dados que so armazenados no banco de dados dentro de uma tabela. O MySQL realiza essa instruo mais rpido que qualquer outro banco de dados do mercado. A sintaxe : SELECT nomedacoluna FROM nomedatabela WHERE condies; No caso do nosso banco de dados livraria:

mysql>SELECT * FROM livros; # o asterisco indica todas as colunas

Um outro caso, a clusula WHERE


mysql>SELECT * FROM livros WHERE ISBN='85-7585-120-5';

Nesse caso foi colocada uma condio que dentre todos os registros s dever aparecer os dados ONDE a coluna ISBN for igual '85-7585-120-5'. A clusula WHERE especifica o critrio utilizado para selecionar linhas particulares. O nico sinal igual utilizado para testar igualdade observe que isso diferente do Java e fcil se confundir. Alm da igualdade, o MySQL suporta um conjunto completo de operadores e expresses regulares. Na tabela a seguir esto listadas as mais utilizadas por voc: Tabela de Operadores no MySQL Operador Nome Exemplos
= > < >= <= != ou <> IN NOT IN IS NOT IS NULL BETWEEN igual maior que menor que
autor_id = 1 Quantidade > 50 Quantidade < 50

Descrio
Testa se os dois valores so iguais Testa se um valor maior que o outro Testa se um valor menor que o outro Testa se um valor maior ou igual ao outro Testa se um valor menor ou igual ao outro Testa se um valor diferente do outro Testa se o valor est em um conjunto particular Testa se o valor no est em um conjunto particular

maior ou Quantidade >= 50 igual a menor ou Quantidade <= 50 igual a diferente de Quantidade !=0
cidade in (So Paulo, Minas Gerais) cidade not in (So Paulo, Minas Gerais)

Endereo no nulo Endereo promocao is null nulo valor BETWEEN 200 AND 350 Quantidade

Testa se o campo no contm um valor Testa se o campo tem

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

108

PHP 5 e MySQL 5 e Ajax


entre um valor e outro valores entre um e outro

Algumas funes que trabalham com a instruo SELECT MAX( )


SELECT MAX(coluna) FROM tabela; Essa funo seleciona o valor mximo de uma coluna.

MIN( )
SELECT MIN(coluna) FROM tabela; O contrrio de MAX, retorna o valor mnimo de uma coluna.

LIMIT
SELECT * FROM tabela LIMIT 2; Limita a visualizao de 2 linhas de dados. SELECT * FROM tabela LIMIT 2,5; Limita a visualizao da linha 2 a linha 5 de dados.

COUNT( )
SELECT COUNT(coluna) FROM tabela; Conta quantas linhas de dados existem na coluna nome. SELECT COUNT(*) FROM tabela; Conta quantas linhas de dados existem em todas as linhas. Nota: Em caso de fazer a contagem em campo de valor NULL a contagem ser diferente da no valor total.

SUM( )
SELECT SUM(coluna) FROM tabela; Soma todos os dados da coluna.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

109

PHP 5 e MySQL 5 e Ajax


ORDER BY
SELECT * FROM tabela ORDER BY coluna; Coloca os dados selecionados em ordem crescente pela coluna.

ORDER BY ... DESC


SELECT * FROM tabela ORDER BY coluna DESC; Coloca os dados selecionados em ordem decrescente pela coluna.

AVG( )
SELECT AVG(coluna) FROM tabela; Faz a mdia aritmtica da coluna designada.

LIKE
mysql>SELECT * FROM livros WHERE titulo LIKE Java%;

Neste caso pode-se fazer uma busca por apenas a inicial do valor desejado. O sinal de %(porcentagem) o caractere curinga que significa qualquer caractere.

mysql>SELECT * FROM livros WHERE titulo LIKE %Java%;

Colocando a % no incio e no fim, com um valor no meio, possvel buscar todos os valores que contenham as letras Java, seja no comeo, meio ou fim.

Um caso a parte: a unio do INSERT INTO ... SELECT


INSERT INTO tabela1(coluna) SELECT tabela.coluna2 FROM tabela2; Insere na tabela tabela1.coluna valores da coluna2 da tabela tabela2.

Comando UPDATE
O comando UPDATE permite editar os valores de dados existentes. A sintaxe para

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

110

PHP 5 e MySQL 5 e Ajax


modificar os valores : UPDATE tabela SET coluna= valor WHERE coluna=valor; Atualiza os dados da coluna determinada em SET na condio passada em WHERE.

Comando DELETE
A instruo DELETE muito semelhante instruo SELECT. A nica diferena em vez de selecionar registros para visualizar, essa instruo exclui esses registros. A instruo DELETE tem a seguinte sintaxe: DELETE FROM tabela WHERE coluna=valor;

Trabalhando com Junes


As junes so uma parte integrante de um banco de dados relacional. As junes permitem ao usurio de banco de dados tirar proveito dos relacionamentos que foram desenvolvidos na fase do projeto do banco de dados. Uma JUNO o termo utilizado para descrever o ato em que uma ou mais tabelas so unidas entre si para recuperar dados necessrios com base nos relacionamentos que so compartilhados entre elas.

Criando uma juno com INNER JOIN


A seguinte sintaxe cria uma juno: SELECT tabela1.coluna, tabela2.coluna FROM tabela1 INNER JOIN tabela2 on tabela1.coluna_de_valor_identico=tabela2.coluna_de_valor_identico; INNER JOINs so provavelmente as mais comuns de todas as junes. Uma INNER JOIN significa que todos que todos os registros que esto sem correspondncia so descartados. Somente as linhas correspondidas sero exibidas no conjunto de resultados. Os dados aparecem na ordem em que voc especifica.

Chaves variadas do MySQL O que uma chave?


Uma chave em uma tabela em um banco de dados fornece um meio de localizar rapidamente informaes especficas. Embora uma chave no precise significar qualquer coisa para o usurio humano do banco de dados, as chaves so uma parte vital da arquitetura de banco de dados e pode influenciar significativamente o desempenho.

Princpios da Chave
Imagine que voc tem uma coleo muito simples de dados em que armazena apenas os dados teis simples. Por exemplo, voc talvez crie uma tabela de Clientes semelhante a um antigo arquivo de ndice de fixas, com nome e detalhes de um cliente em cada ficha. Quando quiser pesquisar um cliente, voc procura o arquivo e l cada ficha sucessivamente. Ao ver a(s) ficha(s) que quer, voc l essas informaes teis como o nome, endereo e nmero de telefone do cliente.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

111

PHP 5 e MySQL 5 e Ajax


Convencionalmente, voc talvez classifique o arquivo de ndice de ficha por ordem de sobrenome. Isso ajuda se voc sabe o nome da pessoa cujos dados est examinando. Mas e se voc quiser localizar as pessoas por algum outro critrio. Naturalmente, voc pode configurar o banco de dados MySQL da mesma maneira. Mas logo ficaria com dificuldades. Com a quantidade de dados o seu banco de dados teria de ler as informaes sucessivamente, o que torna uma operao ineficiente. Voc chamaria essa operao de varredura de tabela. Essa a mais demorada das operaes em um banco de dados. nesse momento em que uma chave se torna til.

Como as chaves funcionam


Uma chave existe como uma tabela extra no banco de dados, embora pertena sua tabela pai. Ela ocupa espao fsico no disco rgido (ou outras reas de armazenamento) do banco de dados. Pode ser to grande quanto a tabela principal e, teoricamente, at maior. Voc define a chave para se relacionar com uma ou vrias colunas em uma tabela especfica. Como os dados em uma chave so totalmente derivados da tabela, voc pode eliminar e recriar uma chave sem qualquer perda de dados.

Benefcios de usar uma chave


A utilizao adequada de chaves pode aprimorar significativamente o desempenho do banco de dados. Para utilizar a analogia de um ndice de livro, considere o pouco nmero de pginas que necessrio no ndice de um livro para dar viso rpida dos temas importantes. Compare quanto tempo voc levaria se estivesse pesquisando pelo volume, pgina por pgina.

Suporte de chave do MySQL


O MySQL suporta os seguintes comandos para criar chaves nas tabelas existentes: ALTER TABLE nome_tabela ADD (KEY | INDEX) nome_do_ndice (nome_da_coluna [,...]); ALTER TABLE nome_tabela ADD UNIQUE nome_do_ndice (nome_da_coluna[,...]); ALTER TABLE nome_tabela (nome_da_coluna[,...]); ADD PRIMARY KEY nome_do_ndice

Observe que no MySQL, chave e ndice so sinnimos. Esses so os formatos preferidos para adicionar chaves a tabelas existentes. Para compatibilidade com outras implementaes de SQL, o MySQL tambm suporta os seguintes: CREATE INDEX nome_do_ndice ON nome_tabela (nome_da_coluna[,...]); CREATE UNIQUE (nome_da_coluna[,...]); INDEX [nome_do_ndice] ON nome_tabela

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

112

PHP 5 e MySQL 5 e Ajax


CREATE PRIMARY KEY ON nome_tabela (nome_da_coluna,...); Voc pode definir as chaves quando cria uma tabela: CREATE TABLE nome_da_tabela (nome_da_coluna tipo_de_campo [NULL | NOT NULL], KEY col_index (nome_da_coluna));

Chaves primrias
Uma chave primria semelhante em princpio a uma chave nica, seus dados devem ser nicos, mas a chave primria de uma tabela tem um status mais privilegiado. Apenas uma chave primria pode existir para cada tabela e seus valores de campo nunca podem ser nulos. Uma chave primria geralmente utilizada como um link estrutural no banco de dados, definindo o relacionamento entre as tabelas diferentes. Sempre que quiser unir uma tabela a outra, voc deve ter a chave primria dessa tabela. O MySQL no requer que voc especifique que a coluna em que estiver a chave primria seja NOT NULL(no nula) *, mas porm se tentar colocar um valor idntico na coluna chave, esta retornar um erro que no pode haver duplicao. * Este caso somente para chaves primrias em tabelas cuja coluna selecionada seja INT ou semelhante. Em casos de ser VARCHAR, CHAR e etc, exigida a utilizao do NOT NULL. Caso isso no ocorra, voc ter como resultado um erro. Se desejar que seja nulo o campo, coloque uma chave UNIQUE.

Chaves estrangeiras
As chaves estrangeiras so atualmente suportadas no MySQL em outro formato de tabela. A mais usada e recomenda para transaes chamada de InnoDB. A seguir voc tem o comando necessrio para criar uma chave estrangeira no seu banco de dados: ALTER TABLE publicacao ADD CONSTRAINT FK_publicacao FOREIGN KEY (isbn) REFERENCES livros (isbn) ON DELETE CASCADE ON UPDATE CASCADE;

Excluindo uma chave estrangeira


Para excluir uma chave estrangeira, use o comando: ALTER TABLE publicacao DROP FOREIGN KEY FK_publicacao;

Transaes
Transaes so mecanismos que asseguram consistncia no banco de dados, especialmente no caso de erro ou queda no servidor.

Usando transaes no MySQL


Por padro, o MySQL na verso atual roda em autocommit mode. Isto significa que cada declarao que voc executa escrita imediatamente ao banco de dados (commit). Se voc desejar trabalhar com transaes no MySQL, voc ter que executar o comando:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

113

PHP 5 e MySQL 5 e Ajax


set autocommit=0; Inicie a transao com o comando: start transaction; Para ilustrar uma transao, voc vai executar uma EXCLUSO na tabela LIVROS: DELETE FROM livros; D um SELECT para ter certeza de que os dados foram todos excludos da tabela: SELECT * FROM livros; Aps confirmar que os dados foram realmente excludos, execute o comando: rollback; O comando ROLLBACK retorna o estado anterior. Mas se voc desejar confirmar o comando, utilize o comando a seguir: commit;

Stored Procedures
Stored Procedures (procedimentos armazenados) passou a ser suportado pelo MySQL na verso 5. Agora, alm do poder da velocidade desse incrvel banco de dados, voc tambm pode armazenar rotinas e cham-las quando necessitar. As stored procedures pode consistir em declaraes de SQL e vrias estruturas de controle especiais. Isto pode ser til quando voc quiser executar a mesma funo de aplicaes diferentes ou plataformas, ou como um modo de encapsular funcionalidade.

Criando um Stored Procedure com resultados de um JOIN


Aqui voc aprender a criar um stored procedure simples para executar uma query com join entre as tabelas livros, publicacao, autores e editora: DELIMITER // CREATE PROCEDURE sp_m_liv_e_aut( ) BEGIN SELECT nome as `Nome do Autor`, titulo as `Ttulo`, ano_publicacao as `Ano Publicado`, editora_nome as Editora FROM autores INNER JOIN publicacao USING (autor_id, autor_id) INNER JOIN livros USING (isbn, isbn) INNER JOIN editora USING (editora_id, editora_id); END // DELIMITER ; Para chamar a procedure, utilize o comando: call sp_m_liv_e_aut( );

Visualizando procedures criadas


Para visualizar as Stored Procedures criadas, execute o comando a seguir: SHOW PROCEDURE STATUS;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

114

PHP 5 e MySQL 5 e Ajax


Visualizando a criao da procedure
Para visualizar o cdigo da Stored procedure, execute o comando: SHOW CREATE PROCEDURE sp_m_liv;

Criando um Stored Procedure com parmetros


A idia agora transmitir um parmetro para que voc possa filtrar os livros, chamando apenas uma procedure com o ISBN do livro: DELIMITER // CREATE PROCEDURE sp_m_liv_isbn(IN vIsbn VARCHAR(100)) BEGIN SELECT * FROM livros WHERE isbn=vIsbn; END // DELIMITER ; Para chamar essa procedure, execute o comando a seguir: call sp_m_liv_isbn('85-7393-436-0');

Criando um procedure com a clusula LIKE


O stored procedure seguinte demonstra como usar a clusula LIKE para retornar valores do banco de dados MySQL: DELIMITER $$ CREATE PROCEDURE sp_m_liv(IN vTitulo VARCHAR(100)) BEGIN SELECT * FROM livros WHERE titulo LIKE CONCAT('%',vTitulo,'%') ORDER By titulo; END $$ DELIMITER; Para chamar essa procedure, execute o comando a seguir: call sp_m_liv('JBuilder'); Para se excluir uma stored procedure execute o seguinte comando: DROP PROCEDURE sp_m_liv;

Criando Views
Uma view pode ser pensada de como uma " query " armazenada. Uma view definida cria essencialmente uma definio nomeada para uma declarao SQL que pode ser ento referenciada como uma tabela em outras declaraes SQL. uma complexa definio para uma situao simples, aqui voc armazena a query e depois a chama pelo nome (fcil n?). Para criar uma view, execute o comando a seguir: CREATE OR REPLACE VIEW vw_livros(nome,titulo,ano_publicacao,editora_nome) AS SELECT nome, titulo, ano_publicacao, editora_nome FROM autores

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

115

PHP 5 e MySQL 5 e Ajax


INNER JOIN publicacao USING (autor_id, autor_id) INNER JOIN livros USING (isbn, isbn) INNER JOIN editora USING (editora_id, editora_id); Para chamar a VIEW, basta usar o comando como se estivesse fazendo uma query: SELECT * FROM vw_livros; Ou se preferir: SELECT titulo, editora_nome, nome FROM vw_livros WHERE nome='Edson';

Visualizando a estrutura de uma view


Assim como nas tabelas, execute o comando: DESC vw_livros;

Visualizando a criao da view


Para visualizar o cdigo da view, execute o comando: SHOW CREATE VIEW vw_livros; Como voc pode ver, as VIEWS so tratadas como se fossem uma outra tabela, armazenando apenas a query que voc deseja executar, podendo ser manipulada depois.

Excluindo uma view


Para se excluir a view, execute o seguinte comando: DROP VIEW vw_livros;

Criando Triggers (gatilhos)


Um trigger um tipo especial de programa armazenado que dispara quando uma tabela modificada por uma declarao INSERT, UPDATE, ou DELETE (DML). Triggers implementam funcionalidade que tem que acontecer sempre que uma certa mudana ocorre na tabela. Porque gatilhos so diretamente fixos tabela, cdigo de aplicao no pode evitar gatilhos no banco de dados. Usos tpicos de gatilhos incluem a implementao lgica de negcios crticos, a denormalizao de dados para reaes de desempenho, e os auditando nas mudanas feitas a uma tabela. Podem ser definidos gatilhos para disparar antes ou depois que uma declarao DML especfica execute. Para criar a Trigger, primeiramente crie a seguinte tabela: CREATE TABLE livros_backup ( isbn CHAR(13) NOT NULL, titulo VARCHAR(50) default NULL, edicao_num TINYINT(2) default NULL, ano_publicacao YEAR(4) default NULL, descricao TEXT, dt_exclusao DATETIME ) ENGINE=InnoDB; Essa tabela ser uma tabela de backup da tabela de livros, assim sendo, quando voc excluir da tabela de livros, essa tabela armazenar os dados excludos. Para que isso seja possvel, voc ter que criar um gatilho (trigger): DELIMITER $$ CREATE TRIGGER tr_livbackup BEFORE DELETE ON livros

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

116

PHP 5 e MySQL 5 e Ajax


FOR EACH ROW BEGIN DECLARE DATA DATE; SET DATA = NOW(); INSERT INTO livros_backup SET isbn = OLD.isbn, titulo=OLD.titulo, edicao_num=OLD.edicao_num, ano_publicacao=OLD.ano_publicacao, descricao=OLD.descricao, dt_exclusao = DATA; END $$ DELIMITER; Voc pode criar gatilhos no MySQL para comandos INSERT, UPDATE e DELETE, com j havia sido dito. No caso, o comando fora feito para a execuo do DELETE. Note a palavra OLD sendo usada antes de cada COLUNA. Isso significa que ele receber os dados antigos. Como a execuo deve ser feita antes da excluso dos dados na tabela livros, voc v na declarao da TRIGGER o comando BEFORE e seguido do comando SQL que o far disparar DELETE e em que tabela. Um loop FOR EACH varrer os dados e os colocar na tabela de backup.

Visualizando as triggers criadas


Execute o comando para visualizar as triggers criadas, bem como sua estrutura: show triggers;

Excluindo uma trigger


Para se excluir a trigger, utilize o comando a seguir: DROP TRIGGER tr_livbackup

Administrando o MySQL
Um sistema de MySQL pode ter muitos usurios. O usurio root geralmente deve ser utilizado somente para propsitos de administrao, por razes de segurana. Para cada usurio que precisar utilizar o sistema, voc precisar configurar uma conta e senha. No obrigatrio configurar senhas para usurios, mas recomendo que voc configure senhas para todos os usurios que forem criados.

Entendendo o sistema de privilgios do MySQL


O MySQL suporta um sofisticado sistema de privilgios. Um privilgio um direito que um usurio tem para realizar uma ao particular em um objeto particular. Quando voc cria um usurio no MySQL, voc concede a ele um conjunto de privilgios para especificar o que ele pode e no pode fazer dentro do sistema.

Configurando usurios
Os comandos GRANT e REVOKE so utilizados para fornecer e retirar direitos dos usurios do MySQL. Ele pode ser concedido nos seguintes nveis: Global 117

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


Banco de dados Tabela Coluna

O comando para criar um usurio com privilgios como mostrado a seguir: GRANT privilgios [colunas] ON item TO nome_do_usuario [IDENTIFIED BY senha] [WITH GRANT OPTION] As clusulas entre colchetes so opcionais. Para conceder privilgios ao um usurio no banco livraria, voc deve criar um usurio com os seguintes privilgios:

mysql> grant all -> on livraria.* -> to edson identified by 'integrator';

Com isso voc concede todos os privilgios de manipulao do banco de dados livraria somente ao usurio edson, com a senha integrator.

Confirmando o novo usurio


Para confirmar a criao do novo usurio, voc deve executar o comando a seguir: flush privileges;

Revogando privilgios
Para revogar esse privilgio voc deve fazer o seguinte comando:

mysql> revoke all -> on livraria.* -> from edson;

Obtendo informaes com SHOW


Se voc desejar visualizar todos os privilgios que um usurio tem, execute o seguinte comando:

SHOW GRANTS FOR edson;

Para visualizar todos os usurios existentes no seu MySQL execute;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

118

PHP 5 e MySQL 5 e Ajax


SHOW GRANTS;

Integrando PHP e MYSQL


O poder do PHP5 unido ao poderio do MySQL 5 torna o desenvolvimento mais rpido e preciso, possibilitando uma gama de situaes antes no vistas graas s limitaes do MySQL.

Acessando seu banco de dados pelo PHP


A partir de agora voc ir trabalhar com o banco de dados em MySQL e o PHP, onde ter uma integrao completa de insero, alterao, seleo e excluso de dados.

Conectando ao MySQL e visualizando dados


<?php $conexao=mysql_connect("localhost","edson","integrator"); if(!$conexao){ echo "Erro ao se conectar"; exit; } $banco=mysql_select_db("livraria"); if(!$banco){ echo "O Banco de dados no foi encontrado"; exit; } $rs=mysql_query("SELECT * FROM livros"); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Visualizando dados da tabela livros</title> </head> <body> <table width="489" border="1" cellspacing="0" cellpadding="0"> <tr> <th width="109" align="left">ISBN</th> <th width="202" align="left">T&iacute;tulo</th> <th width="82" align="left">Edi&ccedil;&atilde;o N.&ordm; </th> <th width="96" align="left">Publicado em: </th> </tr> <?php while($row=mysql_fetch_array($rs)){ ?> <tr> <td><?php echo $row['isbn']?></td> <td><?php echo $row['titulo']?></td> <td align="center"><?php echo $row['edicao_num']?></td> <td align="center"><?php echo $row['ano_publicacao']?></td> </tr> <?php }//end if ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

119

PHP 5 e MySQL 5 e Ajax


</table> </body> </html> vis_dados_mysql.php

A conexo com o servidor de dados em MySQL feita utilizando a funo mysql_connect( ) que tem as seguintes passagens de informaes: mysql_connect (local, usurio, senha); Com condio IF, voc verifica se foi possvel ou no a conexo. Caso no seja possvel de se conectar ao servidor de dados especfico, o construtor exit( ) termina a execuo da pgina, no permitindo que aparea mais nem um erro. Antes, temos um echo que ir imprimir na tela do usurio uma mensagem. A funo utilizada para selecionar o banco de dados aqui a mysql_select_db( ). A funo tem a seguinte passagem de parmetro: mysql_select_db(banco_de_dados) A linha utilizada para a execuo do SQL onde se encontra a funo mysql_query( ). Essa funo tem o seguinte parmetro: mysql_query(string_sql) Com a funo mysql_fetch_array( ) voc consegue recuperar os dados vindos do banco de dados atravs da funo mysql_query( ) e transport-lo para o PHP em formato de array (por isso array ao final do nome da funo). O loop WHILE existe para que se faa uma varredura em todas as linhas, imprimindo os resultado atravs da estrutura echo. Note que uma varivel, chamada $row se transforma em array, acessando assim os dados vindos do banco de dados atravs de uma chamada associativa, com $row['nome_da_coluna_da_tabela'].

Parmetros opcionais de mysql_fetch_array


Usando MYSQL_BOTH, voc ter uma matriz com os ndices associativos e numricos. Usando MYSQL_ASSOC, voc ter apenas os ndices associativos, usando MYSQL_NUM, voc ter apenas os ndices numricos. Onde voc poder acessar os resultados da seguinte maneira, com MYSQL_BOTH: <?php while($row=mysql_fetch_array($rs, MYSQL_BOTH )){ ?> <tr> <td><?php echo $row[ 'isbn' ]?></td> <td><?php echo $row[ 1 ]?></td> <td align="center"><?php echo $row[ 2 ]?></td> <td align="center"><?php echo $row[ 'ano_publicacao' ]?></td> </tr> <?php }//end if ?> Esse parmetro visto anteriormente o padro, no precisando ser declarado. Com o parmetro MYSQL_ASSOC: <?php while($row=mysql_fetch_array($rs, MYSQL_ASSOC )){ ?> <tr> <td><?php echo $row[ 'isbn' ]?></td> <td><?php echo $row[ 'titulo' ]?></td> <td align="center"><?php echo $row[ 'edicao_num' ]?></td>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

120

PHP 5 e MySQL 5 e Ajax


<td align="center"><?php echo $row[ 'ano_publicacao' ]?></td> </tr> <?php }//end if ?> E por fim com o parmetro MYSQL_NUM: <?php while($row=mysql_fetch_array($rs, MYSQL_ASSOC )){ ?> <tr> <td><?php echo $row[ 0 ]?></td> <td><?php echo $row[ 1 ]?></td> <td align="center"><?php echo $row[ 2 ]?></td> <td align="center"><?php echo $row[ 3 ]?></td> </tr> <?php }//end if ?> A escolha de qualquer uma dessas formas no implica em diferena na velocidade de acesso aos dados.

Inserindo dados na tabela livros


O cdigo a seguir ser responsvel pelo cadastro de livros: <?php //conecta ao banco de dados $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria"); //captura os dados vindos do formulrio HTML $isbn=trim( $_POST['isbn'] ); $titulo=trim( $_POST['titulo'] ); $edicao=trim( $_POST['edicao'] ); $publicacao=trim( $_POST['publicacao'] ); $descricao=trim( $_POST['descricao'] ); //verifica se os dados recebidos no so vazios com empty if(!empty( $isbn ) && !empty( $titulo ) && !empty( $edicao ) && !empty( $publicacao ) && !empty( $descricao ) ) { $query="INSERT INTO livros VALUES('$isbn', '$titulo', '$edicao', '$publicacao', '$descricao')"; $ins=mysql_query( $query ); //verifica se o resultado dado falso if( $ins===FALSE ) $msg= "Erro na query... " . mysql_error( ) . "<br/>"; else{ $msg= "Foi inserida " . mysql_affected_rows( ) . " linha <br/>"; //destri as variveis criadas para receber os dados

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

121

PHP 5 e MySQL 5 e Ajax


unset( $isbn,$titulo,$edicao,$publicacao,$descricao ); } }//end if ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Cadastro de Livros</title> </head> <body> <?php if( isset( $msg ) ) echo $msg; ?> <form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']?>"> <table width="259" border="0" cellspacing="2" cellpadding="0"> <tr> <th colspan="2">Cadastro de Livros </th> </tr> <tr> <td width="87" align="right">ISBN:</td> <td width="166"> <input name="isbn" type="text" id="isbn" value="<?php echo $isbn?>" /> </td> </tr> <tr> <td align="right">Ttulo:</td> <td> <input name="titulo" type="text" id="titulo" value="<?php echo $titulo?>" /> </td> </tr> <tr> <td align="right">Edio N.;: </td> <td> <input name="edicao" type="text" id="edicao" value="<?php echo $edicao?>" /> </td> </tr> <tr> <td align="right">Publicaoo:</td> <td> <input name="publicacao" type="text" id="publicacao" value="<?php echo $publicacao?>" /> </td> </tr>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

122

PHP 5 e MySQL 5 e Ajax


<tr> <td align="right" valign="top">Descrio:</td> <td> <textarea name="descricao" rows="5" id="descricao"> <?php echo $descricao?></textarea> </td> </tr> <tr> <td colspan="2" align="center"> <input name="bt_cad" type="submit" id="bt_cad" value="Cadastrar" /> <input name="bt_limp" type="reset" id="bt_limp" value="Limpar" /> </td> </tr> </table> </form> </body> </html> cad_livros.php No comeo desse exemplo voc capturar os dados vindos do formulrio atravs do mtodo $_POST. Voc percebe os valores recebidos envoltos na funo trim( ). Essa funo retira espao no inicio e final de uma string. Logo aps atravs da condio IF voc verifica se os valores no ( ! ) esto vazios com a funo empty( ). Caso no estejam, construdo uma query com a instruo SQL INSERT, que possibilita a insero de dados no banco de dados, como j visto anteriormente. A varivel $ins tem como atribuio o valor resultante de mysql_query( ). Atravs dessa atribuio, voc pode verificar se o valor foi executado ou no. Isso feito atravs do IF que compara a varivel $ins IDNTICO a FALSE. Caso seja, significa que a query apresentou um erro, ou na construo da sintaxe ou no recebimento dos dados que esto tentando serem inseridos. O resultado e FALSE a varivel $msg com o valor de uma String CONCATENADA com mysql_error( ). A funo mysql_error( ) retorna o erro vindo do banco de dados MySQL, dando ao desenvolvedor a possibilidade de depur-lo, caso seja um problema da instruo SQL. Caso contrrio, ELSE, a varivel $msg receber a o valor de uma String CONCATENADA com a funo mysql_affected_rows( ). Essa funo resulta no nmero de linhas afetadas pela instruo SQL (que no caso sempre ser com o valor 1). Ainda na condio ELSE, um construtor de linguagem aparece: o unset( ). O unset( ) destri variveis, que, mais do que necessrio nessa ocasio, as variveis usadas para inserir os dados sero destrudas, evitando assim com que seus dados sejam acessveis em qualquer outra parte do cdigo a seguir. Se unset( ) no chamado, veja que se executou um erro no formulrio, o que permite que os dados preenchidos anteriormente sejam impressos nos valores dos campos (VALUE) desse formulrio.

Alterando o cadastro de livros


O cadastro de livros agora precisa ser alterado, pois os dados foram inseridos e precisam ser acessveis para possveis alteraes de erros ou outras informaes.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

123

PHP 5 e MySQL 5 e Ajax


O cdigo a seguir unir muitos dos conhecimento adquiridos no PHP 5: <?php //conecta ao banco de dados $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria"); //mtodo que verifica se os campos esto preenchidos function preenchido( ) { //verifica o nmero de argumentos $numargs = func_num_args( ); //pega os argumentos passados $arg_list = func_get_args( ); //no loop verifica se os argumentos esto vazios com empty for ($i = 0; $i < $numargs; $i++){ if(empty($arg_list[$i])) return false;//retorna false caso estejam } return true;//retorna true caso no estejam } //mtodo que coloca aspas nas strings para execuo da instruo SQL function valor_string($valor) { //verifica se est ativo as cotas mgicas //se no estiver, usa addslashes $valor = (!get_magic_quotes_gpc( )) ? addslashes($valor) : $valor; $valor = ($valor != "") ? "'" . $valor . "'" : "NULL"; return $valor; } //captura os dados vindos do formulrio HTML $isbn=trim($_REQUEST['isbn']); $titulo=trim($_POST['titulo']); $edicao=trim($_POST['edicao']); $publicacao=trim($_POST['publicacao']); $descricao=trim($_POST['descricao']); //verifica se foi postado o formulrio de atualizao if(isset($_POST['bt_atu'])){ try{ //verifica se os dados recebidos no so vazios if( !preenchido($titulo,$edicao,$publicacao,$descricao) ){ //se forem vazios dispara uma exceo e encerra a execuo //pulando para a clusula catch
throw new Exception('Voc no preencheu os campos corretamente<br />');

} //com sprintf voc pode trabalhar com strings //essa funo retorna string formatado

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

124

PHP 5 e MySQL 5 e Ajax


$query=sprintf("UPDATE livros SET titulo = %s, edicao_num = %s, ano_publicacao = %s, descricao = %s WHERE isbn=%s", valor_string($titulo), valor_string($edicao), valor_string($publicacao), valor_string($descricao), valor_string($isbn)); $update=mysql_query($query); //verifica se o resultado dado falso dispara uma exceo e encerra if($update===FALSE) {
throw new Exception("Erro na atualizao... " . mysql_error() . "<br />");

} else{ $msg= "Foi atualizada " . mysql_affected_rows() . " linha<br />"; //destri as variveis criadas para receber os dados unset($isbn,$titulo,$edicao,$publicacao,$descricao); } } catch (Exception $e) { //caso haja uma exceo mensagem capturada e atribuda a $msg $msg = $e->getMessage( ); } } $rs=mysql_query("SELECT * FROM livros"); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Atualizao de Livros</title> </head> <body> <?php //verifica se existe a varivel $msg if(isset($msg)) echo $msg; ?> <p> <table width="489" border="1" cellspacing="0" cellpadding="0"> <tr> <th width="109" align="left">ISBN</th> <th width="202" align="left">Ttulo</th>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

125

PHP 5 e MySQL 5 e Ajax


<th width="82" align="left">Edio N. </th> <th width="96" align="left">Publicado em: </th> <th width="96" align="left">Atualizar </th> </tr> <?php //varre todos os dados da tabela while($row=mysql_fetch_array($rs)){ ?> <tr> <td><?php echo $row['isbn']?></td> <td><?php echo $row['titulo']?></td> <td align="center"><?php echo $row['edicao_num']?></td> <td align="center"><?php echo $row['ano_publicacao']?></td> <td align="center"> <a href="<?php echo $_SERVER['PHP_SELF']?>?isbn= <?php echo urlencode($row['isbn'])?>"> Clique aqui </a> </td> </tr> <?php }//end if?> </table> </p> <?php //verifica se voc clicou no link e se no est vazio o valor de isbn if( ( !empty($_SERVER['QUERY_STRING']) && !empty($isbn) ) ) : try{ $result=mysql_query("SELECT * FROM livros WHERE isbn='$isbn'"); //se a query resultar em um erro dispara essa exceo if($result===FALSE) { throw new Exception("Erro na consulta... " . mysql_error( ) . "<br />"); } //se o resultado for igual a zero, ou seja, no existir o ISBN //dispara essa exceo if(mysql_num_rows($result)==0) throw new Exception("No existem dados no ISBN procurado"); $row = mysql_fetch_assoc($result); ?> <form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']?>"> <table width="259" border="0" cellspacing="2" cellpadding="0"> <tr> <th colspan="2">Atualizao de Livros </th> </tr> <tr> <td width="87" align="right">ISBN:</td> <td width="166"> <strong><?php echo $isbn?></strong>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

126

PHP 5 e MySQL 5 e Ajax


<input name="isbn" type="hidden" id="isbn" value="<?php echo $row['isbn']?>" /> </td> </tr> <tr> <td align="right">Ttulo:</td> <td> <input name="titulo" type="text" id="titulo" value="<?php echo $row['titulo']?>" /> </td> </tr> <tr> <td align="right">Edio N.;: </td> <td> <input name="edicao" type="text" id="edicao" value="<?php echo $row['edicao_num']?>" /> </td> </tr> <tr> <td align="right">Publicao:</td> <td> <input name="publicacao" type="text" id="publicacao" value="<?php echo $row['ano_publicacao']?>" /> </td> </tr> <tr> <td align="right" valign="top">Descrio:</td> <td> <textarea name="descricao" rows="5" id="descricao"> <?php echo $row['descricao']?> </textarea> </td> </tr> <tr> <td colspan="2" align="center"> <input name="bt_atu" type="submit" id="bt_cad" value="Atualizar" /> </td> </tr> </table> </form> <?php } catch (Exception $e) { //caso haja uma exceo mensagem ecoada na tela echo "<strong>{$e->getMessage( )}</strong>"; } endif; ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

127

PHP 5 e MySQL 5 e Ajax


</body> </html> atu_livros.php Dois mtodos foram criados no comeo do cdigo, sendo o primeiro chamado de preenchido( ). O mtodo preenchido( ) foi desenvolvido para receber diversos argumentos, no possuindo um nmero exato. Se algum desses argumentos passados estiverem vazios, o mtodo retorna FALSE. O mtodo valor_string( ) verifica se as cotas mgicas esto habilitadas no PHP.INI, atravs de get_magic_quotes_gpc( ). Caso no estejam, o mtodo utilizar addslashes(). Em seguida, a varivel recebe os strings aspas simples para que seja possvel usar mais adiante na instruo SQL. A manipulao de exceo ocorre quando voc utiliza o bloco try...catch. O bloco try o responsvel por verificar se existem um problema ocorrendo. nesse ponto que voc tem um IF verificando se no esto preenchidos os valores vindos do formulrio de atualizao. Se no estiverem, uma exceo disparada em throw new Exception( ).
Caso haja um disparo, imediatamente o cdigo muda para o bloco catch e exibe o valor disparado.

Caso no haja um erro, o cdigo segue, onde executada a instruo SQL UPDATE, que dessa vez fora chamada com a funo sprintf, que captura os strings e os retorna formatados. Na execuo da QUERY, novamente uma verificao feita para evitar erros, que se houver, dispara tambm uma EXCEO. Caso no dispare, uma mensagem dada ao usurio indicando que os dados foram atualizados com sucesso. Abaixo da TABELA feita uma verificao para que seja exibido ou no o FORMULRIO. A verificao feita atravs de $_SERVER['QUERY_STRING'] e pelo valor da varivel $isbn. Se voc se lembrar, QUERY_STRING exibe os resultados passados pelo cabealho HTTP, usados aps o smbolo de consulta ?. Esse o mtodo usado para o envio do cdigo ISBN do livro para executar a atualizao. Um outro mtodo aparecera, chamado de mysql_num_rows( ), capaz de capturar o nmero de linhas vindos de uma instruo SQL SELECT. O mtodo mysql_affected_rows( ) no foi utilizado porque ele no funciona com a instruo SELECT. Se o resultado for igual a ZERO, quer dizer que no existe o ISBN procurado, fazendo com que seja disparada uma exceo.

Trabalhando com MySQL Improved Extension


Com o avano do MySQL, principalmente em sua nova verso, a 5, o PHP precisava tambm melhorar seu processo de comunicao com o MySQL nesta verso. Sendo assim, fora criado uma extenso chamada de mysqli. A extenso mysqli (improved aperfeioado) permite a voc acessar a funcionalidade provida pelo MySQL na verso 4.1.2 ou superior. O mysqli possui uma semelhana com a extenso mysql, mas com muito mais funcionalidades. Obs.: Para ter estas funes disponveis, voc dever compilar o PHP com suporte para a extenso mysqli. No Windows, voc precisar habilitar, se no estiver habilitada, a extenso php_mysqli.dll.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

128

PHP 5 e MySQL 5 e Ajax


Criando a conexo com o mysqli
Nessa etapa voc criar uma conexo com o mysqli em um arquivo externo, com a inteno de se incluir nas demais pginas. <?php function conexao( ) { //executa a conexo com mysqli pela interface orientada a objeto $result = new mysqli('localhost', 'edson', 'integrator', 'livraria'); //se no for possvel se conectar dispara uma exceo if (!$result) throw new Exception('No foi possvel se conectar com o banco de dados'); else return $result;//caso contrrio retorna o resultado } ?> conexao.php O mtodo mysqli chamado aqui com uma interface orientada a objeto, mas voc tambm pode optar pelo modo procedural, como feito em mysql_connect( ): $result = mysqli_connect('localhost', 'edson', 'integrator', 'livraria');

Criando o arquivo de funes


Embora a idia seja colocar mais de um mtodo, no incio voc apenas colocar um, o mesmo usado no de atualizao de livros, para que se verifique se foi preenchido os campos do formulrio: <?php //mtodo que verifica se os campos esto preenchidos function preenchido( ) { //verifica o nmero de argumentos $numargs = func_num_args( ); //pega os argumentos passados $arg_list = func_get_args( ); //no loop verifica se os argumentos esto vazios com empty for ($i = 0; $i < $numargs; $i++){ if(empty($arg_list[$i])) return false;//retorna false caso estejam } return true;//retorna true caso no estejam } ?> func.php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

129

PHP 5 e MySQL 5 e Ajax


Criando o Stored Procedure para inserir autores
Para criar o Stored Procedure para inserir autores, execute o comando a seguir no terminal ou prompt de comando: DELIMITER $$ CREATE PROCEDURE sp_ins_autor(in_nome VARCHAR(100), in_dt_nasc DATE) BEGIN IF in_nome IS NOT NULL AND in_dt_nasc IS NOT NULL THEN INSERT INTO autores (nome, dt_nasc) VALUES (in_nome, in_dt_nasc ); END IF; END $$ DELIMITER ;

Criando o cadastro de autores


O cdigo a seguir requisitar tanto a conexo como as funes para que seja possvel de ser manipuladas pelo arquivo, chamando-as por require_once( ). <?php require_once("conexao.php"); require_once("func.php"); $autor=trim($_POST['autor']); $dt_nasc=trim($_POST['dt_nasc']); //verifica se foi postado o formulrio de insero if(isset($_POST['bt_cad'])){ try{ $con=conexao( ); if( !preenchido($autor,$dt_nasc) ) throw new Exception('Voc no preencheu os campos corretamente<br />'); $dt=explode("/",$dt_nasc); $dt_nasc="{$dt[2]}-{$dt[1]}-{$dt[0]}"; $result = $con->query("CALL sp_ins_autor('$autor','$dt_nasc')"); if(!$result) throw new Exception('Problemas: '.$con->errno.' --- '.$con->error.'<br />'); else $msg="O cadastro foi inserido com sucesso!"; unset($autor,$dt_nasc);

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

130

PHP 5 e MySQL 5 e Ajax


catch(Exception $e){ //caso haja uma exceo mensagem capturada e atribuda a $msg $msg = $e->getMessage( ); } }

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Cadastro de Autores</title> </head> <body> <?php //verifica se existe a varivel $msg if(isset($msg)) echo $msg; ?> <form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']?>"> <table width="265" border="0" cellspacing="2" cellpadding="0"> <tr> <th colspan="2">Cadastro de Autores </th> </tr> <tr> <td width="107" align="right">Nome do Autor: </td> <td width="152"> <input name="autor" type="text" id="autor" value="<?php echo $autor?>" /> </td> </tr> <tr> <td align="right">Data de Nasc.: </td> <td> <input name="dt_nasc" type="text" id="dt_nasc" value="<?php echo $dt_nasc?>" /> </td> </tr> <tr> <td colspan="2"> <input name="bt_cad" type="submit" id="bt_cad" value="Cadastrar" /> </td> </tr> </table> </form> </body>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

131

PHP 5 e MySQL 5 e Ajax


</html> cad_autores.php Muitas das situaes aqui vistas j so conhecidas por exemplos anteriores. Dentro da clusula try voc chama o mtodo conexao( ), atribuindo-o varivel $con. A partir desse momento, voc pode acessar com $con os mtodos da classe mysqli, existente no arquivo conexao.php. Como a data de nascimento ser preenchida como em nosso idioma, chamado explode( ) que retorna uma matriz de Strings. A varivel $dt capta os dados quebrados em forma de matriz e os torna acessvel como uma matriz linear. A varivel $dt_nasc recebe essa matriz reorganizando-a no formato de data aceito pelo MySQL. Com o mtodo query( ) de mysqli, voc executa a Stored Procedure sp_ins_autor( ), inserindo assim os valores recebidos.

Selecionando os autores atravs de Stored Procedure


Crie a procedure no terminal ou no prompt de comando: DELIMITER $$ CREATE PROCEDURE sp_sel_autores( ) BEGIN SELECT autor_id as id, nome, DATE_FORMAT(dt_nasc,"%d/%m/%Y") as nascimento FROM autores; END $$ DELIMITER ;

Chamando a Stored Procedure para visualizar os autores


O cdigo a seguir chamar a Stored Procedure criada para exibir seus resultados na pgina: <?php require_once("conexao.php"); require_once("func.php"); try{ $con=conexao( ); $results = $con->query("CALL sp_sel_autores( )"); if(!$results) throw new Exception('Problemas: '.$con->errno.' --- '.$con->error.'<br />'); } catch(Exception $e){ //caso haja uma exceo mensagem capturada e atribuda a $msg $msg = $e->getMessage( );

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

132

PHP 5 e MySQL 5 e Ajax


} ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Visualizar Autores</title> </head> <body> <table width="317" border="1" cellspacing="0" cellpadding="0"> <tr> <th width="190" align="left">Autor</th> <th width="121" align="left">Data Nascimento </th> </tr> <?php try{ if( $results->num_rows==0 ) throw new Exception('No existem dados cadastrados no momento<br />'); while($row = $results->fetch_assoc( )) : ?> <tr> <td><?php echo $row['nome']?></td> <td><?php echo $row['nascimento']?></td> </tr> <?php endwhile; } catch(Exception $e){ //caso haja uma exceo mensagem exibida em echo echo $e->getMessage( ); } //fecha os resultados $results->close( ); //fecha a conexo $con->close( ); ?> </table> </body> </html> vis_autores.php Embora o mtodo de trabalho seja diferente, praticamente a mesma coisa que fazer com o mtodo j visto anteriormente. Voc tem em $results a capacidade de acessar os mtodos vindos da query, que no caso

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

133

PHP 5 e MySQL 5 e Ajax


fora utilizado o fetch_assoc( ), similar ao mysql_fetch_assoc( ) visto anteriormente. O acesso a cada campo de acordo com o ALIAS criado na query armazenada na Stored Procedure. Depois de pegos os resultados, voc fecha a conexo e os results com o mtodo close( ).

Atualizando os autores por Stored Procedure


O cdigo a seguir demonstra como atualizar um cadastro usando Stored Procedure: DELIMITER $$ CREATE PROCEDURE sp_aut_autor(in_nome VARCHAR(100), in_dt_nasc DATE, in_id INT) BEGIN IF in_nome IS NOT NULL AND in_dt_nasc IS NOT NULL AND in_id IS NOT NULL THEN UPDATE autores SET nome=in_nome, dt_nasc=in_dt_nasc WHERE autor_id=in_id; END IF; END $$ DELIMITER ;

Criando a procedure que seleciona um autor em especfico


A Stored Procedure a seguir seleciona somente um autor pelo cdigo do cadastro: DELIMITER $$ CREATE PROCEDURE sp_sel_autor(in_id INT) BEGIN SELECT autor_id, nome, DATE_FORMAT(dt_nasc,'%d/%m/%Y') as dt_nasc FROM autores WHERE autor_id=in_id; END $$ DELIMITER ;

Criando a pgina de atualizao de autores


A pgina de atualizao de autores contm todos os meios j vistos em uma pgina s: <?php require_once("conexao.php"); require_once("func.php"); $autor=trim($_POST['autor']); $dt_nasc=trim($_POST['dt_nasc']); $id=trim($_REQUEST['id']); try{ $con=conexao( );

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

134

PHP 5 e MySQL 5 e Ajax


if(isset($_POST['bt_atu'])){ if( !preenchido($autor,$dt_nasc) ) throw new Exception('Voc no preencheu os campos corretamente<br />'); $dt=explode("/",$dt_nasc); $dt_nasc="{$dt[2]}-{$dt[1]}-{$dt[0]}"; $up = $con->query("CALL sp_aut_autor('$autor','$dt_nasc', $id)"); if($up===FALSE) throw new Exception('Problemas: '.$con->errno.' --- '.$con->error.'<br />'); else $msg="O cadastro foi atualizado com sucesso!"; unset($autor,$dt_nasc); }//end if $results = $con->query("CALL sp_sel_autores( )"); if($results===FALSE) throw new Exception('Problemas: '.$con->errno.' --- '.$con->error.'<br />'); } catch(Exception $e){ //caso haja uma exceo mensagem capturada e atribuda a $msg $msg = $e->getMessage( ); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Atualizar Autores</title> </head> <body> <?php //verifica se existe a varivel $msg if(isset($msg)) echo $msg; ?> <table width="410" border="1" cellspacing="0" cellpadding="0"> <tr> <th width="129" align="left">Autor</th> <th width="165" align="left">Data Nascimento </th> <th width="108" align="left">Atualizar</th> </tr> <?php

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

135

PHP 5 e MySQL 5 e Ajax


try{ if( $results->num_rows==0 ) throw new Exception('No existem dados cadastrados no momento<br />'); while($row = $results->fetch_assoc( )): ?> <tr> <td><?php echo $row['nome']?></td> <td><?php echo $row['nascimento']?></td> <td> <a href="<?php echo $_SERVER['PHP_SELF']?>?id=<?php echo $row['id']?>"> Clique aqui </a> </td> </tr> <?php endwhile; ?> </table> <?php $results->close( ); } catch(Exception $e){ //caso haja uma exceo mensagem exibida em echo echo $e->getMessage( ); } ?> <p> <?php if( !empty($_SERVER['QUERY_STRING']) && !empty($id) ) : try{ $result = $con->query("CALL sp_sel_autor($id)"); if ($result === FALSE) throw new Exception("Erro no resultado... " . $con->error . "<br />"); //se o resultado for igual a zero, ou seja, no existir o ISBN //dispara essa exceo if( $result->num_rows==0 ) throw new Exception("No existem dados no AUTOR procurado"); $row = $result->fetch_object( ); ?> <form

id="form1"

name="form1"

method="post"

action="<?php

echo 136

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

PHP 5 e MySQL 5 e Ajax


$_SERVER['PHP_SELF']?>"> <table width="265" border="0" cellspacing="2" cellpadding="0"> <tr> <th colspan="2">Cadastro de Autores </th> </tr> <tr> <td width="107" align="right">Nome do Autor: </td> <td width="152"><input name="autor" type="text" id="autor" value="<?php echo $row->nome?>" /></td> </tr> <tr> <td align="right">Data de Nasc.: </td> <td><input name="dt_nasc" type="text" id="dt_nasc" value="<?php echo $row>dt_nasc?>" /></td> </tr> <tr> <td colspan="2"><input name="bt_atu" type="submit" id="bt_atu" value="Atualizar" /></td> </tr> </table> <input name="id" type="hidden" id="id" value="<?php echo $row->autor_id?>" /> </form> </p> <?php $result->close( ); }//end try catch (Exception $e) { //caso haja uma exceo mensagem ecoada na tela echo "<strong>{$e->getMessage( )}</strong>"; } endif; $con->close( ); ?> </body> </html> atu_autores.php

Excluindo autores
Para excluir os autores, voc ir criar um procedimento para executar essa ao: DELIMITER $$ CREATE PROCEDURE sp_del_autor(in_id INT) BEGIN DELETE FROM autores WHERE autor_id=in_id; END $$ DELIMITER ;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

137

PHP 5 e MySQL 5 e Ajax


A pgina a seguir faz o trabalho de excluso de autores: <?php require_once("conexao.php"); require_once("func.php"); $id=trim($_REQUEST['id']); try{ $con=conexao( ); if(isset($id) && preenchido($id)){ if( !preenchido($id) ) throw new Exception('Voc no clicou em um autor<br />'); $del = $con->query("CALL sp_del_autor($id)"); if($del===FALSE) throw new Exception('Problemas: '.$con->errno.' --- '.$con->error.'<br />'); else $msg="O cadastro foi EXCLUIDO com sucesso!"; unset($id); }//end if $results = $con->query("CALL sp_sel_autores( )");

} catch(Exception $e){ //caso haja uma exceo mensagem capturada e atribuda a $msg $msg = $e->getMessage(); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Excluir Autores</title> </head> <body> <?php //verifica se existe a varivel $msg if(isset($msg)) echo $msg; ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

138

PHP 5 e MySQL 5 e Ajax


<table width="410" border="1" cellspacing="0" cellpadding="0"> <tr> <th width="129" align="left">Autor</th> <th width="165" align="left">Data Nascimento </th> <th width="108" align="left">Excluir</th> </tr> <?php try{ if( $results->num_rows==0 ) throw new Exception('No existem dados cadastrados no momento<br />'); while($row = $results->fetch_assoc( )): ?> <tr> <td><?php echo $row['nome']?></td> <td><?php echo $row['nascimento']?></td> <td> <a href="<?php echo $_SERVER['PHP_SELF']?>?id=<?php echo $row['id']?>"> Clique aqui </a> </td> </tr> <?php endwhile; ?> </table> <?php $results->close( ); } catch(Exception $e){ //caso haja uma exceo mensagem exibida em echo echo $e->getMessage( ); } $con->close( ); ?> </body> </html> exc_autores.php Por ser uma pgina com situaes semelhantes as j vistas, no sero apresentados detalhes ou explicaes.

Lendo e manipulando o contedo de um diretrio


Algumas vezes, voc ter que verificar o contedo de um diretrio e at mesmo alterlo, excluindo.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

139

PHP 5 e MySQL 5 e Ajax


O exemplo abaixo mostra o mtodo dir( ) que faz a abertura do diretrio. Com o mtodo read ( ) o loop WHILE faz uma varredura em todos os arquivos contidos dentro do diretrio. A funo realpath( ) retorna o caminho fsico real de um determinado diretrio. A funo unlink( ) faz com que voc possa excluir arquivos.
<?php $arq=trim($_GET['arq']); $path = realpath("arquivos"); if(!empty($arq)) unlink($path.'/'.$arq); ?> <html> <head><title>Trabalhando com arquivos</title></head> <body> <?php $_dir = dir($path); echo "Diretrio: " . $_dir->path . "<br/>Contedo:<br/>"; while (($file=$_dir->read())!==FALSE) { if($file!="." && $file!=".."){ echo "<a href=\"{$_SERVER['PHP_SELF']}?arq=$file\"> $file</a><br/>"; } } $_dir->close(); ?> </body> </html>

manip_arq.php

Criando arquivos em PDF


Usado para o desenvolvimento de relatrios, voc tem no PHP diversas formas de desenvolver PDFs. A forma escolhida dessa apostila com a utilizao da biblioteca FPDF, escrita totalmente em PHP. Como caracterstica positiva, essa biblioteca no depende da instalao de nenhuma extenso extra do PHP. Como negativa, a extenso de PDF do PHP mais rpida que essa biblioteca, mas no to atratvel como a biblioteca FPDF, pois considerada mais complexa. A biblioteca FPDF pode ser encontrada no site oficial: http://www.fpdf.org. A seguir voc tem o cdigo que cria um relatrio em PDF utilizando a biblioteca FPDF e com acesso ao banco de dados MySQL: <?php //PDF SCRIPT By EDSON - INTEGRATOR define('FPDF_FONTPATH','fpdf/font/'); require_once('fpdf/fpdf.php'); //Arquivo que se conecta com o banco de dados require_once("conexao.php"); class PDF extends FPDF { //Cabealho da pgina

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

140

PHP 5 e MySQL 5 e Ajax


function Header( ) { //Logo $this->Image('fpdf/tutorial/logo_pb.png',10,8,33); //Arial bold 15 $this->SetFont('Arial','B',15); //Move para a direita $this->Cell(80); //Ttulo $this->Cell(60,10,'Cabealho da Pgina',0,0,'C'); //Quebra de linha $this->Ln(20); } //Rodap da pgina function Footer( ) { //Posio de 1.5 cm da borda inferior $this->SetY(-15); //Arial italic 8 $this->SetFont('Arial','I',8); //Nmero da pgina $this->Cell(0,10,'Pgina '.$this->PageNo().'/{nb}',0,0,'C'); //name $this->SetTextColor(0,0,255); $this->SetFont('','U'); $this->SetY(-5); $this->SetX(90); $this->Write(5,'www.integrator.com.br','http://www.integrator.com.br'); } } //Criando um novo arquivo de PDF //na classe, voc pode definir a visualizao (L em minsculo) indica Paisagem, //o default Retrato, as medidas usadas na pgina e o formato //da pgina: A3, A4 e etc $pdf=new PDF('l','mm','A4'); $pdf->AliasNbPages( ); //Abre o arquivo $pdf->Open( ); //Desabilita a quebra automtica de pginas $pdf->SetAutoPageBreak(false); //Adiciona a primeira pgina $pdf->AddPage( );

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

141

PHP 5 e MySQL 5 e Ajax


//coloca o valor do eixo y na posio por pgina $y_axis = 30; //coloca a altura da linha $row_height = 6; //Imprime os ttulos para a pgina atual //coloca a cor de fundo $pdf->SetFillColor(232,232,232); //coloca o cor da fonte $pdf->SetTextColor(0,0,160); $pdf->SetFont('Arial','B',12); $pdf->SetY($y_axis); $pdf->SetX(25); $pdf->Cell(180,$row_height,'Livros Cadastrados',1,0,'C',1); //adiciona a altura da linha seguinte $y_axis = $y_axis + $row_height; $pdf->SetY($y_axis); $pdf->SetX(25); $pdf->Cell(50,$row_height,'ISBN',1,0,'C',1); $pdf->Cell(100,$row_height,'Titulo',1,0,'C',1); $pdf->Cell(30,$row_height,'Edio',1,0,'C',1); $y_axis = $y_axis + $row_height; try{ $con=conexao( ); //seleciona os livros para serem mostrados no seu arquivo PDF $result=$con->query('select isbn,titulo,edicao_num from livros ORDER BY titulo'); if($result===FALSE) throw new Exception('Problemas: '.$con->errno.' --- '.$con->error.'<br />'); //Inicializa o contador $i = 0; //Coloca o mximo de linhas por pgina $max = 5; if( $result->num_rows==0 ) throw new Exception('No existem dados cadastrados no momento'); while($row = $result->fetch_array( )) { //Se a linha atual da prxima pgina, criada uma nova pgina e //impressa os ttulos novamente if ($i == $max) { $pdf->AddPage( );

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

142

PHP 5 e MySQL 5 e Ajax


$y_axis = 30; //Imprime os ttulos das colunas para a pgina atual $pdf->SetY($y_axis); $pdf->SetX(25); $pdf->SetFillColor(232,232,232); $pdf->SetTextColor(0,0,160); $pdf->Cell(50,$row_height,'ISBN',1,0,'C',1); $pdf->Cell(100,$row_height,'Titulo',1,0,'C',1); $pdf->Cell(30,$row_height,'Edio',1,0,'C',1); //Vai para a prxima linha $y_axis = $y_axis + $row_height; //Pega a varivel $i e coloca o valor 0 (primeira linha) $i = 0; } //coloca o efeito zebra nas linhas if($i%2) $pdf->SetFillColor(255,255,255); else $pdf->SetFillColor(245,245,245); $isbn = $row['isbn']; $titulo = $row['titulo']; $edicao = $row['edicao_num']; //coloca a cor da fonte $pdf->SetTextColor(0,0,0); $pdf->SetY($y_axis); $pdf->SetX(25); //adiciona os valores do banco nas clulas $pdf->Cell(50,$row_height,$isbn,1,0,'L',1); $pdf->Cell(100,$row_height,$titulo,1,0,'L',1); $pdf->Cell(30,$row_height,$edicao,1,0,'R',1); //vai para a prxima linha $y_axis = $y_axis + $row_height; $i ++; } //Cria o arquivo //abaixo voc tem a possibilidade de enviar para o browser para salvar como //$pdf->Output('arquivo.pdf','D'); //o exemplo abaixo para ser exibido diretamente no browser $pdf->Output( );//abre o plug-in padro do PDF para visualizar o arquivo de sada Header('Pragma: public'); //Deve ser colocado para exibio no Internet Explorer $result->close( ); } catch(Exception $e){ //caso haja uma exceo a mensagem capturada e atribuida a $msg echo $e->getMessage( ); }

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

143

PHP 5 e MySQL 5 e Ajax


$con->close( ); gerar_pdf.php

Arquivos de Excel
Para criar um arquivo que tenha como sada o formato do Excel, ou xls, voc inicialmente precisa ter a formatao padro usada por ele. Isso fcil de se conhecer, bastando apenas export-lo no formato XML. Com os headers a seguir, voc tem a possibilidade de ter a sada para download. <?php header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" ); header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); header ( "Pragma: no-cache" ); header ( "Content-type: application/x-msexcel" ); header ( "Content-Disposition: attachment; filename=arquivo.xls" ); header ( "Content-Description: PHP Generated XLS Data" ); ?> O cdigo a seguir demonstra como funciona um documento com sada em formato XLS (MS Excel), com dados vindos do banco de dados. Uma situao crtica que deve ser observada est em ss:ExpandedRowCount, em destaque a seguir. Isso porque voc tem que passar ao arquivo o nmero de linhas correto. Caso no o faa, um erro ocorre.
<?php header( "content-type: text/xml" ); header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT" ); header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" ); header ( "Pragma: no-cache" ); header ( "Content-type: application/x-msexcel" ); header ( "Content-Disposition: attachment; filename=arquivo.xls" ); header ( "Content-Description: PHP Generated XLS Data" ); //conecta ao banco de dados $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria"); //seleciona os dados da tabela $sql = "SELECT * FROM livros"; $resultado = mysql_query($sql); $nr=mysql_num_rows($resultado); //conta o nmero de linhas encontradas //colocado em PHP para evitar erros de interpretao pelo servidor echo( "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n" ); echo( "<?mso-application progid=\"Excel.Sheet\"?>\n" ); ?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

144

PHP 5 e MySQL 5 e Ajax


<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> <Author>Edson Gonalves</Author> <LastAuthor>Edson Gonalves</LastAuthor> <Created>2005-04-30T14:08:07Z</Created> <LastSaved>2005-04-30T14:09:14Z</LastSaved> <Company>Integrator Tecnology and Design</Company> <Version>10.2625</Version> </DocumentProperties> <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> <DownloadComponents/> <LocationOfComponents HRef=""/> </OfficeDocumentSettings> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> <WindowHeight>15930</WindowHeight> <WindowWidth>20025</WindowWidth> <WindowTopX>480</WindowTopX> <WindowTopY>105</WindowTopY> <ProtectStructure>False</ProtectStructure> <ProtectWindows>False</ProtectWindows> </ExcelWorkbook> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font/> <Interior/> <NumberFormat/> <Protection/> </Style> </Styles> <Worksheet ss:Name="Livros no Excel"> <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="<? print( $nr + 1 ) ?>" x:FullColumns="1" x:FullRows="1"> <Column ss:AutoFitWidth="0" ss:Width="117"/> <Row> <Cell><Data ss:Type="String">Ttulo</Data></Cell> <Cell><Data ss:Type="String">Edio N.</Data></Cell> <Cell><Data ss:Type="String">Publicado em</Data></Cell> </Row> <?php while($row = mysql_fetch_array($resultado)){ ?> <Row> <Cell><Data ss:Type="String"><? print( $row["titulo"] ) ?></Data></Cell> <Cell><Data ss:Type="Number"><? print( $row["edicao_num"] ) ?></Data></Cell> <Cell><Data ss:Type="Number"><? print( $row["ano_publicacao"] ) ?></Data></Cell> </Row> <? } ?> </Table> <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> <Selected/> <Panes> <Pane>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

145

PHP 5 e MySQL 5 e Ajax


<Number>3</Number> <ActiveRow>2</ActiveRow> </Pane> </Panes> <ProtectObjects>False</ProtectObjects> <ProtectScenarios>False</ProtectScenarios> </WorksheetOptions> </Worksheet> </Workbook> trab_excel.php

Criando arquivos em RTF


Criar arquivos em formato RTF com o PHP relativamente simples. Primeiro voc precisa usar um editor de arquivos como o BrOffice.org Writer ou MS Word e criar um arquivo com o formato mostrado a seguir: Formato do arquivo chamado de arquivoRTF.rtf Data do relatrio: <<data>> A seguir voc tem uma lista de Livros encontrados no banco de dados: Ttulo <<titulo>> Edio N. Publicado em <<edicao>> <<publicado>>

A seguir voc tem um exemplo de listagem dos livros simples, para que seja atravs desse arquivo a chamada para o outro que ir gerar o RTF com os novos dados: <?php try{ //conecta ao banco de dados $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria"); $rs = mysql_query("SELECT * FROM livros"); if(!$rs) throw new Exception('Problemas: '.mysql_error().'<br />'); } catch(Exception $e){ //caso haja uma exceo a mensagem capturada e atribuida a $msg $msg = $e->getMessage(); } ?>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

146

PHP 5 e MySQL 5 e Ajax


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Visualizar Livros</title> </head> <body> <?php //verifica se existe a varivel $msg if(isset($msg)) echo $msg; ?> <table width="550" border="1" cellspacing="0" cellpadding="0"> <tr> <th width="109" align="left">ISBN</th> <th width="177" align="left">T&iacute;tulo</th> <th width="79" align="left">Edi&ccedil;&atilde;o N.&ordm; </th> <th width="96" align="left">Publicado em: </th> <th width="77" align="left">Gerar RTF </th> </tr> <?php //varre todos os dados da tabela while($row=mysql_fetch_array($rs)){ ?> <tr> <td><?php echo $row['isbn']?></td> <td><?php echo $row['titulo']?></td> <td align="center"><?php echo $row['edicao_num']?></td> <td align="center"><?php echo $row['ano_publicacao']?></td> <td align="center"><a href="geraRTF.php?isbn=<?php echo urlencode($row['isbn'])?>"> Clique aqui </a> </td> </tr> <?php }//end if?> </table> </body> </html> list_livros.php A seguir voc far o arquivo que receber o ISBN do livro para gerar o arquivo RTF com os dados. <?php try{ //conecta ao banco de dados $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria"); //seleciona o livro escolhido na lista

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

147

PHP 5 e MySQL 5 e Ajax


$sql = "SELECT * FROM livros WHERE ISBN='{$_GET['isbn']}'"; $resultado = mysql_query($sql); //se houver problemas na query, lana uma exceo if(!$resultado) throw new Exception('Problemas: '.mysql_error( ).'<br />'); $nr=mysql_num_rows($resultado); } catch(Exception $e){ //caso haja uma exceo a mensagem capturada e ecoada na tela echo $e->getMessage( ); }

//gera os cabealhos corretos para a sada do documento RTF header( "Content-Type: application/msword" ); header( "Content-Disposition: inline, filename=arquivoRTFModificado.rtf"); $data = date( "d/m/Y" ); // abre o arquivo RTF criado como template $filename = "arquivoRTF.rtf"; $output = file_get_contents($filename); // altera as informaes dentro do arquivo template para os dados vindos do banco $row = mysql_fetch_array($resultado); $output = str_replace( "<<data>>", $data, $output ); $output = str_replace( "<<titulo>>", $row["titulo"] , $output ); $output = str_replace( "<<edicao>>", $row["edicao_num"], $output ); $output = str_replace( "<<publicado>>", $row["ano_publicacao"], $output );

//envia a sada gerada para o browser echo $output; ?> geraRTF.php O mtodo file_get_contents( ) o prefervel para se ler o contedo de um arquivo em uma string. Ela usa tcnicas de mapeamento de memria suportadas em seu sistema operacional para melhorar a performance. Mas voc poderia ter usado o conhecido fopen( ), fwrite( ) e fclose( ) se desejasse. O exemplo a seguir faz exatamente isso e gera um novo arquivo, usando o mtodo copy( ) para copi-lo com o novo nome no diretrio especificado. <?php try{ //conecta ao banco de dados $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria");

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

148

PHP 5 e MySQL 5 e Ajax


$sql = "SELECT * FROM livros WHERE ISBN='{$_GET['isbn']}'"; $resultado = mysql_query($sql); if(!$resultado) throw new Exception('Problemas: '.mysql_error().'<br />'); $nr=mysql_num_rows($resultado); $data = date( "d/m/Y" ); // open our template file $arquivo = "arquivoRTF.rtf"; $novoarq="arquivoRTFGerado.rtf"; $dir = './'; if(!copy($arquivo,$dir.$novoarq)) throw new Exception('No foi possvel copiar o arquivo<br />'); if(file_exists($arquivo)) { $abre=fopen($arquivo,"r");//abre o arquivo original $abre_novo=fopen($novoarq,"w+");//abre o arquivo novo $saida=fread($abre,filesize($arquivo)); $row = mysql_fetch_array($resultado); $saida = str_replace( "<<data>>", $data, $saida ); $saida = str_replace( "<<titulo>>", $row["titulo"] , $saida ); $saida = str_replace( "<<edicao>>", $row["edicao_num"], $saida ); $saida = str_replace( "<<publicado>>", $row["ano_publicacao"], $saida ); $grava=fwrite($abre_novo,$saida);//escreve a sada no arquivo novo fclose($abre);//fecha o original fclose($abre_novo);//fecha o novo } else throw new Exception('No foi possvel encontrar o arquivo<br />'); echo "Arquivo gerado com sucesso!"; } catch(Exception $e){ //caso haja uma exceo a mensagem capturada e atribuida a $msg echo $e->getMessage(); }

?> gerarRTF.php

Desenvolvendo aplicaes Web com PHP e Ajax


Nessa etapa da apostila voc aprender a criar aplicaes escritas em PHP5 que acessam dados sem o famoso reload da pgina. Para que isso seja possvel, um conjunto de

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

149

PHP 5 e MySQL 5 e Ajax


tecnologias entram em ao, possibilitando a voc desenvolver aplicaes Web com caractersticas similares a encontrada nas aplicaes para desktop.

O que AJAX?
AJAX carregar e renderizar uma pgina, utilizando recursos de scripts rodando pelo lado cliente, buscando e carregando dados em background sem a necessidade de reload da pgina. AJAX acrnimo para: Asynchronous JavaScript And XML e foi gerado por Jesse James Garret, em um artigo no site http://www.adaptivepath.com/publications/essays/archives/000385.php, da sua empresa Adaptive Path, em fevereiro de 2005. Ajax no uma tecnologia, mas sim um conjunto de tecnologias. O conceito de AJAX se resume em conhecer bem JavaScript, trabalhando com DOM (Document Object Model), CSS (Cascading Style Sheets) e XML.

Como o AJAX trabalha


Enquanto em uma aplicao Web clssica o navegador tem que ir buscar as informaes no servidor e retornar para o cliente, no Ajax ocorre de forma diferente. No carregamento da pgina, toda a lgica de processamento de dados passado ao cliente. Quando o usurio faz uma requisio, quem busca e trs essas informaes o JavaScript, de forma assncrona, no causando assim o chamado reload na tela. O tratamento dos dados, seu formato e exibio fica toda por conta do script que foi carregado inicialmente quando se acessou a pgina. O processo inicial de carregamento mais lento que de uma aplicao comum, pois muitas informaes so pr-carregadas. Mas depois, somente os dados so carregados, tornando assim o site mais rpido.

Criando uma pgina com Ajax


Com o uso do objeto XMLHttpRequest, que faz parte do padro ECMA e est presente em todas as boas verses do Javascript. Os browsers que suportam esse padro so:

Opera 8 Mozilla e Firefox Konqueror Safari

Alm disso o Internet Explorer, desde a verso 5, suporta o Microsoft XMLHTTP, um substituto para o XMLHttpRequest. H duas maneiras de se fazer uma requisio com um objeto XMLHttpRequest, uma sncrona, outra assncrona. No modo sncrono, quando voc manda o objeto fazer uma requisio, o seu script interrompido esperando pelo retorno. No modo assncrono a requisio feita em segundo plano e seu script continua a ser executado. Em modo sncrono, voc tem o problema de ter seu navegador congelado enquanto seu script executado. E isso ruim, pois podem ser que seja rpida a requisio e pode ser que no, ai voc pergunta, ser que est funcionando ou travou? O negcio evitar esse mtodo.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

150

PHP 5 e MySQL 5 e Ajax


ajax.php <?php try{ //conecta ao banco de dados $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria"); $rs = mysql_query("SELECT * FROM livros"); if(!$rs) throw new Exception('Problemas: '.mysql_error().'<br />'); } catch(Exception $e){ //caso haja uma exceo a mensagem capturada e atribuida a $msg $msg = $e->getMessage(); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Trabalhando com Ajax</title> <script language="JavaScript"> function Dados(isbn) { //verifica se o browser tem suporte a ajax try { ajax = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { try { ajax = new ActiveXObject("Msxml2.XMLHTTP"); } catch(ex) { try { ajax = new XMLHttpRequest(); } catch(exc) { alert("Esse browser no tem recursos para uso do Ajax"); ajax = null; } } } //se tiver suporte ajax if(ajax) { ajax.open("GET", "livro.php?isbn="+isbn, true); ajax.onreadystatechange = function() { //enquanto estiver processando...emite a msg de carregando if(ajax.readyState == 1) {

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

151

PHP 5 e MySQL 5 e Ajax


mensagem( "Carregando...!" ); } //aps ser processado - chama funo processXML que vai varrer os dados if(ajax.readyState == 4 ) { if(ajax.responseXML) { processXML(ajax.responseXML); } else { //caso no seja um arquivo XML emite a mensagem abaixo mensagem( "Erro ao carregar" ); } } } ajax.send(null); } }//end function Dados function processXML(obj){ //pega a tag livro do XML var dataArray = obj.getElementsByTagName("livro"); //total de elementos contidos na tag livro if(dataArray.length > 0) { //percorre o arquivo XML paara extrair os dados for(var i = 0 ; i < dataArray.length ; i++) { var item = dataArray[i]; //contudo dos campos no arquivo XML
var isbn = item.getElementsByTagName("isbn")[0].firstChild.nodeValue; var titulo = item.getElementsByTagName("titulo")[0].firstChild.nodeValue; var edicao = item.getElementsByTagName("edicao")[0].firstChild.nodeValue; var publicacao = item.getElementsByTagName("publicacao")[0].firstChild.nodeValue;

} mensagem( "Dados carregados" ); document.getElementById('isbn').innerHTML=isbn; document.getElementById('titulo').innerHTML=titulo; document.getElementById('edicao').innerHTML=edicao; document.getElementById('publicacao').innerHTML=publicacao; } }//end function processXML function mensagem(msg){ document.getElementById('mensagem').innerHTML=msg; }//end function mensagem </script> </head> <body> <?php //verifica se existe a varivel $msg if(isset($msg)) echo $msg;

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

152

PHP 5 e MySQL 5 e Ajax


?> <table width="253" border="1" cellspacing="0" cellpadding="0"> <tr> <th width="137" align="left">ISBN</th> <th width="110" align="left">Exibir dados </th> </tr> <?php //varre todos os dados da tabela while($row=mysql_fetch_array($rs)){ ?> <tr> <td><?php echo $row['isbn']?></td> <td align="center"> <a href="#" onclick="Dados('<?php echo urlencode($row['isbn'])?>')"> Clique aqui </a> </td> </tr> <?php }//end if?> </table> <p> <div id="mensagem"></div> <table width="295" height="92" border="0" cellpadding="2" cellspacing="0"> <tr> <td width="75">ISBN:</td> <td width="212"><span id="isbn"></span></td> </tr> <tr> <td>Ttulo:</td> <td><span id="titulo"></span></td> </tr> <tr> <td>Edio N.</td> <td><span id="edicao"></span></td> </tr> <tr> <td>Publicao:</td> <td><span id="publicacao"></span></td> </tr> </table> </p> </body> </html>

livro.php <?php //conexao ao mysql $conexao=mysql_connect("localhost","edson","integrator"); //acessa o banco de dados desejado $banco=mysql_select_db("livraria");

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

153

PHP 5 e MySQL 5 e Ajax


//recebendo o parmetro $isbn = $_GET["isbn"]; //executa a query $rs = mysql_query("SELECT * FROM livros WHERE isbn='$isbn'"); //conta a quantidade de linhas encontradas $row = mysql_num_rows($rs); //se existem dados if($row>0) { //gera o xml $xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"; $xml .= "<livros>\n"; //percorre os dados encontrados while($l=mysql_fetch_array($rs)){ $xml .= "<livro>\n"; $xml .= "<isbn>".$l['isbn']."</isbn>\n"; $xml .= "<titulo>".$l['titulo']."</titulo>\n"; $xml .= "<edicao>".$l['edicao_num']."</edicao>\n"; $xml .= "<publicacao>".$l['ano_publicacao']."</publicacao>\n"; $xml .= "</livro>\n"; }//end while $xml.= "</livros>\n"; //sada para o navegador header("Content-type: application/xml; charset=iso-8859-1"); }//end if //echo do resultado echo $xml; ?>

Entendendo o AJAX
Para ter a forma com que o objeto XMLHttpRequest vai trabalhar, voc tem que alterar o terceiro parmetro do mtodo open.
Com esse parmetro em true, no terceiro parmetro do mtodo open, coloca o objeto em modo assncrono.

O mtodo open do objeto XMLHttpRequest permite abrir um documento, passar argumentos para ele e capturar uma resposta. Com apenas dois mtodos possveis de se utilizar para acessar um documento: GET e POST, o mtodo usado no exemplo GET. No entanto se a quantidade de informaes a ser passada for muito grande voc dever alterar para o mtodo POST. O mtodo send ativa a conexo e faz a requisio de informaes ao documento aberto pelo mtodo open. Este mtodo possui somente um parmetro que serve para enviar dados extras ao documento que est sendo acessado. O browser Internet Explorer no o obriga a passar nenhum parmetro, mas outros navegadores como o Mozilla, exige algum dado, neste caso, a soluo foi enviar null, mesmo no havendo necessidade de passar nenhum parmetro. Ao fazer a requisio o objeto vai executar o mtodo onreadystatechange.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

154

PHP 5 e MySQL 5 e Ajax


Esse cdigo vai ser executado vrias vezes durante a requisio, por isso testado readyState. Quando readyState tiver o valor 4, significa que a requisio foi concluda e que possvel ler o retorno e trabalhar com ele. Para capturar a resposta do documento web acessado, voc tem duas propriedades do objeto XMLHttpRequest: responseText e responseXML. A propriedade responseText contm o retorno do documento web acessado na forma de texto. J a propriedade responseXML retorna um objeto DOM, em formato XML, podendo ser manipulado facilmente.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

155

PHP 5 e MySQL 5 e Ajax


Apndice A A configurao do Apache (httpd.conf)
O servidor httpd Apache tem a funo de servir pginas html para intranet ou Internet e possui grandes qualidades. Entre elas, e de onde o nome do aplicativo se originou, a de ser um programa bastante "patchevel" ("patchy" em ingls, logo o nome Apache veio de "a patchy server") estendendo suas capacidades iniciais por fazer uso de mdulos diversos. Estes, adicionam o suporte a php, cgi e outros, e so de suma importncia para um servidor http seguro e verstil. A configurao bsica abordada neste documento, tem 3 sees importantes:
Configurao do servidor principal Configurao de um servidor em um domnio virtual Habilitao de uma pgina hospedada no home de usurios

Configurao principal (editando o arquivo de configurao) Os arquivos responsveis por toda a configurao do httpd so trs (acess.conf, srm.conf e httpd.conf), mas apenas um deles importa realmente (httpd.conf), sendo os outros dois considerados dispensveis, j que possvel colocar tudo que poderia estar nestes, no principal. As opes neste arquivo j esto comentadas, mas, mesmo assim, aqui vai uma descrio das mesmas. As principais so:
# ServerType is either inetd, or standalone. only supported # on # Unix platforms. # ServerType standalone Inetd mode is

Diz ao sistema se o httpd vai ser rodado via script prprio (standalone), ou a partir do arquivo inetd.conf (inetd). (em "inetd" o httpd fica ocioso, enquanto o inetd fica monitorando as requisies, quando houver alguma, ele avisa e o servio comea a funcionar)

# # ServerRoot: The top of the directory tree under which the server's # configuration, error, and log files are kept. # # NOTE! If you intend to place this on an NFS (or otherwise network) # mounted filesystem then please read the LockFile documentation # (available at http://www.apache.org/docs/mod/core.html#lockfile); # you will save yourself a lot of trouble. # # Do NOT add a slash at the end of the directory path.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

156

PHP 5 e MySQL 5 e Ajax


# ServerRoot /etc/httpd

Esta cuida do caminho do diretrio onde iro ficar os arquivos de configurao. Pode ser mudado se necessrio.
# # Timeout: The number of seconds before receives and sends time out. # Timeout 300

Tempo mximo (em segundos) que o servidor esperar, mantendo uma conexo aberta com o cliente. Se o limite for excedido, ele ter de criar uma nova conexo com o mesmo.
# # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On

Diretamente ligado com a opo acima, define se o processo de manter a conexo com o cliente est ativo ou no.
# # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 100

Nmero mximo de conexes mantidas, sem necessidade de renovao. Quanto mais alto o nmero, melhor a performance (com o hardware adequado).

# # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 15

Mximo (de segundos) a espera de nova requisio.


# # Number of servers to start initially --- should be a reasonable ballpark # figure.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

157

PHP 5 e MySQL 5 e Ajax


# StartServers 10

Nmero de servers iniciais, ou seja, logo no incio do processo, o httpd poderia responder a 10 conexes simultneas ao mesmo site.
# # Limit on total number of servers running, i.e., limit on the number # of clients who can simultaneously connect --- if this limit is ever # reached, clients will be LOCKED OUT, so it should NOT BE SET TOO LOW. # It is intended mainly as a brake to keep a runaway server from taking # the system with it as it spirals down... # MaxClients 150

Nmero mximo de conexes simultneas por clientes ao site. Se for ultrapassada, mostrar a infame mensagem "http server busy".
# # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, in addition to the default. See also the <VirtualHost> # directive. # #Listen 3000 #Listen 12.34.56.78:80

Permite ao __principal__ httpd server, responder em mais de um ip (descomentando o 12.34.56.78:80 por exemplo, habilitaria ao server http escutar em um ip alm de seu ip normal (o da prpria mquina))

# # BindAddress: You can support virtual hosts with this option. This # directive # is used to tell the server which IP address to listen to. It can either # contain "*", an IP address, or a fully qualified Internet domain name. # See also the <VirtualHost> and Listen directives. # BindAddress 192.168.255.108:80

Esse importante. Por default a linha BindAddress vem comentada pois como est apresentada acima, habilita o acesso a um domnio virtual (em nosso caso, o ip 192.168.255.108:80 (o :80 seria indicando a porta 80) que ser explicado mais alm. Para cada virtual host, necessria uma entrada "BindAddress e um nmero ip"

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

158

PHP 5 e MySQL 5 e Ajax


# # Dynamic Shared Object (DSO) Support # # To be able to use the functionality of a module which was built as a DSO # you # have to place corresponding `LoadModule' lines at this location so the # directives contained in it are actually available _before_ they are used. # Please read the file README.DSO in the Apache 1.3 distribution for more # details about the DSO mechanism and run `httpd -l' for the list of already # built-in (statically linked and thus always available) modules in your # httpd # binary. # # Note: The order is which modules are loaded is important. Don't change # the order below without expert advice. # # Example: # LoadModule foo_module modules/mod_foo.so # #LoadModule mmap_static_module modules/mod_mmap_static.so LoadModule env_module modules/mod_env.so (seguido de uma lista de LoadModule e mais alm, AddModule)

Descomentando quaisquer das linhas que comecem com LoadModule ou AddModule, valida o carregamento de mdulos feito na inicializao do httpd. Estes funcionam como opes, por exemplo, habilitar ou no o suporte a arquivos cgi no server, etc
# # Port: The port to which the standalone server listens. For # ports < 1023, you will need httpd to be run as root initially. # Port 80

O httpd responde por default na porta 80, neste campo voc poder modific-la se quiser.
# # ServerAdmin: Your address, where problems with the server should be # e-mailed. This address appears on some server-generated pages, such # as error documents. # ServerAdmin root@localhost

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

159

PHP 5 e MySQL 5 e Ajax


O endereo de email para onde ser mandado algo se o server acusar erro ou anormalidades
# # ServerName allows you to set a host name which is sent back to clients for # your server if it's different than the one the program would get (i.e., # use # "www" instead of the host's real name). # # Note: You cannot just invent host names and hope they work. The name you # define here must be a valid DNS name for your host. If you don't # understand # this, ask your network administrator. # If your host doesn't have a registered DNS name, enter its IP address # here. # You will have to access it by its address (e.g., http://123.45.67.89/) # anyway, and this will make redirections work in a sensible way. # ServerName vader.suptel

Outro importante. Determina o nome do server __principal__. Importante: o nome tem que obrigatoriamente constar em DNS (um ip associado a um nome) pois apenas inventando um, no ir adiantar. O modo de cham-lo seria http://nome mas se o mesmo no estiver em nenhum DNS, coloque o ip (seria http://numero-ip para cham-lo ento, neste caso).

# # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/html"

Determina o caminho onde estaro os arquivos html do servidor __principal__. IMPORTANTE: o diretrio deve estar com permisso 755 (chmod 755, sendo leitura, escrita e execuo para o dono, leitura e execuo para grupo e outros que no sejam do grupo nem donos (others).
# # This should be changed to whatever you set DocumentRoot to. # <Directory "/html">

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

160

PHP 5 e MySQL 5 e Ajax


# # This may also be "None", "All", or any combination of "Indexes", # "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews". # # Note that "MultiViews" must be named *explicitly* --"Options All" # doesn't give it to you. # Options Indexes FollowSymLinks Includes # # This controls which options the .htaccess files in directories can # override. Can also be "All", or any combination of "Options", "FileInfo", # "AuthConfig", and "Limit" # AllowOverride None # # Controls who can get stuff from this server. # Order allow,deny Allow from all </Directory>

Este conjunto de campos determinam as opes que os diretrios onde contm documentos htmls a serem acessados iro ter. A primeira "# This should.." deve conter o mesmo diretrio que o "DocumentRoot" tem (o /html). IMPORTANTE: TODAS ESTAS DEVERO SER COPIADAS (E EDITADAS SE PRECISO) PARA AS PASTAS PRINCIPAIS QUE CONTIVEREM ARQUIVOS HTML DO SERVIDOR PRINCIPAL OU DOMINIO VIRTUAL. Se por exemplo voc tiver apenas um servidor virtual alem do principal que responda no diretorio /vh (veremos como fazer essa associao mais alm), voc ter de ter as entradas <Directory "/vh"> e todas as abaixo desta, nem que sejam apenas copiadas, abaixo do trmino da ultima (# Controls who can get stuff from this server.).
# # UserDir: The name of the directory which is appended onto a user's home # directory if a ~user request is received. # UserDir public_html

Esta opo bem til. Cuida de qual diretrio o usurio ter de fazer, se quiser ter uma pgina em seu home. No caso, como est configurado, ele precisar criar um diretrio public_html (o nome pode ser alterado no campo acima) e colocar algo em html ali, podendo ser acessado com http://nome.da.maquina/~nome-do-usurio. IMPORTANTE: COMO MENCIONADO ANTERIORMENTE, ESTE E TODOS OS DIRETRIO ANTERIORES PRECISAM TER PERMISSES 755 AFIM DE GARANTIR ACESSO.

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

161

PHP 5 e MySQL 5 e Ajax


# # Control access to UserDir directories. The following is an example # for a site where these directories are restricted to readonly. # <Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Options MultiViews Indexes SymLinksIfOwnerMatch <Limit GET POST OPTIONS PROPFIND> Order allow,deny Allow from all </Limit> <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK> Order deny,allow Deny from all </Limit> </Directory>

Esta opo coordena os direitos de acesso ao diretrio public_html dos usurios e vem por padro, comentada. No caso voc deve descomenta-la e modific-la de acordo com o diretrio home de seus usurios (por exemplo, o campo <Directory /home/*/public_html> diz que, no diretrio /home, todos que existem dentro dele e que tenham public_html vo ser passveis de acesso, sob as regras configuradas abaixo desta linha.
# # DirectoryIndex: Name of the file or files to use as a prewritten HTML # directory index. Separate multiple entries with spaces. # DirectoryIndex index.html index.htm index.cgi

Esta bastante importante tambm pois determina quais nomes de arquivos sero vlidos para realizar-se a abertura dos mesmos em um browser http. No caso da configurao acima, o server aceitar arquivos de nome index.html, index.htm e index.cgi como arquivos iniciais de uma home page.
# # UseCanonicalName: (new for 1.3) With this setting turned on, whenever # Apache needs to construct a self-referencing URL (a URL that refers back # to the server the response is coming from) it will use ServerName and # Port to form a "canonical" name. With this setting off, Apache will # use the hostname:port that the client supplied, when possible. This # also affects SERVER_NAME and SERVER_PORT in CGI scripts. # UseCanonicalName On

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

162

PHP 5 e MySQL 5 e Ajax


Se ligada, uma pagina que por exemplo se chame http://www.teste.com/teste/ e seja acessada como http://www.teste.com/teste (sem o / no final) seja vlida. Se desligada, ele no ir achar.
# # LogLevel: Control the number of messages logged to the error_log. # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. # LogLevel warn

Determina em que nvel o httpd ir rodar. A recomendada a warn pois no causa acmulo de atividades no apache e uma das mais usadas.
# # If you want to use name-based virtual hosts you need to define at # least one IP address (and port number) for them. # NameVirtualHost 192.168.255.108:80

Neste, configuramos o ip e porta que o servidor virtual ter. A definio deste que voc no precisa ter vrios computadores rodando http servers neles, com apenas um voc pode ter www.teste.com e www.teste1.com, cada um abrindo uma pgina diferente (em diferentes diretrios do cpu) e cada um possuindo um ip (mas ambos apontaro para o mesmo cpu, isso se chama IP ALIAS).
# # VirtualHost example: # Almost any Apache directive may go into a VirtualHost container. # #<VirtualHost ip.address.of.host.some_domain.com> # ServerAdmin webmaster@host.some_domain.com # DocumentRoot /www/docs/host.some_domain.com # ServerName host.some_domain.com # ErrorLog logs/host.some_domain.com-error_log # CustomLog logs/host.some_domain.com-access_log common #</VirtualHost> <VirtualHost teste:80> ServerAdmin webmaster@host.some_domain.com DocumentRoot /vh ServerName teste.suptel ErrorLog logs/host.some_domain.com-error_log CustomLog logs/host.some_domain.com-access_log common </VirtualHost>

Esta a ltima mas no menos importante das configuraes bsicas do apache. Ela cuida do servidor virtual e de suas configuraes, sendo que o que est comentado (com um # na frente) d um exemplo do que dever ser feito (as linhas descomentadas no esto escritas por padro, estas apresentadas foram digitadas com base no exemplo). Explicarei cada uma delas:
<VirtualHost teste:80>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

163

PHP 5 e MySQL 5 e Ajax


Valida o nome "teste" ao servidor virtual e fala em que porta ele ir atender (80)
ServerAdmin webmaster@host.some_domain.com

Se o sistema detectar algo de anmalo, um mail ser enviado a webmaster@host.some_domain.com


DocumentRoot /vh

Designa a pasta onde os arquivos html do servidor virtual sero colocados (LEMBRANDO QUE ESTA DEVER TER PERMISSES 755 EM SEU CAMINHO INTEIRO COMO MENCIONADO ANTERIORMENTE).
ServerName teste.suptel

Nome e domnio do servidor virtual.


ErrorLog logs/host.some_domain.com-error_log

O relatrio de erros do servidor virtual vai ser escrito em logs/host.some_domain.comerror_log


CustomLog logs/host.some_domain.com-access_log common

Log de acessos vai ser escrito em logs/host.some_domain.com-access_log common


</VirtualHost>

Indica o final da configurao do virtual host. IMPROTANTE: DEPOIS DE QUALQUER MODIFICAO NESTE ARQUIVO (INCLUSIVE NA PRIMEIRA), O HTTPD DEVER SER REINICIADO DIGITANDO COMO ROOT:
[root@localhost /root]# cds

e aps:
[root@localhost /init.d]# ./httpd stop [root@localhost /init.d]# ./httpd start

Depois, necessrio informar ao sistema que o mesmo precisa responder num outro ip (192.168.255.108 como definido nas configuraes do virtual host) alm do ip verdadeiro (pois um virtual host no nada mais do que fazer um computador responder em outro ip (e outro nome, se assim especificado no dns), direcionando o pedido http para este ip "falso" e associando a pasta de htmls referida ao mesmo). Vamos utilizar ento o linuxconf para adicionar este ip "falso" (tcnica chamada de IP ALIAS, anteriormente mencionada). Entre como root no linuxconf:
[root@localhost]# linuxconf

V em:
Ambiente de Rede --> Apelidos de IP para mquinas virtuais --> eth0 --> configure o ip virtual (no caso do nosso, seria 192.168.255.108) e sua mscara. Depois: Aceitar Sair Sair Sair Ativar as mudanas

Confirme se o novo ip est realmente online usando o comando ping:

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

164

PHP 5 e MySQL 5 e Ajax


[root@localhost]# ping 192.168.255.108 Coloque algum documento html no diretrio /html (que de acordo com a configurao feita, a pasta do server principal, podendo ter subpastas dentro desta) e em /vh (configurada para o virtualhost "teste" e que tambm pode ter subpastas), todas com as devidas permisses 755 previamente mencionadas. E, para acess-los, digite em um browser:
http://vader.suptel (para o principal j que o nome o do servidor principal) ou: http://teste (que o nome do virtual host)

O primeiro tem que estar respondendo no documento html vlido na pasta /html e o segundo na /vh. Para uma pgina no home do usurio, digite (aps o usurio ter criado a pasta public_html em seu home e ter dado permisses 755 para a mesma).
http://nome-da-maquina/~nome-do-usurio

deve responder no html do diretrio /home/nome-do-usurio/public_html

Como fao para o apache abrir um diretrio, sem conter o index.html?


Basta editar o arquivo de configurao do a pache /etc/httpd/conf/httpd.conf, que pode ser aberto com o comando:
[root@localhost]# mcedit /etc/httpd/conf/httpd.conf

Inclua a opo Indexes, conforme o exemplo abaixo:


<Directory "/html"> Options Indexes FollowSymLinks Includes </Directory>

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

165

PHP 5 e MySQL 5 e Ajax


Bibliografia
Manual on-line do MySQL5 em www.mysql.com Manual on-line do PHP em www.php.net Manual FPDF em www.fpdf.org

PHP 5 & MySQL 5 for Web www.integrator.com.br/php

166

Você também pode gostar