7. Recursos PHP para a Internet
w
Protocolo HTTP
. Na aula passada vimos um script simples de autenticação de
usuários. Neste script foi usado o tag META para passar uma URL ao servidor
web. A linguagem PHP dispõe da função
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>
aula07_01.htm
<?php
function validar($login, $senha) {
// Inserir aqui o código de validação return (($login == "senne") &&
($senha == "feg2003")); }
// Aqui comeca o script principal if (validar($login,$senha))
header("Location: http://localhost/DAIaula07/autoriza.php"); else
echo("<h1>Usuário não autorizado!!!</h1>"); ?>
aula07_01.php
Note que com o protocolo HTTP é possível executar um script PHP a partir de outro script PHP.
Recursos PHP para a Internet
w
Exercício
. Considere uma página como mostra a figura abaixo. Implementar o
script
aula07_02.php
que exibe a página da instituição selecionada.
w
. A função
mail()
do PHP deve ser usada para envio de e-mail. Sua
sintaxe é a seguinte:
mail(Destinatário, Assunto, Mensagem, Informações_Adicionais);
Exemplo:
aula07_02.htm
Considere que, para serem enviados, os dados devem
satisfazer as seguintes condições:
•
Todos os campos são obrigatórios;
•
A consistência do campo e-mail deve ser feita
verificando apenas a existência do caractere @;
•
O campo telefone deve ter sete ou oito caracteres.
Recursos PHP para a Internet
<?php
$erro = "";
if ($nome == "")
$erro .= "O nome não foi digitado.<br>";
if ((strlen($telefone) > 8) || (strlen($telefone) < 7))
$erro .= "O número do telefone deve ter sete ou oito caracteres.<br>"; if (strpos ($email, "@") == 0)
$erro .= "O e-mail fornecido não é válido.<br>";
echo("<html><title>Envio de formulário</title><body>\n"); if ($erro == "")
{
// Não houve erro no preenchimento do formulário mail("seu_email@feg.unesp.br",
"Dados do Formulário",
"Nome: $nome\n Telefone: $telefone\n E-mail: $email"); echo("Obrigado por enviar seus dados!\n");
} else
echo("Seus dados não foram enviados!<br>
Verifique as mensagens de erro abaixo:<br><br><b> $erro </b>"); echo("</body></html>");
?>
aula07_03.php
Note nas atribuições à variável $erro o uso combinado dos operadores de concatenação ( . ) e de atribuição ( = ) resultando no operador ( .= ). Escrever $erro .= "string" é equivalente a
escrever: $erro = $erro . "string"
Para usar a função mail é preciso configurar a sessão
[mail function] do arquivo c:\apache\php\php.ini:
SMTP = mail.feg.unesp.br
Recursos PHP para a Internet
w
Upload de arquivos
. Existe um tipo de campo de formulário que permite o
envio de arquivos da máquina do usuário para o servidor. Isto é muito útil
para enviar um arquivo para o servidor sem a necessidade de liberação de um
acesso por FTP. Exemplo:
<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> aula07_04.htm <?php echo("<html><body>");
if (($arq == "none") or ($arq_name == "")) {
echo("<p>Arquivo não especificado!</p>");
echo("<p><a href=javascript:history.back();>Voltar</a></p>"); }
aula07_04.php
Neste caso, como o nome do campo é arq, o script PHP terá acesso a duas variáveis: $arq (arquivo temporário referente ao arquivo especificado após clique no botão Browse...) e
$arq_name (nome do arquivo). Se o botão Browse... não
for usado para especificar o arquivo, $arq = "none".
Recursos PHP para a Internet
w
A função
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 gravação para que a cópia seja
realizada. A função retorna
0
(
false
) caso a cópia não seja realizada.
w
Protocolo FTP
. A seqüência de tarefas para uso do protocolo FTP é a seguinte:
Conectar ao servidor, Identificação (login e senha), Envio/Busca de arquivo(s),
Desconectar. Os comandos para cada uma destas tarefas são os seguintes:
$con = ftp_connect('servidor');
$log = ftp_login($con, 'login', 'senha');
ftp_put($con, 'arquivo_remoto', 'arquivo_local', FTP_BINARY);
ftp_quit($con);
else {
$dest = "c:\\apache\\htdocs\\DAIaula07\\".$arq_name; if (copy($arq, $dest) == 0)
echo("<p>Não foi possível copiar o arquivo!</p>"); else
echo("<p>Upload realizado com sucesso!</p>"); }
echo("</body></html>"); ?>
Recursos PHP para a Internet
w
Exercício
. Refazer a aplicação de upload de arquivos de modo a usar o
protocolo FTP. Use o servidor
200.145.11.141
, usuário "
teste_php
" e senha
"
123456789
". Em seguida, experimente fazer o download do arquivo copiado
no servidor para a pasta
c:\temp
.
w
Cookies
. Os cookies são usados para gravar alguma informação no
computador cliente. Cada cookie representa um par (nome, valor). Cookies
são úteis para armazenar algumas informações do usuário, tais como a
quantidade de vezes que já visitou a página, ou algum dado fornecido numa
visita anterior.
w
Existem
cookies persistentes
e
cookies de sessão
. Os cookies persistentes são
gravados em arquivo e perduram mesmo após o browser ser fechado, mas
possuem data e hora de expiração. Os cookies de sessão não são
armazenados em disco e permanecem ativos apenas enquanto a sessão do
browser não for encerrada. Por padrão, existem algumas limitações para o uso
de cookies: 300 cookies no total, 4 Kbytes por cookie, 20 cookies por servidor
ou domínio.
w
Para gravar cookies no cliente, deve ser utilizada a função
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;
Recursos PHP para a Internet
n
exp
- data de expiração do cookie (opcional). Se não for definida, o
cookie será de sessão;
n
path
- path do script que gravou o cookie;
ndominio
- domínio responsável pelo cookie;
n
segura
- o valor 1 indica que o cookie só pode ser transmitido por uma
conexão segura (https).
w
Exemplo:
setcookie("Campus", "FEG", time()+3600);
Neste caso, será gravado um cookie de nome "
Campus
" e valor "
FEG
", com
tempo de expiração de uma hora (3600 segundos além do horário atual).
w
Importante
: Cookies só podem ser gravados antes do envio de qualquer
informação para o cliente. Portanto todas as chamadas à função
setcookie()
devem ser feitas antes do envio de qualquer header ou texto.
w
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 variável $nome, onde nome é o nome do cookie.
Por exemplo, para recuperar o valor do cookie acima podemos escrever:
$HTTP_COOKIE_VARS["Campus"]
ou
Recursos PHP para a Internet
w
O script
aula07_05.php
irá, com base no valor
da variável $Escolha, gravar ou recuperar um
cookie de sessão.
<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>
Recursos PHP para a Internet
w
Defina alguns cookies e tente recuperá-los. Em seguida, feche o browser e
carregue a página
aula07_05.htm
novamente e tente recuperar os cookies
definidos. O que ocorre?
<?php
if ($Escolha == "1") {
setcookie($Nome, $Valor); echo("<html><body>");
echo("<h2>Cookie armazenado: ($Nome, $Valor)</h2>"); }
else {
$Valor = $HTTP_COOKIE_VARS[$Nome]; if ($Valor == "")
echo("<h2>Não existe cookie $Nome!</h2>"); else
echo("<h2>Cookie recuperado: ($Nome, $Valor)</h2>"); }
echo("</body></html>"); ?>
aula07_05.php
Note que a função setcookie() deve ser executada antes de que algo seja enviado ao cliente.
Recursos PHP para a Internet
Tratamento de Erros
w
A linguagem PHP permite a verificação e o tratamento de erros ocorridos na
execução de scripts. O tratamento de erros pode ser feito no próprio script. O
PHP possui vários níveis de erros e avisos, os quais são estabelecidos por
constantes pré-definidas (ou por valores inteiros).
w
Algumas constantes de erro:
w
O padrão do PHP é o nível
E_ALL & ~E_NOTICE
, ou seja, mostrar todos os
erros exceto as notificações. Isto pode ser alterado em tempo de execução,
chamando a função
error_reporting(nível)
com o nível 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 são os valores inteiros
associados às constantes E_ERROR, E_WARNING e E_PARSE.
Todos os erros e advertências. 2047
E_ALL
Notificações de possíveis erros (avisos sobre possíveis erros no código do script). Interessante para a depuração do script. 8
E_NOTICE
Erros de sintaxe (parse errors). 4
E_PARSE
Advertências (a execução do script não é interrompida). 2
E_WARNING
Erros fatais (não podem ser recuperados), tais como: erros de alocação de memória. 1 E_ERROR Significado Valor Constante
Recursos PHP para a Internet
w
Com o nível 0 (
zero
) nenhum aviso ou mensagem de erro será gerada em
tempo de execução. Neste caso, podemos usar a variável
$php_errormsg
que
conterá o último erro gerado pelo script, para criar rotinas específicas de
tratamento de erros e para personalizar mensagens de erro para o usuário.
w
Para criar rotinas de tratamento de erros e para a exibição de todas as
mensagens de erro é preciso configurar o arquivo
c:\apache\php\php.ini
,
alterando a diretiva track_erros para:
track_errors = on
.
w
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.
<?php
// Inibir a exibição automática de erros error_reporting(0);
// Função de tratamento de erros
function TrataErro($errno, $errmsg, $filename, $linenum) { // Data e hora para mensagem de erro
$dhora = date("Y-m-d H:i:s"); // Vetor de tipos de erro. $errortype = array (
1 => "Erro",
2 => "Advertência",
4 => "Erro de sintaxe",
aula07_06.php
A função para tratamento de erros definida pelo usuário deve ter dois
parâmetros obrigatórios: o número do erro e um string descrevendo o erro. A função pode ter três outros parâmetros opcionais: o nome do arquivo onde o erro ocorreu, o número da linha onde o erro ocorreu, e o contexto no qual o erro ocorreu.
Recursos PHP para a Internet
8 => "Notificação", 16 => "Erro do interpretador PHP", 32 => "Advertência do interpretador PHP", 64 => "Erro de compilação", 128 => "Advertência de compilação", 256 => "Erro definido pelo usuário",512 => "Advertência definida pelo usuário", 1024=> "Notificação definida pelo usuário" );
// Estabelecer os tipos para os quais serão exibidas mensagens de erro $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$erro = "<erro>\r\n"; $erro .= "\t<data-e-hora>".$dhora."</data-e-hora>\r\n"; $erro .= "\t<numero-do-erro>".$errno."</numero-do-erro>\r\n"; $erro .= "\t<tipo-do-erro>".$errortype[$errno]."</tipo-do-erro>\r\n"; $erro .= "\t<mensagem>".$errmsg."</mensagem>\r\n"; if (in_array($errno, $user_errors))
$erro .= "\t<comentário>Mensagem do usuário!!</comentário>\r\n"; $erro .= "\t<script>".$filename."</script>\r\n";
$erro .= "\t<linha-no-script>".$linenum."</linha-no-script>\r\n"; $erro .= "</erro>\r\n";
Recursos PHP para a Internet
// Para testar // echo $erro;
// Salvar arquivo erro.log e enviar e-mail caso haja erro crítico error_log($erro, 3, "erro.log");
if ($errno == E_USER_ERROR)
mail("seu_email@feg.unesp.br","Erro Crítico",$erro); }
function distancia($vect1, $vect2) {
if (!is_array($vect1) || !is_array($vect2)) {
trigger_error("Parâmetros incorretos (são esperados vetores).", E_USER_ERROR);
return NULL; }
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;
A função trigger_error gera uma mensagem de erro, advertência ou notificação definida pelo usuário.
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; } return sqrt($d); } $old_error_handler = set_error_handler("TrataErro"); // Constante indefinida, gerar uma advertência.
$t = NAO_ESTOU_DEFINIDA; // Definir alguns vetores $a = array(2,3,"bobo");
$b = array(5.5, 4.3, -1.6); $c = array (1,-3);
A função set_error_handler estabelece uma função definida pelo usuário para o tratamento de erros, advertências ou notificações. A função
Recursos PHP para a Internet
// Gerar um erro de usuário $t1 = distancia($c,$b)."\n"; // Gerar outro erro
$t2 = distancia($b,"eu não sou um vetor")."\n"; // Gerar uma advertência
$t3 = distancia($a,$b)."\n"; ?>
A função error_log envia uma mensagem de erro para o servidor web, para uma porta TCP ou para um arquivo. O segundo parâmetro da função especifica qual deve ser o destino da mensagem. Os valores possíveis são:
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 endereço especificado no terceiro parâmetro.
2 - a mensagem é enviada para um endereço IP (e, opcionalmente, para uma porta) estabelecido no
terceiro parâmetro.