$_SESSION em PHP

Assim como cookies, as sessões também são utilizadas para salvar valores ($variáveis) durante a visita de um usuário à sua aplicação PHP. Porém, tal sessão é destruída assim que o usuário fechar seu navegador de Internet.

É interessante utilizar sessões ($_SESSION) quando você precisa passar dados de uma página para outra em sua aplicação, sem ter que utilizar $_GET, $_POST ou $_COOKIE. Você só precisa criar a sessão que deseja, com o valor necessário, e, magicamente, o valor configurado aparecerá em todas as outras páginas ou arquivos do seu script PHP quando necessário.

Iniciando uma sessão em PHP

É necessário utilizar a função session_start para iniciar qualquer sessão em PHP. Você deve chamar essa função antes de qualquer output do seu código, ou seja, antes de qualquer echo, print, códigos HTML e coisas do tipo. Geralmente, chamamos a função session_start nas primeiras linhas do nosso código PHP para prevenir erros.

Veja um exemplo:

// Inicia a sessão
session_start();

Você sempre deve utilizar o trecho de código acima para fazer qualquer coisa relacionada a uma sessão PHP, mesmo que seja para destruí-la (falaremos nisso mais adiante no artigo).

Definindo valores para $_SESSION

$_SESSION é um array associativo que recebe os valores que você quiser definir. Veja um exemplo para definir uma sessão de nome, usuário e senha. Esses dados estarão disponíveis em todas as páginas do nosso script enquanto o navegador estiver aberto ou a sessão terminar.

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

// Cria as chaves e seus valores
$_SESSION['nome']    = 'Luiz Otávio';
$_SESSION['usuario'] = 'luiz';
$_SESSION['senha'] = 'otavio';

// Mostra uma frase na tela
echo 'Olá ' . $_SESSION['nome'];

Fazendo isso, agora eu poderia criar um sistema de login para meu usuário, já que a sessão é individual para cada acesso. Isso significa que cada pessoa que acessar seu site, terá uma sessão própria, com ID e valores únicos.

Se eu quiser acessar os dados da sessão em outros arquivos PHP dentro do meu script, basta iniciar a sessão e exibir os dados. Veja:

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

// Mostra uma frase na tela
echo 'Olá ' . $_SESSION['nome'];

Perceba que não estou verificando se a sessão existe. Se eu quiser mais segurança eu meu script, basta verificar se a sessão existe, se não está vazia, e se é igual ao usuário que está na minha base de dados (vamos ver isso mais adiante nesse curso). Veja um exemplo básico:

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

// Verifica se a sessão do usuário não existe
if ( ! isset( $_SESSION['usuario'] ) && ! isset( $_SESSION['senha'] ) ) {
	// Ação a ser executada: mata o script e manda uma mensagem
	exit('Usuário não está logado');
}

// Verifica se a sessão do usuário está vazia
if ( empty( $_SESSION['usuario'] ) && empty( $_SESSION['senha'] ) ) {
	// Ação a ser executada: mata o script e manda uma mensagem
	exit('Sessão terminada, faça login novamente');
}

// Simulação de um usuário do banco de dados
$usuario_bd = 'luiz';

// Verifica se a sessão do usuário está vazia
if ( $_SESSION['usuario'] != $usuario_bd ) {
	// Ação a ser executada: mata o script e manda uma mensagem
	exit('Você não é o usuário correto.');
}

/*
 * Se o seu código passar por todas as verificações acima
 * significa que a sessão existe, não está vazia
 * e que o usuário é o "luiz"
 * portanto, exibimos os dados na tela
 */
echo 'Olá ' . $_SESSION['nome'] . ', acesse seus dados abaixo.'; 

O trecho de código acima pode parecer longo e complicado para você à primeira vista, porém, as muitas linhas são meros comentários. Estamos apenas verificando se as variáveis de sessão existem, se elas não estão vazias, e se o usuário é o "luiz", que na vida real, seria um usuário da base de dados.

Apagando valores de $_SESSION

Para apagar qualquer valor de uma sessão, você pode utilizar a função unset do PHP. Veja um exemplo:

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

// Cria uma chave e valor para um item da sessão
$_SESSION['usuario'] = 'luiz';

// Mostra o valor
echo $_SESSION['usuario'];

// Apaga a chave
unset( $_SESSION['usuario'] );

// Tenta mostrar o valor
// Mas gera um erro, pois ela foi apagada
echo $_SESSION['usuario'];

Existem duas formas para apagar todos os dados da sessão, o mais simples é atribuir um array nulo para $_SESSION. Veja:

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

// Apaga tudo da sessão
$_SESSION = array();

Note que a sessão ainda estará disponível, porém vazia.

O segundo método é destruindo a sessão, neste caso, a sessão deixará de existir.

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

// Destroi a sessão
session_destroy();

Destruir a sessão é sempre mais eficaz do que qualquer outro método.

Leia mais sobre as sessões em PHP

Existem várias funções disponíveis para as sessões PHP para atender qualquer tipo de necessidade especial, todas estão disponíveis no manual do PHP:

Vale a pena conferir.

Concluindo

Lembre-se: sessões e cookies são essenciais para a criação de sistemas de login, então vale a pena dedicar um tempo a mais para aprender todas as nuances dessa parte do PHP.

Em caso de dúvidas, basta deixar um comentário.