Ir para o conteúdo

Cookies e Sessões em PHP

A programação para a web é diferente em alguns aspectos da programação para aplicações offline. Existem conceitos e recursos diferentes, por exemplo, cookies e sessões. À semelhança de ficheiros, ou bases de dados, numa aplicação web, pode ser necessário ler e guardar valores em cookies para identificar um cliente, por exemplo. Este artigo pretende dar uma noção da utilização de cookies e sessões em PHP.

Cookies: pequenas e estaladiças!

Os cookies são dados que são guardados no computador do cliente, com o objectivo de armazenar pequenas informações. Os cookies são geridos pelos browsers: a maioria oferece ferramentas para ver e editar estes pequenos ficheiros, e permitem definir o ciclo de vida para um cookie.

Basicamente, um cookie é composto pelos seguintes elementos:

Elemento Descrição
Nome Nome do cookie, ou seja, a "chave" que identifica o cookie em si
Domínio O endereço web que criou o cookie, e o único que está autorizado a lê-lo
Caminho Definindo o caminho do endereço (estrutura de sub-directórios), é possível restringir a utilização dos cookies dentro do mesmo domínio
Data de criação Data em que foi criado o cookie
Data de expiração Data em que o cookie irá ser apagado pelo browser
Valor Valor contido dentro do cookie

Mãos na massa

Criar e ler cookies em PHP é fácil. Temos uma array global no PHP que se chama $_COOKIE. Com este array podemos ler um cookie. Para escrever um cookie, temos de usar a função de PHP setcookie. Comecemos por definir um cookie:

<?php
  // escrever um cookie no computador do utilizador
  $nome = "utilizador";
  $valor = "Zé manel";
  $dataExpiracao = time() + 3600;
  setcookie($nome, $valor, $dataExpircao);

  // conteudos da pagina ...
?>

Neste exemplo, definimos um cookie. Aspectos a ter em atenção:

  • O cookie foi definido no início da página, antes de qualquer output
    O cookie é enviado junto com os headers HTTP. Estes cabeçalhos contêm informações da página, como o seu tamanho, que cookies quer colocar, etc. e são enviados antes de quaisquer tags ou conteúdos de página. Caso seja enviado algum conteúdo antes da criação de cookies, o PHP irá devolver um erro "headers already sent".
  • A data de expiração foi definida em segundos
    Em PHP, a função time devolve o número de segundos desde as 0 horas de 1 de Janeiro de 1970. Repare-se que na função colocamos time() + 3600, o que significa que a data de expiração vai ser a data actual, somada com 3600 segundos, o que quer dizer que a data de expiração do cookie é dentro de uma hora, a partir do momento em que foi criado. A data não tem que ser colocada no formato de segundos, mas é mais usual. Se não for fornecido nenhum argumento para a data, o cookie é considerado como um cookie de sessão, isto é, o cookie irá expirar automaticamente quando o cliente fecha o browser.
  • O cookie só vai funcionar no domínio onde foi criado
    Por omissão, o cookie apenas pode ser acedido pelo domínio em que foi criado. É possível redefinir o domínio, de modo a que seja possível a subdomínios terem acesso aos dados. Definir cookies para outro domínio para além do actual não é possível, por questões de segurança.

Vamos agora, noutro exemplo prático, ver como ler o cookie previamente criado:

<?php
  // ler o cookie com o nome "utilizador"
  $nomeUser = $_COOKIE['utilizador'];

  echo "O seu nome de utilizador é $nomeUser";
?>

Como se vê, é bastante fácil ler um cookie. O valor do cookie irá ser retornado, caso este exista no computador do cliente, com a mesma chave e desde que ainda não tenha expirado.

As sessões

De modo análogo aos cookies, as sessões são, por predefinição, dados de texto guardados numa pasta específica no servidor (também podem ser cookies no browser do utilziador ou até algo personalizado usando uma função para o efeito session_set_save_handler()). Estes não podem ser acedidos pelo browser de forma directa, tendo de ser lidos com PHP. Com sessões, é possível guardar não só dados de tipos básicos, como strings e inteiros, mas também objectos de PHP, como classes, etc.

