Tabela de Conteúdos
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 pequenos ficheiros de texto 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 inicio 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, pequenos ficheiros de texto guardados numa pasta específica no servidor1). 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; ?>
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.
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) 2) |
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: