Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma...

77
Sistemas de Informação Curso Técnico de Multimédia Módulo 5 - PHP

Transcript of Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma...

Page 1: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

Sistemas de Informação

Curso Técnico de Multimédia

Módulo 5 - PHP

Page 2: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

2

Índice Capítulo I - Introdução ao PHP ............................................................................................... 7

O que se deve saber antes de começar? .............................................................................. 7

O que é o PHP? ................................................................................................................ 7

1. Client-Side Scripts ..................................................................................................... 7

2. Server-Side Scripts .................................................................................................... 7

Exemplos de Server-Side scripts ..................................................................................... 8

Capítulo II - PHP .................................................................................................................. 9

Sintaxe ........................................................................................................................... 9

Comentários em PHP....................................................................................................... 10

Exemplo ..................................................................................................................... 10

Variáveis ....................................................................................................................... 10

Exemplo: ................................................................................................................... 10

Regras da definição de variáveis ................................................................................... 11

Strings .......................................................................................................................... 11

Exemplo ..................................................................................................................... 11

Operadores para manipular strings ................................................................................... 11

Concatenação ............................................................................................................. 11

Exemplo ..................................................................................................................... 11

strlen() ...................................................................................................................... 12

Exemplo ..................................................................................................................... 12

strpos() ..................................................................................................................... 12

Exemplo ..................................................................................................................... 12

Operadores .................................................................................................................... 12

Operadores aritméticos ................................................................................................ 12

Operadores de atribuição ............................................................................................. 13

Operadores de comparação .......................................................................................... 13

Capítulo III - Comandos de Selecção .................................................................................... 14

If...Else e ElseIf .......................................................................................................... 14

If...Else ......................................................................................................................... 14

Sintaxe ...................................................................................................................... 14

Exemplo ..................................................................................................................... 15

ElseIf ............................................................................................................................ 15

Sintaxe ...................................................................................................................... 15

Exemplo ..................................................................................................................... 15

Sintaxe ...................................................................................................................... 16

Exemplo ..................................................................................................................... 17

Capítulo IV - Ciclos de repetição .......................................................................................... 17

While ............................................................................................................................ 18

Sintaxe ...................................................................................................................... 18

Exemplo ..................................................................................................................... 18

Do...while ...................................................................................................................... 18

Sintaxe ...................................................................................................................... 18

Exemplo ..................................................................................................................... 18

For ............................................................................................................................... 19

Page 3: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

3

Sintaxe ...................................................................................................................... 19

Exemplo ..................................................................................................................... 19

Foreach ......................................................................................................................... 19

Sintaxe ...................................................................................................................... 19

Exemplo ..................................................................................................................... 19

Capítulo V - Arrays / Vetores ............................................................................................... 20

Vetores numéricos .......................................................................................................... 20

Exemplo de definição 1 ................................................................................................ 20

Exemplo de definição 2 ................................................................................................ 20

Exemplo de utilização: ................................................................................................. 21

Vetores associativos ....................................................................................................... 21

Exemplo de definição 1 ................................................................................................ 21

Exemplo de definição 2 ................................................................................................ 21

Exemplo de utilização .................................................................................................. 21

Vetores multidimensionais ............................................................................................... 22

Exemplo 1 .................................................................................................................. 22

Exemplo 2 .................................................................................................................. 23

Capítulo VI - Funções ......................................................................................................... 23

Criar uma função ............................................................................................................ 23

Exemplo ..................................................................................................................... 24

Chamar uma função ........................................................................................................ 24

Exemplo ..................................................................................................................... 24

Adicionar parâmetros ...................................................................................................... 25

Exemplo 1 .................................................................................................................. 25

Exemplo 2 .................................................................................................................. 25

Devolução de valores ...................................................................................................... 26

Exemplo ..................................................................................................................... 26

Capítulo VII - Formulários e Input de utilizador ...................................................................... 27

Lidar com formulários em PHP .......................................................................................... 27

Exemplo de formulário: ................................................................................................ 27

Validação de formulários ................................................................................................. 27

$_GET ........................................................................................................................... 28

A variável $_GET ........................................................................................................ 28

Exemplo ..................................................................................................................... 28

Porquê usar o $_GET? ................................................................................................. 29

$_POST ......................................................................................................................... 29

A variável $_POST ....................................................................................................... 29

Exemplo ..................................................................................................................... 29

Porquê usar o $_POST? ................................................................................................ 29

No entanto, não é possível marcar a página. ...................................................................... 30

$_REQUEST ................................................................................................................... 30

A variável $_REQUEST ................................................................................................. 30

Exemplo ..................................................................................................................... 30

Capítulo VIII - Date() ......................................................................................................... 30

Sintaxe ......................................................................................................................... 30

Page 4: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

4

Formatar Data................................................................................................................ 30

Exemplo ..................................................................................................................... 30

Adicionar o Timestamp .................................................................................................... 31

mktime() ................................................................................................................... 31

Sintaxe ...................................................................................................................... 31

Exemplo ..................................................................................................................... 31

Capítulo IX - Inclusão de Ficheiros ....................................................................................... 32

Server Side Includes ....................................................................................................... 32

Include() ....................................................................................................................... 32

Exemplo 1 .................................................................................................................. 32

Exemplo 2 .................................................................................................................. 33

Require() ....................................................................................................................... 34

Exemplo include() ....................................................................................................... 34

Exemplo require() ....................................................................................................... 35

Capítulo X - Ficheiros ......................................................................................................... 36

Fopen() - abrir um ficheiro............................................................................................... 36

Exemplo 1 .................................................................................................................. 36

Exemplo 2 .................................................................................................................. 36

Fclose() - fechar um ficheiro ............................................................................................ 37

Exemplo ..................................................................................................................... 37

Feof() - verificar se está no fim do ficheiro ......................................................................... 37

Exemplo ..................................................................................................................... 37

Fgets() - ler um ficheiro linha a linha ................................................................................ 37

Exemplo ..................................................................................................................... 37

Fgetc() - ler um ficheiro carácter a carácter ....................................................................... 38

Exemplo ..................................................................................................................... 38

Criar um ficheiro upload de um formulário ......................................................................... 38

Exemplo ..................................................................................................................... 38

Criar o script de envio de ficheiro ..................................................................................... 39

Exemplo ..................................................................................................................... 39

Restrições de envio ......................................................................................................... 40

Exemplo ..................................................................................................................... 40

Gravar ficheiros enviados ................................................................................................ 41

Exemplo ..................................................................................................................... 41

O que é um cookie? ........................................................................................................ 43

Como criar um cookie? .................................................................................................... 43

Sintaxe ...................................................................................................................... 43

Exemplo ..................................................................................................................... 43

Como definir o valor de um cookie? .................................................................................. 44

Exemplo 1 .................................................................................................................. 44

Exemplo 2 .................................................................................................................. 44

Como apagar um cookie? ................................................................................................ 45

Exemplo ..................................................................................................................... 45

E se um browser não suportar cookies? ............................................................................. 45

Exemplo: ................................................................................................................... 45

Page 5: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

5

Capítulo XIII - Sessões ....................................................................................................... 46

Variáveis de sessão ........................................................................................................ 46

Começar uma sessão ...................................................................................................... 47

Exemplo ..................................................................................................................... 47

Armazenar uma variável de sessão ................................................................................... 47

Exemplo 1 .................................................................................................................. 47

Exemplo 2 .................................................................................................................. 48

Eliminar uma sessão ....................................................................................................... 48

Exemplo 1 .................................................................................................................. 48

Exemplo 2 .................................................................................................................. 49

Capítulo XIV - Envio de emails ............................................................................................. 49

Mail() ............................................................................................................................ 49

Sintaxe ...................................................................................................................... 49

Email simples ................................................................................................................. 50

Exemplo ..................................................................................................................... 50

Formulários de email....................................................................................................... 50

Exemplo ..................................................................................................................... 50

Email Injections ............................................................................................................. 51

Exemplo ..................................................................................................................... 52

Parar Email Injections ..................................................................................................... 53

Exemplo ..................................................................................................................... 53

Capítulo XV - Tratamento de erros ....................................................................................... 55

Tratamento básico de erros: die() .................................................................................... 55

Exemplo ..................................................................................................................... 55

Criar um tratamento de Custom Error ............................................................................... 56

Sintaxe ...................................................................................................................... 56

Error Report levels .......................................................................................................... 57

Exemplo ..................................................................................................................... 57

Tratamento de erros: set_error_handler() ......................................................................... 58

Exemplo ..................................................................................................................... 58

Captura de erros: trigger_error() ...................................................................................... 59

Exemplo ..................................................................................................................... 59

Exemplo ..................................................................................................................... 59

Registo de erros: error_log() ........................................................................................... 60

Enviar uma mensagem de erro por email ....................................................................... 60

Exemplo ..................................................................................................................... 60

Capítulo XVI - Tratamento de excepções ............................................................................... 61

Uso básico de excepções ................................................................................................. 62

Exemplo ..................................................................................................................... 62

Try, throw e catch .......................................................................................................... 63

Exemplo ..................................................................................................................... 63

Explicação do exemplo ................................................................................................. 64

Criar uma classe customException .................................................................................... 64

Exemplo ..................................................................................................................... 64

Explicação do exemplo ................................................................................................. 65

Page 6: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

6

Múltiplas excepções ........................................................................................................ 65

Exemplo ..................................................................................................................... 65

Explicação do exemplo ................................................................................................. 66

Relançamento de excepções ............................................................................................ 67

Exemplo ..................................................................................................................... 67

Explicação do exemplo ................................................................................................. 68

Set_Exception_Handler ................................................................................................... 69

Exemplo ..................................................................................................................... 69

Regras para excepções .................................................................................................... 69

Capítulo XVII - Filtros ......................................................................................................... 70

Porquê usar filtros? ......................................................................................................... 70

O que são dados externos?........................................................................................... 70

Funções e filtros ............................................................................................................. 70

Exemplo ..................................................................................................................... 71

Validação e Saneamento ................................................................................................. 71

Opções e bandeiras ........................................................................................................ 72

Exemplo ..................................................................................................................... 72

Validação de dados introduzidos ....................................................................................... 72

Exemplo ..................................................................................................................... 73

Explicação do exemplo ................................................................................................. 73

Sanear a introdução de dados .......................................................................................... 73

Exemplo ..................................................................................................................... 74

Explicação do exemplo ................................................................................................. 74

Filtrar introduções múltiplas ............................................................................................. 74

Exemplo ..................................................................................................................... 75

Explicação do exemplo ................................................................................................. 75

Filter Callback ................................................................................................................ 76

Exemplo ..................................................................................................................... 76

Explicação do exemplo ................................................................................................. 77

Page 7: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

7

Capítulo I - Introdução ao PHP

Um ficheiro de PHP contém texto, tags de HTML e scripts. Scrips de PHP são

executáveis apenas no servidor.

O que se deve saber antes de começar?

Antes de se começar a estudar PHP devemos ter já noções de:

• HTML

• Alguns scripts (por exemplo javascript)

O que é o PHP?

• PHP significa: Hypertext Preprocessor.

• PHP é uma linguagem de criação de scripts embutida em HTML no

servidor.

1. Client-Side Scripts

São responsáveis pelas acções executadas no browser, sem contacto com o

servidor. Os exemplos mais comuns de aplicações client-side são imagens e

textos que mudam com o passar do rato e os javascripts.

Os scripts client-side são muito úteis para fazer validações de formulários sem

utilizar processamento do servidor, não provocando com isso tráfego na rede.

2. Server-Side Scripts

São responsáveis pelas acções executadas no servidor. Os exemplos mais

comuns de aplicações server-side são os scripts cgi´s e php.

Page 8: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

8

No momento em que o utilizador solicita uma URL, o servidor apresentará no

browser um código HTML dinâmico, isto é muito útil para construções de

aplicações baseadas em informações on-line.

O PHP é uma linguagem de programação server-side scripts para criar sites

dinâmicos.

Sites dinâmicos são aqueles que devolvem para o cliente uma página criada em

tempo real.

Exemplos de Server-Side scripts

• Sistemas de busca (www.yahoo.com, www.cade.com.br, etc...); nele,

quando se escreve a palavra chave da busca e clica no botão pesquisar o

resultado da busca é processado online;

• Salas de chat; nelas, quando se escreve e clica no botão enviar, as

informações são processadas em tempo real conjuntamente com a dos

outros utilizadores, resultando num código HTML dinâmico gerado do

servidor para o cliente.

Page 9: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

9

Utilizando a linguagem PHP é permitida a interacção directa do utilizador com o

site, através de formulários, contadores de acesso, estatísticas do site, ou criar

aplicações para uma rede local baseadas numa Intranet.

Aplicações em PHP são geradas com excelente performance e automaticamente

pelo servidor. O utilizador não vê o código PHP, somente o HTML; isto é muito

importante quando se lida com senhas.

Capítulo II - PHP

Sintaxe

O utilizador não consegue ver o código de PHP seleccionando para ver o código

fonte no browser, só se pode ver o código de HTML, isto porque o script é

executado no lado do servidor antes do resultado ser enviado para o browser.

Um script de PHP começa sempre com:

• <?php

E termina com

• ?>

Um ficheiro de PHP contém tags de HTML e algum código PHP.

<html>

<body>

<?php echo "Hello World";

?>

</body> </html>

Page 10: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

10

Cada linha de PHP termina com ponto e vírgula.

Existem dois comandos pare escrever texto com PHP

• echo

• print

Comentários em PHP

• // - para uma simples linha

• /* ... */ - para um bloco de linhas.

Exemplo

<html> <body> <?php

//This is a comment /* This is a comment block */

?>

</body> </html>

Variáveis

As variáveis são utilizadas para guardar valores, tais como números, palavras ou

resultado de funções, podendo ser usadas várias vezes no código.

Todas as variáveis em PHP começam com o símbolo $.

A forma correcta de definir uma variável é:

$var_name = value;

Exemplo:

<?php

$txt = "Hello World!";

$number = 16;

?>

No PHP uma variável não precisa de ser declarada antes de ser inicializada.

Page 11: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

11

Regras da definição de variáveis

• O nome de uma variável precisa de começar com uma letra ou underscore

(_)

• O nome só poderá conter alfanuméricos e underscore (a-Z, 0-9, _)

• O nome de uma variável não poderá conter espaços em branco.

Strings

As variáveis string são usadas para guardar valores que contenham caracteres.

Exemplo

<?php

$txt="Hello World";

echo $txt;

?>

O resultado será:

Hello World

Operadores para manipular strings

Concatenação

Só existe um operador em PHP para strings, a concatenação – duas strings são

agrupadas numa só.

Exemplo

<?php

$txt1="Hello World";

$txt2="1234";

echo $txt1 . " " . $txt2;

?>

O resultado será:

Hello World 1234

Page 12: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

12

strlen()

strlen() – indica o tamanho de uma string.

Exemplo

<?php

echo strlen("Hello world!");

?>

O resultado será:

12

strpos()

strpos() – procura uma string dentro de outra se encontra, devolve a posição

onde esta ocorre pela primeira vez, caso contrário retorna Falso.

Exemplo

<?php

echo strpos("Hello world!","world");

?>

O resultado sera:

6

Nota: A primeira posição será a posição 0

Operadores

Operadores aritméticos

Operador Descrição Exemplo Resultado

+ Adição x=2

x+2

4

- Subtracção x=2

5-x

3

* Multiplicação x=4 20

Page 13: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

13

x*5

/ Divisão 15/5 5/2

3 2.5

% Modulo (resto da divisão) 5%2

10%8 10%2

1

2 0

++ Incremento x=5 x++

x=6

-- Decremento x=5

x--

x=4

Operadores de atribuição

Operador Exemplo Equivale a

= x=y x=y

+= x+=y x=x+y

-= x-=y x=x-y

*= x*=y x=x*y

/= x/=y x=x/y

.= x.=y x=x.y

%= x%=y x=x%y

Operadores de comparação

Operador Descrição Exemplo

== É igual a 5==8 devolve falso

!= Não é igual a 5!=8 devolve verdadeiro

> É maior que 5>8 devolve falso

< É menor que 5<8 devolve verdadeiro

>= É maior ou igual que 5>=8 devolve falso

<= É menor ou igual que 5<=8 devolve verdadeiro

Page 14: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

14

Operadores lógicos

Operador Descrição Exemplo

&& e x=6

y=3

(x < 10 && y > 1) devolve

verdadeiro

|| ou x=6

y=3

(x==5 || y==5) devolve falso

! não x=6

y=3

!(x==y) devolve verdadeiro

Capítulo III - Comandos de Selecção

If...Else e ElseIf

Os comandos if, elseif e else em PHP são usados em diferentes acções, baseadas

em diferentes condições.

• if...else – é usado quando se que executar um bloco de instruções quando

a condição é verdadeira e outro quando a condição é verdadeira.

• elseif – é usado juntamente com o if…else para executar um bloco de

instruções se uma de várias condições for verdadeira.

If...Else

Sintaxe

if (condição)

código para ser executado se a condição for verdadeira;

else

código para ser executado se a condição for falsa;

Page 15: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

15

Exemplo

Este exemplo escreve "Have a nice weekend!" se o dia corrente for Sexta-Feira,

caso contrário escreve "Have a nice day!":

<?php

$d=date("D");

if ($d=="Fri")

echo "Have a nice weekend!";

else

echo "Have a nice day!";

?>

Se o código a ser executado tiver mais que uma linha, então serão necessárias

chavetas

ElseIf

Sintaxe

if (condição)

código para ser executado se a condição for verdadeira;

elseif (condição)

código para ser executado se a condição for verdadeira;

else

código para ser executado se a condição for falsa;

Exemplo

Este exemplo escreve "Have a nice weekend!" se o dia corrente for Sexta-Feira,

escreve "Have a nice Sunday!" se o dia corrente for Domingo caso contrário

escreve "Have a nice day!":

<html>

<body>

<?php

$d=date("D");

if ($d=="Fri")

Page 16: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

16

echo "Have a nice weekend!";

elseif ($d=="Sun")

echo "Have a nice Sunday!";

else

echo "Have a nice day!";

?>

</body>

</html>

Switch

Se queremos seleccionar um de vários blocos de código a executar, usamos o

comando Switch

Sintaxe

switch (expressao1)

{

case valor1:

código a executar se expressão1 = valor1;

break;

case valor2:

código a executar if expressão1 = valor2;

break;

default:

código a executar se expressão1 diferebte de valor1 e valor2

}

Notas:

• Depois de um bloco de código convém colocar break para que se saia do

switch;

• Default é usado no caso nenhum dos casos anteriores ser verdadeiro

Page 17: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

17

Exemplo

<html>

<body>

<?php

switch ($x)

{

case 1:

echo "Number 1";

break;

case 2:

echo "Number 2";

break;

case 3:

echo "Number 3";

break;

default:

echo "No number between 1 and 3";

}

?>

</body>

</html>

Capítulo IV - Ciclos de repetição

Os ciclos de repetição em PHP são usados para executar um mesmo bloco de

código um número específico de vezes.

Em PHP existem os seguinte ciclos de repetição:

• while – executa o bloco de instruções se, e enquanto, uma condição se

verificar;

• do...while – executa o bloco de instruções uma vez e repete-o enquanto

uma condição se verificar;

• for – executa o bloco de instruções um numero especificado de vezes;

• foreach – executa o bloco de instruções para cada elemento de um array.

Page 18: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

18

While

Sintaxe

while (condição)

bloco de instruções;

Exemplo

<?php

$i=1;

while($i<=5)

{

echo "The number is " . $i . "<br />";

$i++;

}

?>

Do...while

Sintaxe

do

{

code to be executed;

}while (condition);

Exemplo

<?php

$i=0;

do

{

$i++;

echo "The number is " . $i . "<br />";

}while ($i<5);

?>

Page 19: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

19

For

Sintaxe

for (inicialização; condição; incremento)

{

bloco de instruções;

}

Exemplo

<?php

for ($i=1; $i<=5; $i++)

{

echo "Hello World!<br />";

}

?>

Foreach

Sintaxe

foreach (array contiver um valor)

{

Bloco de instruções;

}

Exemplo

<?php

$arr=array("one", "two", "three");

foreach ($arr as $value)

{

echo "Value: " . $value . "<br />";

}

?>

Page 20: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

20

Capítulo V - Arrays / Vetores

Em vez de termos várias variáveis, podemos criar um vetor onde guardaremos

cada um dos valores das variáveis, desde que estas sejam do mesmo tipo.

Cada elemento de um vetor tem o seu nome para que possa ser facilmente

acedido.

Existem 3 tipos diferentes de vetores:

• vetores numérico

• vetores associativos

• vetores multidimensionais

Vetores numéricos

Um vetor numerico identifica cada elemento com um número.

Existem diferentes formas de criar um vetor numérico:

Exemplo de definição 1

Neste exemplo cria-se e atribuem-se valores simultaneamente ao vetor:

$names = array("Peter","Quagmire","Joe");

Exemplo de definição 2

Neste exemplo a atribuição é manualmente:

$names[0] = "Peter";

$names[1] = "Quagmire";

$names[2] = "Joe";

Page 21: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

21

Exemplo de utilização:

<?php

$names[0] = "Peter";

$names[1] = "Quagmire";

$names[2] = "Joe";

echo $names[1] . " and " . $names[2] .

" are ". $names[0] . "'s neighbors";

?>

Resultado:

Quagmire and Joe are Peter's neighbors

Vetores associativos

Nestes vetores, a cada elemento é associado um valor.

Exemplo de definição 1

$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34);

Exemplo de definição 2

$ages['Peter'] = "32";

$ages['Quagmire'] = "30";

$ages['Joe'] = "34";

Exemplo de utilização

<?php

$ages['Peter'] = "32";

$ages['Quagmire'] = "30";

$ages['Joe'] = "34";

echo "Peter is " . $ages['Peter'] . " years old.";

?>

Resultado

Peter is 32 years old.

Page 22: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

22

Vetores multidimensionais

Num vetor multidimensional cada elemento pode ser também um vetor, e cada

elemento desse vetor um novo vetor, e assim sucessivamente.

Exemplo 1

Neste exemplo vamos criar um vetor multidimensional com atribuição

automática.

$families = array

(

"Griffin"=>array

(

"Peter",

"Lois",

"Megan"

),

"Quagmire"=>array

(

"Glenn"

),

"Brown"=>array

(

"Cleveland",

"Loretta",

"Junior"

)

);

O vetor irá ter o seguinte aspecto:

Array

(

[Griffin] => Array

(

Page 23: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

23

[0] => Peter

[1] => Lois

[2] => Megan

)

[Quagmire] => Array

(

[0] => Glenn

)

[Brown] => Array

(

[0] => Cleveland

[1] => Loretta

[2] => Junior

)

)

Exemplo 2

Para escrever um valor do vetor acima descrito:

echo "Is " . $families['Griffin'][2] .

" a part of the Griffin family?";

O resultado será:

Is Megan a part of the Griffin family?

Capítulo VI - Funções

O grande poder do PHP vem da possibilidade de ter funções.

Criar uma função

Uma função é um bloco de instruções que pode ser executado sempre que

necessário.

Criar funções em PHP:

Page 24: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

24

• Todas as funções começam com: "function()"

• Nome da função – deve permitir que se entenda o que faz peloo seu

nome. O nome de uma função tem de começar por uma letra ou

underscore.

• Depois do nome devemos colocar o código entre "{" e “}”.

Exemplo

Uma função que escreva o nome sempre que chamada

<?php

function writeMyName()

{

echo "Pedro";

}

writeMyName();

?>

Chamar uma função

Exemplo

Como chamar a função acima descrita:

function writeMyName()

{

echo "Pedro";

}

echo "Hello world!<br />";

echo "My name is ";

writeMyName();

echo ".<br />That's right, ";

writeMyName();

echo " is my name.";

?>

O resultado será:

Page 25: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

25

Hello world!

My name is Pedro.

That's right, Pedro is my name.

Adicionar parâmetros

A nossa primeira função (writeMyName()) é um exemplo simples de como se

constrói uma função.

Para adicionar mais funcionalidades numa função podemos acrescentar

parâmetros, tais como variáveis.

Exemplo 1

O próximo exemplo escreve diferentes nomes, mas o mesmo apelido:

<?php

function writeMyName($fname)

{ echo $fname . " Francisco.<br />"; }

echo "My name is ";

writeMyName("Pedro");

echo "My name is ";

writeMyName("José");

echo "My name is ";

writeMyName("Carlos");

?>

O resultado será:

My name is Pedro Francisco.

My name is José Francisco.

My name is Carlos Francisco.

Exemplo 2

A próxima função tem dois parâmetros:

<?php

function writeMyName($fname,$punctuation)

Page 26: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

26

{

echo $fname . " Francisco" . $punctuation . "<br />";

}

echo "My name is ";

writeMyName("Pedro",".");

echo "My name is ";

writeMyName("José","!");

echo "My name is ";

writeMyName("Carlos","...");

?>

O resultado será:

My name is Pedro Francisco.

My name is José Francisco!

My name is Carlos Francisco...

Devolução de valores

As funções em PHP podem também devolver valores:

Exemplo

<?php

function add($x,$y)

{

$total = $x + $y;

return $total;

}

echo "1 + 16 = " . add(1,16);

?>

O resultado será:

1 + 16 = 17

Page 27: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

27

Capítulo VII - Formulários e Input de utilizador

Lidar com formulários em PHP

Quando se lida com formulários de HTML e PHP qualquer elemento de um

formulário de uma página de HTML fica automaticamente válido para os scripts

de PHP.

Exemplo de formulário:

<form action="welcome.php" method="post">

Name: <input type="text" name="name" />

Age: <input type="text" name="age" />

<input type="submit" />

</form>

Este exemplo contém dois campos de introdução e um botão de submissão.

Quando se preenche o formulário e se clica no botão, os dados são enviados para

o ficheiro "welcome.php” que tem o seguinte aspecto:

<html>

<body>

Welcome <?php echo $_POST["name"]; ?>.<br />

You are <?php echo $_POST["age"]; ?> years old.

</body>

</html>

Um output desse ficheiro será, por exemplo:

Welcome John.

You are 28 years old.

Validação de formulários

Os dados introduzidos pelo utilizador deverão ser validados logo que possível. A

validação Cliente-Side é rápida, reduzindo o trabalho do servidor

Page 28: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

28

No entanto, qualquer site que receba um enorme tráfego sobre os recursos do

servidor pode ter problemas a nível da segurança de dados, assim convém

utilizar sempre a validação de dados no Server-Side quando se trata de aceder a

base de dados.

Uma boa forma de validar um formulário no servidor é comentar o formulário

para a página onde este se encontra, em vez de saltar para uma página

diferente. O utilizador terá acesso às mensagens de erro na mesma página que o

formulário. Isto faz com que seja mais fácil de descobrir o erro.

$_GET

A variável $_GET

• A variável $_GET é um vetor de nomes e valores enviado pelo método GET

do HTTP.

• A informação pelo método GET é visível para todos, existindo um limite de

informação a enviar (max. 100 caracteres).

Exemplo

<form action="welcome.php" method="get">

Name: <input type="text" name="name" />

Age: <input type="text" name="age" />

<input type="submit" />

</form>

Quando o utilizador clicar no botão submeter, na barra de endereço aparecerá

algo deste género:

http://www.database.com/welcome.php?name=Peter&age=37

O ficheiro "welcome.php" poderá então usar a variável $_GET para recolher os

dados do formulário (notar que o nome dos campos do formulário serão

automaticamente colocados no vetor correspondente)

Welcome <?php echo $_GET["name"]; ?>.<br />

You are <?php echo $_GET["age"]; ?> years old!

Page 29: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

29

Porquê usar o $_GET?

• Quando se utiliza a variável $ _GET todos os nomes e valores das

variáveis são exibidos no URL. (este método não deve ser usado quando

se enviam passwords ou outras informações sensíveis). No entanto,

porque as variáveis são exibidas no URL, é possível marcar a página, o

que poderá ser útil em alguns casos.

$_POST

A variável $_POST

• A variável $_GET é um vetor de nomes e valores enviado pelo método

POST do HTTP.

• A informação enviada de um formulário pelo método POST é invisível para

outros utilizadores e não existe um limite de informação a enviar.

Exemplo

<form action="welcome.php" method="post">

Enter your name: <input type="text" name="name" />

Enter your age: <input type="text" name="age" />

<input type="submit" />

</form>

Quando o utilizador clicar no botão submeter, na barra de endereço não irá

aparecer nenhum dado do formulário, aparecendo algo deste género:

http://www.database.com/welcome.php

O ficheiro "welcome.php" poderá então usar a variável $_POST para recolher os

dados do formulário (notar que o nome dos campos do formulário serão

automaticamente colocados no vetor correspondente)