Na prática

As sessões são geralmente utilizadas, tal como o seu próprio nome informa, para dados de sessões e login. Para guardar o ID do utilizador com sessão iniciada, por exemplo.

Vamos começar por definir um índice, pois a variável $_SESSION, tal como a $_COOKIE, é um array.

<?php
session_start();

$_SESSION["userID"] = $userID;

?>

Importante: É obrigatório colocar session_start() no início do ficheiro em que queremos utilizar sessões.

Agora vamos aceder à variável que guardamos, tal como acedemos a índice de um array comum.

<?php
session_start();

echo $_SESSION["userID"];

?>

Agora vamos apagar o conteúdo da variável de sessão, vamos "sair de sessão".

<?php
session_start();

session_destroy();

echo $_SESSION["userID"];
?>

Neste caso, o output será nulo.

A grande vantagem de sessões às variáveis comuns é que o valor da mesma mantém-se até o apagarmos. São por isso a opção perfeita para manter variáveis globais no sistema, neste caso, manter o mesmo estado entre páginas.

Podem ver um grande artigo nesta Wiki de como se fazer um Simples Sistema de Login Usando Sessões.

Cookies e sessões: a dupla perfeita

Através da utilização de cookies e sessões, é possível guardar um estado entre páginas: logins, carrinhos de compras, etc. Nesta secção, vamos ver como combinar cookies e sessões para mantermos a informação de um carrinho de compras numa página.

Considerações de quando usar um e outro

Antes de iniciar o exemplo em si, convém ter a noção de que tipos de dados se devem guardar num e noutro.

Critérios Cookie Sessões
Acessíveis directamente pelo utilizador? Sim (browser, ficheiros de cookie) Não (acesso feito pelo PHP) 1
Persistentes? Não (podem ser apagados pelo utilizador) Sim* (depende das definições do servidor)

Fazendo uma breve análise no quadro podemos concluir:

Tipo de informação Método preferível de armazenamento
Nome utilizador, password Sessões (apenas acessíveis com PHP)
Informações internas (preços, identificadores, ...) Sessões (reduz a probabilidade do utilizador poder editar informações que não deveriam ser editadas)
Preferências de apresentação Cookies (acesso local, utilizador tem controlo sobre a reposição de opções - basta apagar o cookie para repor as opções)
Identificadores únicos, Guid's Cookies

Exemplo prático

Neste exemplo, vamos considerar um carrinho de compras muito simples, composto pelo nome de cliente, uma data, e uma matriz com as informações de produto e respectivo preço.

<?php
  //iniciar sempre a sessão
  session_start();

  if (empty($_SESSION['carrinho'])) {
    // se não houver um carrinho definido, criamos um para exemplo
    $_SESSION['carrinho'] = array( 'cliente' => 'Maria' ,
                                   'data' => '3/11/2009',
                                   'produtos' => array( 'Laranjas' => 0.50,
                                                        'Talho' => 4.35
                                                      )
                                 );
  }

  // Imprimir conteúdos do carrinho de compras
  // construir uma tabela para os dados
  echo "<table border="1"><tr>";
  echo "<th>Cliente</th><td>{$_SESSION['carrinho']['cliente']}</td>";
  echo "</tr><tr>";
  echo "<th>Data</th><td>{$_SESSION['carrinho']['data']}</td>";
  echo "</tr><tr>";
  echo "<th>Produtos</th><td><ul>";

  // percorrer todos os produtos
  $total = 0.0;
  foreach ($_SESSION['carrinho']['produtos'] as $p => $c) {
    echo "<li>$p - $c</li>";
    $total += $c;
  }

  echo "</ul></td></tr><tr>";
  echo "<th>Total</th><td>$total</td>/<tr></table>";
?>

Ligações úteis

Cookies:

Sessões:


  1. Exceto se forem usadas cookies para gravar os dados da sessão.