Você está na página 1de 62

Licenciamento de Uso

Este documento propriedade intelectual 2002 do Centro de Computao da Unicamp e distribudo sob os seguintes termos: 1. As apostilas publicadas pelo Centro de Computao da Unicamp podem ser reproduzidas e distribudas no todo ou em parte, em qualquer meio fsico ou eletrnico, desde que os termos desta licena sejam obedecidos, e que esta licena ou referncia a ela seja exibida na reproduo. 2. Qualquer publicao na forma impressa deve obrigatoriamente citar, nas pginas externas, sua origem e atribuies de direito autoral (o Centro de Computao da Unicamp e seu(s) autor(es)). 3. Todas as tradues e trabalhos derivados ou agregados incorporando qualquer informao contida neste documento devem ser regidas por estas mesmas normas de distribuio e direitos autorais. Ou seja, no permitido produzir um trabalho derivado desta obra e impor restries sua distribuio. O Centro de Computao da Unicamp deve obrigatoriamente ser notificado (treinamentos@ccuec.unicamp.br) de tais trabalhos com vista ao aperfeioamento e incorporao de melhorias aos originais. Adicionalmente, devem ser observadas as seguintes restries: A verso modificada deve ser identificada como tal O responsvel pelas modificaes deve ser identificado e as modificaes datadas Reconhecimento da fonte original do documento A localizao do documento original deve ser citada Verses modificadas no contam com o endosso dos autores originais a menos que autorizao para tal seja fornecida por escrito. A licena de uso e redistribuio deste material oferecida sem nenhuma garantia de qualquer tipo, expressa ou implcita, quanto a sua adequao a qualquer finalidade. O Centro de Computao da Unicamp no assume qualquer responsabilidade sobre o uso das informaes contidas neste material.

PHP Intermedirio

Sumrio
O que PHP?.........................................................................................................................6 Vantagens...............................................................................................................................6 Sintaxe Bsica........................................................................................................................ 7 Variveis.............................................................................................................................7 Inteiros...........................................................................................................................7 Ponto-Flutuante.............................................................................................................8 Strings............................................................................................................................8 Caracteres de Escape....................................................................................................8 Arrays............................................................................................................................ 8 Unio de arrays ............................................................................................................9 Objetos...........................................................................................................................9 Listas............................................................................................................................. 9 Booleans........................................................................................................................ 9 Transformaes de tipo...................................................................................................... 9 Coeres......................................................................................................................10 Transformaes explcitas de tipo...............................................................................10 Tipo suportados nas transformaes explcitas.......................................................... 10 Funo settype.............................................................................................................11 Operadores........................................................................................................................11 Aritmticos...................................................................................................................11 Strings..........................................................................................................................11 Atribuio....................................................................................................................11 Lgicos........................................................................................................................ 12 Comparao................................................................................................................ 12 Incremento e decremento............................................................................................ 12 Estruturas de controle....................................................................................................... 13 If e Else........................................................................................................................13 Switch.......................................................................................................................... 14 While............................................................................................................................14 Do..while..................................................................................................................... 15 For............................................................................................................................... 15 Obs.: os comandos while, do while e for , quando utilizados sem um parmetro de controle, tem como valor padro o true, ou seja, vai ser executado como se fosse um loop infinito................................................................................................................. 15 Nesse caso a sada seria: 1,2,3 ...............................................................................16 Break........................................................................................................................... 16 Continue...................................................................................................................... 16 Sada: echo()..................................................................................................................... 16 Sada: print()..................................................................................................................... 17 Funes.............................................................................................................................17 Passagem de parmetros por referncia.....................................................................18 Escopo das variveis.........................................................................................................18 Globais........................................................................................................................ 19

Diviso de Servios Comunidade Centro de Computao Unicamp

PHP Intermedirio

Locais.......................................................................................................................... 19 Estticas...................................................................................................................... 20 Sesses.................................................................................................................................. 21 Superglobal $_SESSION..................................................................................................21 Upload de Arquivos.............................................................................................................23 A varivel $_FILES..........................................................................................................23 A funo move_uploaded_file().......................................................................................24 Manipulao de Data e Hora............................................................................................. 26 Funes.............................................................................................................................26 mktime().......................................................................................................................26 strftime()...................................................................................................................... 26 date()........................................................................................................................... 27 checkdate().................................................................................................................. 31 getdate().......................................................................................................................31 Enviando e-mails................................................................................................................. 33 Projeto.................................................................................................................................. 34 Banco de dados e tabelas.................................................................................................. 34 chamados.....................................................................................................................34 atendimentos................................................................................................................34 usuarios....................................................................................................................... 34 Funes chamadas frequentemente por outros scripts..................................................... 35 funcoes.php..................................................................................................................35 misc.php.......................................................................................................................36 Scripts de autenticao e pgina inicial do sistema..........................................................37 Index.php..................................................................................................................... 37 autentica_src.php........................................................................................................ 38 pagina_principal.php.................................................................................................. 39 Mdulo de incluso de chamados.....................................................................................40 form_chamado.php......................................................................................................40 incluir_chamado.php...................................................................................................41 exibe_mensagem.php...................................................................................................44 Testando o mdulo de incluso de chamados............................................................. 45 Mdulo de registro de atendimentos................................................................................ 46 form_atendimento.php.................................................................................................46 registrar_atendimento.php.......................................................................................... 47 registrar_atendimento2.php........................................................................................ 49 registrar_atendimento3.php........................................................................................ 52 exibe_mensagem.php...................................................................................................54 Testando o mdulo de registro de atendimentos.........................................................54 Mdulo de consulta.......................................................................................................... 55 consulta_chamados_periodo.php................................................................................55 consulta_chamados_periodo2.php..............................................................................56 Testando o mdulo de consulta................................................................................... 60 Expirao de sesso.......................................................................................................... 61
Diviso de Servios Comunidade Centro de Computao Unicamp

PHP Intermedirio

logout.php....................................................................................................................61 Exerccios complementares................................................................................................ 61 Dicas..................................................................................................................................... 62


ltima atualizao em 06/05/2011

Diviso de Servios Comunidade Centro de Computao Unicamp

PHP Intermedirio

O que PHP?
O PHP foi criado por volta de 1994 por Rasmus Lerdorf, com o nome de Personal Home Page Tools. A abreviao PHP vem de Hypertext PreProcessor, que uma linguagem de programao de cdigo aberto muito utilizada para a criao de scripts que so executados no servidor web para a manipulao de pginas HTML.

Vantagens
O PHP apresenta inmeras vantagens:

uma linguagem de fcil aprendizado; Tem performance e estabilidade excelentes; Seu cdigo aberto, no preciso pagar por sua utilizao, e possvel alter-lo na medida da necessidade de cada usurio; Tem suporte nos principais servidores web do mercado, principalmente no servidor web Apache; Suporta conexo com os bancos de dados mais utilizados do mercado, como por exemplo: MySQL, PostgreSQL, Oracle e DB2; multiplataforma, tem suporte nos sistemas operacionais mais utilizados no mercado; Suporta uma variedade grande de padres e protocolos, como o XML, DOM, IMAP, POP3, LDAP, HTTP, entre outros; No precisa ser compilado; A partir da verso 5 do PHP, foi introduzindo um novo modelo de orientao a objetos. Nessa verso o tratamento de objetos foi completamente reescrito, permitindo um desempenho melhor e mais vantagens.

Diviso de Servios Comunidade Centro de Computao Unicamp

PHP Intermedirio

Sintaxe Bsica
O PHP tem uma sintaxe simples e enxuta, o que facilita a organizao dos scripts a serem desenvolvidos. Outra caracterstica interessante que os cdigos em PHP so embutidos no HTML. A seguir, exemplos da sintaxe do PHP:

1
<?php ... ... .. ?>

2
<? .... .... .... ?>

3
<% .... .... .... %>

4
<script language=PHP> .... ..... ... </script>

Variveis
Manipular variveis em PHP uma atividade simples, como veremos a seguir: no necessrio declarar as variveis, isto feito quando atribumos algum valor para elas; para declar-las, necessrio apenas colocar como primeiro caracter o ' $' , juntamente com a string referente ao nome da varivel, e esta string deve comear com uma letra ou o caracter '_'; PHP case sensitive, isto , '$a' diferente de '$A'. aconselhvel utilizar os nomes de variveis com letras minsculas, por causa das variveis pr-definidas da linguagem, que so declaradas com maisculas; PHP suporta os seguintes tipos de variveis: inteiros (integer ou long); ponto flutuante (double ou float); strings arrays objetos

Inteiros
Este tipo de varivel contm dados inteiros. Sintaxe:
$curso = 123; //inteiro positivo $curso = -123; //inteiro negativo

Diviso de Servios Comunidade Centro de Computao Unicamp

PHP Intermedirio

Ponto-Flutuante
Tambm chamada Float ou Double, esse tipo de varivel pode conter valores com pontoflutuante. Sintaxe:
$curso = 1.234;

Strings
Este tipo de varivel pode ter seu contedo entre () aspas simples ou () aspas duplas. Sintaxe:
$curso = 'PHP'; // desta maneira, o valor da varivel ser exatamente o texto contido entre as aspas $curso= PHP; // desta maneira, qualquer varivel ou caracter de escape ser processado antes da impresso da variavel

Exemplos de strings: $string1 = Programando em PHP; echo $string1; //este exemplo ira imprimir Programando em PHP $string2 = $string1; // este exemplo ir imprimir $string1 $string3 = $string1; //este exemplo ir imprimir Programando em PHP

Caracteres de Escape
\n \r \t \\ \$ \ \ nova linha; retorno de carro (semelhante a \n) tabulao horizontal a prpria barra (\) o smbolo $ aspas simples aspas duplas

Arrays
Array um tipo de varivel que possui seu contedo agrupado por ndices, como um vetor ou um dicionrio. Estes ndices podem ser de qualquer tipo suportado pelo PHP, com mostrado a seguir: Sintaxe:
$estilo_musical[0] = 'pagode';

Diviso de Servios Comunidade Centro de Computao Unicamp

PHP Intermedirio

$estilo_musical[1] = drum 'n' bass; $estilo_musical[MPB] = 'Gilberto Gil'; $estilo_musical[Rock] = 'Blind Guardian';

Unio de arrays

$a = array("a" => "ma", "b" => "banana"); $b = array("a" =>"pra", "b" => "framboesa", "c" => "morango"); $c = $a + $b; // Uniao de $a e $b echo "Unio de \$a e \$b: \n"; var_dump($c);

Objetos
Um objeto pode ser inicializado utilizando o comando new para instanciar uma classe para uma varivel. Obs.: esse tpico faz parte do treinamento de PHP Avanado.

Listas
Utilizadas em PHP para realizar atribuies mltiplas, como por exemplo, atribuir valores de um array para variveis, como mostra a seguir: Sintaxe:
list($a,$b,$c) = array(0=>a, 1=>b, 2=>c);

O trecho de cdigo acima atribuir simultnea e respectivamente os valores do array s variveis passadas com parmetros para o comando list. muito importante lembrar que s sero passadas ao comando list os elementos do array que possurem os ndices com valores inteiros e no negativos.

Booleans
Em PHP, no existe um tipo especfico para as variveis do tipo boolean, ele trata este tipo com valores inteiros: 0 (zero) para false e valores diferentes deste como true.

Transformaes de tipo
possvel fazer transformaes de tipos de variveis atravs das seguintes formas:

Diviso de Servios Comunidade Centro de Computao Unicamp

PHP Intermedirio

Coeres
Quando ocorrem determinadas operaes matemticas entre dois valores de tipos diferentes, como por exemplo a adio, o PHP converte um deles automaticamente. Um exemplo disso seria a converso de uma string para um valor numrico (inteiro ou ponto flutuante), que segue as seguintes regras: analisado o nicio da string, se contiver um nmero, ele ser analisado, caso contrrio, o valor ser 0 (zero); O nmero pode conter o sinal no incio (+ ou -); Se a string contiver um ponto em sua parte numrica a ser analisada, ele ser considerado, e o valor obtido ser um ponto flutuante; Se a string contiver as letras ''e'' ou ''E'' em sua parte numrica a ser analisada, o valor seguinte ser considerado como expoente da base 10, e o valor obtido ser um ponto flutuante.

Sintaxe:
$curso $curso $curso $curso $curso $curso = = = = = = 1 1 1 1 1 1 + + + + + + 12.8; 15; 1.5e3; 10curso; 10curso; +A10testes; // // // // // // $curso $curso $curso $curso $curso $curso == == == == == == 13.8 16 1501 11 11 1

Transformaes explcitas de tipo


Desta forma precisaremos utilizar a sintaxe de typecast do PHP, como os exemplos a seguir: Sintaxe:
$curso $curso $curso $curso = = = = 20; // integer(20) (double)$curso; // double(20.0) 3.9; // double(3.9) (int)$curso; //o valor truncado e fica como integer(3)

Tipo suportados nas transformaes explcitas


Sintaxe:
(int), (integer) = muda para inteiro; (real), (double), (float) = muda para ponto flutuante; (string) = muda para string (array) = muda para array (object) = muda para objeto

Diviso de Servios Comunidade Centro de Computao Unicamp

10

PHP Intermedirio

Funo settype
Trabalha igualmente as transformaes explcitas, porm com sintaxe diferente, como o exemplo a seguir: Sintaxe:
$curso = 20; // (integer) settype($curso, double);

O valor da varivel $curso foi transformada em ponto flutuante.

Operadores
Aritmticos + * / % Strings Adio Subtrao Multiplicao Diviso Mdulo

.
Atribuio = += -= *= /= %= .=
Sintaxe:

Concatenao

Atribuio simples Atribuio com adio Atribuio com subtrao Atribuio com Multiplicao Atribuio com diviso Atribuio com mdulo Atribuio com concatenao

$curso = 8; $curso += 2; // $curso fica com o valor 10

Diviso de Servios Comunidade Centro de Computao Unicamp

11

PHP Intermedirio

Lgicos and or xor ! && || Comparao == != < > <= >= === !=== Incremento e decremento ++ -

e lgico ou lgico ou exclusivo No (inverso) e lgico ou lgico

igual a diferente de menor que maior que menor ou igual a maior ou igual a Idntico a No idntico a

incremento decremento

Estes podem receber o valor antes ou depois da varivel: Antes: retorna o valor da varivel antes de increment-la ou decrement-la: Sintaxe:
$a = 1; $b = ++$a; // $b recebe 2, valor de $a j incrementado)

Depois: retorna o valor da varivel j incrementada ou decrementada:

Sintaxe:
$a = 1; $b = $a++; // $b recebe 1 e $a passa a ter 2)

Diviso de Servios Comunidade Centro de Computao Unicamp

12

PHP Intermedirio

Estruturas de controle
If e Else
O comando if testa a condio passada e executa o bloco de cdigo caso o valor retornado da condio seja verdadeiro: Sintaxe:
$a = 1; if ($a == 1) { ... ... ... }

Caso a condio passada retorne um valor falso, e seja necessrio executar um bloco de cdigo diferente, utiliza-se a instruo else: Sintaxe:
$a = 1; $b = 2; if ($a > $b) { ... ... } else { ... ... }

Ainda existe a instruo elseif, para situaes onde precisa-se verificar mais que uma condio: Sintaxe:
$a = 1; $b = 2; $c = 3; if ($a > $b) {

echo $a maior que $b ; } elseif ($a > $c) { echo $a maior que $c ;
} else { }

echo $a menor que $b e $c ;

Diviso de Servios Comunidade Centro de Computao Unicamp

13

PHP Intermedirio

Switch
Comando utilizado para fazer mltiplos testes de condio. A idia deste comando igual ao do elseif , porm com algumas diferenas: Sintaxe:
$a = 1; switch ($a) { case 0:

echo $a igual a 0 ;
break; case 1:

echo $a igual a 1 ;
break; case 2:

echo $a igual a 2 ;
break; default:

echo \$a igual a $a ;


}

A idia do comando switch achar a condio verdadeira e executar qualquer bloco de cdigo que esteja abaixo dela, inclusive os que no forem do seu trecho, por esse motivo, utilizamos o comando break logo abaixo da ltima linha do bloco de cdigo, como o exemplo anterior. O comando switch tambm aceita testes de condio em qualquer tipo de varivel suportado pelo PHP: Sintaxe: $a = curso;
switch ($a) {

case PHP: echo $a igual a PHP ; break; case curso: echo $a igual a Curso ; break; case CCUEC: echo \$a igual a CCUEC ;
} break;

While
Este comando utilizado para realizar laos condicionais. Ele executa o bloco de cdigo enquanto a condio passada for verdadeira, e caso a condio inicial que foi passada se torne falsa, o bloco no ser executado: Sintaxe:

Diviso de Servios Comunidade Centro de Computao Unicamp

14

PHP Intermedirio

$a = 1; while ($a <= 10) { }

echo Nmero.$a++.<br>;

Do..while
Este comando tem a mesma idia que o comando while, porm, seu teste de condio feito no final do bloco de cdigo: Sintaxe:
$c = 0; do {

echo Nmero.++$c.<br>;
} while ($c < 10);

For
Como nos outros comando que realizam laos condicionais, o comando for tambm precisa de uma condio para ser testada a cada lao realizado, porm, este comando necessita de mais dois parmetros, que seriam a declarao da varivel contadora e a instruo de incremento: Sintaxe:
for ($a=1; $a<=10; $a++) { echo Nmero.$a.<br>; }

Obs.: os comandos while, do while e for , quando


