Você está na página 1de 6

Sessões em PHP (Extraído de www.php.

net)
Introdução
O suporte a sessões no PHP consiste em uma forma de preservar certos dados através de acessos subseqüentes. Isto
te permite construir aplicações mais personalizadas e aumenta a atração ao seu web site. Um visitante acessando seu
web site está determinado por uma única id, a então chamada id de sessão. Esta ou é guardada em um cookie do lado
do usuário ou está na URL. As sessões te permitem registrar arbitrariamente números de variáveis para estarem lado a
lado com as requisições. Quando um visitante acessa seu site, o PHP checará automaticamente (se session.auto_start
está definida para 1) ou no seu pedido (explicitamente através da session_start() ou implicitamente através da
session_register()) se uma id de sessão específica foi enviada com o pedido. Se este é o caso, o ambiente anterior
guardado é restaurado.

Todas as variáveis registradas são publicadas em série após o pedido terminar. Variáveis registradas que estão
indefinidas estão marcadas como estando não definida. Num acesso subseqüente, estas não estarão definidas pelo
módulo da sessão a menos que o usuário as defina mais tarde. A sessão, se for utilizada, deve ser a primeira coisa a
ser feita na página, isto é, antes de serem enviados os cabeçalhos HTTP.

session_start
session_start — Inicia dados de sessão

Descrição
bool session_start ( void )

session_start() cria uma sessão (ou resume a sessão atual baseada numa id de sessão sendo passada
via uma variável GET ou um cookie).

Esta função sempre retorna TRUE.

Nota: Se você está usando sessões baseadas em cookie, você deve chamar session_start() antes de
qualquer coisa ser exibida para o navegador.

Exemplo 1998. Um exemplo de sessão: page1.php


<?php
// page1.php
session_start();
echo 'Bem vindo a pagina #1';
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// Funciona se o cookie de seção foi aceito
echo '<br /><a href="page2.php">page 2</a>';
// Ou talvez passando o ID da seção se necessário
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>

Após ver page1.php, a segunda pagina page2.php irá magicamente conter os dados da seção. Leia Uso
de seções para informações sobre propagando ids de seções já que, por exemplo, explica tudo sobre a
constante SID.

Exemplo 1999. Um exemplo de seção: page2.php


<?php
// page2.php
session_start();
echo 'Bem vindo a pagina #2<br />';
echo $_SESSION['favcolor']; // green
echo $_SESSION['animal']; // cat
echo date('Y m d H:i:s', $_SESSION['time']);
// Você pode querer usar o SID aqui, como fizemos em page1.php
echo '<br /><a href="page1.php">page 1</a>';
?>

Se você quiser usar uma seção com nomes, você deve usar session_name() antes de session_start().

session_start() irá registrar um handler de saída interno para URL reescrevendo quando trans-sid está
habilitada. Se um usuário utiliza ob_gzhandler ou ob_start(), a ordem do handler de exibição é
importante para a exibição apropriada. Por exemplo, usuário deve registrar ob_gzhandler antes de a
sessão começar.

Nota: Uso de zlib.output_compression é mais recomendado do que ob_gzhandler

Nota: A partir do PHP 4.3.3, usar session_start() quando a seção já tiver sido iniciada irá resultar em
um erro de nível. E_NOTICE. Também, o segundo início de seção será simplesmente ignorado.

session_name
session_name — Obtém e/ou define o nome da sessão atual

Descrição
string session_name ( [string $name] )

session_name() retorna o nome da sessão atual. Se name está especificado, o nome da sessão atual é
mudado para esse valor.

O nome da sessão refere-se à id de sessão em cookies e URLs. Ela poderia conter apenas caracteres
alfanuméricos; ela poderia ser curta e descritiva (i.e. para usuários com avisos em cookie habilitados). O
nome da sessão é retomado para o valor padrão guardado em session.name no pedido na hora de
inicialização. Dessa forma, você precisa chamar session_name() para cada requerimento (e antes de
session_start() ou session_register() serem chamadas).

Atenção

O nome da sessão não pode consistir apenas de digitos, ao menos uma letra deve estar presente. Se
não, um novo id de sessão é gerado a cada vez.

Exemplo 1995. Exemplos session_name()


<?php

// defina o nome da sessão para WebsiteID

$previous_name = session_name("WebsiteID");

echo "O nome da sessão anterior era $previous_name<br />";


?>

session_id
session_id — Obtém e/ou define o id de sessão atual

Descrição
string session_id ( [string $id] )

session_id() é usado para obter ou definir o id de sessão para a sessão atual.


A constante SID também pode ser usada para obter o nome atual e o id da sessão como uma string
adequado para adicionar em URLs. Veja também Manipulação de Sessão.

Parâmetros
id

Se id for especificado, ele irá substituir o id de sessão atual. session_id() precisa ser chamado
antes de session_start() para este fim. Dependendo do manipulador de sessão, nem todos os
caracteres são permitidos em um id de sessão. Por exemplo, o manipulador de sessão em
arquivo permite apenas caracteres no intervalo a-z, A-Z and 0-9!

Nota: Quando estiver usando cookies de sessão, especificar um id para session_id() irá
sempre enviar um novo cookie quando session_start() for chamada, sem importar se o id da
sessão atual for identico ao que esta sendo definido.

Valores de retornado

session_id() retorna o id de sessão para a sessão atual ou uma string vazia ("") se não houver
sessão atual (não existe um id de sessão atual).

session_destroy

session_destroy — Destrói todos os dados registrados em uma sessão

Description
bool session_destroy ( void )

session_destroy() destroi todos os dados associados com a sessão atual. Ela não desregistra nenhuma
das variáveis globais associadas a sessão atual, nem desregistra o cookie de sessão.

