6
respostas

Como criar Login com SESSION em PDO?

Olá,

Estou desenvolvendo um projeto simples de controle de estoque e gostaria de saber como criar um sistema de login e logout com SESSION. Já vi alguns exemplos na Web, mas fiquei confuso. Gostaria de aproveitar o código do meu projeto, que é em PHP PDO. Ou seja, sem ter que criar/duplicar muitos arquivos.

Estes são os seguintes arquivos/códigos que tenho e gostaria de implementar tal sistema:

Classe Conexão.php

<?php

class Conexao
{
    public static function pegarConexao() 
    {
        $conexao = new PDO(DB_DRIVE . ':host=' . DB_HOSTNAME . ';dbname=' . DB_DATABASE, DB_USERNAME, DB_PASSWORD);
        $conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $conexao;        
    }    
}

Classe Erro.php

<?php

class Erro
{
    public static function trataErro(Exception $e) 
    {
         if(DEBUG) {
             echo '<pre>';
             print_r($e);
             echo '</pre>';
         } else {
             include 'erro.php';
         }
         exit;
     }
}

Arquivo config.php

<?php

    define( 'DEBUG', true);    
    define( 'DB_DRIVE', 'mysql');
    define( 'DB_HOSTNAME', '127.0.0.1');
    define( 'DB_DATABASE', 'loja_musical');
    define( 'DB_USERNAME', 'root');
    define( 'DB_PASSWORD', '');

Arquivo global.php


<?php
    require_once 'config.php';

    spl_autoload_register('carregarClasse');

    function carregarClasse($nomeClasse) 
    {
        if(file_exists('classes/' . $nomeClasse . '.php')) {
            require_once 'classes/' . $nomeClasse . '.php';
        }
    }

O index.php tem um fomulário que solicita e-mail e senha. Não postei aqui porque o HTML bagunça a postagem. Há uma tabela simples no MySQL onde cadastrei apenas um e-mail e senha (sem md5 por enquanto, mas gostaria de um exemplo). Tenho uma classe Usuario.php em branco, que futuramente posso criar uma gestão de cadastro de usuários. E gostaria de saber se também posso usá-la para esse sistema de login/logout com PDO.

6 respostas

Crie uma classe como esta:

class login {

    function autentica($nome, $senha) {
        $query = "SELECT count(*) as conectado FROM usuarios WHERE usu_nome=:p_usu_mome AND usu_senha=:p_usu_senha";
        $conexap = Conexao::pegarConexao();
        $stmt = $conexap->prepare($query);
        $stmt->bindValue(':p_usu_mome', $nome);
        $stmt->bindValue(':p_usu_senha', $senha);
        $stmt->execute();
        $result = $sth->fetch(PDO::FETCH_OBJ);
        return $result->conectado;
    }

    function logout(){
        $_SESSION["conectado"]='0'; 
        $_SESSION["nome"]='';
    }

}

Obs: Substitua o nome da tabela e os nomes dos campos pelos da sua tabela

Em em algum lugar do seu código cole o código a seguir:

 <?php
                        if (!isset($_SESSION["conectado"]) || ($_SESSION["conectado"] <> '1')) {
                            $login = new login();
                            if (isset($_POST["nome"]) && (isset($_POST["senha"]))) {
                                try {
                                    $conectado = $login->autentica($_POST["nome"], $_POST["senha"]);
                                    if ($conectado) {
                                        $_SESSION["conectado"] = '1';
                                        $_SESSION["nome"] = $_POST["nome"];
                                    } else {
                                        $_SESSION["conectado"] = '0';
                                    }
                                    header("location:index.php");
                                } catch (Exception $e) {
                                    Erro::trataErro($e);
                                }
                            } else {
                                print '<li><a href="/login.php">Login</a></li>';
                            }
                        } else {
                            print '<li><a href="#">' . $_SESSION["nome"].'</a></li>';
                            print '<li><a href="/index.php?logout=1">Logout</a></li>';
                        }
                        if (isset($_GET["logout"])){
                            $login = new login();
                            $login->logout();
                            header("location:index.php");
                        }
                        ?>

