Problemas com sessão no php
Boa noite, comecei estudar php a pouquíssimo tempo e estou passando o sistema de matrícula offline da ONG onde trabalho para um sistema online que será usado por todas as unidades.
Comecei talvez pelo mais complicado, login e sessão. Criei uma classe login, que acessa um banco de dados, valida o usuário cria e destrói a sessão.
Mas a classe só está validando a sessão na segunda chamada a ela e não a esta destruindo. Será que podem me dar uma luz?
<?php
Class login{
/ variáveis para a conexão do DB/
var $db;
var $servidor = 'teste';
var $banco = 'teste';
var $usuario = 'teste';
var $senhadb = 'teste';
/* outras variáveis usadas na classe*/
var $sql, $quser, $erro = "", $dados;
function validausuario($usuario,$senha){
/* acessa o DB e valida o usuário por uma view q faz join entre as tabelas
* usuario e nucleo trazendo só os usuários ativos*/
$this->db = mysqli_connect($this->servidor,$this->usuario,
$this->senhadb, $this->banco);
$senha= md5($senha);
$this->sql ="select * from user_nucleo "
. "where user_nucleo.usuario ='".$usuario."' and "
. "user_nucleo.senha = '".$senha."'";
$this->quser= mysqli_query($this->db, $this->sql);
if($this->quser){
$total=mysqli_num_rows($this->quser);
}else{
return FALSE;/*se não trouxe nada*/
}
return ($total==1 )?TRUE:FALSE;/*se trouxe apenas uma linha*/
}
function logar($usuario,$senha){
/*com o usuário já validado, cria a sessão e o cookie*/
if($this->validausuario($usuario,$senha)){
if(!isset($_SESSION)){
session_start();
}
/*passa as colunas da querry para a variavel qsuer e limpa a query*/
$this->dados= mysqli_fetch_assoc($this->quser);
mysqli_free_result($this->quser);
/*passa os dados para a sessão*/
foreach ($this->dados AS $chave=>$valor){
$_SESSION[$chave]=$valor;
}
$_SESSION['logado']=1;
/*ciação do cookie*/
$valor= join('#', array($usuario,$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_USER_AGENT']));
$valor= sha1($valor);
setcookie('token',$valor,0,'/');
} else{
$this->erro = "Usuário inválido";
return FALSE;
}
}
function logado(){
/*verifica se a sessão está criada junto com o cookie*/
if(!isset($_SESSION)){
session_start();
}
if (!isset($_SESSION['logado']) or !$_SESSION['logado']){
return FALSE;
}
if (!isset($_COOKIE['token'])){
return FALSE;
} else {
$valor= join('#', array($_SESSION['usuario'],$_SERVER['REMOTE_ADDR'],
$_SERVER['HTTP_USER_AGENT']));
$valor= sha1($valor);
if ($_COOKIE['token']!==$valor){
return FALSE;
}
}
return TRUE;
}
function deslogar(){
if(isset($_COOKIE['PHPSESSID'])){/*destrói o cokkie da sessão*/
setcookie('PHPSESSID', FALSE,(time() - 3600));
unset($_COOKIE['PHPSESSID']);
}
if(isset($_COOKIE['token'])){/*destrói o cokkie do usuário*/
setcookie('token', FALSE,(time() - 3600));
unset($_COOKIE['token']);
}
session_destroy(); /*destrói a sessão*/
header("Location: __DIR__/../index.php");/*volta para o login*/
}
}
Chamada da classe para logar, só vai para a página welcome quando clica pela segunda vez no botão logar (a instância do objeto está no header) :
<div>
<form method="post" name="formulario" action="">
<h1>Login</h1>
<p><label>Usuário</label>
<input type="text" name="usuario" maxlength="50" autofocus/></p>
<p><label>Senha</label>
<input type="password" name="senha" maxlength="50" /></p>
<p><input class="button" id="ok" type="submit" name="Logar" value="Logar" />
<input class="button" id="cancel" type="reset" value="Cancelar"/></p>
</form>
</div>
<?php
if(isset($_POST["Logar"]) && $_POST["Logar"] == "Logar"){
$logar = $objLogin->logar($_POST["usuario"],$_POST['senha']);
if ($objLogin->logado()){
header("Location:__DIR__/../welcome.php");
}
}
?>
Header instância a classe verifica se existe usuário logado e direciona pro login ou logof
<?php
require_once(__DIR__.'/class/login.php');
$objLogin = new login();if ($objLogin->logado()) {
echo "<p id='usuario'><a href='logof.php' title='Clique para deslogar'> Bem vindo(a) "
. $_SESSION['nome'].",". $_SESSION['nucleo']." <img src='imagens/lock.png' alt=''/></a></p>";}else {
echo "<p id='usuario'><a href='index.php'> "
. "Fazer login <img src='imagens/lock_open.png' alt=''/></a></p>";
}
?>Discussão (2)
Carregando comentários...