Welcome <?php echo $_POST["name"]; ?>.<br />

You are <?php echo $_POST["age"]; ?> years old!

Porquê usar o $_POST?

• As variáveis enviadas com o POST do HTTP não são mostradas no URL

Page 30: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

30

• As variáveis não têm limite de comprimento

No entanto, não é possível marcar a página.

$_REQUEST

A variável $_REQUEST

• A variável $ _REQUEST do PHP contém o conteúdo de ambos $ _GET, $

_POST e $ _COOKIE.

• A variável $ _REQUEST do PHP pode ser usada para obter os dados de um

formulário enviados com ambos os métodos GET e POST.

Exemplo

Welcome <?php echo $_REQUEST["name"]; ?>.<br />

You are <?php echo $_REQUEST["age"]; ?> years old!

Capítulo VIII - Date()

A função date() é usada para formatar a data ou a hora.

Sintaxe

date(format,timestamp)

Formatar Data

O primeiro parâmetro da função date() especifica o formato da data/hora. Neste

caso, podemos indicar letras para nos referirmos ao dia, mês e ano:

• d - dia do mês (01-31)

• m - mês (01-12)

• Y – ano (em quarto dígitos)

Outros caracteres, como "/", ".", ou "-" podem ser inseridos entre as letras para

uma formatação adicional.

Exemplo

<?php

Page 31: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

31

echo date("Y/m/d");

echo "<br />";

echo date("Y.m.d");

echo "<br />";

echo date("Y-m-d");

?>

O resultado sera:

2006/07/11

2006.07.11

2006-07-11

Adicionar o Timestamp

O segundo parâmetro da função date() especifica o timestamp. Este parâmetro,

opcional, indica o tempo, em segundos, desde 1 de Janeiro de 1970. É também

conhecido por Unix Timestamp.

mktime()

Existe a função mktime() que permite ver qual o valor de uma determinada data.

Sintaxe

mktime(hora, minuto, segundo, mês, dia, ano,is_dst)

Exemplo

Para ir para uma data futura, simplesmente adicionamos um dia ao argumento

da função mktime():

<?php

$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));echo "Tomorrow is ".date("Y/m/d", $tomorrow);

?>

O resultado será:

Tomorrow is 2006/07/12

Page 32: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

32

Capítulo IX - Inclusão de Ficheiros

Server Side Includes

Server Side Includes (SSI) são usadas para criar funções, cabeçalhos, rodapés

ou elementos que serão usados várias vezes ou em múltiplas páginas.

Podemos inserir um elemento de uma página num página de PHP antes do

servidor o executar com as funções include() e require(). Estas duas funções são

similares, diferindo apenas no modo como lidam com os erros.

A função include() gera um aviso de erro, no entanto o processamento continua,

enquanto que a função require() gera um erro fatal, parando a execução após o

erro.

Estas duas funções são usadas para usadas para criar funções, cabeçalhos,

rodapés ou elementos que serão usados várias vezes ou em múltiplas páginas.

Isto pode permitir ao programador uma poupança de tempo. Significa que se

pode criar um elemento (cabeçalho, menu, …) standart que irá ser utilizador em

várias páginas. Quando um desses elementos for necessário, basta apenas

importá-lo do ficheiro. Também podemos mudar numa página apenas esse

objecto, deixando o resto igual.

Include()

A função include() copia todo o texto de um ficheiro especifico para um ficheiro

que use essa função.

Exemplo 1

Assumindo que temos um ficheiro com um cabeçalho standart, chamado

"header.php".

Para incluir esse ficheiro numa página, utilizamos a função include() da seguinte

forma:

<html>

<body>

<?php include("header.php"); ?>

Page 33: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

33

<h1>Welcome to my home page</h1>

<p>Some text</p>

</body>

</html>

Exemplo 2

Assumindo, agora, que temos um ficheiro com um menu standart, que deverá

ser apresentado em todas a spáginas. Vamos ver como será o ficheiro

"menu.php":

<html>

<body>

<a href="http://www.w3schools.com/default.php">Home</a>

<a href="http://www.w3schools.com/about.php">About Us</a>

<a href="http://www.w3schools.com/contact.php">Contact Us</a>

</body>

</html>

Os três ficheiros, "default.php", "about.php", e "contact.php", deverão todos

incluir o ficheiro "menu.php".

Exemplo do código do ficheiro "default.php":

<html>

<body>

<?php include("menu.php"); ?>

<h1>Welcome to my home page</h1>

<p>Some text</p>

</body>

</html>

Se colocarmos o código do "default.php" no browser, irá aparecer:

<html>

<body>

<a href="default.php">Home</a> |

<a href="about.php">About Us</a> |

Page 34: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

34

<a href="contact.php">Contact Us</a>

<h1>Welcome to my home page</h1>

<p>Some text</p>

</body>

</html>

E, claro, que temos de fazer o mesmo para os ficheiros "about.php" and

"contact.php".

Ao utilizarmos ficheiros include, simplificamos o update de texto no ficheiro

menu.php" se decidirmos renomear ou mudar a ordem dos links, ou adicionar

outra página para o site.

Require()

Enquanto que a função include() apenas gera um aviso de erro, continuando a

executar o código, a função require() gera um erro fatal, interrompendo a

execução do código.

Exemplo include()

Se incluirmos um ficheiro com a função include(), e ocorrer um erro, devemos

ver um erro como o seguinte:

Código PHP:

<html>

<body>

<?php

include("wrongFile.php");

echo "Hello World!";

?>

</body>

</html>

Mensagem de erro:

Warning: include(wrongFile.php) [function.include]:

failed to open stream:

No such file or directory in C:\home\website\test.php on line 5

Warning: include() [function.include]:

Page 35: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

35

Failed opening 'wrongFile.php' for inclusion

(include_path='.;C:\php5\pear')

in C:\home\website\test.php on line 5

Hello World!

Foi enviado uma mensagem de erro, mas a execução continuou na mesma

(notar o echo)

Exemplo require()

Vejamos agora o mesmo exemplo com a função require():

Código PHP:

<html>

<body>

<?php

require("wrongFile.php");

echo "Hello World!";

?>

</body>

</html>

Mensagem de erro:

Warning: require(wrongFile.php) [function.require]:

failed to open stream:

No such file or directory in C:\home\website\test.php on line 5

Fatal error: require() [function.require]:

Failed opening required 'wrongFile.php'

(include_path='.;C:\php5\pear')

in C:\home\website\test.php on line 5

Foi enviada uma mensagem de erro, e a execução foi interrompida (o commando

echo não chegou a ser executado).

É recomendado que se use a função require() em vez da include(), dado que em

caso de erro a execução dos scripts é interrompida.

Page 36: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

36

Capítulo X - Ficheiros

Fopen() - abrir um ficheiro

A função fopen() é usada para abrir ficheiros em PHP.

O primeiro parâmetro desta função contém o nome do ficheiro a abrir, o segundo

especifica o modo de abertura desse mesmo ficheiro.

Exemplo 1

<html>

<body>

<?php

$file=fopen("welcome.txt","r");

?>

</body>

</html>

Um ficheiro pode ser aberto dos seguintes modos:

• r Lê. Começa no início do ficheiro.

• r+ Lê e escreve. Começa no início do ficheiro.

• w Apenas escreve.

• w+ Lê e escreve. Abre e elimina todo o conteúdo de um ficheiro, ou cria

um ficheiro novo caso não exista.

• a Acrescenta. Abre e escreve no fim do ficheiro, ou cria um novo

ficheiro caso não exista.

• a+ Lê e acrescenta. Acrescenta no fim do ficheiro preservando o seu

conteúdo.

• x Apenas escreve. Cria um novo ficheiro, retorna Falso e com erro se

o ficheiro já existir.

• x+ Lê e escreve. Cria um novo ficheiro, retorna Falso e com erro se o

ficheiro já existir.

Nota: se a função fopen() for incapaz de abrir um determinado ficheiro devolve

0(falso).

Exemplo 2

<html>

Page 37: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

37

<body>

<?php

$file=fopen("welcome.txt","r") or exit("Unable to open file!");

?>

</body>

</html>

Fclose() - fechar um ficheiro

A função fclose() é usada para fechar um ficheiro aberto.

Exemplo

<?php

$file = fopen("test.txt","r");

//some code to be executed

fclose($file);

?>

Feof() - verificar se está no fim do ficheiro

A função feof() verifica se o fim do ficheiro(end of file) foi alcançado.

Esta função é usada em ciclos para ficheiro de tamanha desconhecido.

Nota: não se pode ler em ficheiros abertos no modo: w, a, x

Exemplo

if (feof($file)) echo "End of file";

Fgets() - ler um ficheiro linha a linha

Nota: após ser chamada esta função, o ponteiro move-se para a linha seguinte

Exemplo

Este exemplo lê um ficheiro linha a linha, até o fim do ficheiro ser alcançado

<?php

$file = fopen("welcome.txt", "r") or exit("Unable to open file!");

Page 38: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

38

while(!feof($file))

{

echo fgets($file). "<br />";

}

fclose($file);

?>

Fgetc() - ler um ficheiro carácter a carácter

Nota: depois de se chamar esta função, o ponteiro avança para o carácter

seguinte.

Exemplo

Este exemplo lê um ficheiro, carácter a carácter. Até o fim do ficheiro ser

alcançado.

<?php

$file=fopen("welcome.txt","r") or exit("Unable to open file!");

while (!feof($file))

{

echo fgetc($file);

}

fclose($file);

?>Capítulo XI - Upload de ficheiros

Com o PHP é possível o upload de ficheiros para o servidor.

Criar um ficheiro upload de um formulário

Permitir o upload dos dados de um formulário pode ser bastante útil.

Exemplo

<html>

<body>