utilizados sem um parmetro de controle, tem como valor padro o true, ou seja, vai ser executado como se fosse um loop infinito. $a = 1; while (true) { echo "Nmero".$a++."<br>"; } $a = 1; for (;;) { echo "Nmero".$a++."<br>";

Diviso de Servios Comunidade Centro de Computao Unicamp

15

PHP Intermedirio

Nesse caso a sada seria: 1,2,3

Break
O comando break pode ser utilizado em comandos de laos condicionais e no comando switch, e sua funo parar imediatamente a execuo do lao condicional, prosseguindo normalmente com a execuo do script: Sintaxe:
$a = 20; while ($a > 0) { if ($a == 3) { echo Nmero invlido!; break; } echo Nmero .$a.<br>; $a--; }

Continue
O comando continue tambm funciona dentro dos laos condicionais, porm, no para o fluxo do bloco de cdigo, e sim, volta para o incio dele: Sintaxe:
for ($a=0;$a<=10;$a++) { if ($a == 5) { echo "<p>Pulou o Numero ==> $a</p>"; continue; } echo "Numero ==> $a<br>"; }

Sada: echo()
A funo echo faz a impresso de um ou mais argumentos na janela do navegador. Sintaxe:
Echo Echo Essa instruo ir imprimir no navegador.; (Tambm pode-se usar parnteses.);

Diviso de Servios Comunidade Centro de Computao Unicamp

16

PHP Intermedirio

Para a construo sem o uso de parnteses, possvel passar mais de um argumento para a funo: Sintaxe:
Echo Primeiro argumento, Segundo argumento ;

Tambm existe uma construo abreviada do echo que possibilita alternar entre PHP e HTML rapidamente. Sintaxe:
<P>Aqui HTML <?=Aqui PHP?></P>

Essa forma mais utilizada em formulrios.

Sada: print()
A funo print bem semelhante a echo, com duas diferenas: print aceita apenas 1 argumento e alm da impresso no navegador, print retorna 1 em caso de sucesso e 0 em caso de falha na tentativa de impresso. Exemplos:
Print Funciona igual a funo echo. ; Print (Tambm pode-se usar parnteses.) ; Print (Tambm pode-se usar aspas simples.) ;

Funes
Funes so pequenas sees independentes de cdigo que podem ser chamadas a qualquer momento e em qualquer ordem, que servem para desempenhar tarefas especficas dentro dos scripts. Sintaxe:
function soma ($a,$b) { $c = $a + $b; return $c; } echo "A funcao soma() retornou ==> ".soma(5,10);

A instruo return opcional, j que no obrigatrio retornar algum valor em funes no PHP, outra regra a de no permitir que sejam retornados mltiplos valores atravs desta instruo. Para resolver essa necessidade, pode-se retornar listas e arrays. Sintaxe:
function soma ($a, $b) {

Diviso de Servios Comunidade Centro de Computao Unicamp

17

PHP Intermedirio

$c = $a + $b; }

$d = $c - 5;
return array($c,$b,$d)

Passagem de parmetros por referncia


Normalmente, a passagem de parmetros em PHP feita atravs dos valores das variveis, no permitindo assim, a alterao do valor na varivel original. Sintaxe:
function contador($a) { ++$a; } $cont = 10; contador($cont); echo "A variavel <b>$cont</b> contem ==> ".$cont;

No exemplo acima, a varivel original permanecer com o mesmo valor porque no foi definida a passagem de parmetros por referncia, o que alteraria tambm o valor da varivel original. Uma das maneiras de se utilizar esse recurso colocar o carcter ''&'' antes do nome da varivel na declarao da funo. Sintaxe:
function contador(&$a) { ++$a; } $cont = 10; contador($cont); echo "A variavel <b>$cont</b> contem ==> ".$cont;

Poderamos tambm utilizar a passagem de parmetros por referncia apenas quando fssemos chamar a funo, e no em sua declarao. Sintaxe:
contador(&$cont); echo $cont;

Escopo das variveis


Discutimos anteriormente sobre variveis e os tipos suportados pelo PHP. Agora, discutiremos sobre os escopos destas variveis, que podem ser dos seguintes tipos:

Globais;

Diviso de Servios Comunidade Centro de Computao Unicamp

18

PHP Intermedirio

Locais; Estticas; Constantes.

Globais As variveis globais so por definio, as variveis que podem ser acessadas dentro de todo o script. Porm, quando cria-se escopos locais como nas funes, precisaremos utilizar um tipo de chamada especial, utilizando o global. Sintaxe:
$curso = 'PHP'; function mostra() { global $curso; echo $curso; } mostra();

O mesmo recurso pode ser acessado atravs da array GLOBALS, que nos permite acessar todas as variveis globais do script. O exemplo acima pode ser reescrito da seguinte maneira: Sintaxe:
$curso = 'PHP'; function mostra() {

echo $GLOBALS[curso];
} mostra();

Locais
As variveis locais so o tipo mais restrito dentro do PHP. Elas funcionam apenas dentro do escopo onde foram definidas. Sintaxe:
function mostra() { $var_local = 'varivel local'; echo Var_local= $var_local; } echo Var_local= $var_local;

Diviso de Servios Comunidade Centro de Computao Unicamp

19

PHP Intermedirio

Estticas
As variveis estticas so variveis que possuem o mesmo tempo de vida das variveis globais, com a diferena de funcionarem apenas em escopos locais e serem inicializadas uma s vez. Sintaxe:
function contador() { static $i = 0; echo $i++.<br>; } for ($a=0; $a<=5; $a++) { contador(); }

Diviso de Servios Comunidade Centro de Computao Unicamp

20

PHP Intermedirio

Sesses
Este recurso, que foi implementado na verso 4 do PHP, muito til para quem trabalha com scripts que necessitam passar dados em acessos subseqentes para outros scripts. Sesses tambm so utilizadas para: Customizao de elementos de uma pgina, como cores, fontes, textos, etc; Gerenciamento de autenticao em sistemas para a web; Armazenamento de informaes sigilosas dentro do servidor, evitando a passagem destas informaes por meio de campos do tipo hidden do HTML ou cookies, aumentando assim a segurana destes dados.

Esse recurso j vem habilitado na instalao padro do PHP, no havendo a necessidade de nenhuma configurao adicional, e antes de inicializar uma sesso, devemos lembrar das seguintes regras bsicas de utilizao: Nenhum contedo deve ser exibido antes de inicializar uma sesso; Em todas as pginas que forem utilizar este recurso, a sesso deve ser inicializada;

Para inicializar uma sesso, basta executar o seguinte comando: Sintaxe:


<?php session_start(); ?>

Quando esta pgina for carregada, a sesso ser inicializada e a ID da sesso ficar gravada em um cookie chamado PHPSESSID dentro do navegador. Esta sesso ser vlida enquanto o navegador estiver aberto ou enquanto a funo session_destroy() no for executada. Para visualizarmos a ID da sesso corrente, utilizamos a funo session_id(). Sintaxe:
<?php session_start(); $id_sess = session_id(); echo "A ID da sesso corrente ====> <b>$id_sess</b>"; ?>

Superglobal $_SESSION
Adicionar valores em uma sesso uma tarefa muito simples, e para isso, utilizaremos a superglobal $_SESSION. Sintaxe:

Diviso de Servios Comunidade Centro de Computao Unicamp

21

PHP Intermedirio

<?php session_start(); $_SESSION["curso"] = "PHP Intermedirio"; $teste = "Teste de Sesses!" $_SESSION["teste"] = $teste; ?>

Atribuir os valores de uma sesso para variveis globais ou locais tambm uma tarefa simples: Sintaxe: <?php session_start(); $curso = $_SESSION["curso"]; $teste = $_SESSION["teste"]; ?> Os ltimos dois recursos que sero apresentados para manipular sesses so: session_unset() - Limpa todas as variveis da sesso corrente. session_destroy() - Finaliza a sesso corrente. Utiliza-se estas duas funes no final do uso da sesso, que conseqentemente expira o cookie PHPSESSID no navegador, finalizando a sesso corrente. O cdigo PHP para este fim apresentado no exemplo abaixo. Sintaxe:
<?php session_unset();

?>

session_destroy();

Diviso de Servios Comunidade Centro de Computao Unicamp

22

PHP Intermedirio

Upload de Arquivos
O PHP capaz de receber o upload de qualquer navegador que siga a norma RFC1867. Isto permite que se faa upload de arquivos de texto de binrios. Com as funes de autenticao e manipulao de arquivos do PHP, voc tem o controle completo de quem pode fazer o upload de arquivo e o que fazer com o arquivo aps seu upload. Abaixo, um exemplo de um formulrio HTML para realizar esta tarefa. Sintaxe (teste_upload.html):
<html> <head> <title>Documento sem t&iacute;tulo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso8859-1"> </head> <body> <form enctype="multipart/form-data" action="teste_upload.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="300000"> Send this file: <input name="arquivo" type="file"> <input type="submit" value="Enviar Arquivo"> </form> S permitido o envio de arquivos .jpg e .gif </body> </html>

O atributo enctype da tag <form> o mais importante para a realizao de um upload, sem ele, este recurso no ir funcionar. O campo do tipo file, MAX_FILE_SIZE, indica ao navegador o tamanho mximo do arquivo a ser enviado. Agora veremos mais sobre como o PHP processa o upload de arquivo dentro do servidor.

A varivel $_FILES
Este array nos fornece as informaes sobre o arquivo que o navegador enviou ao servidor. Abaixo, a lista dos valores que este array nos disponibiliza.
$_FILES['arquivo']['name'] $_FILES['arquivo']['type'] $_FILES['arquivo']['size'] $_FILES['arquivo']['tmp_name'] $_FILES['arquivo']['error'] o nome original do arquivo no computador do usurio. o MIME type do arquivo, se o navegador deu esta informao: ex. image/gif o tamanho em bytes do arquivo o nome temporrio do arquivo, como foi guardado no servidor. o cdigo de erro associado a este upload de arquivo.

Diviso de Servios Comunidade Centro de Computao Unicamp

23

PHP Intermedirio

Adicionado no PHP 4.2.0

Os cdigos de erro que o item $_FILES['arquivo']['error'] pode retornar so:

UPLOAD_ERR_OK UPLAOD_ERR_INI_SIZE UPLOAD_ERR_FORM_SIZE UPLOAD_ERR_PARTIAL UPLOAD_ERR_NO_FILE

0 1 2 3 4

no ouve erro, o upload foi bem sucedido O arquivo no upload maior do que o limite definido em upload_max_filesize no php.ini O arquivo ultrapassa o limite de MAX_FILE_SIZE que foi especificado no formulrio HTML O upload do arquivo foi feito parcialmente No foi feito upload do arquivo

A funo move_uploaded_file()
Quando realizado um upload de arquivo para o servidor web, este arquivo fica em um diretrio temporrio, normalmente em /tmp (podemos alterar este diretrio no php.ini), e caso no seja inicializada nenhuma ao para manipular este arquivo, ele ser apagado deste diretrio ao fim da execuo do script. Para esta tarefa, o PHP disponibiliza a funo move_uploaded_file. Esta funo responsvel por mover um arquivo carregado pelo mecanismo do PHP de HTTP POST para uma nova localizao. Sintaxe:
move_uploaded_file(string nome do arquivo, string destino);

OBS: O diretrio de destino deve ter permisso de escrita para o PHP. A seguir, um exemplo de um script PHP que receber os dados do mtodo POST para realizar o upload:

Sintaxe (teste_upload.php):

Diviso de Servios Comunidade Centro de Computao Unicamp

24

PHP Intermedirio

<?php $uploaddir = 'C:\WAPP\apache2\htdocs\cursophp\upload_arquivos\\'; $uploadfile = $uploaddir. $_FILES['arquivo']['name']; print "<pre>"; if ($_FILES['arquivo']['size'] != 0){ if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploaddir . $_FILES['arquivo']['name'])) { print "O arquivo valido e foi carregado com sucesso. Mais informaes:\n"; print_r($_FILES); } else { print "Erro no processamento! Mais informaes:\n"; print_r($_FILES); }} else { print "Erro no processamento! Mais informaes:\n"; print_r($_FILES); } print "</pre>"; ?>

Diviso de Servios Comunidade Centro de Computao Unicamp

25

PHP Intermedirio

Manipulao de Data e Hora


Neste captulo iremos mostrar algumas funes interessantes que o PHP nos disponibiliza para manipulao de data e hora. As mais utilizadas e importantes so as seguintes:

mktime() strftime() date() checkdate() getdate()

Funes
mktime()
Retorna uma data com o formato Unix/timestamp. Esse formato baseado em um contador que teve seu valor zero associado com a data 01/01/1970 00:00:00UTC, e que incrementado a cada segundo. Uma vez representadas no formato UNIX timestamp as datas se tornam um pouco complicadas para o raciocnio humano mas so manipuladas mais facilmente pelos computadores. til para se fazer operaes com datas. Se os argumentos forem invlidos, a funo retornar FALSE (antes do PHP 5.1 retornava -1). Exemplo: 01/01/1970 00:00:00 UTC -> 0 01/01/1970 00:01:00 UTC -> 60 01/01/1999 00:00:01 UTC -> 915 148 801 16/09/2004 23:59:58 UTC -> 1 095 379 198 Sintaxe:
mktime(int hora, int minuto, int segundo, int ms, int dia, int ano);