Para poder matar a sessão junto, como para fazer o log out do usuário, o id da sessão também deve ser
desregistrado. Se for usado um cookie para propagar o id de sessão (funcionamento padrão), então o
cookie de sessão deve ser excluído. setcookie() pode ser usado para isso.

Retorna TRUE em caso de sucesso ou FALSE em falhas.

session_set_cookie_params

session_set_cookie_params — Define os parâmetros do cookie de sessão

Descrição
void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure [,
bool $httponly]]]] )

Define parãmetros dos cookies como no arquivo php.ini file. O efeito desta função é apenas pela duração
do script. Então, então você precisa chamar session_set_cookie_params() para cada requisição e
antes que session_start() seja chamada.

Exercícios
<?
// Observe que a sessão é a primeira coisa a ser definida na página
session_name("Regis"); // nome da sessão
session_set_cookie_params(20); // 20 segundos é o tempo da sessão
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>:: Sessões em PHP ::</title>
</head>

<body>
<?
echo session_id()."<br>";//mostrando o id da sessão
echo session_name();// mostrando o nome da sessão
?>
</body>
</html>

Experimente atualizar a página a cada 21 segundos. Observe que é gerado um novo id de sessão.

Autenticando um usuário em um website


Uma das utilizações das sessões é a autenticação de um usuário em um website. Esta técnica consiste
em pedir um login e uma senha ao usuário, verificar se está cadastrado no banco de dados e, caso
positivo, permitir o seu acesso às páginas restritas ou, caso negativo, redirecioná-lo à página de login ou
à uma página de erro (acesso negado). A página que será permitida o acesso deverá verificar se houve o
correto login na página anterior.

Para este exercício, faremos quatro páginas: uma que contém dados da conexão com o banco, a de login
e senha, uma de acesso permitido e uma de acesso negado. Crie também uma tabela usuarios no seu
banco de dados (web09 ou web12) com os campos id (chave primária), nome, login e senha, conforme
abaixo:

Campo Tipo Collation Atributos Nulo Padrão Extra Ações


id int(11) Não auto_increment

nome varchar(60) latin1_swedish_ci Não

login varchar(15) latin1_swedish_ci Não

senha varchar(15) latin1_swedish_ci Não

Cadastre um usuário com os seguintes dados: id (deixe em branco, pois é auto_increment), nome
(Coloque o seu nome completo com acentos, ç, etc.) login (coloque um login com até 15 caracteres sem
acentos, ç ou caracteres especiais) e a senha (digite uma senha qualquer, mas sem acentos, ç,
caracteres especiais). Comecemos com a página de conexão:

<?
$cfg['servidor'] = "localhost";
$cfg['banco'] = "web09"; // se for outro, altere-o
$cfg['usuario'] = "root";
$cfg['password'] = "";
?>

Dentro da sua pasta de trabalho (provavelmente em C:\Arquivos de programas\EasyPHP\www\Web09),


crie uma pasta “includes” e salve o código acima num arquivo com o nome de “config.php” dentro dessa
pasta “includes”. Agora, vamos à página de login:

<?
session_start();
include ("includes/config.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>:: Cart&oacute;rio Albuquerque ::</title>
<link href="styles/main.css" rel="stylesheet" type="text/css" />
<script src="Scripts/AC_RunActiveContent.js" type="text/javascript"></script>
</head>
<body>
<div id="main">
<h2>Autentica&ccedil;&atilde;o</h2>
<fieldset>
<legend>Acessar ao sistema:</legend>
<form id="form1" name="form1" method="post" action="">
<table width="80%" border="0" align="center" cellpadding="0" cellspacing="2">
<tr>
<td width="20%" align="right">
<label for="login">Login:</label></td>
<td width="19%"><input name="login" type="text" id="login" size="15"
/></td>
<td width="13%" align="right"><label for="senha">Senha:</label></td>
<td width="19%"><input name="senha" type="password" id="senha" size="15"
/></td>
<td width="29%"><input name="enviar" type="submit" id="enviar"
value="Enviar" /></td>
</tr>
</table>
</form>
<?
if (isset($_POST['enviar']) && $_POST['enviar']) {
$server = mysql_connect($cfg['servidor'], $cfg['usuario'],
$cfg['password']);
$linkbd = mysql_select_db($cfg['banco'], $server);
$login = strip_tags($_POST['login']);
$senha = strip_tags($_POST['senha']);
$sql = "SELECT * FROM usuarios WHERE login='$login' AND
senha='$senha'";
$msg="";
$query = mysql_query($sql);
if (mysql_num_rows($query) > 0) {
$_SESSION['logado'] = true;
echo '<script
type="text/javascript">window.location.href="permitido.php"</script>';
} else $msg = "Usuario nao cadastrado";
echo "$msg";
}
?>
</fieldset>
</div>
</body>
</html>

A primeira linha é o início da sessão. Como já havia dito, deve ser a primeira coisa a ser feita
numa página web que vai usar sessão. Depois, incluímos o arquivo config.php que contém os
dados da conexão com o banco de dados.

A página de acesso permitido é bem simples, em nosso exemplo. Apenas para exemplificar a
técnica.

<?
session_start();
if (!isset($_SESSION['logado']) || $_SESSION['logado']=="") header("Location:
negado.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>:: Permitido ::</title>
</head>
<body>
<h1>Bem vindo ao Site <? echo $_SESSION['nome']; ?></h1>
</body>
</html>

A página de acesso negado serve apenas para dizer que o usuário não tem permissão de acesso ao
website. Em nosso exemplo, temos:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>:: Acesso Negado ::</title>
</head>

<body>
<h1>Acesso Negado</h1>
<p><a href="login.php">Retornar à página de login</a></p>
</body>
</html>