<form action="upload_file.php" method="post"

enctype="multipart/form-data">

<label for="file">Filename:</label>

<input type="file" name="file" id="file" />

<br />

Page 39: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

39

<input type="submit" name="submit" value="Submit" />

</form>

</body>

</html>

Nota1:

• O atributo enctype da tag <form> especifica a forma "multipart/form-

data" a ser usada quando o formulário requerer os dados, tais como os

dados do ficheiro a ser importado

• O atributo type="file" da tag <input> indica que o que se introduz deve

ser processado como um ficheiro. Por exemplo, quando for visto no

browser, deve existir um botão junto do campo de introdução.

Nota2:

• Permitir aos utilizadores o envio de ficheiros contém um grande risco de

segurança. Só se deve permitir a utilizadores de confiança o envio de

ficheiros.

Criar o script de envio de ficheiro

Exemplo

O ficheiro "upload_file.php" deverá ter o seguinte código:

<?php

if ($_FILES["file"]["error"] > 0)

{

echo "Error: " . $_FILES["file"]["error"] . "<br />";

}

else

{

echo "Upload: " . $_FILES["file"]["name"] . "<br />";

echo "Type: " . $_FILES["file"]["type"] . "<br />";

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";

echo "Stored in: " . $_FILES["file"]["tmp_name"];

}

Page 40: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

40

?>

Utilizando o vetor global PHP $_FILES podem-se enviar ficheiros do utilizador

para o servidor remoto.

O primeiro parâmetro é o nome do formulário a ser enviado, sendo que o

segundo parâmetro poderá ser "name", "type", "size", "tmp_name" or "error".

Por exemplo:

• $_FILES["file"]["name"] – nome do ficheiro a ser enviado

• $_FILES["file"]["type"] – tipo do ficheiro a ser enviado

• $_FILES["file"]["size"] – tamanho, em bytes, do ficheiro a ser enviado

• $_FILES["file"]["tmp_name"] – nome da cópia temporária a ser

armazenada no servidor

• $_FILES["file"]["error"] – o código do erro resultante do envoi de ficheiro

Restrições de envio

Por segurança, devem-se adicionar restrições no envio de ficheiros.

Exemplo

Neste script adicionaram-se restrições de envio. Apenas se podem enviar

ficheiros .gif ou .jpg, e não podendo serem maiores que 20kb

<?php

if ((($_FILES["file"]["type"] == "image/gif")

|| ($_FILES["file"]["type"] == "image/jpeg")

|| ($_FILES["file"]["type"] == "image/pjpeg"))

&& ($_FILES["file"]["size"] < 20000))

{

if ($_FILES["file"]["error"] > 0)

{

echo "Error: " . $_FILES["file"]["error"] . "<br />";

}

else

{

echo "Upload: " . $_FILES["file"]["name"] . "<br />";

echo "Type: " . $_FILES["file"]["type"] . "<br />";

Page 41: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

41

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";

echo "Stored in: " . $_FILES["file"]["tmp_name"];

}

}

else

{

echo "Invalid file";

}

?>

Nota: para o IE reconhecer ficheiros .jpg o tipo deve ser .pjpeg, para o FireFox

deve ser .jpeg.

Gravar ficheiros enviados

Exemplo

Este exemplo cria uma cópia temporária dos ficheiros enviados na pasta PHP

temp do servidor

A cópia temporária desaparece quando o script acaba. Para armazenar o ficheiro

precisamos de o copiar para uma localização diferente.

<?php

if ((($_FILES["file"]["type"] == "image/gif")

|| ($_FILES["file"]["type"] == "image/jpeg")

|| ($_FILES["file"]["type"] == "image/pjpeg"))

&& ($_FILES["file"]["size"] < 20000))

{

if ($_FILES["file"]["error"] > 0)

{

echo "Return Code: " . $_FILES["file"]["error"] . "<br />";

}

else

{

echo "Upload: " . $_FILES["file"]["name"] . "<br />";

echo "Type: " . $_FILES["file"]["type"] . "<br />";

Page 42: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

42

echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";

echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

if (file_exists("upload/" . $_FILES["file"]["name"]))

{

echo $_FILES["file"]["name"] . " already exists. ";

}

else

{

move_uploaded_file($_FILES["file"]["tmp_name"],

"upload/" . $_FILES["file"]["name"]);

echo "Stored in: " . "upload/" . $_FILES["file"]["name"];

}

}

}

else

{

echo "Invalid file";

}

?>

O código acima verifica se existe já um ficheiro, se não existir o ficheiro copia-o

para a pasta especificada.

Nota: este exemplo guarda o ficheiro numa nova pasta chamada "upload"

Page 43: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

43

Capítulo XII - Cookies

O que é um cookie?

Um cookie é, muitas vezes, usado para identificar um utilizador. É um pequeno

ficheiro que o servidor coloca no computador do utilizador. Cada vez que o

mesmo computador requisita a página com o browser, envia o cookie também.

Com o PHP podemos criar e recuperar os valores do cookie.

Como criar um cookie?

A função setcookie() é usada para definir um cookie.

Nota: a função setcookie() deve de aparecer antes da tag <html>

Sintaxe

setcookie(name, value, expire, path, domain);

Exemplo

No exemplo em baixo vamos criar um cookie, designado “usera atribuir-lhe o

valor “Alex Porter". Vamos também especificar que o cookie deverá expirer ao

fim de uma hora:

<?php

setcookie("user", "Alex Porter", time()+3600);

?>

<html>

<body>

</body>

</html>

Nota: o valor do cookie é automaticamente codificado quando enviado, e

automaticamente descodificado quando recebido – para prevenir a codificação

podemos usar setrawcookie() em vez de setcookie().

Page 44: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

44

Como definir o valor de um cookie?

A variável $_COOKIE é usada para definir o valor de um cookie.

Exemplo 1

Neste exemplo vamos definir o valor de um cookie chamado “user2 e mostrá-lo

no monitor

<?php

// Print a cookie

echo $_COOKIE["user"];

// A way to view all cookies

print_r($_COOKIE);

?>

Exemplo 2

Aqui vamos usar a função isset() para procurar se um cookie foi enviado

<html>

<body>

<?php

if (isset($_COOKIE["user"]))

echo "Welcome " . $_COOKIE["user"] . "!<br />";

else

echo "Welcome guest!<br />";

?>

</body>

</html>

Page 45: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

45

Como apagar um cookie?

Quando apagamos um cookie, devemo-nos assegurar que a data de expiração já

passou

Exemplo

<?php

// set the expiration date to one hour ago

setcookie("user", "", time()-3600);

?>

E se um browser não suportar cookies?

Se a aplicação encontrar um browser que não suporte cookies, teremos que usar

um outro método para passar a informação de uma página para outra na

aplicação, um dos métodos é passar a informação através de formulários.

Exemplo:

O formulário seguinte passa os dados do utilizador através do formulário para o

ficheiro "welcome.php" quando o utilizador clica no botão "Submit".

<html>

<body>

<form action="welcome.php" method="post">

Name: <input type="text" name="name" />

Age: <input type="text" name="age" />

<input type="submit" />

</form>

</body>

</html>

Page 46: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

46

Os dados são recuperados do ficheiro "welcome.php" da seguinte forma (por

exemplo):

<html>

<body>

Welcome <?php echo $_POST["name"]; ?>.<br />

You are <?php echo $_POST["age"]; ?> years old.

</body>

</html>

Capítulo XIII - Sessões

Quando se trabalha com uma aplicação, abrimo-la, fazemos algumas mudanças

e, em seguida, fechamo-la. Isto é similar a uma sessão.

O computador sabe quem somos. Sabe quando se inicia a aplicação e quando se

termina. Mas, na Internet, há um problema: o servidor não sabe quem o

utilizador é e o que faz, porque o endereço HTTP não mantém o estado.

Uma variável de sessão PHP resolve o problema anterior, permitindo-lhe guardar

as informações do utilizador no servidor para uso posterior (ou seja, username,

etc.).

No entanto, as informações são temporárias e serão apagados após o utilizador

ter deixado o website. Se quisermos um armazenamento permanente dessa

informação podemos armazenar os dados numa base de dados.

Variáveis de sessão

Uma variável PHP de sessão é usada para armazenar informação sobre, ou

mudar informação, sobre o utilizador de uma sessão.

Page 47: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

47

As variáveis de sessão guardam informação sobre um único utilizador, sendo

válidas para todas páginas numa aplicação.

As variáveis de sessão trabalham através da criação de um único registo para

cada visitante e armazenamento dos dados desse registo.

Começar uma sessão

Antes de podermos armazenar a informação de uma sessão, temos que iniciar

essa mesma sessão

Nota: a função start() deverá aparecer antes da tag <html>.

Exemplo

<?php session_start(); ?>

<html>

<body>

</body>

</html>

O código do exemplo anterior regista o utilizador da sessão com o servidor,

permite iniciar a gravação dos dados do utilizador, e atribui um registo para a

sessão do utilizador

Armazenar uma variável de sessão

A forma correcta de armazenar e recuperar variáveis de sessão é usar a variável

$_SESSION.

Exemplo 1

<?php

session_start();

// store session data

$_SESSION['views']=1;

?>

Page 48: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

48

<html>

<body>

<?php

//retrieve session data

echo "Pageviews=". $_SESSION['views'];

?>

</body>

</html>

O resultado será:

Pageviews=1

Exemplo 2

Criar um contador de páginas vizualisadas. A função isset() verifica se as

variáveis "views" já foram definidas.Se sim, incrementamos o nosso contador.

Caso contrário definimos e iniciamos uma “views” igual a 1.

<?php

session_start();

if(isset($_SESSION['views']))

$_SESSION['views']=$_SESSION['views']+1;

else

$_SESSION['views']=1;

