PHP – Trabalhando com sessões

PHP – Trabalhando com sessões

Olá, nesse post veremos como utilizar de forma simples, as sessões no PHP .
É claro que já é simples trabalhar com sessões no PHP, no entanto escrevi uma classe na tentativa de facilitar ainda mais, sabe-se que para iniciar uma sessão basta utilizar o comando:

 <?php
 session_start();
 ?
 

Até aí beleza e depois? O que mais precisamos fazer não só para manter a sessão mas também para utiliza-la afim de recuperar informações?

Adianto que não utilizaremos recursos para aplicar segurança  e toda aquela coisa, comento isso porque as vezes aparecem um ou outro artista que dizem coisas do tipo:
– Pá comessá ten di tê siguranssa na çeção.

Então, já aviso de prima que não é abordada nesse post  a questão de segurança em sessões com PHP!

Bem, vou citar aqui o que a classe propõe para trabalharmos com uma sessão:
– setar/recuperar  o tempo de sessão em segundos, ex: 3600 segundos (1 hora)
– gravar/recuperar informações em um array da sessão
– checar o status da sessão (validar)

É pouca coisa mas penso eu que a classe facilita a forma de faze-lo, vejamos um exemplo no arquivo login.php que é responsável por iniciar/setar uma sessão:

<?php
// incluindo a classe
require_once 'session.class.php';
// nova sessao
$ses = new Session;
// iniciando a sessao
$ses->start();
// tempo de sessao com 3600 seg. (1 hora)
$ses->init(3600);
// inserindo uma informação adicional na sessao
$ses->addNode('userName', 'Rafael Clares');
?>

O arquivo login inicia e seta o tempo de  sessão para 1 hora e também adiciona à sessão no índice  “userName” o valor  “Rafael Clares“, essa informação poderá ser recuperada nas demais páginas, assim como podem ser adicionados novos índices no array da sessão, ex:

<?php
 $ses->addNode('userName', 'Rafael Clares');
 $ses->addNode('userID', '123456');
 $ses->addNode('userMail', '[email protected]');
?>

