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

 

 

Share this post


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

Share this post


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

Share this post


Link to post
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

  • Similar Content

    • By dutopfave
      Boa Noite Galera, estou com dúvida em como cria um cadastra de VARIAÇÕES DE PRODUTOS.

      Ex.: Tenho um produto que é um TENIS, ai nele vou criar as VARIAÇÕES, então vou usa COR e TAMANHO.
      COR: preto, verde, azul
      TAMANHO: 39, 40, 41

      até ai blz, porém a duvida é como fazer o cadastrado de combinações de cor e tênis, tipo no banco de dados teria q fica exatamente assim....

      ID | COR | TAMANHO
      ... | preto | 39
      ... | preto | 40
      ... | preto | 41
      ... | verde | 39
      ... | verde | 40
      ... | verde | 41
      ... | azul | 39
      ... | azul | 40
      ... | azul | 41

      alguém tem alguma solução
    • By lucianfpaula
      Olá amigos, tenho uma duvida talvez simples mas não para mim hehehe. estou desenvolvendo um sistema onde a pessoa faz um cadastro simples mas preciso de uma função que não permita que a pessoa faça mais de um cadastro pelo dispositivo dela, tipo ela faz pelo celular dela com nome, email etc... mas preciso limitar o cadastro não apenas pelo email mas também pelo dispositivo, ou seja preciso de uma forma de identificar o aparelho para que não haja mais cadastro pelo mesmo dispositivo. Não sei se ficou claro minha duvida, alguém pode me ajudar? Muito grato
    • By RodrigoWD3
      Pessoal boa tarde, estou criando uma galeria com categorias no php e mysql, gostaria de saber como faço para colocar um botão -  Exibir Mais Fotos - fazendo exibir o restante dos registros na mesma pagina, teria alguma forma de limitar as fotos sem usar o LIMIT do sql? pode ser usando jQuery algo assim , obrigado
    • By Jack Oliveira
      Ola galera boa noite
      Pessoal preciso enviar um arquivo por e-mail, onde o sistema faz backups do banco de dados manual e automatico
       
      preciso que seja enviado apenas o sql que for gerado tanto manual quanto automatico
      ambos esta fazendo o backups normalmente sem problemas
       
      Segue o código a baixo
       
      <?php session_start(); require_once('../../database/config.php'); require_once('../../database/config.database..php'); require_once('../../includes/funcoes.php'); require_once('controller.php'); if (!is_dir('../../backups')) { @mkdir('../../backups', 0777, true); } $name_backup = "Backups_" . date("ymdHis"); $querySQL = DBCreate('backups', [ 'name' => "Banco_de_dados_" . $name_backup, 'type' => 'sql', 'status' => 'Iniciado' ], true); $queryZIP = DBCreate('backups', [ 'name' => "Arquivos_ZIP_" . $name_backup, 'type' => 'zip', 'status' => 'Iniciado' ], true); try { require_once("Mysqldump.php"); $dump = new Ifsnop\Mysqldump\Mysqldump('mysql:host=' . DB_HOSTNAME . ';dbname=' . DB_DATABASE . '', '' . DB_USERNAME . '', '' . DB_PASSWORD . ''); $dump->start("../../backups/Banco_{$name_backup}.sql"); if (file_exists("../../backups/Banco_{$name_backup}.sql")) { DBUpdate('backups', array('status' => 'concluido'), "id = '{$querySQL}'"); } } catch (\Exception $e) { $return = [ "title" => "Oops!", "msg" => "Erro ao exportar banco de dados.", "icon" => "error" ]; DBUpdate('backups', array('status' => 'Erro ao exportar banco de dados'), "id = '{$querySQL}'"); Redireciona('?erro'); } try { $filename = "Arquivos_ZIP_{$name_backup}.zip"; $rootPath = realpath('../../wa/'); $zip = new ZipArchive(); $zip->open("../../backups/$filename", ZipArchive::CREATE | ZipArchive::OVERWRITE); $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $name => $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = substr($filePath, strlen($rootPath) + 1); $zip->addFile($filePath, $relativePath); } } $zip->close(); } catch (\Exception $e) { $return = [ "title" => "Oops!", "msg" => "Erro ao criar arquivo de backup no formato zip!", "icon" => "error" ]; DBUpdate('backups', array('status' => 'Erro ao criar arquivo de backup no formato zip'), "id = '{$queryZIP}'"); } DBUpdate('backups', array('status' => 'concluido'), "id = '{$queryZIP}'"); if (empty($return)) { $return = [ "title" => "Deu Certo!", "msg" => "Backup Realizado com Sucesso!", "icon" => "success" ]; } echo json_encode($return); if (!empty(getConfigBackup('mail_notify'))) { @require_once('../../controller/class.phpmailer/PHPMailerAutoload.php'); $mail = new PHPMailer(); $mail->CharSet = "UTF-8"; $mail->isSMTP(true); $mail->SMTPSecure = getConfigBackup('mail_seguranca'); $mail->Host = getConfigBackup('mail_host'); $mail->Username = getConfigBackup('mail_email'); $mail->Password = getConfigBackup('mail_senha'); $mail->Port = getConfigBackup('mail_porta'); $mail->From = getConfigBackup('mail_email'); $mail->FromName = ConfigPainel('site_nome'); $mail->Subject = "Seu Backup está pronto!"; if (strstr(getConfigBackup('mail_notify'), ';')) { $email = explode(';', getConfigBackup('mail_notify')); foreach ($email as $key => $value) { $mail->AddAddress($value); } } else { $mail->AddAddress(getConfigBackup('mail_notify')); } $dados = "Olá, o Backup do painel " . ConfigPainel('site_nome') . " foi realizado com sucesso. Ele está disponível em seu dashboard na área de backups. Acesse o Painel para Gerenciar seus backups."; $mail->Body = "<div id='m_-7598057918015146334m_-2331253013811829785wrapper' dir='ltr' style='background-color:#f7f7f7;margin:0;padding:70px 0 70px 0;width:100%'> <table border='0' cellpadding='0' cellspacing='0' height='100%' width='100%'> <tbody> <tr> <td align='center' valign='top'> <div id='m_-7598057918015146334m_-2331253013811829785template_header_image'></div> <table border='0' cellpadding='0' cellspacing='0' width='600' id='m_-7598057918015146334m_-2331253013811829785template_container' style='background-color:#ffffff;border:1px solid #dedede;border-radius:3px!important'> <tbody> <tr> <td align='center' valign='top'> <table border='0' cellpadding='0' cellspacing='0' width='600' id='m_-7598057918015146334m_-2331253013811829785template_header' style='background-color:#333333;border-radius:3px 3px 0 0!important;color:#ffffff;border-bottom:0;font-weight:bold;line-height:100%;vertical-align:middle;font-family:&quot;Helvetica Neue&quot;,Helvetica,Roboto,Arial,sans-serif'> <tbody> <tr> <td id='m_-7598057918015146334m_-2331253013811829785header_wrapper' style='padding:36px 48px;display:block'> <h1 style='color:#ffffff;font-family:&quot;Helvetica Neue&quot;,Helvetica,Roboto,Arial,sans-serif;font-size:30px;font-weight:300;line-height:150%;margin:0;text-align:left'>Backup Realizado com sucesso</h1> </td> </tr> </tbody> </table> </td> </tr> <tr> <td align='center' valign='top'> <table border='0' cellpadding='0' cellspacing='0' width='600' id='m_-7598057918015146334m_-2331253013811829785template_body'> <tbody> <tr> <td valign='top' id='m_-7598057918015146334m_-2331253013811829785body_content' style='background-color:#ffffff'> <table border='0' cellpadding='20' cellspacing='0' width='100%'> <tbody> <tr> <td valign='top' style='padding:48px'> <div id='m_-7598057918015146334m_-2331253013811829785body_content_inner' style='color:#636363;font-family:&quot;Helvetica Neue&quot;,Helvetica,Roboto,Arial,sans-serif;font-size:14px;line-height:150%;text-align:left'> <p style='margin:0 0 16px'></p> $dados </div> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </div>"; $mail->IsHTML(true); $mail->Send(); $mail->ClearAllRecipients(); $mail->ClearAttachments(); } Lembrando so ser enviado o que for sql
      Ex: Banco_de_dados_Backups_210412193634.sql
      SQL_Backup_210412180942.sql
       
      Conforme for gerando o backups
      no create tem type sql
       
       
      Não sei isso vai ajudar em algo mais a tabela  backups esta assim
       
      INSERT INTO `backups` (`id`, `name`, `type`, `created_at`, `status`) VALUES (1, 'SQL_Backup_210412180942', 'sql', '2021-04-12 21:09:42', 'concluido'), (2, 'ZIP_Backup_210412180942', 'zip', '2021-04-12 21:09:42', 'Iniciado'), (3, 'Banco_de_dados_Backups_210412193634', 'sql', '2021-04-12 22:36:34', 'concluido'), (4, 'Arquivos_ZIP_Backups_210412193634', 'zip', '2021-04-12 22:36:34', 'Iniciado');  
       
      Se puderem da esta ajuda fico grato
    • By henriquers
      Estou com um problema com o Select2, ele tem um campo de busca mas não esta filtrando corretamente e não estou entendo o motivo, sem utilizar o AJAX colocando os options manualmente ele funciona corretamente, mas trazendo os dados via AJAX ele não funciona o campo de busca.
      Se aguem poder me dar uma luz agradeço a ajuda.
       

       
      Nessa imagem estou tentando filtrar apenas para os itens que tenha LUVA na descrição, mas não funciona, posso colocar qual quer coisa que ele não faz o filtro
       
      Abaixo segue meu codigo
       
      HTML
      <!DOCTYPE HTML PUBLIC> <HTML> <HEAD> <TITLE> Select2 </TITLE> <link href="select2/select2.css" rel="stylesheet" type="text/css" /> <script src="https://code.jquery.com/jquery-latest.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/i18n/pt-BR.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.css" rel="stylesheet"/> <script> $(document).ready(function(){ $("#selUser").select2({ language: "pt-br", ajax: { url: "get_dados.php", type: "GET", dataType: 'json', delay: 200, data: function (params) { return { q: params.term, // search term page: params.page }; }, processResults: function (response) { return { results: response }; }, cache: true }, width: "20%", closeOnSelect: true, }); }); </script> </head> <body> <select id='selUser' style='width: 200px;'> <option value='0'>- Search user -</option> </select> </body> </html> get_dados.php
      <?php include './conn_orcl.php'; $select="SELECT PRO_CODPRO PRODUTO,TRIM(PRO_DESCRI) DESCRICAO FROM F_PRODS WHERE PRO_LOCEST='ALMOX' AND PRO_STATUS = 'AT' ORDER BY DESCRICAO"; $parse=oci_parse($conn,$select); oci_execute($parse); $data = array(); while($row=oci_fetch_array($parse)){ $data[] = array("id"=>$row['PRODUTO'], "text"=>$row['PRODUTO']." - ".$row['DESCRICAO']); }; echo json_encode($data); ob_end_flush(); oci_free_statement($parse); oci_close($conn); ?>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.