echo "Views=". $_SESSION['views'];

?>

Eliminar uma sessão

Se desejarmos eliminar os dados de uma sessão, podemos usar as funções

unset() ou session_destroy().

Exemplo 1

<?php

unset($_SESSION['views']);

?>

Page 49: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

49

Exemplo 2

Podemos elimiar a sessão completamente chamando a função session_destroy().

<?php

session_destroy();

?>

Nota: session_destroy() irá reiniciar a sessão e eliminar todos os dados

armazenados.

Capítulo XIV - Envio de emails

O PHP permite o envio de emails directamente do script.

Mail()

A função mail() do PHP é usada dentro do script.

Sintaxe

mail(to,subject,message,headers,parameters)

Parâmetros:

• to - requerido. Especifica o destinatário do email.

• subject – requerido. Especifica o assunto do email.

• message – requerido. Define a mensagem a enviar.

• headers – opcional. Especifica cabeçalhos adicionais, tais como: from, cc

e bcc.

• parameters – opcional. Especifica um parâmetro adicional para o

programa de envio do email.

Page 50: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

50

Nota: para que a função mail() esteja disponível, o PHP requer a instalação e

funcionamento do sistema de email. O programa a usar é definido pela

configuração do ficheiro php.ini

Email simples

A forma mais simples de enviar um email com o PHP é enviar um email de texto.

Exemplo

Neste exemplo, primeiro declaramos as variáveis ($to, $subject, $message,

$from, $headers), posteriormente usamos essas variáveis na função mail() e

enviamos o mail.

<?php

$to = "[email protected]";

$subject = "Test mail";

$message = "Hello! This is a simple email message.";

$from = "[email protected]";

$headers = "From: $from";

mail($to,$subject,$message,$headers);

echo "Mail Sent.";

?>

Formulários de email

Podemos criar um formulário que nos dê os dados para um email.

Exemplo

<html>

<body>

<?php

if (isset($_REQUEST['email']))

//if "email" is filled out, send email

{

//send email

Page 51: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

51

$email = $_REQUEST['email'] ;

$subject = $_REQUEST['subject'] ;

$message = $_REQUEST['message'] ;

mail( "[email protected]", "Subject: $subject",

$message, "From: $email" );

echo "Thank you for using our mail form";

}

else

//if "email" is not filled out, display the form

{

echo "<form method='post' action='mailform.php'>

Email: <input name='email' type='text' /><br />

Subject: <input name='subject' type='text' /><br />

Message:<br />

<textarea name='message' rows='15' cols='40'>

</textarea><br />

<input type='submit' />

</form>";

}

?>

</body>

</html>

Explicação do exemplo anterior:

Envio de uma mensagem de texto para um endereço de email especifico

• Primeiro verificam-se se os campos estão preenchidos.

• Se não, volta a colocar o formulário para preencher

• SE sim, envia o email do formulário

• Quando se clica o botão “submit” após o preenchimento do formulário, a

página é actualizada, verificam-se os campos do email e o email é

enviado.

Email Injections

Page 52: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

52

Exemplo

Analisemos o código do exemplo anterior:

<html>

<body>

<?php

if (isset($_REQUEST['email']))

//if "email" is filled out, send email

{

//send email

$email = $_REQUEST['email'] ;

$subject = $_REQUEST['subject'] ;

message = $_REQUEST['message'] ;

mail("[email protected]", "Subject: $subject",

$message, "From: $email" );

echo "Thank you for using our mail form";

}

else

//if "email" is not filled out, display the form

{

echo "<form method='post' action='mailform.php'>

Email: <input name='email' type='text' /><br />

Subject: <input name='subject' type='text' /><br />

Message:<br />

<textarea name='message' rows='15' cols='40'>

</textarea><br />

<input type='submit' />

</form>";

}

?>

</body>

</html>

O problema com este código é que um utilizador não autorizado pode inserir

dados no cabeçalho do email através do formulário.

Page 53: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

53

O que acontecerá se um utilizador adicionar o seguinte texto no formulário?

[email protected]%0ACc:[email protected]

%0ABcc:[email protected],[email protected],

[email protected],[email protected]

%0ABTo:[email protected]

A função email() coloca o texto acima no cabeçalho do email como normalmente,

e agora o cabeçalho contem um cc, um bcc e um to: extra. Quando o utilizador

clicar no botão para submeter, o emial será enviado para todos os endereços

acima.

Parar Email Injections

A melhor forma de acabar com emails injections é a validação de dados.

Exemplo

O código abaixo é o mesmo do exemplo anterior, mas agora adicionámos uma

validação de dados que verifica o campo email do formulário.

<html>

<body>

<?php

function spamcheck($field)

{

//eregi() performs a case insensitive regular expression match

if(eregi("to:",$field) || eregi("cc:",$field))

{

return TRUE;

}

else

{

return FALSE;

}

}

//if "email" is filled out, send email

Page 54: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

54

if (isset($_REQUEST['email']))

{

//check if the email address is invalid

$mailcheck = spamcheck($_REQUEST['email']);

if ($mailcheck==TRUE)

{

echo "Invalid input";

}

else

{

//send email

$email = $_REQUEST['email'] ;

$subject = $_REQUEST['subject'] ;

$message = $_REQUEST['message'] ;

mail("[email protected]", "Subject: $subject",

$message, "From: $email" );

echo "Thank you for using our mail form";

}

}

else

//if "email" is not filled out, display the form

{

echo "<form method='post' action='mailform.php'>

Email: <input name='email' type='text' /><br />

Subject: <input name='subject' type='text' /><br />

Message:<br />

<textarea name='message' rows='15' cols='40'>

</textarea><br />

<input type='submit' />

</form>";

}

?>

</body>

</html>

Page 55: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

55

Capítulo XV - Tratamento de erros

Por defeito, o tratamento de erros em PHP é muito simples. Qualquer erro é

descrito no browser com o nome do ficheiro, o número da linha e uma

mensagem descrevendo o erro.

Quando se criam scripts e aplicações Web, o tratamento de erros é importante.

Se os erros não forem tratados, para além de a aplicação não ser muito

profissional, sujeita-se a riscos de segurança.

Existem diferentes formas de tratamento de erros:

• O uso do comando "die()"

• Custom errors e error triggers

• Error reporting

Tratamento básico de erros: die()

Exemplo

O primeiro exemplo mostra um script que abre um ficheiro de texto

<?php

$file=fopen("welcome.txt","r");

?>

Se o ficheiro não abrir então irá aparecer um erro do género:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:

No such file or directory in C:\webfolder\test.php on line 2

Para evitar que o utilizador receba esta mensagem de erro, há que verificar

primeiro a existência do ficheiro antes de o tentar abrir.

<?php

if(!file_exists("welcome.txt"))

{

die("File not found");

Page 56: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

56

}

else

{

$file=fopen("welcome.txt","r");

}

?>

Agora se o ficheiro não existir a mensagem de erro será:

File not found

O código acima é mais eficiente que o anterior, dado que usa um mecanismo de

tratamento de erro simples para parar o script após o erro.

No entanto, parar simplesmente o script não é, muitas vezes, a forma correcta

de o fazer.

Criar um tratamento de Custom Error

Criar um tratamento de custom error é bastante simples, basta criar uma função

simples que possa ser chamada sempre que um erro ocorra.

Esta função deverá ser criada com um mínimo de dois parâmetros (error level e

error message), mas pode aceitar até cinco parâmetros (optionalmente: file,

line-number, e error context)

Sintaxe

error_function(error_level,error_message,error_file,error_line,error_context)

Parâmetros Descrição

error_level Necessário. Especifica o error report level. Deve ser um

número.

error_message Necessário. Especifica a mensagem de erro.

error_file Opcional. Especifica o nome do ficheiro em que ocorreu o

erro.

error_line Opcional. Especifica a linha em que ocorreu o erro

error_context Opcional. Especifica toas as variáveis, e os seus valores, emu

so aquando da ocorrência do erro.

Page 57: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

57

Error Report levels

Os error report levels são diferentes tipos de erro de utilizador, definidos, que se

podem tratar.

Valor Constante Descrição

2 E_WARNING Não fatal. A execução do script não é

interrompida

8 E_NOTICE Notificação. O script encontrou algo que pode ser

um erro, mas tambem pode acontecer o script

corre normalmente.

256 E_USER_ERROR Erro fatal gerado pelo utilizador. Similar ao

E_ERROR enviado pelo programador usando a

função PHP trigger_error()

512 E_USER_WARNING Aviso não fatal, gerado pelo utilizador. Similar ao

E_WARNING enviado pelo programador usando a

função PHP trigger_error()

1024 E_USER_NOTICE Notificação gerada pelo utilizador. Similar ao

E_NOTICE enviado pelo programador usando a

função PHP trigger_error()

4096 E_RECOVERABLE_ERROR Introdução de um fatal error. Similar ao

E_ERROR mas pode ser causado por uma

manipulação incorrecta do utilizador

8191 E_ALL Todos os erros e avisos excepto E_STRICT

Exemplo

Vamos criar uma função para tratar erros:

function customError($errno, $errstr)

{

echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); }

A função acima é uma função simples de tratamento de erros. Quando aplicada,

recebe o error level e uma mensagem de erro. Após o qual mostra o error level e

a mensagem e termina o script.

Page 58: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

58

E agora que criámos uma função que trata erros, precisamos de definir quando

deve ser aplicada.

Tratamento de erros: set_error_handler()

O padrão para tratamento de erros no PHP é construir uma função específica

para tal. Vamos fazer da função do exemplo anterior a função para tratar dos

erros que ocorram aquando do executar do script.

É possível alterar o erro para se tratar apenas de erros específicos. Desta forma