A idéia é que durante o login você possa adicionar informações que sejam úteis durante a sessão, lembrando…  informações essas que não venham comprometer a segurança, como por exemplo adicionar à sessão uma senha ou dado importante do usuário(#wrong).

Para não ficar dúvidas, não estamos falando de login e sim de sessão, para você implementar a sessão no login (e isso é que torna utilizável)  você precisa implementar o login e dentro da condição verdadeira implementar a sessão, ex (não vou colocar a consulta em bd, então nem comentem lances de SQL Injection, criptografia e coisas do tipo ) :

<?php
if(  $row['login']  == "$usuario"  and  $row['password'] == "$senha" )
{
require_once 'session.class.php';
$ses = new Session;
$ses->start();
$ses->init(3600);
}
?>

Bem, seria a “grosso” modo o local onde você deve implementar a sessão!

Prosseguindo,  após ter setado a sessão você precisa “checar” nas demais páginas para permitir a navegação, então vamos utilizar aqui page1 e page2 como exemplo.

page1

<?php
// incluindo a classe
require_once 'session.class.php';
// nova sessao
$ses = new Session;
// iniciando a sessao
$ses->start();
// checando a sessao
if(!$ses->check())
{
// imprimindo mensagem de status (sessao inativa)
echo $ses->status();
exit;
}
else
{
// imprindo o nome do usuario
echo "Olá, " . $ses->getNode('userName');
// imprimindo tempo restante
echo "Tempo restante: ". $ses->getLeftTime();
}
?>

Perceba que nesse arquivo já não temos mais a chamada ao método $ses->init($time);
Esse método é responsável por setar a sessão, inicializa-la, logo, precisamos/devemos utiliza-la apenas uma vez!
Quase todo o restante parece igual a não ser pelo fato de que agora estamos recuperando as informações além de checar se a sessão está ativa, estamos também imprimindo (toscamente) o nome do usuário e o tempo restante de sessão.

$ses->getNode(‘userName’)  recupera a informação passada à sessão durante o (suposto) login c/ o método addNode(‘node’,’value’).
$ses->getLeftTime() recupera o tempo restante da sessão, ou seja, momento em que o login foi efetuado – momento atual.

O recurso do método getLefTime() é bastante utilizado (não com esse nome, claro) em sites como internet banking por exemplo, acho que todos que utilizam o serviço já devem ter notado no topo que fica constantemente aparecendo o tempo de sessão restante, nesse exemplo ele recupera apenas quando atualiza a página, claro… No entanto, irei comentar como fazer para que ele fique o tempo todo contando e trazendo a informação mesmo que a página não seja atualizada!

Bem, até agora vimos que o arquivo login seta/inicializa a sessão e em seguida não mais o consultaremos e também não faremos mais chamadas à alguns métodos presentes nesse arquivo para que a sessão não seja “resetada”.

No arquivo page1 vimos que ele checa a sessão e imprime algumas informações.

Para que possamos realmente testar a funcionalidade precisamos de navegação, ou seja, transitar da page 1 para page 2  através de uma sessão, bem, o arquivo page 2 é identico ao arquivo page 1.

Na verdade a única diferença é que no arquivo page 1 existe um link para o arquivo page 2logout e no  page 2 exise o link para page 1logout, acontece que não estão presentes nos códigos acima, resolvi não colocar para não ficar muita “sujeira” no código de explicação, no entanto no link demo tem os links e são links comuns, claro(acho que nem conheço links incomuns)…
Bom, o links vocês notarão nos fontes, o html logo abaixo do PHP.

Para ficar mais claro,
O motivo de não ter colocado é que os links seriam a única diferença entre os 2 arquivos, isso porque a única coisa que você precisa fazer em todas as páginas que dependerão de sessão é inserir a verificação, ou seja, no cabeçalho de cada página você vai colocar :

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
if(!$ses->check())
{
echo $ses->status();
exit;
}
?>

E também poderia ser assim:

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
if(!$ses->check())
{
// incluindo o form de login
include 'formulario_login.html';
exit;
}
?>

E se você preferir pode ser um include, algo como “check_session.php” com o conteúdo acima.
Claro que se você for utilizar os outros métodos da classe você adiciona-los ao include, se essas informações forem comuns à todas as páginas!

Lembrando que os métodos podem ser utilizados depois de ter iniciado as sessão, quero dizer que você pode mesmo depois de estar na sessão, chamar um método e depois recuperar a informação, ex:

<?php
$ses->addNode('status_aviso_home','leu o aviso');
?>

Ha-ha, confesso que eu deveria ter me inspirado mais para dar esse exemplo acima, mas você entenderam que eu sei ($ses->addNode(‘QueBurro’,’DaZeroPraEle’)) !

Retomando, faltou ainda o cara responsável por encerrar a sessão, o tal de logout, vejamos:

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
// destruindo a sessao
$ses->destroy();
// destruindo objeto
unset($ses);
?>

Com isso nós finalizamos e como se diz lá pelas 5 da manhã, vamos pensar um pouco

– O login.php é o cara que após ter se certificado de que deve iniciar uma sessão,  seta os parâmetros e faz o trabalho dele de “startar” a sessão.
– O page1.php é o cara que só vai exibir o conteúdo caso a sessão esteja ativa e para isso ele faz a verificação como o $ses->check() que retorna false se não estiver ativa a sessão.
– O page2.php é outro cara que utilizamos para ficar “para lá e para cá” entre as páginas com intuito de testar a navegação com sessão (se estiver ativa).
– O logout.php é quem encerra a sessão e destrói o objeto $ses.
– O session.class.php é quem faz os if’s hahahahaha (é ow, eu tbm sinto sono e hj não tá rolando Atari Teenage Riot) .

Nota:
Quando a sessão está inativa aparece a mensagem “A sessão requerida não está ativa“.
Essa mensagem pode ser alterada na classe ou você pode seta-la durante a verificação, ou seja, antes do método  check(), ficaria assim:

<?php
require_once 'session.class.php';
$ses = new Session;
$ses->start();
$ses->setMsg("Escreva aqui que o cara precisa se logar");
if(!$ses->check())
{
echo $ses->status();
exit;
}
?>

demo:  session
fontes: download

Valeu pessoal e até a próxima sessão.
abraço à todos

$ses->destroy();

Comments

  1. By Flávio

  2. By Pedro

  3. By Tony Manuel

%d blogueiros gostam disto: