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 2 e logout e no page 2 exise o link para page 1 e logout, 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();
Classe nota 10
Rafael.
Achei seu site por acaso ao buscar como utilizar classes em PHP e fiquei impressionado com o conteúdo.
É importante ter pessoas como você, que muitas vezes cansado do trabalho, ainda encontra tempo para compartilhar seu conhecimento.
Que Deus abençoe sua vida.
Passarei a ser visitante frequente. Parabéns!
Ai, gostei muito… site excelente, além de postar a sessão e explicar bem explicadinho posta o demo e a fonte pra download.. parabéns ótimo trabalho!
Seu site é o melhor dos melhores… parabéns