Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

George  Rewrited

Problemas com sessão no php

Recommended Posts

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>";
}
?>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ative a reportação de erros no script ou php.ini
 

 

no script:

ini_set('display_errors', true);
error_reporting(E_ALL);

 

E todo código PHP que envia buffers para armazenamento em memória, vem antes do HTML.


E não no final.
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O cookie é o vilão da minha história, vou estudar mais como criá-los e destruí-los, assim que o tirei do código, funcionou tudo perfeito. 

O outro erro é que eu estava criando uma seção dentro da página de boas vindas, aí a função deslogar estava destruindo esta outra sessão em branco. não a seção do usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
    • Por landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, plural, ativo. Nela tem cadastrado vários itens e seu respectivo plural. No campo ativo eu coloco a letra "S" para informar que esta palavra está ativa no sistema. Por exemplo: 1, casa, casas, S 2, mesa, mesas, S 3, cama, camas, S 4, moto, motos, S 5, rádio, rádios O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "variações" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, camas, moto 2, mesas, casas, radio 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela variações da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "casa". Preciso fazer com que o php me liste todos os registros da tabela "variações" que contenham a palavra "casa". Porém se tiver algum registro com a palavra "casas" também tem que ser listado. Neste caso ele irá encontrar dois registros. Agora eu preciso que o php verifique os demais itens e faça a listagem apenas dos item que estão ativos (que contenham um "S" no campo ativo. Neste caso ele irá encontrar apenas um registro, pois o segundo registro contém a palavra "rádio". E "rádio" não está ativo na tabela itens. Como faço isso?
    • Por First
      Olá a todos!
       
      Quando eu tento fazer o login me mostra esse erro "Could not log you in."; Alguém sabe me ajudar a resolver esse problema no meu código?
      <?php require_once("core/init.php"); if (Input::exists()) { if (Token::check(Input::get("token"))) { $validate = new Validate(); $validation = $validate->check($_POST, array( "username" => array("required" => true), "password" => array("required" => true) )); if ($validation->passed()) { $user = new User(); $remember = (Input::get("remember")) === "on" ? true : false; $login = $user->login(Input::get("username"), Input::get("password"), $remember); if ($login) { Session::flash("home", "Welcome back!"); Redirect::to("index.php"); } else { echo "Could not log you in."; } } else { foreach ($validation->errors() as $error) { echo $error."<BR>"; } } } } ?> <form action="" method="POST"> <div class="field"> <label for="username">Username</label> <input type="text" name="username" id="username"> </div> <div class="field"> <label for="password">Password</label> <input type="password" name="password" id="password"> </div> <div class="field"> <label for="remember"> <input type="checkbox" name="remember" id="remember"> Remember me </label> </div> <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"> <input type="submit" value="Log in"> </form>  
       
      Desde já obrigado.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.