o script pode lidar com diferentes erros de formas diferentes. No entanto, neste

exemplo, vamos usar um erro personalizado para todos os erros:

set_error_handler("customError");

A função set_error_handler () apenas necessita de um parâmetro, um segundo

parâmetro poderá ser adicionada para especificar um erro nível.

Exemplo

Testar um erro tentando mostrar uma variável inexistente.

<?php

//error handler function

function customError($errno, $errstr)

{

echo "<b>Error:</b> [$errno] $errstr";

}

//set error handler

set_error_handler("customError");

//trigger error

echo($test);

?>

O resultado será:

Custom error: [8] Undefined variable: test

Page 59: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

59

Captura de erros: trigger_error()

Num script onde os utilizadores podem introduzir dados, é útil que se capture um

erro quando uma há uma introdução ilegal. No PHP isto é feito pela função

trigger_error().

Exemplo

Neste exemplo um erro ocorre se a variável “test” for maior que 1

<?php

$test=2;

if ($test>1)

{

trigger_error("Value must be 1 or below");

}

?>

O resultado será:

Notice: Value must be 1 or below

in C:\webfolder\test.php on line 6

Um erro pode ser capturado em qualquer parte do script, e adicionando um

segundo parâmetro à função, podemos especificar o nível do erro capturado.

Tipos de erro possíveis:

• E_USER_ERROR – erro fatal gerado pelo utilizador. Este erro não pode

ser recuperado. A execução do script é interrompida.

• E_USER_WARNING – aviso não fatal gerado pelo utilizador. A execução

do script não é interrompida.

• E_USER_NOTICE – aviso gerado pelo utilizador. O script encontrou algo

que pode ser prejudicial à sua execução, mas também pode ocorrer com a

execução normal do script.

Exemplo

Neste exemplo um E_USER_WARNING ocorre se a variável "test" for maior que

1. Se um E_USER_WARNING ocorrer, podemos usar o manipulador de erros para

terminar a execução do script:

<?php

Page 60: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

60

//error handler function

function customError($errno, $errstr)

{

echo "<b>Error:</b> [$errno] $errstr<br />";

echo "Ending Script";

die();

}

//set error handler

set_error_handler("customError",E_USER_WARNING);

//trigger error

$test=2;

if ($test>1)

{ trigger_error("Value must be 1 or below",E_USER_WARNING);

} ?>

O resultado será:

Error: [512] Value must be 1 or below

Ending Script

Registo de erros: error_log()

Por defeito o PHP envia um registo de erro para o sistema de servidores

registados ou para um ficheiro, dependendo da configuração do error_log no

ficheiro php.ini. utilizando a função error_log() podemos enviar registo de erros

para um destinatário remoto específico.

Enviar mensagens de erro por email pode ser uma soa solução para se ser

notificado de erros específicos

Enviar uma mensagem de erro por email

Exemplo

Neste exemplo será enviado um email com uma mensagem de erro, e a

execução do script é interrompida, se ocorrer um erro específico.

<?php

Page 61: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

61

//error handler function

function customError($errno, $errstr)

{

echo "<b>Error:</b> [$errno] $errstr<br />";

echo "Webmaster has been notified";

error_log("Error: [$errno] $errstr",1,

"[email protected]","From: [email protected]");

}

//set error handler

set_error_handler("customError",E_USER_WARNING);

//trigger error

$test=2;

if ($test>1)

{ trigger_error("Value must be 1 or below",E_USER_WARNING); } ?>

O resultado será:

Error: [512] Value must be 1 or below

Webmaster has been notified

O email recebido será:

Error: [512] Value must be 1 or below

Nota: Isto não deverá ser usado com todos os erros.

Capítulo XVI - Tratamento de excepções

As excepções são usadas para mudar a execução normal de um script se ocorrer

um erro.

O que acontece quando ocorrer uma excepção:

• O estado corrente é guardado

• O código de execução é substituído por um predefinido

Page 62: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

62

• Dependendo da situação, pode acontecer que o estado seja guardado e a

execução do script termine, ou então que a execução do script continue a

partir de uma parte diferente do código.

Existem diferentes métodos de tratar erros desta forma:

• Uso básico de excepções

• Criar uma função que trate os erros normais

• Múltiplas excepções

• Relançamento da excepção

• Definir um nível máximo de excepção

Nota: as excepções devem de ser apenas utilizadas em condições de erro, não

devendo ser usadas para ‘saltar’ para outro lugar no código, num dado

momento.

Uso básico de excepções

Quando uma excepção é lançada, o código a seguir não será executado, e o PHP

irá tentar encontrar esse bloco.

Se uma excepção não é capturada, será emitido um erro fatal com uma

mensagem de "Uncaught Exception”.

Exemplo

Vamos tentar lançar uma excepção sem a apanhar

<?php

//create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); }

return true; } //trigger exception checkNum(2); ?>

O código irá ter um erro como este:

Fatal error: Uncaught exception 'Exception'

with message 'Value must be 1 or below' in C:\webfolder\test.php:6

Stack trace: #0 C:\webfolder\test.php(12):

Page 63: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

63

checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Try, throw e catch

Para evitar o erro do exemplo anterior, necessitamos de criar o código

apropriadamente para tartar uma excepção.

Uma excepção apropriada deverá incluir:

• Try – uma função que use uma excepção deve estar num bloco “try”. Se a

excepção não for apanhada, o código irá continuar normalmente. No

entanto, se a excepção for apanhada, fica "throw"

• Throw – é a forma como se acciona uma excepção. Cada "throw" deverá

ter no mínimo um "catch"

• Catch – um bloco "catch" devolve uma excepção r cria um objecto

contend informação da excepção.

Exemplo

Vamos tentar accionar uma excepção com um código válido

<?php

//create function with an exception function checkNum($number)

{ if($number>1) {

throw new Exception("Value must be 1 or below"); }

return true; } //trigger exception in a "try" block try {

checkNum(2);

//If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below';

}

//catch exception catch(Exception $e)

{ echo 'Message: ' .$e->getMessage();

} ?>

O resultado será:

Message: Value must be 1 or below

Page 64: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

64

Explicação do exemplo

O código acima lança uma excepção e apanha-a

1. A função checkNum() é criada. Verifica se um número é maior que 1. Se

sim, uma excepção é lançada

2. A função checkNum() é chamada num bloco "try"

3. A excepção dentro da função checkNum() é lançada

4. O bloco “catch” devilve a excepção e e cria um objeto ($e) contendo as

informações da excepção.

5. A mensagem erro é mostrada através da função $e->getMessage() do

objecto da excepção.

No entanto, uma forma de evitar a regra "every throw must have a catch" é

estabelecer um nível superior de excepção a ser tratadas.

Criar uma classe customException

Criar uma customException é simples. Basta criar uma classe especial com

funções que possam ser chamadas quando uma excepção ocorre no PHP.

Exemplo

Vamos criar uma classe de excepção, extensão da classe de excepções.

