• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Vnepomuceno

[PHP] Sessões

16 mensagens neste tópico

Já existe um outro artigo sobre o login básico, mas como este é um bocado mais abrangente acerca das sessions e porque também aqui ficam algumas dúvidas esclarecidas de uma thread que foi posta aqui, aqui fica.

(Retirado do Cine XL Blog, http://www.cinexl.net/blog/?p=85, de Valter Nepomuceno.)

Usualmente numa aplicação Web, pode ser necessário que certos tipos de informação acompanhem o utilizador ao longo da sua estadia no site, de modo a que estejam sempre disponíveis a ser usados em qualquer página em que o utilizador se encontre. Nestes casos específicos, é recomendável que a aplicação Web utilize sessões para melhor gerir as informações de cada utilizador.

Uma das principais vantagens das sessões, é que as variáveis de sessão ($_SESSION["variável"]), podem ser usadas para guardar variáveis e/ou informações referentes ao utilizador, sem que seja preciso utilizar includes para que estas estejam disponíveis em quantas páginas forem precisas, pois as variáveis de sessão são globais, ou seja, desde que a sessão seja iniciada, podem ser utilizadas sem qualquer outro procedimento.

Após estas variáveis de sessão serem definidas, sendo variáveis globais, como já foi referido, vão permanecer até que essa sessão acabe. Isto garante que cada utilizador possa apenas consultar e manejar os dados referentes a si mesmo.

Agora vamos a um pouco de código. Para que em cada página seja indicado que as variáveis de sessão vão ser precisas, é usado o:

session_start();
Para que seja indicada à aplicação Web de que a sessão deve terminar, deve ser usado o seguinte código (uma sessão também terminará caso o browser seja encerrado):
session_destroy();
Desta maneira, assim que a página interprete o script que indica que deve ser iniciada a sessão (o script deve ser colocado logo no início da página, de modo a que seja interpretado da mais rápida forma possível) esta é iniciada automaticamente, e as variáveis de sessão estarão logo disponíveis a ser usadas:
<? session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html>
 <head>
   <title></title>
 </head>
 <body>
 </body>
</html>
A definição de variáveis de sessão funciona da seguinte maneira:
$_SESSION["nome da variavel"] = valor;
Por exemplo, caso a sessão inicie depois de terem sido validados certos dados num formulário, é importante que esses dados, como por exemplo o nome de usuário e a password, sejam guardados em variáveis de sessão. Se o nome de usuário e a password forem inseridos numa input box, então, o código do formulário será:
<form action="action.php" method="post">
Username: <input type="text" name="usuario" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Validar" />
</form>
Agora a acção do formulário:
//A variavel pre-definida $_POST["nome do elemento de formulario"] vai receber os dados inseridos no formulario e grava-los como $usuario e $password
$usuario = $ _POST["usuario"];
$password = $ _POST["password"];

//Vou fazer a validacao atraves de uma if statement para nao prolongar muito o artigo. E aconselhavel que usem uma tabela na vossa base de dados para guardarem os dados de utilizador
if($usuario == "Carlos" & $password == "12345") {
 session_start();
 $_SESSION["usuario"] = $usuario;
 $_SESSION["password"] = $password;
 echo "Sessao iniciada";
}
else {
 echo "A sessao nao foi iniciada!";
}
Agora, para realmente testar se a sessão foi iniciada correctamente, podemos escrever uma página, index.php sendo que:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
   <title></title>
 </head>
 <body>
<?
   echo $_SESSION["usuario"];
   echo $_SESSION["password"];
?>
 </body>
</html>
E caso a sessão tenha iniciado correctamente, será mostrado na página index.php o seguinte resultado:
Carlos
12345
É necessário para a segurança da aplicação Web fazer o seguinte procedimento. Em cada página que seja iniciada a sessão através do session_start(), é recomendável que se introduza também o seguinte código:
session_start();
//A funcao isset(); verifica se a variavel em questao existe ou nao, retornando um valor true ou false, caso a variavel exista ou nao
if(isset($_SESSION["usario"])) {

}
else {
? >
 //Caso a funcao isset verifique que nao existe a variavel de sessao usuario, retornando o valor false, a pagina e reencaminhada para a pagina de login
 <script language="javascript" >window.location="login.php";< /script >
<?
}
Este pequeno truque é muito importante se se quer salvaguardar as páginas unicamente restritas a usuários validados, para evitar que utilizadores, através de links directos, consigam visitar a página sem serem validados.

Poderia estar aqui o dia todo a dar dicas sobre como melhorar as sessões, mas como o importante mesmo é aprender o básico e depois aplicar a cada caso segundo a inteligência (caso existente :D ) de cada um, ficamos-nos por aqui.

Bons programas ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já meti o GeSHi.

Digam o que acham do tutorial para saber se vale a pena quando fizer outro para o meu blog, postá-lo aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
// A variavel pre-definida $_POST["nome do elemento de formulario"] vai receber os dados
// inseridos no formulario e grava-los como $usuario e $password
$_POST["usuario"] = $usuario;
$_POST["password"] = $password;

Não quererás dizer:

$usuario = $_POST["usuario"];
$password = $_POST["password"];

Uma nota:

Como disse o Vnepomuceno,

A funcao isset(); verifica se a variavel em questao existe ou nao, retornando um valor true ou false, caso a variavel exista ou nao

Se a variável estiver vazia e existir, retorna true. Por exemplo, se se clicar no submit sem se ter preenchido os campos, vai retornar true.

Peço desculpa pelo off-topic, mas como é um problema que muita gente tem, achei por bem esclarecer.

Bom trabalho, Vnepomuceno. Obrigado. : )

~hasta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma nota:

Como disse o Vnepomuceno,

A funcao isset(); verifica se a variavel em questao existe ou nao, retornando um valor true ou false, caso a variavel exista ou nao

Se a variável estiver vazia e existir, retorna true. Por exemplo, se se clicar no submit sem se ter preenchido os campos, vai retornar true.

Acrescento,

é por isso que na maior parte das vezes deve utilizar-se a função empty()

Exemplo simples:

<?php

$x = "";

if (empty($x))
echo "A variavel nao tem nehum valor definido!";
else
echo "Ninguem chega a ver isto";
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não quererás dizer:

$usuario = $_POST["usuario"];
$password = $_POST["password"];

Não é exactamente a mesma coisa??

Em relação ao que disseram, acho que essa situação não pode acontecer, porque o $_SESSION["usuario"] so é criado se o $_POST["usuario"] for igual à pesquisa de usuário correspondente à password, numa base de dados. Logo se o usuário for vazio, na base de dados não vai haver nenhuma password a que corresponda um usuário vazio, e a sessão não será iniciada, e a $_SESSION["usuario"] não será igual a $_POST["usuario"]

Estou certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é igual pois estás a atribuir á variavel global algo que exista em $utilizador, como sao atribuidos valores random a variaveis que não tem valor o $_POST['utilizador'] terá um valor desconhecido.

Ao contrário seria correcto.

Podes dar continuação agora ao tutorial mas usando Base de Dados !

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não quererás dizer:

$usuario = $_POST["usuario"];
$password = $_POST["password"];

Não é exactamente a mesma coisa??

Não, é como o Gurzi disse.

Ao fazeres

$variavel_um = $variavel_dois;

Estás a atribuir à $variavel_um o valor que está na $variavel_dois, nunca o contrário.

Em relação ao que disseram, acho que essa situação não pode acontecer, porque o $_SESSION["usuario"] so é criado se o $_POST["usuario"] for igual à pesquisa de usuário correspondente à password, numa base de dados. Logo se o usuário for vazio, na base de dados não vai haver nenhuma password a que corresponda um usuário vazio, e a sessão não será iniciada, e a $_SESSION["usuario"] não será igual a $_POST["usuario"]

Estou certo?

Sim, no caso desse algoritmo nunca acontece.

A nota que fiz foi só uma informação adicional à função isset(), não para o teu caso em particular.

~hasta

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Peço desculpa, isto são os hábitos da Matemática (se x=y, então, obviamente y=x)

Obrigado pelo reparo ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só uma pequena questão. Para utilizar sessões é necessário ter as register globals on? Ou posso tê-las desligadas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só uma pequena questão. Para utilizar sessões é necessário ter as register globals on? Ou posso tê-las desligadas?

As register_globals na minha opinião deviam estar sempre off pois só servem para abrir uns "buraquitos" :thumbsup:
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só uma pequena questão. Para utilizar sessões é necessário ter as register globals on? Ou posso tê-las desligadas?

As register_globals na minha opinião deviam estar sempre off pois só servem para abrir uns "buraquitos" :thumbsup:

Pois eu sei desses buracos. Eu só fiz aquela pergunta porque vi isto escrito.

Uma das principais vantagens das sessões, é que as variáveis de sessão ($_SESSION[variável]), podem ser usadas para guardar variáveis e/ou informações referentes ao utilizador, sem que seja preciso utilizar includes para que estas estejam disponíveis em quantas páginas forem precisas, pois as variáveis de sessão são globais, ou seja, desde que a sessão seja iniciada, podem ser utilizadas sem qualquer outro procedimento.

Após estas variáveis de sessão serem definidas, sendo variáveis globais, como já foi referido, vão permanecer até que essa sessão acabe.

Tenho que ter as register_globals on para trabalhar com sessões? Ou podem estar desligadas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de ter o register_globals para trabalhar com sessões.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenho que ter as register_globals on para trabalhar com sessões? Ou podem estar desligadas?

Eu respondi-te:

... só servem para abrir uns "buraquitos" :D

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok, obrigado pela informação... eu ainda não percebo muito de php e ando agora a começar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok, obrigado pela informação... eu ainda não percebo muito de php e ando agora a começar.

A gente está aqui para te ajudar :thumbsup:
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora