Jump to content

[PHP] Sessões


Vnepomuceno
 Share

Recommended Posts

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 😄 ) de cada um, ficamos-nos por aqui.

Bons programas ;)

Link to comment
Share on other 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

Link to comment
Share on other 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";
?>
Link to comment
Share on other 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?

Link to comment
Share on other 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 !

Link to comment
Share on other 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

Link to comment
Share on other 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" 👍

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other 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" 👍

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?

Link to comment
Share on other 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" 😄

👍

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other 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 👍

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.