O valor de retorno precisa passar por uma formatao para poder ser apresentado, para isso, usamos a funo strftime().

strftime()
Formata uma data do tipo Unix/timestamp para uma string de apresentao Sintaxe:

Diviso de Servios Comunidade Centro de Computao Unicamp

26

PHP Intermedirio

strftime(string formatao, int timestamp);

Exemplo: $data = mktime(10,20,30,10,20,2009); echo $data; echo strftime("<br> %d/%m/%Y - %H:%M:%S", $data); Sada: 1192886430 (formato Unix/timestamp) 20/10/2007 - 10:20:30 Uma lista das principais opes para esta funo encontra-se na listagem abaixo: %d %m %y %Y %H %I %M %S %R %x %X dia do ms (01 a 31) ms (01 a 12) ano com 2 dgitos (ex. 80, 03) ano com 4 dgitos (ex. 1980, 2003) hora atual no formato 24 horas (00 a 23) hora atual no formato 12 horas (01 a 12) minuto atual (00 a 59) segundo atual (00 a 59) hora no formato 24 horas (22:45) data sem mostrar a hora do formato Unix/timestamp (ex. 21/12/2003) horrio sem mostrar a data do formato Unix/timestamp (ex. 19:33)

date()
Retorna uma data formatada como uma string ou inteiro de acordo com as opes passadas como parmetro.
Veja as opes de formatao abaixo.

Diviso de Servios Comunidade Centro de Computao Unicamp

27

PHP Intermedirio

Caractere de format
Dia d ---

Descrio

Exemplo de valores retornados


--01 at 31

Dia do ms, 2 digitos com preenchimento de zero

D j l ('L' minsculo)

Uma representao textual de um dia, trs Mon at Sun letras Dia do ms sem preenchimento de zero A representao textual completa do dia da semana 1 at 31 Sunday at Saturday

1 (para Segunda) Representao numrica ISO-8601 do dia da at 7 (para semana (adicionado no PHP 5.1.0) Domingo) Sufixo ordinal ingls para o dia do ms, 2 caracteres st, nd, rd ou th. Funciona bem com j 0 (para domingo) at 6 (para sbado) 0 through 365 ---

Representao numrica do dia da semana

z Semana

O dia do ano (comeando do 0) ---

Nmero do ano da semana ISO-8601, semanas Exemplo: 42 (the comeam na Segunda (adicionado no PHP 42nd week in the 4.1.0) year) Ms -----

Um representao completa de um ms, como January at January ou March December Representao numrica de um ms, com leading zeros Uma representao textual curta de um 01 a 12 Jan a Dec

m M

Diviso de Servios Comunidade Centro de Computao Unicamp

28

PHP Intermedirio

Caractere de format
Dia ---

Descrio

Exemplo de valores retornados


---

ms, trs letras n t Ano Representao numrica de um ms, sem leading zeros Nmero de dias de um dado ms --1 a 12 28 through 31 --1 se est em ano bissexto, 0 caso contrrio.

Se est em um ano bissexto

Nmero do ano ISO-8601. Este tem o mesmo valor como Y, exceto que se o nmero da semana ISO (W) pertence ao anterior ou prximo ano, o ano usado ao invs. (adicionado no PHP 5.1.0) Uma representao de ano completa, 4 dgitos Uma representao do ano com dois dgitos Tempo --Antes/Depois de meio-dia em minsculo Antes/Depois de meio-dia em maisculo Swatch Internet time Formato 12-horas de uma hora sem preenchimento de zero Formato 24-horas de uma hora sem preenchimento de zero Formato 12-horas de uma hora com zero

Exemplos: 1999 ou 2003

Exemplos: 1999 ou 2003 Exemplos: 99 ou 03 --am or pm AM or PM 000 at 999 1 at 12

a A B g

G h

0 at 23 01 at 12

Diviso de Servios Comunidade Centro de Computao Unicamp

29

PHP Intermedirio

Caractere de format
Dia ---

Descrio

Exemplo de valores retornados


---

preenchendo esquerda H i s u Timezone Formato 24-horas de uma hora com zero preenchendo esquerda Minutos com zero preenchendo esquerda 00 at 23 00 at 59

Segundos, com zero preenchendo esquerda 00 at 59 Milisegundos (adicionado no PHP 5.2.2) --Identificador de Timezone (adicionado no PHP 5.1.0) Exemplo: 54321 --Exemplos: UTC, GMT, Atlantic/Azores

1 se horrio de I (capital i) Se a data est ou no no horrio de vero vero, 0 caso contrrio. O Diferena para Greenwich time (GMT) em horas Diferena para Greenwich time (GMT) com dois pontos entre horas e minutos (adicionado no PHP 5.1.3) Abreviao de Timezone Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. Full Date/Time c --ISO 8601 date (adicionado no PHP 5) Exemplo: +0200

Exemplo: +02:00

Exemplos: EST, MDT ...

-43200 at 50400

--2004-02-

Diviso de Servios Comunidade Centro de Computao Unicamp

30

PHP Intermedirio

Caractere de format
Dia ---

Descrio

Exemplo de valores retornados


--12T15:19:21+00:00

checkdate()
Verifica se a data passada vlida, retorna verdadeiro ou falso: Sintaxe:
checkdate(int mes, int dia, int ano);

$a = checkdate(11,02,1980); if ($a) { } else { }


echo "Data Correta<p>"; echo "<font color=\"red\">Data Incorreta</font><p>";

getdate()
Retorna um array com as informaes de uma data no formato Unix/timestamp Sintaxe:
array getdate(int timestamp);

$data_array = getdate(); print_r($data_array);

A lista dos itens mais importantes deste array retornado encontra-se abaixo:
"seconds" "minutes" "hour" "mday" "wday" retorna os segundos (0 a 59) retorna os minutos (0 a 59) retorna as horas (0 a 23) retorna o dia do ms (1 a 31) retorna a representao numrica do dia da semana (0 para Domingo e 6

Diviso de Servios Comunidade Centro de Computao Unicamp

31

PHP Intermedirio

para Sbado) "mon" "year" "yday" "weekday" "month" retorna a representao numrica do ms atual (1 a 12) retorna a representao numrica do anual atual (2003) retorna a representao numrica do dia do ano (1 a 365) representao textual do dia da semana (Domingo a Sbado) representao textual do ms atual (Janeiro a Dezembro)

Diviso de Servios Comunidade Centro de Computao Unicamp

32

PHP Intermedirio

Enviando e-mails
Para enviar e-mails a partir de scripts PHP, necessrio instalar um programa para
processamento de correio eletrnico, nesse treinamento utilizaremos o SendMail.

Esse programa far a interface entre o php e o servidor de e-mails. No treinamento utilizaremos como servidor de e-mails o BOL. Para utilizarmos o programa sendmail precisamos alterar o arquivo de configurao do PHP, o php.ini. necessrio alterar o valor da diretiva sendmail_path, incluindo o PATH (caminho) do executvel do aplicativo servidor de correio eletrnico como segue:
sendmail_path = "C:\sendmail\sendmail.exe -t"

J no arquivo sendmail.ini necessrio configurar as informaes referentes ao servidor de e-mail. Mais informaes sobre instalao e configurao esto disponveis na documentao complementar. A seguir, temos dois exemplos de como podemos utilizar a funo mail do PHP para enviar mensagens. No exemplo 1, os parmetros so passados de uma forma mais simplificada, entre aspas e separados por vrgulas. No exemplo 2, temos uma verso mais completa, indicada para quando se quer enviar a mensagem para mais de um endereo eletrnico ou com cpia para outro e-mail. Exemplo 1:
mail("e-mail", "Assunto", "Contedo da mensagem Linha 1 Linha 3", "Ttulo da mensagem"); Linha 2

Exemplo 2:
<?php // A funo mail utilizada dessa forma possibilita o envio de // mensagens para mais de um destinatrio e tambm // possibilita trabalharmos com parmetros adicionais $assunto = "Curso de PHP"; $para = "Bol1 <cursophp1@bol.com.br>, Bol2 <cursophp2@bol.com.br>"; $remetente = "Alexandre <arroyo.alexandre@gmail.com>"; $Cc = "Bol3 <cursophp-serv@bol.com.br>"; $mensagem = "Testando a funo mail do PHP!!!"; $headers = "From: ".$remetente."\r\n"; $headers .= "Cc: ".$Cc."\r\n"; $headers .= "Bcc: ".$remetente."\r\n"; mail($para,$assunto,$mensagem,$headers); echo 'Mensagem enviada!'; ?>

Mais informaes sobre essa funo podem ser obtidas em: http://br2.php.net/manual/pt_BR/function.mail.php

Diviso de Servios Comunidade Centro de Computao Unicamp

33

PHP Intermedirio

Projeto
O projeto consiste no desenvolvimento de um sistema (SRC Sistema de Registro de Chamados) cujo objetivo registrar chamados de usurios para uma equipe de suporte, solicitando algum tipo de atendimento tcnico. O sistema tambm vai disponibilizar uma consulta geral a partir dos dados armazenados. O desenvolvimento se dar no ambiente WAPP (Windows/Apache/Postgres/PHP). Mais informaes sobre a instalao e a configurao desse ambiente esto disponveis na documentao complementar. Os arquivos e pastas referentes ao sistema ficaro armazenados no diretrio de publicao do servidor web Apache, na pasta - cursophp - criada para o treinamento: C:\WAPP\apache2\htdocs\cursophp

Banco de dados e tabelas


Para o desenvolvimento do sistema utilizaremos o servidor de banco de dados PostgreSQL. Foi criada a base de dados cursophp, contendo as seguintes tabelas:

chamados
num_chamado integer primary key not null auto_increment, data_chamado date not null, hora_chamado time not null, usuario varchar(40) not null, email varchar(40) not null, problema text not null, equipe_acionada varchar(40) not null

atendimentos
num_chamado integer not null, data_atendimento date not null, responsavel varchar(40) not null, equipe_responsavel varchar(40) not null, solucao text not null

usuarios
login varchar(20) not null, senha varchar(10) not null,

Diviso de Servios Comunidade Centro de Computao Unicamp

34

PHP Intermedirio

