As sessões são um recurso oferecido pelo PHP que possibilita a criação de variáveis para armazenar valores que poderão ser utilizados em qualquer momento durante sua visita em um site, dessa forma, a cada novo visitante do seu site deverá ser criada uma nova sessão que guardará os dados dele. Após uma sessão ser criada, você poderá utilizá-la em qualquer arquivo.
Uma variável de sessão só não estará mais disponível quando o usuário fechar o navegador ou quando a sessão for destruída.
Sua principal finalidade é o armazenamento de informações cruciais em tempo de execução de um site; alguns exemplos dessas informações são: nome, login, senha, horário que entrou no site, tempo que está inativo, e etc.
Teremos a seguir uma visão geral da utilização de sessões e logo após veremos sua utilização na criação de um gerenciador de tarefas.
Para iniciar uma sessão basta utilizar o código da Listagem 1.
Listagem 1. Criando uma sessão.
<?php
session_start(); // inicia a sessão
?>
Com a sessão iniciada podemos criar variáveis de sessão, onde de fato serão guardados os valores que precisamos. Na Listagem 2 vemos como guardar essa informação a partir de um nome ou de outra variável.
Listagem 2. Criando uma variável de Sessão.
<?
session_start();
$_SESSION['usuario'] = 'nome do usuario'; // passando o valor diretamente para a sessão
$usuario = 'nome de usuário';
$_SESSION['usuario'] = $usuario // pegando o valor de uma variável que já existe e possui e valor // que queremos
?>
Utilizando qualquer uma das duas formas mostradas, o resultado será o mesmo.
Para exibir esse valor basta utilizar o comando echo, como mostra a Listagem 3.
Listagem 3. Imprimindo uma variável de sessão.
<?php
session_start();
$_SESSION['usuario'] = 'nome do usuario';
echo $_SESSION['usuario'];
?>
Para destruir uma variável de sessão basta usar a função unset(), como mostra a Listagem 4.
Listagem 4. Destruindo uma variável de sessão.
<?php
session_start();
$_SESSION['usuario'] = 'nome do usuario';
unset ($_SESSION['usuario'] ); // Destroi a variável de sessão.
?>
Caso você não queira destruir apenas uma variável de sessão, mas todas elas, precisaremos usar o código da Listagem 5.
Listagem 5. Destruindo toda as variáveis de sessão de uma única vez.
<?php
session_start();
$_SESSION['usuario'] = 'nome do usuario'; // cria a primeira variável de sessão
$_SESSION['senha'] = 'senha do usuario'; // cria a segunda variável de sessão
$_SESSION['email'] = 'e-mail do usuario'; // cria a terceira variável de sessão
session_destroy(); // apaga todas as variáveis de uma única vez
?>
Cada sessão iniciada possui um tempo de vida (time to live – TTL) de 180 minutos, e após esse tempo ela irá ser destruída automaticamente. Caso queira aumentar ou diminuir esse tempo, você pode utilizar a função session_cache_expire(), como mostra a Listagem 6.
Listagem 6. Informando o tempo de vida de uma sessão.
<?php
session_cache_expire(30);
session_start();
?>
No exemplo apresentado essa sessão será destruída em 30 minutos.
Para verificar se uma variável de sessão existe podemos utilizar a função isset() da Listagem 7, que retorna um valor booleano verdadeiro caso exista, e falso caso contrário.
Listagem 7. Verificando a existência de uma sessão.
<?php
session_start();
$_SESSION['autor'] = 'luciano';
if(isset($_SESSION['autor'])){
echo “Autor existe”;
} else {
echo “Autor não existe”;
}
?>
Criando um gerenciador de tarefas
Agora vamos iniciar a criação da nossa aplicação que contará com duas páginas: uma para cadastrar e listar as tarefas, e outra para manipular as informações e salvá-las em uma lista.
Para construir nossa aplicação utilizaremos o NetBeans (não mostraremos aqui como instalá-lo).
Após abrir o IDE, vamos criar um novo projeto PHP chamado Gerenciador de Tarefas, como mostra a Figura 1.
Figura 1. Criando nosso projeto.
Criando o formulário de cadastro de tarefas
Vamos criar o formulário de cadastros no arquivo index.php, que deve conter o código da Listagem 8.
Listagem 8. Conteúdo atual do nosso index.php.
<html>
<head>
<meta charset="UTF-8">
<title>Gerenciador de Tarefas: Devmedia</title>
</head>
<body>
<form>
<fieldset>
<legend>Nova tarefa</legend>
<label>
Tarefa:
<input type="text" name="nome" id=”name”/>
</label>
<input type="submit" value="Cadastrar" />
</fieldset>
</form>
<?php
// put your code here
?>
</body>
</html>
Para ver o resultado do código apresentado, certifique-se que seu servidor web está rodando e acesse o link: http://localhost/Gerenciador de Tarefas/index.php
O resultado deve ser o mesmo da Figura 2.
Figura 2. Execução da Listagem 8
Com a página rodando no seu navegador experimente digitar um valor qualquer, como “Ler artigo Devmedia” e, ao clicar no botão Cadastrar repare que aparentemente nada aconteceu. Mas se você observar, a URL da sua aplicação mudou e agora deve ser algo como:
http://localhost/Gerenciador de Tarefas/index.php ?nome=Ler+artigo+Devmedia.
Com isso podemos perceber que “nome” refere-se ao nosso input, que recebeu o valor Ler+artigo+Devmedia.
Utilizando os Dados Passados pela URL
Agora que já vimos como passar dados pela URL vamos aprender como utilizá-los com o que chamamos em PHP de variáveis super globais, ou seja, variáveis que estão disponíveis em qualquer escopo (parte) de um script PHP.
Para o nosso exemplo utilizaremos o $_GET logo após a tag e dentro da estrutura , como no código da Listagem 9.
Listagem 9. Super global $_GET para acessar o nome da tarefa.
. . .
</form>
<?php
if (isset($_GET['nome'])) {
echo "Nome informado: " . $_GET['nome'];
}
?>
. . .
Repare que a função isset() serve para verificar se uma variável ou índice existe: se ela existir nosso código executará o comando echo para imprimir o valor desse índice, caso contrário, não acontecerá nada.
O resultado da Listagem 9 deverá ser algo como a Figura 3.
Figura 3. Tela inicial.
Como queremos salvar uma lista de tarefas devemos salvar num array, que servirá como uma lista de tarefas. Para isso altere o código conforme a Listagem 10.
Listagem 10. Pegando o valor de $_GET e guardando em um array chamado $lista_tarefas.
. . .
</form>
<?php
$lista_tarefas = array();
if (isset($_GET['nome'])) {
$lista_tarefas[] = $_GET['nome'];
}
?>
. . .
Inicialmente é verificado se existe um índice chamado nome dentro do $_GET: caso exista, será criado um índice em $lista_tarefas.
Para exibir a lista criada utilizaremos uma tabela para armazenar todas as atividades inseridas usando um comando novo foreach. Adicione o código da Listagem 11logo após o código PHP que termina com o ?>.
Listagem 11. Criando uma tabela para imprimir nossas tarefas.
. . .
<table>
<tr>
<th>Tarefas</th>
</tr>
<?php foreach ($lista_tarefas as $tarefa) : ?>
<tr>
<td><?php echo $tarefa; ?> </td>
</tr>
<?php endforeach; ?>
</table>
</body>
. . .
Estamos criando uma tabela com uma coluna que traz o título “Tarefas” e a seguir tags para a criação de linhas, onde serão exibidas as tarefas.
O foreach é uma estrutura de repetição que irá por cada um dos registros do nosso array, e cada índice será atribuído a uma variável, no nosso caso, a $tarefa.
Após a alteração, o nosso gerenciador deve ser igual a Figura 4.
Figura 4. Primeira tarefa adicionada.
Agora digite uma nova tarefa, como “Estudar Programação” e clique em cadastrar. Veja que a nossa tarefa anterior foi substituída, como mostra a Figura 5.
Figura 5. Segunda tarefa adicionada.
Aqui percebemos que nossa aplicação não está fazendo o que ela foi proposta, afinal, onde está nossa primeira tarefa? Quando trabalhamos com web, a cada nova requisição o PHP interpreta todo o conteúdo novamente e envia para o navegador, assim, tudo que foi executado antes será perdido.
Para resolver nosso problema o PHP fornece um recurso chamado sessão.
Trabalhando com Sessões
Para resolvermos o problema de não conseguir manter um valor salvo em uma variável antes e depois de uma nova requisição utilizaremos o recurso chamado sessões. Em linhas gerais, esse recurso nos possibilita a criação de uma ou mais variáveis especiais que existirão em todas as requisições.
Para isso utilizaremos outra variável super global, o $_SESSION, que diferentemente do $_GET que só conseguia ler informações, consegue ler e escreve-las.
Devemos chamar a função session_start() no início de nossa aplicação adicionando a linha:
<?php session_start(); ?>
<html>
. . .
Agora vamos alterar nosso código para pegar as tarefas e salvar na nossa $_SESSION. Altere o if que testa a existência de dados em $_GET e adicione um outro if abaixo do array $lista_tarefas que irá receber os dados da $_SESSION, como mostra a Listagem 12.
Listagem 12. Adicionando uma variável de sessão.
<?php
. . .
if (isset($_GET['nome'])) {
$_SESSION['lista_tarefas'][] = $_GET['nome'];
}
$lista_tarefas = array();
if (isset($_SESSION['lista_tarefas'])) {
$lista_tarefas = $_SESSION['lista_tarefas'];
}
. . .
?>
Agora se você testar irá conseguir cadastrar várias tarefas sem perder nada.
A forma mais simples de declarar uma variável de sessão é assim:
$_SESSION['tarefa'] = 'Estudar PHP';
Após criada, ela estará disponível em qualquer lugar da aplicação.
Podemos destrui-la a qualquer momento usando o unset():
unset($_SESSION['tarefa']);
Dessa forma destruiremos uma variável por vez, mas caso tenhamos várias variáveis podemos destrui-las todas de uma única vez:
session_destroy(); // destrói toda sessão.
Caso abra essa mesma aplicação que fizemos em outro navegador, você verá que suas tarefas não existem mais, isso se dá pelo fato de que o PHP possui um sistema de controle de donos de cada sessão e, para isso, ele salva um cookie no navegador que informa quem é o dono de cada sessão. Assim, se você trocar de navegador não terá mais acesso a essas informações.
Agora faça outro teste indo até o gerenciador de tarefas e aperte F5 várias vezes: repare que nenhuma nova tarefa é adicionada, já que ele repetirá a última tarefa adicionada a cada F5. Mais à frente veremos como resolver esse problema.
Separando nosso Arquivo
Nosso arquivo atual contém tanto código HTML quanto PHP, mas essa não é postura mais correta. No entanto, se continuarmos com nosso projeto assim não terá nenhum problema, mas irá chegar um momento que nosso arquivo estará tão grande e complexo que teremos dificuldade de entender o que está acontecendo.
Levando em consideração esses fatores iremos agora separar nossos arquivos com o objetivo de deixar cada arquivo dividido o máximo possível por linguagem.
Crie um arquivo chamado tarefas.php e adicione o código da Listagem 13.
Listagem 13. Conteúdo do arquivo tarefas.php.
<?php
session_start();
if (isset($_GET['nome'])) {
$_SESSION['lista_tarefas'][] = $_GET['nome'];
}
if (isset($_SESSION['lista_tarefas'])) {
$lista_tarefas = $_SESSION['lista_tarefas'];
} else {
$lista_tarefas = array();
}
include "index.php";
É válido lembrar que só adicionamos uma nova instrução, o resto do código já existia, apenas estava separado e o juntamos em um único lugar.
A nova instrução é o include, que serve para incluir um arquivo com todas as suas variáveis e funções no nosso arquivo atual, dessa forma, teremos acesso a variável $lista_tarefas, mesmo ela tendo sido definida no arquivo index.php.
Para vermos o resultado da nossa aplicação devemos acessar diretamente o arquivo tarefas.php e não mais o index.php. Se você estiver utilizando outro editor de códigos pode simplesmente mudar a URL no navegador. Como estamos usando o Netbeans, podemos configurá-lo para executar o projeto abrindo o arquivo tarefas.php, para isso vá em propriedades do projeto e clique em Executar Configurações, onde uma tela como a da Figura 6 aparecerá.
Em URL do projeto altere o caminho do arquivo.
Figura 6. Alterando o arquivo inicial da nossa aplicação.
O conteúdo fina do arquivo index ficará como na Listagem 14.
Listagem 14. Arquivo index.php.
<html>
<head>
<meta charset="utf-8" />
<title>Gerenciador de Tarefas: Devmedia</title>
</head>
<body>
<h1>Gerenciador de Tarefas</h1>
<form>
<fieldset>
<legend>Nova tarefa</legend>
<label>
Tarefa:
<input type="text" name="nome" />
</label>
<input type="submit" value="Cadastrar" />
</fieldset>
</form>
<table>
<tr>
<th>Tarefas</th>
</tr>
<?php foreach ($lista_tarefas as $tarefa) : ?>
<tr>
<td><?php echo $tarefa; ?> </td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
Podemos ver que nesse arquivo quase todo nosso código é HTML, com exceção da estrutura foreach. Assim, conseguimos separar as responsabilidades da nossa aplicação por arquivo, tornando nosso processo de desenvolvimento mais simples.
Adicionando mais campos
Até então nosso código só possibilita o cadastro do nome da nossa tarefa, agora vamos incrementar nosso sistema para que possamos descrever e classificar cada item adicionado.
Os campos que adicionaremos serão, prazo para conclusão, nível de prioridade e estado da tarefa, que poderá estar concluída ou em andamento.
No arquivo index.php vá até o nosso formulário e adicione o código da Listagem 15.
Listagem 15. Adicionando campos ao nosso formulário.
. . .
<label>
Descrição (Opcional):
<textarea name="descricao"></textarea>
</label>
<label>
Prazo (Opcional):
<input type="text" name="prazo" />
</label>
<fieldset>
<legend>Prioridade:</legend>
<label>
<input type="radio" name="prioridade" value="baixa" checked />
Baixa
<input type="radio" name="prioridade" value="media" />
Média
<input type="radio" name="prioridade" value="alta" />
Alta
</label>
</fieldset>
<label>
Tarefa concluída:
<input type="checkbox" name="concluida" value="sim" />
</label>
<input type="submit" value="Cadastrar" />
. . .
O resultado até agora deve ser algo como o da Figura 7.
Figura 7. Gerenciador de Tarefas com vários campos.
Vamos então editar o arquivo tarefas.php, conforme a Listagem 16, para receber e armazenar as novas informações passadas pelo formulário. Utilizaremos o nome da tarefa como o único campo obrigatório, dessa forma, a tarefa só será cadastrada se o usuário fornece esse campo, caso contrário, todas as outras informações serão descartadas.
Listagem 16. Alterando o arquivo tarefas.php.
<?php
session_start();
if (isset($_GET['nome']) && $_GET['nome'] != '') {
$tarefa = array();
$tarefa['nome'] = $_GET['nome'];
if (isset($_GET['descricao'])) {
$tarefa['descricao'] = $_GET['descricao'];
} else {
$tarefa['descricao'] = '';
}
if (isset($_GET['prazo'])) {
$tarefa['prazo'] = $_GET['prazo'];
} else {
$tarefa['prazo'] = '';
}
$tarefa['prioridade'] = $_GET['prioridade'];
if (isset($_GET['concluida'])) {
$tarefa['concluida'] = $_GET['concluida'];
} else {
$tarefa['concluida'] = '';
}
$_SESSION['lista_tarefas'][] = $tarefa;
}
. . .
Por fim, vamos alterar nossa tabela do index.php para que mostre todos os campos inseridos no formulário, conforme mostra a Listagem 17.
Listagem 17. Alterando a tabela para mostrar todos os campos inseridos.
. . .
<table>
<tr>
<th>Tarefa</th>
<th>Descricao</th>
<th>Prazo</th>
<th>Prioridade</th>
<th>Concluída</th>
</tr>
<?php foreach ($lista_tarefas as $tarefa) : ?>
<tr>
<td><?php echo $tarefa['nome']; ?> </td>
<td><?php echo $tarefa['descricao']; ?> </td>
<td><?php echo $tarefa['prazo']; ?> </td>
<td><?php echo $tarefa['prioridade']; ?> </td>
<td><?php echo $tarefa['concluida']; ?> </td>
</tr>
<?php endforeach; ?>
</table>
. . .
Após essas modificações adicione uma nova tarefa informando todos os campos, conforme vemos na Figura 8.
Figura 8. Exibindo todos os campos cadastrados.
Se por acaso você se perdeu em algum momento na alteração dos códigos, nas Listagens 18 e 19 apresentamos os códigos completos dos arquivos index.php e tarefa.php respectivamente.
Listagem 18. Código completo do arquivo index.php.
<html>
<head>
<meta charset="utf-8" />
<title>Gerenciador de Tarefas: Devmedia</title>
</head>
<body>
<h1>Gerenciador de Tarefas</h1>
<form action="tarefas.php">
<fieldset>
<legend>Nova tarefa</legend>
<label>
Tarefa:
<input type="text" name="nome" />
<br />
<br />
</label>
<label>
Descrição (Opcional):
<textarea name="descricao"></textarea>
<br />
<br />
</label>
<label>
Prazo (Opcional):
<input type="text" name="prazo" />
<br />
<br />
</label>
<fieldset>
<legend>Prioridade:</legend>
<label>
<input type="radio" name="prioridade" value="baixa" checked />
Baixa
<input type="radio" name="prioridade" value="media" />
Média
<input type="radio" name="prioridade" value="alta" />
Alta
</label>
<br />
<br />
</fieldset>
<label>
Tarefa concluída:
<input type="checkbox" name="concluida" value="sim" />
<br />
<br />
</label>
<input type="submit" value="Cadastrar" />
</fieldset>
</form>
<table>
<tr>
<th>Tarefa</th>
<th>Descricao</th>
<th>Prazo</th>
<th>Prioridade</th>
<th>Concluída</th>
</tr>
<?php foreach ($lista_tarefas as $tarefa) : ?>
<tr>
<td><?php echo $tarefa['nome']; ?> </td>
<td><?php echo $tarefa['descricao']; ?> </td>
<td><?php echo $tarefa['prazo']; ?> </td>
<td><?php echo $tarefa['prioridade']; ?> </td>
<td><?php echo $tarefa['concluida']; ?> </td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
Listagem 19. Código completo do arquivo tarefas.php.
<?php
session_start();
if (isset($_GET['nome']) && $_GET['nome'] != '') {
$tarefa = array();
$tarefa['nome'] = $_GET['nome'];
if (isset($_GET['descricao'])) {
$tarefa['descricao'] = $_GET['descricao'];
} else {
$tarefa['descricao'] = '';
}
if (isset($_GET['prazo'])) {
$tarefa['prazo'] = $_GET['prazo'];
} else {
$tarefa['prazo'] = '';
}
$tarefa['prioridade'] = $_GET['prioridade'];
if (isset($_GET['concluida'])) {
$tarefa['concluida'] = $_GET['concluida'];
} else {
$tarefa['concluida'] = '';
}
$_SESSION['lista_tarefas'][] = $tarefa;
}
if (isset($_SESSION['lista_tarefas'])) {
$lista_tarefas = $_SESSION['lista_tarefas'];
} else {
$lista_tarefas = array();
}
include "index.php";
?>
Links
Manual de referência
http://php.net/manual/pt_BR/reserved.variables.session.php
Funções para Sessão
http://php.net/manual/pt_BR/ref.session.php
Função session_start()
http://br.php.net/session_start
Função unset()
http://us.php.net/unset
Função session_destroy()
http://us.php.net/session_destroy