Você está na página 1de 16

7.

Recursos PHP para a Internet


w

Protocolo HTTP. Na aula passada vimos um script simples de autenticao de


usurios. Neste script foi usado o tag META para passar uma URL ao servidor
web. A linguagem PHP dispe da funo header para facilitar esta tarefa.
<html>
<body>
<form action="aula07_01.php" method="post">
Login: <input type="text" name="login">
Senha: <input type="password" name="senha"><br><br>
<input type="submit" value=" Entrar ">
</form>
</body>
</html>
<?php
function validar($login, $senha)
{
// Inserir aqui o cdigo de validao
return (($login == "senne") &&
($senha == "feg2003"));
}

aula07_01.htm

aula07_01.php

Note que com o protocolo


HTTP possvel executar
um script PHP a partir de outro
script PHP.

// Aqui comeca o script principal


if (validar($login,$senha))
header("Location: http://localhost/DAIaula07/autoriza.php");
else
echo("<h1>Usurio no autorizado!!!</h1>");
?>
ELFS, 2003

167

Recursos PHP para a Internet


w

Exerccio. Considere uma pgina como mostra a figura abaixo. Implementar o


script aula07_02.php que exibe a pgina da instituio selecionada.

aula07_02.htm

E-Mail. A funo mail() do PHP deve ser usada para envio de e-mail. Sua
sintaxe a seguinte:
mail(Destinatrio, Assunto, Mensagem, Informaes_Adicionais);

Exemplo:

aula07_03.htm
ELFS, 2003

Considere que, para serem enviados, os dados devem


satisfazer as seguintes condies:
Todos os campos so obrigatrios;
A consistncia do campo e-mail deve ser feita
verificando apenas a existncia do caractere @;
O campo telefone deve ter sete ou oito caracteres.
168

Recursos PHP para a Internet


<?php
$erro = "";

aula07_03.php

if ($nome == "")
$erro .= "O nome no foi digitado.<br>";

Note nas atribuies varivel $erro o


uso combinado dos operadores de
concatenao ( . ) e de atribuio ( = )
resultando no operador ( .= ). Escrever
$erro .= "string" equivalente a
escrever: $erro = $erro . "string"

if ((strlen($telefone) > 8) || (strlen($telefone) < 7))