Não esqueça de criar o formulário de login com os campos nome e senha apontando para o módulo que faz a autenticação.

<?php require_once 'cabecalho.php' ?>
<div class="row">
    <div class="col-md-12">
        <h2>Login</h2>
        <form action="index.php" method="POST">
        Nome<br/>
        <input type="text" required name="nome">
        <br/>
        Senha<br/>
        <input type="password" required name="senha"><br/>
        <button type="submit">
            Login
        </button>
        </form>
    </div>
</div>
<?php require_once 'rodape.php' ?>

Na primeira execução a autenticação e feita e se o usuário e a senha estiverem corretos grava na sessão. Na execução seguinte verifica se o usuário já esta autenticado e apenas exibe o nome dele.

Ainda tenho dúvida com relação a edição do arquivo que deverá ser requerido para verificar se o usuário está logado para liberar acesso às outras telas, e caso contrário direcionar para o formulário de login.

Coloque isto nos outro módulos. Se não estiver logado vai pra tela de login

session_start();
if ($conectado=0) {
     header("location:index.php");
}

Ao submeter os dados para autenticação retorna o seguinte erro: "Fatal error: Uncaught Error: Class 'Login' not found in /home/meunome/Templates/MeuProjeto/login-post.php:4 Stack trace: #0 {main} thrown in /home/meunome/Templates/MeuProjeto/login-post.php on line 4"

Os aquivos estão assim:

Formulário de login:

<?php require_once 'cabecalho.php' ?>
    <div class="row">
        <div class="col-md-12">
            <h2>Login</h2>
            <form action="login-post.php" method="POST">
            E-mail:<br>
            <input type="email" required name="email">
            <br/>
            Senha:<br>
            <input type="password" required name="password"><br/>
            <button type="submit">
                Login
            </button>
            </form>
        </div>
    </div>
<?php require_once 'rodape.php' ?>

login-post.php:

<?php

    if (!isset($_SESSION["conectado"]) || ($_SESSION["conectado"] <> '1')) {
        $login = new Login();
        if (isset($_POST["email"]) && (isset($_POST["password"]))) {
            try {
                $conectado = $login->autentica($_POST["email"], $_POST["password"]);
                if ($conectado) {
                    $_SESSION["conectado"] = '1';
                    $_SESSION["email"] = $_POST["email"];
                } else {
                    $_SESSION["conectado"] = '0';
                }
                header("location:index.php");
            } catch (Exception $e) {
                Erro::trataErro($e);
            }
        } else {
            print '<li><a href="/login.php">Login</a></li>';
        }
    } else {
        print '<li><a href="#">' . $_SESSION["email"].'</a></li>';
        print '<li><a href="/index.php?logout=1">Logout</a></li>';
    }
    if (isset($_GET["logout"])){
        $login = new login();
        $login->logout();
        header("location:index.php");
    }
?>

Classe Login.php:

<?php

class Login
{    

    function autentica($email, $password) {
      $query = "SELECT count(*) as conectado FROM users WHERE email=:email AND password=:password";
      $conexap = Conexao::pegarConexao();
      $stmt = $conexap->prepare($query);
      $stmt->bindValue(':email', $email);
      $stmt->bindValue(':password', $password);
      $stmt->execute();
      $result = $sth->fetch(PDO::FETCH_OBJ);
      return $result->conectado;
     }

     function logout(){
      $_SESSION["conectado"]='0'; 
      $_SESSION["email"]='';
     }
}

Faltou um require ai no arquivo do login.php

Consegui implementar um sistema de login baseado em um exemplo que achei na web. Porém, esse sistema tem algum erro que ainda não consegui identificar. Inseri o require. Não apresenta erro, mas loga mesmo se errar a senha/usuário, ou seja, não faz a verificação, passa direto.