nome varchar(40) not null, email varchar(40) not null, tipo_usuario varchar(20) not null Mais informaes sobre a criao do banco de dados e das tabelas podem ser obtidas na documentao complementar.

Funes chamadas frequentemente por outros scripts


Os scripts funcoes.php e misc.php contm funes chamadas frequentemente por outros scripts. Essas chamadas so realizadas por meio do comando include, no incio de cada script. Include e Require
O include uma funo que permite a incluso do contedo de um arquivo em outro arquivo. Esse contedo pode ser qualquer tipo de cdigo PHP, HTML ou simplesmente texto. Os arquivos a serem includos podem conter uma biblioteca de funes ou classes. A funo require tem o mesmo objetivo da funo include, no entanto, em caso de erro, o include apenas mostra uma mensagem de warning e o script continuar executando, j o require causa um Fatal Error, encerrando a execuo do script.

funcoes.php
<?php //Funo que monta o cabealho das pginas function monta_cabecalho() { echo "<html> <head> <title>SRC</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> <!-- Link to Style External Sheet --> <link href='css/style.css' type='text/css' rel='stylesheet' /> </head> <body> <div id='cabecalho'> <br><h2>Sistema de Registro de Chamados</h2> </div> "; } //Funo que monta o menu lateral das pginas, recebe parmetros

Diviso de Servios Comunidade Centro de Computao Unicamp

35

PHP Intermedirio

function monta_menu($login,$tip_us) { echo "<div id='menu_lateral'> Login: <b>$login</b> <br><br> <br><br> <a href=\"form_chamado.php\">Incluir Chamado</a><br> <br>"; if ($tip_us == 'user_atend') { echo "<br><a href=\"form_atendimento.php\">Registrar Atendimento</a><br><br>"; } echo "<br> <a href=\"consulta_chamados_periodo.php\">Consultar Chamados por Periodo </a><br> <br> <br> <a href=\"pagina_principal.php\">Pagina Inicial </a><br> <br><br><br> <a href=\"logout.php\">Logout </a><br> </div> <div id='conteudo'> "; } //Funo que monta o rodap das pginas function monta_rodape() { echo "</div><div id='rodape'> <img src=\"imagens/rodape.jpg\" width=\"760\" height=\"18\"></div> </body> </html> "; } ?>

misc.php
<?php // Declarao da funo que verifica se o usurio se autenticou antes de acessar essa pgina function ver_session() { if (!$_SESSION["usuario_sys"]) { // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho();

Diviso de Servios Comunidade Centro de Computao Unicamp

36

PHP Intermedirio

echo "<br><br><p><font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">No permitido acessar esta rea antes de prvia autenticao!!<p><b><a href=\"index.php\">Pgina Principal</a></b></font>"; // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); die(); } } // Comando que faz a conexo com o banco de dados PostgreSQL pg_connect("host=localhost dbname=cursophp user=postgres password=adminpgs") or die ("Erro ao conectar o banco de dados"); ?>

Scripts de autenticao e pgina inicial do sistema


Index.php
O script index.php vai exibir o formulrio de autenticao para acesso ao sistema e ter o seguinte cdigo:
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o arquivo especificado include ("funcoes.php"); // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); ?> <div id='conteudo'> <form action="autentica_src.php" method="post"> <b>Autentica&ccedil;&atilde;o</b><br><br> <?php // Exibe mensagem de erro caso o formulrio j tenha sido validado e tenha sido constatado campos invlidos if ($_SESSION["erro_aut"]) { echo " <table align=center> <tr> <td><font color=\"red\">Usu&aacute;rio ou senha inv&aacute;lidos!</font><br><br></td> </tr> </table> "; }

Diviso de Servios Comunidade Centro de Computao Unicamp

37

PHP Intermedirio

// Limpar a varivel "erro_aut" de $_SESSION unset($_SESSION["erro_aut"]); ?> <!-- Monta os campos do formulrio --> <table> <tr> <td>Usu&aacute;rio: </td><td><input type="text" name="usuario" size="20"></td> </tr> <tr valign="top"> <td>Senha: </td><td><input type="password" name="senha" size="20"><br><br></td> </tr> <tr valign="top"> <td><input type="submit" name="submit" size="20" value=" Autenticar "></td><td>&nbsp;</td> </tr> </table> </form> <?php // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); ?>

autentica_src.php
Este script faz a autenticao do usurio junto ao banco de dados:
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o arquivo especificado include("misc.php"); include("funcoes.php"); // Recebe os dados do formulrio e guarda em variveis locais $log_user = $_POST["usuario"]; $sen_user = $_POST["senha"]; // Monta a instruo sql $instr_sql = "select email, tipo_usuario from usuarios where login='$log_user' and senha='$sen_user'"; // Executa a instruo sql $exec_sql = pg_query($instr_sql); // Utiliza a funo pg_fetch_assoc() para buscar o resultado de uma linha e coloc-lo numa matriz associativa $reg_user_aut = pg_fetch_assoc($exec_sql); if ($reg_user_aut)

Diviso de Servios Comunidade Centro de Computao Unicamp

38

PHP Intermedirio

// Se encontrou registro, guarda os dados obtidos em variveis de sesso e chama o prximo script $_SESSION["usuario_sys"] = $log_user; $_SESSION["email_usuario_sys"] = $reg_user_aut["email"]; $_SESSION["tipo_usuario_sys"] = $reg_user_aut["tipo_usuario"]; //print_r($_SESSION); // Funo header chama outro script sem retornar para o script chamador header("Location: pagina_principal.php"); } else { // Se no encontrou registro, ativa a varivel de erro e chama o script anterior $_SESSION["erro_aut"] = "1"; // Funo header chama outro script sem retornar para o script chamador header("Location: index.php"); } ?>

pagina_principal.php
Esse script exibe a pgina inicial do sistema aps a autenticao do usurio:
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("misc.php"); include ("funcoes.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); ?>

Diviso de Servios Comunidade Centro de Computao Unicamp

39

PHP Intermedirio

<b>Objetivo</b><br><br> Esse sistema registra e armazena informa&ccedil;&otilde;es referentes aos chamados feitos pelos usu&aacute;rios e aos atendimentos realizados pela equipe t&eacute;cnica. Tamb&eacute;m disponibiliza a consulta dos dados armazenados.<br><br></td> <?php // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); ?>

Mdulo de incluso de chamados


form_chamado.php
Esse script exibe o formulrio que receber os dados do chamado.
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("funcoes.php"); include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); ?> <strong><font color="#264989">Incluir Chamado</font></strong> <?php // Exibe mensagem de erro caso o formulrio j tenha sido validado e tenha sido constatado campos em branco if ($_SESSION["erro"]) { echo ('<BR><BR><font color="#CC0033"><b>Campos

Diviso de Servios Comunidade Centro de Computao Unicamp

40

PHP Intermedirio

Obrigat&oacute;rios n&atilde;o Preenchidos</b></font><BR>'); $problema = trim($_SESSION["problema"]); $equipe_acionada = trim($_SESSION["equipe_acionada"]); unset($_SESSION["erro"]); unset($_SESSION["problema"]); unset($_SESSION["equipe_acionada"]); } ?> <!-- Monta os campos do formulrio --> <FORM method="post" action="incluir_chamado.php"> <P><b>Usu&aacute;rio: </b><?php echo $_SESSION["usuario_sys"]; ?> <br><br> <b>E-mail: </b> <?php echo $_SESSION["email_usuario_sys"]; ?> <?php echo "<P> <b>Descri&ccedil;&atilde;o do Problema: </b>$problema<br> <textarea name=\"problema\" rows=3 cols=40>$problema</textarea>"; if (!$equipe_acionada) { echo '<P><b>Equipe Acionada: </b>&nbsp; <select name="equipe_acionada"> <option value="suporte">Suporte</option> <option value="conectividade">Conectividade</option> <option value="desenvolvimento">Desenvolvimento</option> <option value="producao">Produ&ccedil;&atilde;o</option> </select><BR>'; } else { echo "<P> <b>Equipe Acionada: </b>$equipe_acionada <input type=\"hidden\" name=\"equipe_acionada\" value=\"$equipe_acionada\"><BR>"; } ?> &nbsp;<BR> &nbsp; <INPUT name="sub" type="SUBMIT" value="Enviar Dados"> </form> <?php // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); ?>

Diviso de Servios Comunidade Centro de Computao Unicamp

41

PHP Intermedirio

incluir_chamado.php
Esse script vai receber os dados do formulrio, fazer as devidas consistncias e gravar esses dados na tabela chamados. Se o processamento for Ok ser enviada uma mensagem utilizando a funo mail, passando como parmetros o destinatrio, o assunto, o corpo da mensagem e cabealhos adicionais. Saiba mais sobre algumas funes que sero utilizadas no script a seguir
trim: tira espaos em branco no incio e no final de uma varivel. header: chama outro script, podendo passar parmetros e no retorna ao script chamador. Nenhum comando de exibio (echo, include, tags html) pode ser executado antes dessa funo. mail: envia mensagens por e-mail de acordo com os parmetros utilizados. or die: expresso que pode ser usada como uma alternativa para o if/else. Finaliza a execuo do script.
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o arquivo especificado include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Recebe variveis globais e campos do formulrio e armazena em variveis locais $usuario = $_SESSION["usuario_sys"]; $email = $_SESSION["email_usuario_sys"]; $problema = trim($_POST["problema"]); $equipe_acionada = trim($_POST["equipe_acionada"]); //echo 'problema = '.$problema; // Consiste se o campo do formulrio est em branco if (!$problema) { $_SESSION["problema"] = $problema; $_SESSION["equipe_acionada"] = $equipe_acionada; $_SESSION["erro"] = 1; header("location: form_chamado.php"); } else { // A instruo include () inclui e avalia o arquivo especificado

Diviso de Servios Comunidade Centro de Computao Unicamp

42

PHP Intermedirio

include ("funcoes.php"); // Obtm a data da ocorrncia // data no formato dd/mm/aaaa para exibio $data_exib = date("d/m/Y"); // data no formato aaaa/mm/dd para ser gravada no banco $data_chamado = date("Y").'-'.date("m").'-'.date("d"); // Obtm a hora da ocorrncia $hora_chamado = date("H:i:s"); // Inclui os dados na tabela chamados - Monta a primeira instruo sql $instr_sql = "INSERT into chamados (data_chamado, hora_chamado, usuario, email, problema, equipe_acionada) values ('$data_chamado', '$hora_chamado', '$usuario', '$email', '$problema', '$equipe_acionada')"; // se a execuo da instruo sql foi OK, recupera os dados para exibio e para enviar por e-mail if (pg_query($instr_sql)) { // Monta a segunda instruo sql $instr_sql2 = "SELECT num_chamado from chamados where email = '$email' and data_chamado = '$data_chamado' and hora_chamado = '$hora_chamado'"; // Executa a segunda instruo sql $exec_sql2 = pg_query ($instr_sql2) or die ("Erro no acesso ao banco"); // Utiliza a funo pg_fetch_assoc() para buscar o resultado de uma linha e coloc-lo numa matriz associativa $row = pg_fetch_assoc($exec_sql2); $num_chamado = $row["num_chamado"]; // envia um e-mail para o responsvel pelo atendimento com os dados do chamado $var_mail = mail ("cursophp2@bol.com.br", "SRC - Um Novo Chamado foi Incluido", "Mais Informaes Nmero do Chamado: $num_chamado Data do Chamado: $data_exib Hora do Chamado: $hora_chamado Usurio: $usuario E-mail: $email Problema: $problema Equipe Acionada: $equipe_acionada","SRC - Sistema de Registro de Chamados"); // var_dump ($var_mail); // exit; $_SESSION["msg_exib"] = "incluir_chamado_ok"; $_SESSION["data_exib"] = $data_exib; $_SESSION["hora_chamado"] = $hora_chamado; $_SESSION["num_chamado"] = $num_chamado; header("Location: exibe_mensagem.php"); } // se a execuo da instruo sql deu erro else { $_SESSION["msg_exib"] = "incluir_chamado_erro";

Diviso de Servios Comunidade Centro de Computao Unicamp

43

PHP Intermedirio

} } ?>

header("Location: exibe_mensagem.php");

exibe_mensagem.php
No indicado exibirmos as mensagens finais em um script que acessa banco de dados, pois se o usurio clicar no boto atualizar do navegador, o script ser processado novamente. Por isso, criaremos um script somente para exibir as mensagens finais. Esse script ser chamado por intermedio da funo header.
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("funcoes.php"); include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); / ****************************************************************** ********** Exibe mensagens referentes aos mdulos Incluir Chamado e Incluir Atendimento ***************************************************************** ***********/ switch ($_SESSION["msg_exib"]) { case "incluir_chamado_ok": $data_exib = trim($_SESSION["data_exib"]); $hora_chamado = trim($_SESSION["hora_chamado"]); $num_chamado = trim($_SESSION["num_chamado"]); echo "<BR><BR> <center> <b><font color=\"#CC0033\"> Processado com

Diviso de Servios Comunidade Centro de Computao Unicamp

44

PHP Intermedirio

Sucesso </font></b></center><BR> <center>Data: $data_exib</center><BR> <center>Hora: $hora_chamado</center><BR> <center>N&uacute;mero do Chamado: $num_chamado </center><br><br> <center> <b> <a href=\"form_chamado.php\">Voltar</a> </b> </center>"; unset($_SESSION["data_exib"]); unset($_SESSION["hora_chamado"]); unset($_SESSION["num_chamado"]); unset($_SESSION["msg_exib"]); break; case "incluir_chamado_erro": echo "<BR><BR> <center><b><font color=\"#CC0033\"> Erro no Processamento </font></b></b> </center> <BR><BR><center> <b> <a href=\"form_chamado.php\">Voltar</a> </b> </center>"; unset($_SESSION["msg_exib"]); break; case "incluir_atendimento_ok": echo "<BR><BR> <center><b><font color=\"#CC0033\"> Processado com Sucesso </font></b></b> </center> <BR><BR><center> <b> <a href=\"form_atendimento.php\">Voltar</a> </b> </center>"; unset($_SESSION["msg_exib"]); break; case "incluir_atendimento_erro": echo "<BR><BR> <center><b><font color=\"#CC0033\"> Erro no Processamento</font></b></b> </center> <BR><BR><center> <b> <a href=\"form_atendimento.php\">Voltar</a> </b> </center>"; unset($_SESSION["msg_exib"]); break; } // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); ?>

Testando o mdulo de incluso de chamados


Deixe os campos do formulrio em branco. Clique em enviar. Dever exibir uma mensagem de erro. Preencha os campos do formulrio e clique no boto enviar. Dever exibir a mensagem Processado com Sucesso,junto com a data/hora da incluso e o nmero do chamado.

Diviso de Servios Comunidade Centro de Computao Unicamp

45

PHP Intermedirio

Mdulo de registro de atendimentos


form_atendimento.php Este script exibe o formulrio inicial de atendimento, utilizado para obter o nmero do chamado.
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("funcoes.php"); include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); ?> <p><strong><font color="#264989">Registrar Atendimento</font></strong><br></p> <?php // Exibe mensagem de erro caso o formulrio j tenha sido validado e tenha sido constatado campo em branco if ($_SESSION["erro_atend"]) { echo '<BR><strong><font color="#CC0033"> Preencha o n&uacute;mero do chamado</font></strong><BR><BR>'; unset($_SESSION["erro_atend"]); } ?> <!-- Monta os campos do formulrio --> <form method="post" action="registrar_atendimento.php"> <p><strong>N&uacute;mero do Chamado</strong>: <input type="text" name="num_chamado" size="10" maxlength="20"></p><p> <input type="submit" name="Submit" value="Enviar"></p> </form>

Diviso de Servios Comunidade Centro de Computao Unicamp

46

PHP Intermedirio

<center> <strong> <a href="pagina_principal.php">Home</a> </strong> </center></font> <?php // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); ?>

registrar_atendimento.php Esse script recebe o dado do formulrio, faz a consistncia, obtm dados do chamado e chama o script registrar_atendimento2.php, que vai exibir o formulrio completo de atendimento. Saiba mais sobre algumas funes que sero utilizadas no script a seguir
pg_num_rows: obtem o nmero de registros que retornou do select. pg_fetch_assoc: obtem os campos do registro que retornou do select, usando como ndice o nome do campo. pg_fetch_row: obtem os campos do registro que retornou do select, da mesma forma que o comando anterior, mas utiliza um ndice seqencial, comeando do valor zero.

<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o arquivo especificado include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Recebe os dados do formulrio e guarda em variveis locais $num_chamado = trim($_POST["num_chamado"]); // Consiste se nmero do chamado est em branco if (!$num_chamado) { $_SESSION["erro_atend"] = 1; header("location: form_atendimento.php"); } else { // Monta a instruo sql

Diviso de Servios Comunidade Centro de Computao Unicamp

47

PHP Intermedirio

$instr_sql = "SELECT usuario, email, data_chamado, hora_chamado, problema, equipe_acionada from chamados where num_chamado = '$num_chamado'"; // Executa a instruo sql $exec_sql = pg_query($instr_sql) or die ("Erro no acesso ao banco"); $achou = pg_num_rows($exec_sql); // Se encontrou registro, guarda os dados em variveis de sesso que sero utilizadas no prximo script if ($achou > 0) { $reg = pg_fetch_assoc($exec_sql); $data_chamado = $reg["data_chamado"]; $_SESSION["hora_chamado"] = $reg["hora_chamado"]; $_SESSION["problema"] = $reg["problema"]; $_SESSION["equipe_acionada"] = $reg["equipe_acionada"]; $_SESSION["usuario"] = $reg["usuario"]; $_SESSION["email"] = $reg["email"]; //Coloca a data do chamado em formato de exibio (de aaaa-mm-dd para dd/mm/aaaa) $dt = explode("-",$data_chamado); $dt2 = mktime(0,0,0,$dt[1],$dt[2],$dt[0]); $data_exib = date("d/m/Y",$dt2); $_SESSION["num_chamado"] = $num_chamado; $_SESSION["data_exib"] = $data_exib; header("location: registrar_atendimento2.php"); } // Se no encontrou registro, exibe mensagem else { // A instruo include () inclui e avalia o arquivo especificado include ("funcoes.php"); // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); echo ' <BR><BR> <center> <strong><font color="#CC0033">N&uacute;mero de chamado n&atilde;o cadastrado</font></strong></center><BR><BR> <center> <strong> <a href="form_atendimento.php">Voltar</a> </strong> </center> <BR><BR><BR><BR> </td> </tr> </table>'; // Funo definida no script funcoes.php

Diviso de Servios Comunidade Centro de Computao Unicamp

48

PHP Intermedirio

responsvel por montar o rodap da pgina monta_rodape(); } } ?>

registrar_atendimento2.php Esse script vai exibir os dados do chamado juntamente com o formulrio atendimento.
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("funcoes.php"); include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Guarda dados das variveis de sesso em variveis locais $num_chamado = $_SESSION["num_chamado"]; $usuario = $_SESSION["usuario"]; $email = $_SESSION["email"]; $data_exib = $_SESSION["data_exib"]; $hora_chamado = $_SESSION["hora_chamado"]; $problema = $_SESSION["problema"]; $equipe_acionada = $_SESSION["equipe_acionada"]; // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); echo '<b><font color="#264989">Registrar Atendimento</font></b><BR><BR>'; // O bloco condicional a seguir vlido para quando esse script for chamado pelo registrar_atendimento3.php if ($_SESSION ["consist"] == 1 || $_SESSION ["consist"] == 2) { $dia = trim($_SESSION["dia"]); $mes = trim($_SESSION["mes"]); $ano = trim($_SESSION["ano"]); $responsavel = trim($_SESSION["responsavel"]); $equipe_responsavel =

de

Diviso de Servios Comunidade Centro de Computao Unicamp

49

PHP Intermedirio