$erro .= "O nmero do telefone deve ter sete ou oito caracteres.<br>";
if (strpos ($email, "@") == 0)
$erro .= "O e-mail fornecido no vlido.<br>";
echo("<html><title>Envio de formulrio</title><body>\n");
if ($erro == "")
{
// No houve erro no preenchimento do formulrio
mail("seu_email@feg.unesp.br",
"Dados do Formulrio",
"Nome: $nome\n Telefone: $telefone\n E-mail: $email");
echo("Obrigado por enviar seus dados!\n");
}
else
echo("Seus dados no foram enviados!<br>
Verifique as mensagens de erro abaixo:<br><br><b> $erro </b>");
echo("</body></html>");
?>
Para usar a funo mail preciso configurar a sesso
[mail function] do arquivo c:\apache\php\php.ini:
SMTP = mail.feg.unesp.br
sendmail_from = seu_email@seu_domnio.br
ELFS, 2003

169

Recursos PHP para a Internet


w

Upload de arquivos. Existe um tipo de campo de formulrio que permite o


envio de arquivos da mquina do usurio para o servidor. Isto muito til
para enviar um arquivo para o servidor sem a necessidade de liberao de um
acesso por FTP. Exemplo:
aula07_04.htm
<html>
<body>
<form action="aula07_04.php" method="post" enctype="multipart/form-data">
<input type="file" name="arq"><br><br>
<input type="submit" value=" Enviar ">
</form>
</body>
</html>
Neste caso, como o nome do campo arq, o script PHP ter
acesso a duas variveis: $arq (arquivo temporrio referente
ao arquivo especificado aps clique no boto Browse...) e
$arq_name (nome do arquivo). Se o boto Browse... no
for usado para especificar o arquivo, $arq = "none".
aula07_04.php
<?php
echo("<html><body>");
if (($arq == "none") or ($arq_name == ""))
{
echo("<p>Arquivo no especificado!</p>");
echo("<p><a href=javascript:history.back();>Voltar</a></p>");
}
A disjuno lgica representada pelo operador || ou pela palavra or.

ELFS, 2003

170

Recursos PHP para a Internet


else
{
$dest = "c:\\apache\\htdocs\\DAIaula07\\".$arq_name;
if (copy($arq, $dest) == 0)
echo("<p>No foi possvel copiar o arquivo!</p>");
else
echo("<p>Upload realizado com sucesso!</p>");
}
echo("</body></html>");
?>

A funo int copy(string origem, string destino) copia o arquivo origem para o
arquivo destino. Os strings origem e destino devem conter os nomes
completos dos arquivos (incluindo os caminhos). A pasta destino deve existir
(at mesmo em outro computador) e permitir gravao para que a cpia seja
realizada. A funo retorna 0 (false) caso a cpia no seja realizada.

Protocolo FTP. A seqncia de tarefas para uso do protocolo FTP a seguinte:


Conectar ao servidor, Identificao (login e senha), Envio/Busca de arquivo(s),
Desconectar. Os comandos para cada uma destas tarefas so os seguintes:
$con = ftp_connect('servidor');
$log = ftp_login($con, 'login', 'senha');
ftp_put($con, 'arquivo_remoto', 'arquivo_local', FTP_BINARY);
ftp_quit($con);
Para download s usar a funo ftp_get($con, 'arquivo_local','arquivo_remoto', FTP_BINARY);

ELFS, 2003

171

Recursos PHP para a Internet


w

Exerccio. Refazer a aplicao de upload de arquivos de modo a usar o


protocolo FTP. Use o servidor 200.145.11.141, usurio "teste_php" e senha
"123456789". Em seguida, experimente fazer o download do arquivo copiado
no servidor para a pasta c:\temp.

Cookies. Os cookies so usados para gravar alguma informao no


computador cliente. Cada cookie representa um par (nome, valor). Cookies
so teis para armazenar algumas informaes do usurio, tais como a
quantidade de vezes que j visitou a pgina, ou algum dado fornecido numa
visita anterior.
Existem cookies persistentes e cookies de sesso. Os cookies persistentes so
gravados em arquivo e perduram mesmo aps o browser ser fechado, mas
possuem data e hora de expirao. Os cookies de sesso no so
armazenados em disco e permanecem ativos apenas enquanto a sesso do
browser no for encerrada. Por padro, existem algumas limitaes para o uso
de cookies: 300 cookies no total, 4 Kbytes por cookie, 20 cookies por servidor
ou domnio.
Para gravar cookies no cliente, deve ser utilizada a funo setcookie(), que
possui a seguinte assinatura:

int setcookie(string nome, string valor, int exp, string path, string dominio, int segura);

onde:
n
nome - nome do cookie;
n
valor - valor armazenado no cookie;
ELFS, 2003

172

Recursos PHP para a Internet


n

n
n
n

exp - data de expirao do cookie (opcional). Se no for definida, o


cookie ser de sesso;
path - path do script que gravou o cookie;
dominio - domnio responsvel pelo cookie;
segura - o valor 1 indica que o cookie s pode ser transmitido por uma
conexo segura (https).

Exemplo: setcookie("Campus", "FEG", time()+3600);


Neste caso, ser gravado um cookie de nome "Campus" e valor "FEG", com
tempo de expirao de uma hora (3600 segundos alm do horrio atual).

Importante: Cookies s podem ser gravados antes do envio de qualquer


informao para o cliente. Portanto todas as chamadas funo setcookie()
devem ser feitas antes do envio de qualquer header ou texto.

Existem duas formas de recuperar cookies gravados por scripts PHP:


n
acessando o array $HTTP_COOKIE_VARS[] com ndice igual ao nome do
cookie;
n
acessando uma varivel $nome, onde nome o nome do cookie.
Por exemplo, para recuperar o valor do cookie acima podemos escrever:
$HTTP_COOKIE_VARS["Campus"] ou
$Campus

ELFS, 2003

173

Recursos PHP para a Internet


aula07_05.htm
<html>
<head>
<title>Exemplo de Cookie</title>
</head>
<body>
<h2>Exemplo de Cookie</h2>
<form action="aula07_05.php" method="post">
<p>Nome: <input type="text" name="Nome"></p>
<p>Valor: <input type="text" name="Valor"></p>
<br>
<p>
<input type="radio" name="Escolha" value="1" checked>Armazenar</input>
<input type="radio" name="Escolha" value="2">Recuperar</input>
</p>
<input type="reset" value="Limpar">
<input type="submit" value="Executar">
</form>
</body>
</html>

O script aula07_05.php ir, com base no valor


da varivel $Escolha, gravar ou recuperar um
cookie de sesso.

ELFS, 2003

174

Recursos PHP para a Internet


aula07_05.php
<?php
if ($Escolha == "1")
Note que a funo setcookie() deve ser executada
{
antes de que algo seja enviado ao cliente.
setcookie($Nome, $Valor);
echo("<html><body>");
echo("<h2>Cookie armazenado: ($Nome, $Valor)</h2>");
}
else
{
$Valor = $HTTP_COOKIE_VARS[$Nome];
if ($Valor == "")
echo("<h2>No existe cookie $Nome!</h2>");
else
echo("<h2>Cookie recuperado: ($Nome, $Valor)</h2>");
}
echo("</body></html>");
?>

Defina alguns cookies e tente recuper-los. Em seguida, feche o browser e


carregue a pgina aula07_05.htm novamente e tente recuperar os cookies
definidos. O que ocorre?

ELFS, 2003

175

Recursos PHP para a Internet


Tratamento de Erros
w A linguagem PHP permite a verificao e o tratamento de erros ocorridos na
execuo de scripts. O tratamento de erros pode ser feito no prprio script. O
PHP possui vrios nveis de erros e avisos, os quais so estabelecidos por
constantes pr-definidas (ou por valores inteiros).
w Algumas constantes de erro:
Constante

Valor

E_ERROR

Erros fatais (no podem ser recuperados), tais como: erros de


alocao de memria.

E_WARNING

Advertncias (a execuo do script no interrompida).

E_PARSE

Erros de sintaxe (parse errors).

E_NOTICE

Notificaes de possveis erros (avisos sobre possveis erros no


cdigo do script). Interessante para a depurao do script.

E_ALL

2047

Significado

Todos os erros e advertncias.

O padro do PHP o nvel E_ALL & ~E_NOTICE, ou seja, mostrar todos os


erros exceto as notificaes. Isto pode ser alterado em tempo de execuo,
chamando a funo error_reporting(nvel) com o nvel desejado. Por exemplo,
error_reporting(E_ERROR | E_WARNING | E_PARSE), o que equivalente a
error_reporting(7). Note que 7 = 1 + 2 + 4, que so os valores inteiros
associados s constantes E_ERROR, E_WARNING e E_PARSE.

ELFS, 2003

176

Recursos PHP para a Internet


w

w
w

Com o nvel 0 (zero) nenhum aviso ou mensagem de erro ser gerada em


tempo de execuo. Neste caso, podemos usar a varivel $php_errormsg que
conter o ltimo erro gerado pelo script, para criar rotinas especficas de
tratamento de erros e para personalizar mensagens de erro para o usurio.
Para criar rotinas de tratamento de erros e para a exibio de todas as
mensagens de erro preciso configurar o arquivo c:\apache\php\php.ini,
alterando a diretiva track_erros para: track_errors = on.
Exemplo. O script a seguir ir criar um arquivo erro.log (em formato XML) e
ir enviar um e-mail com as mensagens de erro.
aula07_06.php
<?php
// Inibir a exibio automtica de erros
error_reporting(0);
// Funo de tratamento de erros
function TrataErro($errno, $errmsg, $filename, $linenum) {
// Data e hora para mensagem de erro
A funo para tratamento de erros
$dhora = date("Y-m-d H:i:s");
definida pelo usurio deve ter dois
parmetros obrigatrios: o nmero do erro e
// Vetor de tipos de erro.
um string descrevendo o erro. A funo
$errortype = array (
pode ter trs outros parmetros opcionais: o
1
=> "Erro",
nome do arquivo onde o erro ocorreu, o
2
=> "Advertncia",
4
=> "Erro de sintaxe", nmero da linha onde o erro ocorreu, e o
contexto no qual o erro ocorreu.

ELFS, 2003

177

Recursos PHP para a Internet


8
=>
16 =>
32 =>
64 =>
128 =>
256 =>
512 =>
1024=>
);

"Notificao",
"Erro do interpretador PHP",
"Advertncia do interpretador PHP",
"Erro de compilao",
"Advertncia de compilao",
"Erro definido pelo usurio",
"Advertncia definida pelo usurio",
"Notificao definida pelo usurio"

// Estabelecer os tipos para os quais sero exibidas mensagens de erro


$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$erro
$erro
$erro
$erro
$erro

= "<erro>\r\n";
.= "\t<data-e-hora>".$dhora."</data-e-hora>\r\n";
.= "\t<numero-do-erro>".$errno."</numero-do-erro>\r\n";
.= "\t<tipo-do-erro>".$errortype[$errno]."</tipo-do-erro>\r\n";
.= "\t<mensagem>".$errmsg."</mensagem>\r\n";

if (in_array($errno, $user_errors))
$erro .= "\t<comentrio>Mensagem do usurio!!</comentrio>\r\n";
$erro .= "\t<script>".$filename."</script>\r\n";
$erro .= "\t<linha-no-script>".$linenum."</linha-no-script>\r\n";
$erro .= "</erro>\r\n";

ELFS, 2003

178

Recursos PHP para a Internet


// Para testar
// echo $erro;
// Salvar arquivo erro.log e enviar e-mail caso haja erro crtico
error_log($erro, 3, "erro.log");
if ($errno == E_USER_ERROR)
mail("seu_email@feg.unesp.br","Erro Crtico",$erro);
}
function distancia($vect1, $vect2) {
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Parmetros incorretos (so esperados vetores).",
E_USER_ERROR);
A funo trigger_error gera uma
return NULL;
mensagem de erro, advertncia ou
}
notificao definida pelo usurio.
if (count($vect1) != count($vect2)) {
trigger_error("Vetores precisam ser do mesmo tamanho.",
E_USER_ERROR);
return NULL;
}
for ($i=0; $i<count($vect1); $i++) {
$c1 = $vect1[$i];
$c2 = $vect2[$i];
$d = 0.0;
ELFS, 2003

179

Recursos PHP para a Internet


if (!is_numeric($c1)) {
trigger_error("Coordenada $i no vetor 1 considerada como zero.",
E_USER_WARNING);
$c1 = 0.0;
}
if (!is_numeric($c2)) {
trigger_error("Coordenada $i no vetor 2 considerada como zero.",
E_USER_WARNING);
$c2 = 0.0;
}
$d += $c2*$c2 - $c1*$c1;
A funo set_error_handler estabelece uma
}
funo definida pelo usurio para o tratamento de
return sqrt($d);
erros, advertncias ou notificaes. A funo
}
retorna o tratador de erro anterior (caso exista).
$old_error_handler = set_error_handler("TrataErro");
// Constante indefinida, gerar uma advertncia.
$t = NAO_ESTOU_DEFINIDA;
//
$a
$b
$c

ELFS, 2003

Definir alguns vetores


= array(2,3,"bobo");
= array(5.5, 4.3, -1.6);
= array (1,-3);

180

Recursos PHP para a Internet


// Gerar um erro de usurio
$t1 = distancia($c,$b)."\n";
// Gerar outro erro
$t2 = distancia($b,"eu no sou um vetor")."\n";
// Gerar uma advertncia
$t3 = distancia($a,$b)."\n";
?>
A funo error_log envia uma mensagem de erro para o servidor web, para uma porta TCP ou para
um arquivo. O segundo parmetro da funo especifica qual deve ser o destino da mensagem. Os
valores possveis so:
0 - a mensagem enviada para o sistema de log mantido pelo PHP (ou para um arquivo,
dependendo de como est configurada a diretiva error_log).
1 - a mensagem enviada por e-mail para o endereo especificado no terceiro parmetro.
2 - a mensagem enviada para um endereo IP (e, opcionalmente, para uma porta) estabelecido no
terceiro parmetro.
3-

ELFS, 2003

181

Recursos PHP para a Internet


w

Exerccio. Criar um site para manuteno do quadro de horrios de uma


escola. Considere as seguintes funcionalidades:
Crie um novo banco de dados MySQL horario
contendo duas tabelas: horario, com campos
codhora (smallint) e horario (varchar(11)) e
disciplinas, com campos coddisc(smallint) e
nomedisc (varchar(20)).
O boto Executar dever executar a operao
de banco de dados selecionada (Incluir, Excluir
ou Alterar) correspondente aos dados
estabelecidos nos campos Dia, Horrio e
Disciplina.

w
w

O boto Mostrar dever exibir o quadro de horrio atual como um documento


HTML, de acordo com as informaes armazenadas no banco de dados.
O boto Enviar dever enviar uma mensagem com as informaes do quadro
de horrio atual para um endereo de e-mail.

ELFS, 2003

182

Você também pode gostar