<?php class customException extends Exception { public function errorMessage() {

//error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } }

$email = "[email protected]"; try {

//check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //throw exception if email is not valid

throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage();

} ?>

Page 65: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

65

A nova classe é uma cópia da antiga classe de excepção classe com um

acrescento da função errorMessage(). Desde que se trata de uma cópia da velha

classe, e que herda as propriedades e métodos da mesma, podemos usar

métodos da classe excepção como getLine(), getFile() e getMessage().

Explicação do exemplo

O código acima lança uma excepção e apanha-a com a classe customException()

1. A classe customException() class é criada como uma extensão da velha

classe Exception. Deste modo, ela herda todos os métodos e propriedades

dessa mesma classe.

2. A função errorMessage() é criada. Esta função devolve uma mensagem de

erro se um endereço de email é inválido.

3. A variável $email é definida como uma string que não é um endereço

válido de email.

4. O bloco "try" é executado e uma excepção é lançada desde que o endereço

de email seja inválido

5. O bloco "catch" apanha a excepção e mostra a mensagem de erro

Múltiplas excepções

É possível usar múltiplas excepções para verificar múltiplas condições.

Estas excepções podem usar diferentes classes de excepções e devolver

mensagens de erro diferentes.

Exemplo

<?php

class customException extends Exception

{

public function errorMessage()

{

//error message

$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile().':

<b>'.$this->getMessage().'</b> is not a valid E-Mail address';

return $errorMsg;

}

}

Page 66: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

66

$email = "[email protected]";

try

{

//check if

if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)

{

//throw exception if email is not valid

throw new customException($email);

}

//check for "example" in mail address

if(strpos($email, "example") !== FALSE)

{

throw new Exception("$email is an example e-mail");

}

}

catch (customException $e)

{

echo $e->errorMessage();

}

catch(Exception $e)

{

echo $e->getMessage();

}

?>

Explicação do exemplo

O código acima testa duas condições e lança uma excepção se uma das

condições não for cumprida.

1. A classe customException() é criada como uma extensão da antiga classe

Exception(). Desta forma herda todos os métodos e propriedades dessa

classe.

2. A função errorMessage() é criada. Esta função devolve uma mensagem de

erro se um endereço de email for inválido.

Page 67: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

67

3. A variável $email é definida como uma string que é um endereço válido de

email, mas que contem a palavra ‘exemplo’

4. O bloco "try" é executado e não é lançada, de acordo com a primeira

condição, uma excepção

5. A segunda condição acciona uma excepção desde que o endereço de email

contenha a palavra ‘exemplo’.

6. O bloco "catch" apanha a excepção e mostra a mensagem de erro correcta

Relançamento de excepções

Às vezes, quando uma excepção é lançada, pode-se querer tratar de forma

diferente da forma padrão. É possível lançar uma excepção, uma segunda vez,

dentro de um bloco "catch".

Um script deve esconder os erros de sistema do utilizador. Erros de sistema

podem ser importante para o programador, mas não são do interesse do

utilizador.

Para tornar as coisas mais fáceis para o utilizador, podemos relançar a excepção

com uma mensagem amigável para o utilizador

Exemplo

<?php

class customException extends Exception

{

public function errorMessage()

{

//error message

$errorMsg = $this->getMessage().' is not a valid E-Mail address.';

return $errorMsg;

}

}

$email = "[email protected]";

try

{ try

{

Page 68: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

68

//check for "example" in mail address

if(strpos($email, "example") !== FALSE)

{

//throw exception if email is not valid

throw new Exception($email);

}

}

catch(Exception $e)

{

//re-throw exception

throw new customException($email);

}

}

catch (customException $e)

{

//display custom message

echo $e->errorMessage();

}

?>

Explicação do exemplo

O código acima testa se o endereço de email contém a palavra ‘example’. Se

sim, a excepção é reutilizada.

1. A classe customException() é criada como uma extensão da antiga classe

Exception(). Desta forma herda todos os métodos e propriedades dessa

classe.

2. A função errorMessage() é criada. Esta função devolve uma mensagem de

erro se um endereço de email for inválido.

3. A variável $email é definida como uma string que é um endereço válido de

email, mas que contem a palavra ‘exemplo’

4. O bloco "try" contém um outro bloco “try”para que seja possível relanção a

excepção.

5. A excepção é desencadeada desde que o mail contenha a palavra

‘example’

Page 69: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

69

6. O bloco "catch" apanha a excepção e relança uma "customException"

7. A "customException" á apanhada e é mostrada a mensagem de erro.

Se a excepção não for capturada no bloco “try”, é procurado de um bloco “catch”

em níveis mais elevados.

Set_Exception_Handler

A função set_exception_handler() define uma função para apanhar excepções

não apanhadas.

Exemplo

<?php

function myException($exception)

{

echo "<b>Exception:</b> " , $exception->getMessage();

}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');

?>

O resultado será:

Exception: Uncaught Exception occurred

Nota: no código acima não existe bloco "catch". Em vez disso, temos o accionada

a set_exception_handler.

Regras para excepções

• O código pode ser cercado num bloco “try”, para ajudar a capturar

possíveis excepções

Page 70: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

70

• Cada bloco “try” ou “throw” deve ter, pelo menos, um bloco “ catch”

correspondente

• Vários blocos “catch” podem ser usados para apanhar diferentes classes de

excepções

• Excepções podem ser lançadas(ou relanladas), numa captura dentro de

um bloco”try”

Uma simples regra: se lançamos alguma coisa, temos que a apanhar.

Capítulo XVII - Filtros

Os filtros em PHP são usados para validar e filtrar os dados vindos de fontes

inseguras, como introduções do utilizador

Porquê usar filtros?

Quase todas as aplicações web dependem de dados que são introduzidos pelo

utilizador, ou que provêm de outra aplicação. Ao usarmos filtros estamos a

garantir que os dados introduzidos sejam os correctos.

Um filtro de dados é uma das mais aplicações mais importantes de segurança.

Devem-se filtrar todos os dados externos.

O que são dados externos?

• Dados introduzidos através de um formulário

• Cookies

• Web services data4018

• Variáveis de servidor

• Resultado de consulta de bases de dados

Funções e filtros

Page 71: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

71

Para filtrar uma variável devemos usar uma das seguintes funções filtro:

• filter_var() – filtra uma variável com um filtro específico

• filter_var_array() – filtra um conjunto de variáveis com um dou mais

filtros diferentes

• filter_input – recebe uma variavel introduzida e filtra-a

• filter_input_array – recebe um conjunto de variáveis e filtra-as com um

ou mais filtros diferentes

Exemplo

<?php

$int = 123;

if(!filter_var($int, FILTER_VALIDATE_INT))

{

echo("Integer is not valid");

}

else

{

echo("Integer is valid");

}

?>

O código usa o filtro "FILTER_VALIDATE_INT" para filtrar a variável, desde que o

inteiro é válido, o resultadop do código será:

"Integer is valid"

Se tentarmos com uma variável que não seja inteira, o resultado será:

"Integer is not valid"

Validação e Saneamento

Existem dois tipos de filtro:

• Filtros de validação:

o Usados para validarem introdução de dados.

o Regras de formatação (como validação de url e de email)

Page 72: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

72

o Devolve o tipo esperado de sucesso ou insucesso na falha

• Filtros de saneamento:

o Usados para permitirem caracteres específicos numa string

o Não tem regras de formatação

o Devolve sempre a string

Opções e bandeiras

São usadas para adicionar opções de filtro a um filtro específico.

Filtros diferentes têm diferentes opções e bandeiras.

Exemplo

No exemplo seguinte valida-se um inteiro usando filter_var() e as opções

“min_range" e "max_range"

<?php $var=300; $int_options = array(

"options"=>array ( "min_range"=>0, "max_range"=>256 ) );

if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))

{ echo("Integer is not valid"); } else { echo("Integer is valid");

} ?>

Tal como o código acima, as opções devem ser colocados num array com o nome

"options". Se for utilizada uma bandeira, esta não precisa de estar num array.

Como o inteiro é "300", não está no intervalo especificado, e assim o resultado

será:

"Integer is not valid".

Validação de dados introduzidos

Vamos tentar validar entrada de um formulário.

Page 73: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

73

Uma das primeiras coisas que temos a fazer é confirmar que a entrada de dados

existe.

Em seguida, o filtramos a entrada de dados usando a função filter_input().

Exemplo

No exemplo a seguir, a variável de entrada "email" é enviado para a página de

PHP.

<?php

if(!filter_has_var(INPUT_GET, "email"))

{

echo("Input type does not exist");

}

else

{

if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL))

{

echo "E-Mail is not valid";

}

else

{

echo "E-Mail is valid";

}

}

?>

Explicação do exemplo

O exemplo acima tem uma entrada (email) enviado usando o método "GET"

1. Verifica se existe uma entrada da variável "email"do tipo GET

2. Se a entrada da variável existe, verifica se se trata de um email válido

Sanear a introdução de dados

Vamos tentar limpar um URL enviado por um formulário.

Primeiro confirmamos que os dados introduzidos existem.

Page 74: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

74

Depois saneamos os dados usando a função filter_input().

Exemplo

Neste exemplo, a variável de entrada "url" é enviada para a página de PHP

<?php

if(!filter_has_var(INPUT_POST, "url"))

{

echo("Input type does not exist");

}

else

{

$url = filter_input(INPUT_POST,

"url", FILTER_SANITIZE_URL);

}

?>

Explicação do exemplo

O exemplo em cima tem um input (url) enviado pelo método "POST"

1. Verifica se o input "url" do "POST" existe

2. Se existir, saneia (elimina os caracteres inválidos) e guarda-a na variável

$url

Se a variável de introdução é similar a:

http://www.W3ååSchøøools.com/

A variável $url depois de saneada será similar a :

http://www.W3Schools.com/

Filtrar introduções múltiplas

Um formulário é constituído quase sempre por mais de um campo. Para evitar

chamar as funções filter_var ou filter_input, repetidamente, podemos usar as

funções filter_var_array ou filter_input_array.

Page 75: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

75

Exemplo

Usamos a função filter_input_array() função para filtrar três variáveis GET. As

variáveis GET recebidas são um nome, uma idade e um endereço de correio

electrónico:

<?php $filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING

), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array

( "min_range"=>1,

"max_range"=>120 ) ), "email"=> FILTER_VALIDATE_EMAIL, ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"])

{ echo("Age must be a number between 1 and 120.<br />"); } elseif(!$result["email"]) { echo("E-Mail is not valid.<br />");

}

else { echo("User input is valid"); } ?>

Explicação do exemplo

O exemplo acima tem três introduções (nome, idade e email) enviado pelo

método "GET" método.

1. Define-se um array contendo o nome das variáveis introduzidas e os filtros

utilizados na introdução das variáveis.

2. Chama-se a função filter_input_array() com as variáveis GET introduzidas

e o array acabado de definir.

3. Verificam-se as variáveis "idade" e "email" na variável $result para as

introduções inválidas. (Se nenhuma das variáveis for inválida, o resultado

será FALSE após a função filter_input_array())

Page 76: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

76

O Segundo parâmetro da função filter_input_array() pode ser um array ou uma

única identificação de um filtro.

Se o parâmetro for uma simples chave filtrada, todos os valores no array são

filtrados pelo filtro especificado.

Se o parâmetro for um array então deverá respeitar as seguintes regras:

• Deve ser um array contendo uma variável introduzida como chave do

array (por exemplo a variável introduzida "age")

• O valor do array deve ser filtrado ou deve especificar um filtro, bandeira

ou opção

Filter Callback

É possível chamar uma função definida pelo utilizador e usá-la com o filtro

FILTER_CALLBACK. Desta forma, podemos ter um controlo total sobre os dados

filtrados.

Podemos criar a nossa própria função ou usar uma já existente no PHP.

Exemplo

Neste exemplo usamos uma função criada para converter todos os “_” em

espaços em branco.

<?php

function convertSpace($string)

{

return str_replace("_", " ", $string);

}

$string = "Peter_is_a_great_guy!";

echo filter_var($string, FILTER_CALLBACK,

array("options"=>"convertSpace"));

?>

O resultado sera:

Page 77: Sistemas de Informação · O que se deve saber antes de começar? ... indica o tamanho de uma string. Exemplo

77

Peter is a great guy!

Explicação do exemplo

O exemplo acima converte todos os “_” em espaços em branco

1. Cria uma função que substitui todos os “_” por espaços em branco.

2. Chama a função filter_var() com o filtro FILTER_CALLBACK e um vetor

contend a nossa função.