trim($_SESSION["equipe_responsavel"]); $solucao = trim($_SESSION["solucao"]); if ($_SESSION["consist"] == 1) { echo ('<BR><b><font color="#CC0033">Campo(s) obrigatorio(s) nao preenchido(s)</font></b><p>'); unset($_SESSION["consist"]); } if ($_SESSION["consist"] == 2) { echo ('<BR><BR><b><font color="#CC0033">Data invalida</font></b><p>'); unset($_SESSION["consist"]); } } // Exibe dados do chamado e monta o formulrio para registrar atendimento echo " <b> Numero do chamado: </b>$num_chamado<BR> <b> Usuario: </b> $usuario <BR> <b> E-mail: </b> $email <BR> <b> Data: </b> $data_exib &nbsp;&nbsp; <BR> <b> Hora: </b> $hora_chamado <BR> <b> Problema: </b> $problema <BR> <b> Equipe acionada: </b> $equipe_acionada <BR><BR><HR> <form method=post action=registrar_atendimento3.php> <p><b>Data do Atendimento </b> <BR>(formato dd/mm/aaaa) <table BORDER width=\"580\" > <tr> <td><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Data :&nbsp; <input name=\"dia\" type=\"TEXT\" value=\"$dia\" size=\"2\" maxlength=2 > &nbsp;&nbsp; <input name=\"mes\" type=\"TEXT\" value=\"$mes\" size=\"2\" maxlength=2 > &nbsp;&nbsp; <input name=\"ano\" type=\"TEXT\" value=\"$ano\" size=\"4\" maxlength=4 > </font> </td></tr></table><br>"; // Se a primeira vez que executa o script inicializa o campo, caso contrrio exibe o contedo do campo if (!$responsavel) { echo '<table width="400"> <tr> <td> <b><font face="Verdana, Arial, Helvetica, sansserif" size="2">Respons&aacute;vel :</font></b> <select NAME="responsavel" > <option value="Paulo">Paulo</option> <option value="Carlos">Carlos</option> <option value="Eduardo">Eduardo</option> <option value="Cristina">Cristina</option> <option value="Jose">Jose</option> <option value="Marcos">Marcos</option>

Diviso de Servios Comunidade Centro de Computao Unicamp

50

PHP Intermedirio

<option value="Ricardo">Ricardo</option> </select> </td> </tr> </table>'; } else {

echo "<table width=\"400\"> <tr> <td> <b><font face=\"Verdana, Arial, Helvetica, sansserif\" size=\"2\">Respons&aacute;vel :</b> $responsavel </font><br><br> <input type=\"hidden\" name=\"responsavel\" value=\"$responsavel\"> </td> </tr> </table>"; } // Se a primeira vez que executa o script inicializa o campo, caso contrrio exibe o contedo do campo if (!$equipe_responsavel) { echo '<table width="400"> <tr> <td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Equipe Respons&aacute;vel:</font></b> <select NAME="equipe_responsavel"> <option value="suporte">Suporte</option> <option value="conectividade">Conectividade</option> <option value="desenvolvimento">Desenvolvimento</option> <option value="producao">Producao</option> </select> </td> </tr> </table>'; } else { echo "<table width=\"400\"> <tr> <td><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Equipe Respons&aacute;vel: </b>$equipe_responsavel</font> <input type=\"hidden\" name=\"equipe_responsavel\" value=\"$equipe_responsavel\"> </td> </tr> </table>";

Diviso de Servios Comunidade Centro de Computao Unicamp

51

PHP Intermedirio

} // Se a primeira vez que executa o script inicializa o campo, caso contrrio exibe o contedo do campo if (!$solucao) { echo '<p><b>Solu&ccedil;&atilde;o:</b> <br> <textarea name="solucao" type=text rows=5 cols=50></textarea>'; } else { echo "<p><b>Solu&ccedil;&atilde;o :</b> $solucao<br> <input type=\"hidden\" name=\"solucao\" value=\"$solucao\">"; } // Passa alguns dados do chamado para o script seguinte por meio de campos escondidos echo "<input type=\"hidden\" name=\"num_chamado\" value=\"$num_chamado\"> <input type=\"hidden\" name=\"email\" value=\"$email\"> <center> <p> <input name=\"sub\" type=\"SUBMIT\" value=\"Enviar Dados\"> <br></font></center> </form> "; // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); ?>

Saiba mais sobre algumas funes que sero utilizadas no script a seguir
checkdate: faz consistncia de datas, inclusive checa anos bissextos. Recebe como parmetros: ms, dia e ano (nessa ordem). Os valores dos parmetros tem que ser inteiros.

registrar_atendimento3.php
Esse script vai consistir os campos do formulrio de atendimento, gravar os dados na tabela atendimentos e enviar uma mensagem com as informaes do atendimento para o usurio que abriu o chamado.
<?php // Inicializar a sesso session_start();

Diviso de Servios Comunidade Centro de Computao Unicamp

52

PHP Intermedirio

// A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("funcoes.php"); include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Recebe os dados do formulrio e guarda em variveis locais $num_chamado = trim($_POST["num_chamado"]); $email = trim($_POST["email"]); $dia = trim($_POST["dia"]); $mes = trim($_POST["mes"]); $ano = trim($_POST["ano"]); $responsavel = trim($_POST["responsavel"]); $equipe_responsavel = trim($_POST["equipe_responsavel"]); $solucao = trim($_POST["solucao"]); // Prepara a data para consistncia $var_data = checkdate((int)$mes, (int)$dia, (int)$ano); // Consiste se campos obrigatrios foram preenchidos if (!$dia || !$mes || !$ano || !$responsavel || ! $equipe_responsavel || !$solucao) { $_SESSION["consist"] = 1; $_SESSION["num_chamado"] = $num_chamado; $_SESSION["email"] = $email; $_SESSION["dia"] = $dia; $_SESSION["mes"] = $mes; $_SESSION["ano"] = $ano; $_SESSION["responsavel"] = $responsavel; $_SESSION["equipe_responsavel"] = $equipe_responsavel; $_SESSION["solucao"] = $solucao; header("location: registrar_atendimento2.php"); } // Consiste data elseif (!$var_data) { $_SESSION["consist"] = 2; $_SESSION["num_chamado"] = $num_chamado; $_SESSION["email"] = $email; $_SESSION["dia"] = $dia; $_SESSION["mes"] = $mes; $_SESSION["ano"] = $ano; $_SESSION["responsavel"] = $responsavel; $_SESSION["equipe_responsavel"] = $equipe_responsavel; $_SESSION["solucao"] = $solucao; header("location: registrar_atendimento2.php"); } // Se os dados recebidos esto OK else { // Formata a data para ser gravada no banco (aaaa-mm-dd)

Diviso de Servios Comunidade Centro de Computao Unicamp

53

PHP Intermedirio

$data_atendimento = $ano."-".$mes."-".$dia; // Monta a instruo sql $instr_sql = "INSERT into atendimentos (num_chamado, data_atendimento, responsavel, equipe_responsavel, solucao) values ('$num_chamado', '$data_atendimento', '$responsavel', '$equipe_responsavel', '$solucao')"; // Executa a instruo sql if (pg_query($instr_sql)) { // formata a data para exibio (dd/mm/aaaa) $data_atendimento = $dia."/".$mes."/".$ano; // Retorna um e-mail para quem abriu o chamado mail ("$email", "SRC - O chamado $num_chamado foi atendido", "Aviso: O chamado $num_chamado foi atendido. Mais Informaes: Data do atendimento: $data_atendimento Responsel: $responsavel Equipe Responsvel: $equipe_responsavel Soluo: $solucao","SRC - Sistema de Registro de Chamados"); $_SESSION["msg_exib"] = "incluir_atendimento_ok"; header("Location: exibe_mensagem.php"); } else { $_SESSION["msg_exib"] = "incluir_atendimento_erro"; header("Location: exibe_mensagem.php"); } } ?>

exibe_mensagem.php
Para completar o processamento necessrio chamar o script que exibe as mensagens finais: exibe_mensagem.php (cujo cdigo est descrito nas pginas 42 e 43 ).

Testando o mdulo de registro de atendimentos


Deixe o campo Nmero do Chamado do formulrio em branco. Dever exibir uma mensagem de erro. No campo Nmero do Chamado do formulrio, digite um nmero inexistente. Dever exibir uma mensagem de erro. No campo Nmero do Chamado do formulrio, digite um nmero vlido. Dever exibir o formulrio completo para o registro do atendimento.

Diviso de Servios Comunidade Centro de Computao Unicamp

54

PHP Intermedirio

No formulrio completo deixe os campos obrigatrios em branco. Dever exibir uma mensagem de erro. No formulrio completo digite datas invlidas no campo Data do atendimento. Dever exibir uma mensagem de erro. Preencha o formulrio completo com dados vlidos. Dever exibir a mensagem Processado com sucesso.

Mdulo de consulta
consulta_chamados_periodo.php Este script exibe o formulrio de consulta, que pede um intervalo de datas.
<?php // Inicializar a sesso session_start(); // A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("funcoes.php"); include ("misc.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); ?> <b>Consulta chamados ocorridos num determinado per&iacute;odo</b> <?php // Exibe mensagem de erro caso o formulrio j tenha sido validado e tenha sido constatado alguma data invlida if ($_SESSION["consist"] == 1) { $dia_ini = trim($_SESSION["dia_ini"]); $mes_ini = trim($_SESSION["mes_ini"]); $ano_ini = trim($_SESSION["ano_ini"]); $dia_fim = trim($_SESSION["dia_fim"]);

Diviso de Servios Comunidade Centro de Computao Unicamp

55

PHP Intermedirio

$mes_fim = trim($_SESSION["mes_fim"]); $ano_fim = trim($_SESSION["ano_fim"]); echo ('<BR><BR><b><font color="#CC0033">Data(s) inv&aacute;lidas(s)</font></b>'); unset($_SESSION["consist"]); } ?> <form method="post" action="consulta_chamados_periodo2.php"> <p> <b> Entre com o per&iacute;odo: </b><BR><BR> <b>De:</b> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dia <?php // Monta os campos do formulrio echo (" <input name=\"dia_ini\" type=\"TEXT\" size=2 maxlength=2 value=\"$dia_ini\"> &nbsp;&nbsp;&nbsp;m&ecirc;s <input name=\"mes_ini\" type=\"TEXT\" size=2 maxlength=2 value=\"$mes_ini\"> &nbsp;&nbsp;&nbsp;ano <input name=\"ano_ini\" type=\"TEXT\" size=4 maxlength=4 value=\"$ano_ini\"><BR><BR> <b>At&eacute;:</b> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dia <input name=\"dia_fim\" type=\"TEXT\" size=2 maxlength=2 value=\"$dia_fim\"> &nbsp;&nbsp;&nbsp;m&ecirc;s <input name=\"mes_fim\" type=\"TEXT\" size=2 maxlength=2 value=\"$mes_fim\"> &nbsp;&nbsp;&nbsp;ano <input name=\"ano_fim\" type=\"TEXT\" size=4 maxlength=4 value=\"$ano_fim\"> "); ?> </p> <center><p> <input name="sub" type="SUBMIT" value="Enviar Dados"> <br> </center> <?php // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); ?>

consulta_chamados_periodo2.php Este script consiste os campos recebidos do formulrio, faz uma consulta s tabelas chamados e atendimentos e exibe os dados obtidos.
<?php // Inicializar a sesso session_start();

Diviso de Servios Comunidade Centro de Computao Unicamp

56

PHP Intermedirio

// A instruo include () inclui e avalia o(s) arquivo(s) especificado(s) include ("misc.php"); include ("funcoes.php"); // Funo que verifica se o usurio se autenticou antes de acessar essa pgina ver_session(); // Recebe os dados do formulrio e guarda em variveis locais $dia_ini = trim($_POST["dia_ini"]); $mes_ini = trim($_POST["mes_ini"]); $ano_ini = trim($_POST["ano_ini"]); $dia_fim = trim($_POST["dia_fim"]); $mes_fim = trim($_POST["mes_fim"]); $ano_fim = trim($_POST["ano_fim"]); // Checa se a data de inicio e data de fim so vlidas $var_data_ini = checkdate((int)$mes_ini, (int)$dia_ini, (int) $ano_ini); $var_data_fim = checkdate((int)$mes_fim, (int)$dia_fim, (int) $ano_fim); // Consiste as datas de incio e de fim if (!$var_data_ini || !$var_data_fim) { $_SESSION["consist"] = 1; $_SESSION["dia_ini"] = $dia_ini; $_SESSION["mes_ini"] = $mes_ini; $_SESSION["ano_ini"] = $ano_ini; $_SESSION["dia_fim"] = $dia_fim; $_SESSION["mes_fim"] = $mes_fim; $_SESSION["ano_fim"] = $ano_fim; // Funo header chama outro script sem retornar para o script chamador header("location: consulta_chamados_periodo.php"); } // converte as datas para o formato Unix/timestamp para comparlas entre si $data_ini = mktime(0,0,0,$mes_ini,$dia_ini,$ano_ini); $data_fim = mktime(0,0,0,$mes_fim,$dia_fim,$ano_fim); // Compara as datas de incio e de fim if ($data_ini > $data_fim) { $_SESSION["consist"] = 1; $_SESSION["dia_ini"] = $dia_ini; $_SESSION["mes_ini"] = $mes_ini; $_SESSION["ano_ini"] = $ano_ini; $_SESSION["dia_fim"] = $dia_fim; $_SESSION["mes_fim"] = $mes_fim; $_SESSION["ano_fim"] = $ano_fim; // Funo header chama outro script sem retornar para o script chamador header("location: consulta_chamados_periodo.php");

Diviso de Servios Comunidade Centro de Computao Unicamp

57

PHP Intermedirio

} else {

//adiciona um zero a esquerda nos valores de 1 a 9 //se for digitado 1 nos campos dia ou ms,transforma para 01 $dia_ini = strftime("%d",$data_ini); $mes_ini = strftime("%m",$data_ini); $ano_ini = strftime("%Y",$data_ini); $dia_fim = strftime("%d",$data_fim); $mes_fim = strftime("%m",$data_fim); $ano_fim = strftime("%Y",$data_fim); //Converte as datas para o formato aaaa-mm-dd $data_ini = $ano_ini."-".$mes_ini."-".$dia_ini; $data_fim = $ano_fim."-".$mes_fim."-".$dia_fim; //Converte as datas para o formato dd/mm/aaaa $data_ini_exib = $dia_ini."/".$mes_ini."/".$ano_ini; $data_fim_exib = $dia_fim."/".$mes_fim."/".$ano_fim;

// Monta a primeira instruo sql $instr_sql = "SELECT num_chamado, data_chamado, hora_chamado, usuario, email, problema, equipe_acionada from chamados where data_chamado >= '$data_ini' and data_chamado <= '$data_fim' order by num_chamado"; // Executa a instruo sql e verifica se encontrou algum registro $exec_sql = pg_query($instr_sql) or die ("Erro no acesso ao banco"); $achou = pg_num_rows($exec_sql); // Se encontrou, guarda as variaveis if ($achou > 0) { // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); echo "<div id='conteudo'><BR> <font color=\"#264989\"><b>Consulta chamados ocorridos no per&iacute;odo de $data_ini_exib a $data_fim_exib</b></font> <br><a href=\"consulta_chamados_periodo.php\"><b>Voltar</b></a> "; // Executa enquanto houverem chamados while ($reg = pg_fetch_assoc($exec_sql)) { $num_chamado = $reg["num_chamado"]; $data_chamado = $reg["data_chamado"]; $hora_chamado = $reg["hora_chamado"]; $usuario = $reg["usuario"]; $email = $reg["email"]; $problema = $reg["problema"]; $equipe_acionada = $reg["equipe_acionada"];

Diviso de Servios Comunidade Centro de Computao Unicamp

58

PHP Intermedirio

//Transforma a data do chamado obtida do banco para formato de exibio (de aaaa-mm-dd para dd/mm/aaaa) //utiliza as funces explode (retorna uma matriz de strings), mktime (converte a data para o formato Unix/timestamp) //e date (formata a data) $dt = explode("-",$data_chamado); $dt2 = mktime(0,0,0,$dt[1],$dt[2],$dt[0]); $data_chamado_exib = date("d/m/Y",$dt2); //Exibe os dados do chamado echo "<BR> <HR><BR> <b>N&uacute;mero do chamado: </b> $num_chamado <BR><BR> <b> Data do chamado: </b> $data_chamado_exib <BR> <b> Hora do chamado: </b> $hora_chamado <BR> <b> Usu&aacute;rio: </b> $usuario <BR> <b> E-mail: </b> $email <BR> <b> Problema: </b> $problema <BR> <b> Equipe acionada: </b> $equipe_acionada <BR> "; // Monta a segunda instruo sql $instr_sql2 = "SELECT data_atendimento, responsavel, equipe_responsavel, solucao from atendimentos where num_chamado = '$num_chamado'"; algum registro // Executa a instruo sql e verifica se encontrou

$exec_sql2 = pg_query($instr_sql2) or die ("Erro no acesso ao banco"); $achou2 = pg_num_rows($exec_sql2); // Se encontrou, guarda as variaveis if ($achou2 > 0) { echo " <BR> <b>Atendimento</b> <BR><BR> "; //Executa enquanto houverem atendimentos // Utiliza a funo pg_fetch_row que retorna uma linha como um array enumerado while ($row2 = pg_fetch_row ($exec_sql2)) { $data_atendimento = $row2[0]; $responsavel = $row2[1]; $equipe_responsavel = $row2[2]; $solucao = $row2[3]; $data_atendimento); $dt_at = explode("-",

$dt_at2 = mktime(0,0,0,$dt_at[1],$dt_at[2],$dt_at[0]);

Diviso de Servios Comunidade Centro de Computao Unicamp

59

PHP Intermedirio

date("d/m/Y",$dt_at2);

$data_atendimento_exib =

//Exibe os dados do atendimento echo "<b> Data do Atendimento: </b> $data_atendimento_exib <BR> <b> Respons&aacute;vel: </b> $responsavel <BR> <b> Equipe respons&aacute;vel: </b> $equipe_responsavel <BR> <b> Solu&ccedil;&atilde;o: </b> $solucao <BR><BR>"; } } // Se no encontrou nenhum atendimento para esse chamado exibe mensagem else { echo '<BR> Obs: At&eacute; o momento, nenhum atendimento foi registrado para esse chamado. '; } } echo "<b><a href=\"consulta_chamados_periodo.php\"><BR><BR> Voltar</a></b>"; } // Se no encontrou nenhum chamado para esse perodo else { // Funo definida no script funcoes.php responsvel por montar o cabealho da pgina monta_cabecalho(); // Funo definida no script funcoes.php responsvel por montar o menu lateral da pgina, recebe parmetros monta_menu($_SESSION["usuario_sys"], $_SESSION["tipo_usuario_sys"]); // Exibe mensagem echo ' <BR><BR> <center> <font color="#CC0033"> <b> N&atilde;o existem chamados para esse per&iacute;odo. </b> </font> </center><BR><BR> <center> <b> <a href="consulta_chamados_periodo.php">Voltar</a> </b> </center> <BR><BR><BR><BR>'; } // Funo definida no script funcoes.php responsvel por montar o rodap da pgina monta_rodape(); } ?>

Testando o mdulo de consulta


Deixe os campos obrigatrios do formulrio em branco. Dever exibir uma mensagem

Diviso de Servios Comunidade Centro de Computao Unicamp

60

PHP Intermedirio

de erro. Digite datas invlidas. Dever exibir uma mensagem de erro. Digite um intervalo de datas vlido. Dever exibir os dados resultantes da consulta.

Expirao de sesso
logout.php
Este script far a expirao da sesso quando o usurio sair do sistema:
<?php // Inicializar a sesso session_start(); //Libera todas as variveis de sesso session_unset(); //Destri todos os dados registrados em uma sesso session_destroy(); //Retorna para a pgina de autenticao header("Location: index.php"); ?>

Exerccios complementares
1) Fazer um script que altere o campo tipo_usuario do usuario3 na tabela de usurios: alterar de user_normal para user_atend. A sintaxe do comando sql para fazer a alterao de registros na tabela a seguinte: "UPDATE usuarios SET tipo_usuario='$variavel' WHERE login='usuario3'" 2) Fazer um script que exclua o registro referente ao usuario3 da tabela de usurios. A sintaxe do comando sql para fazer a excluso a seguinte: "DELETE from usuarios where login = '$variavel'"

Diviso de Servios Comunidade Centro de Computao Unicamp

61

PHP Intermedirio

Dicas
Documentao Oficial do PHP http://www.php.net Consulta a dicas e artigos do site PHP Brasil http://www.phpbrasil.com Para mais informaes sobre o PostgreSQL, consulte o site: http://www.commandprompt.com/ppbook/

Diviso de Servios Comunidade Centro de Computao Unicamp

62

Você também pode gostar