Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia senhores.
Meu site tem um sistema de login que utiliza variáveis $_SESSION conforme descrito nos trechos abaixo. O grande problema é que este sistema de login estava funcionando há quase um ano e ontem do nada, parou de funcionar. Fiz verificações e concluí que a sessão é criada apenas na página onde os dados são criados, mas não é propagada nas outras páginas, é como se ela deixasse de existir. Ou seja, ao tentar fazer o login, o usuário é redirecionado de volta para a página de login. O provedor informou que não houve mudanças nos diretórios. Então a grande pergunta é: o que pode estar causando este problema nas SEESSIONS se não houveram alterações nem no código-fonte e nem no diretório de hospedagem? Substituir variáveis de sessions por variáveis vindas de um banco de dados é algo válido e seguro?
PÁGINA QUE RECEBE E ANALISA OS DADOS INSERIDOS NO FORM DO LOGIN:
>
Citar
$user = $_POST['user'];
$pass = $_POST['pass'];
$symbol = '$$btx#@ssk';
$senha_final = md5($pass.$user.$symbol);
$verifica = mysql_query ("SELECT * FROM USUARIOS WHERE EMAIL = '$user' AND SENHA = '$senha_final' ");
$dado = mysql_fetch_object($verifica);
if ($dado->FUNC == AsOp)
{$nivel = 3; }
elseif ($dado->FUNC == OpEs)
{$nivel = 2; }
elseif ($dado->FUNC == CoOp)
{$nivel = 4; }
elseif ($dado->FUNC == GeOp)
{$nivel = 4; }
if ($dado->FUNC == DiEx)
{$nivel = 4; }
if ($dado->FUNC == TeCa)
{$nivel = 0; }
$linhas = mysql_num_rows ($verifica);
if ($dado->STATUS == 'Ativo')
{
if ($linhas > 0)
{session_start();
ob_start();
$_SESSION['user'] = $user;
$_SESSION['pass'] = $pass;
$_SESSION['nivel'] = $nivel;
$_SESSION['filial'] = $dado->BASE;
$_SESSION['who'] = $dado->NOME;
$logado = $_SESSION['user'];
$action_query = mysql_query("UPDATE USUARIOS SET ONOFF ='Online' WHERE EMAIL='$logado'");
header('location:index.php');
}
}
elseif ($dado->STATUS == 'Bloqueado')
{
unset ($_SESSION['user']);
unset ($_SESSION['pass']);
unset ($_SESSION['nivel']);
unset ($_SESSION['filial']);
unset ($_SESSION['who']);
header('location:login1.php?warning=LoginLock');
}
else
{
unset ($_SESSION['user']);
unset ($_SESSION['pass']);
unset ($_SESSION['nivel']);
unset ($_SESSION['filial']);
unset ($_SESSION['who']);
header('location:login1.php?warning=LoginFail');
}
TRECHO DO COLOCADO NAS PÁGINAS PROTEGIDAS
>
Citar
session_start();
if((!isset ($_SESSION['user']) == true) and (!isset ($_SESSION['pass']) == true))
{session_destroy();
unset($_SESSION['user']);
unset($_SESSION['pass']);
header('location:login1.php?warning=SessionFail'); }>
38 minutos atrás, marsolim disse:
primeramente uma dica, use o recurso de código escolhendo a linguagem certa nesse caso o php pra postar codigo ao inves de citar e por favor faça indentação no codigo pra facilitar leitura. segundamente acho que esse == true no !isset é desnecessário. tu pode usar só isset ou !isset de acordo o que precisa. e não entendi o porque do unsset. por que tá dando unset se quer que a seção fique ativa?
Bom dia e obrigado pela resposta.
Não havia me atentado que existe a opção de "code" para mostrar os trechos de código, por isso usei o "cite".
Quanto ao !isset a ideia é que se estivesse vazio, a sessão seria destruída e redirecionado ao login. E funcionava normalmente.
Mas agora, pelos testes que fiz, a sessão é criada, porém quando chega no próxima página, as variáveis de sessão não existem, mesmo sem o UNSET.
Fiz o seguinte teste:
PÁGINA DE ANÁLISE: login_analise.php
$user = $_POST['user'];
$pass = $_POST['pass'];
$symbol = '*_*#$@!77';
$senha_final = md5($pass.$user.$symbol);
$verifica = mysql_query ("SELECT * FROM USUARIOS WHERE EMAIL = '$user' AND SENHA = '$senha_final' ");
$dado = mysql_fetch_object($verifica);
$linhas = mysql_num_rows ($verifica);
if ($dado->STATUS == 'Ativo')
{
if ($linhas > 0)
{session_start();
ob_start();
$_SESSION['user'] = $user;
$_SESSION['pass'] = $pass;
$_SESSION['nivel'] = $nivel;
$_SESSION['filial'] = $dado->BASE;
$_SESSION['who'] = $dado->NOME;
$logado = $_SESSION['user'];
$action_query = mysql_query("UPDATE USUARIOS SET ONOFF ='Online' WHERE EMAIL='$logado'");
header('location:index_teste.php');
}
PÁGINA PROTEGIDA QUE RECEBERIA A SESSÃO: index_teste.php
if((isset ($_SESSION['user'])) and (isset ($_SESSION['pass'])))
{echo 'Sessão OK';}
else
{ echo 'Sessão não existe';}
O resultado no navegador é: "Sessão não existe". Ou seja, as variáveis não estão passando de uma página para outra.e assim?
if(isset($_SESSION['user']) && isset($_SESSION['pass'])){
echo 'Sessão OK';
}else{
echo 'Sessão não existe';
}
o operador **and** no php é **&&** e o **or** é **||** e acho que basta testar uma seção e eu aliás crio só uma seção com uma array de dados tipo
$_SESSION['logado'] = array($user, $pass, $nivel);
e quando precisar uso por exemplo
echo 'Bem vindo ', $logado[0];
aí tu pode testar só a seção logado
if(isset($_SESSION['logado'])){
echo 'Sessão OK';
}else{
echo 'Sessão não existe';
}
a e bota o **session_start()** no início da página logo depois dos headers se tiver headers, se não tiver bota na primeira linha
primeramente uma dica, use o recurso de código escolhendo a linguagem certa nesse caso o php pra postar codigo ao inves de citar e por favor faça indentação no codigo pra facilitar leitura. segundamente acho que esse == true no !isset é desnecessário. tu pode usar só isset ou !isset de acordo o que precisa. e não entendi o porque do unsset. por que tá dando unset se quer que a seção fique ativa?