Login no sistema (exemplo do nosso projeto conex)

Nosso exemplo será composto por três páginas principais:

  • login.php: Página onde o usuário insere suas credenciais (email de usuário e senha).

  • profile.php: Página restrita, acessada somente após o login bem-sucedido.

  • login-user.php: Página responsável por processar os dados de login.

Vamos utilizar a conexão e a tabela users criada no exemplo de configuração do servidor e banco de dados.

Página de Login (login.php)

Na página de login, o usuário será solicitado a inserir seu email de e senha. Se as credenciais estiverem corretas, o sistema iniciará uma sessão e redirecionará o usuário para a página restrita (profile.php), se não será redirecionado novamente para o login.php com a mensagem de erro no query params.

Arquivo: t05-session-php\view\login.php

    <form class="form-group" method="POST" action="../src/login-user.php">
        <div class="form-control">
            <label for="email">Email</label>
            <input type="email" id="email" name="email" required />
        </div>

        <!--resto do código-->

Com esssa alteração o form de login agora está referenciado ao código de controle de login de usuários, seguido do verbo http POST


Arquivo: t05-session-php\src\login-user.php

<?php
session_start();

require_once __DIR__ . '/../database.php';
require_once __DIR__ . '/users.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $email = trim($_POST['email']);
    $password = trim($_POST['password']);

    if (empty($email) || empty($password)) {
        $_SESSION['error'] = "Todos os campos são obrigatórios!";
        header("Location: /view/login.php?error=todos-os-campos-obrigatorios");
        exit();
    }

    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $_SESSION['error'] = "Formato de email inválido!";
        header("Location: /view/login.php?error=formato-de-email-invalido");
        exit();
    }

    $database = Database::getInstance();
    $users = new Users($database);

    $user = $users->getUserByEmail($email);

    if ($user && password_verify($password, $user['password_hash'])) {
        $id = $_SESSION['user_id'] = $user['id'];
        $_SESSION['user_name'] = $user['username'];
        $_SESSION['user_email'] = $user['email'];
        $_SESSION['LAST_ACTIVITY'] = time();
        $_SESSION['success'] = "Login realizado com sucesso!";

        header("Location: ../view/profile.php?id={$id}&success=login-realizado-com-sucesso");
        exit();
    } else {
        $_SESSION['error'] = "Credenciais inválidas!";
        header("Location: /view/login.php?error=credencial-errada");
        exit();
    }
}

Este código PHP trata o processo de autenticação de usuários com base no formulário de login login.php. Ele verifica se o usuário preencheu o formulário corretamente e valida as credenciais.


Observações

session_start();

Inicia uma nova sessão ou retoma a existente. Isso permite armazenar informações do usuário, como dados de login, em variáveis de sessão.


require_once __DIR__ . '/../database.php';
require_once __DIR__ . '/users.php';

Esses arquivos são incluídos para permitir o acesso ao banco de dados e manipulação de usuários.


if ($_SERVER["REQUEST_METHOD"] == "POST")

Verifica se o método de requisição é POST, ou seja, se o formulário foi enviado.


 $email = trim($_POST['email']);
 $password = trim($_POST['password']);

O código coleta e "limpa" os valores do formulário com trim() para remover espaços extras.


if (empty($email) || empty($password))

Verifica se os campos de email e senha estão vazios e, se sim, define uma mensagem de erro na sessão e redireciona o usuário de volta para a página de login.


if ($user && password_verify($password, $user['password_hash']))

Se o usuário for encontrado no banco de dados e a senha fornecida corresponder à senha armazenada (com o password_hash), a autenticação é bem-sucedida.


 $id = $_SESSION['user_id'] = $user['id'];
        $_SESSION['user_name'] = $user['username'];
        $_SESSION['user_email'] = $user['email'];
        $_SESSION['LAST_ACTIVITY'] = time();
        $_SESSION['success'] = "Login realizado com sucesso!";

        header("Location: ../view/profile.php?id={$id}&success=login-realizado-com-sucesso");
        exit();
  • Se o login for bem-sucedido, as variáveis de sessão são definidas ($_SESSION['user_id'], $_SESSION['user_name'], etc.) com informações do usuário.

  • Define também o tempo de atividade da sessão com $_SESSION['LAST_ACTIVITY'] = time();.

  • Exibe uma mensagem de sucesso e redireciona o usuário para a página de perfil (profile.php).


else {
        $_SESSION['error'] = "Credenciais inválidas!";
        header("Location: /view/login.php?error=credencial-errada");
        exit();
    }

Se a senha não corresponder ou o usuário não for encontrado, o código define uma mensagem de erro na sessão e redireciona o usuário de volta para a página de login com um aviso de "Credenciais inválidas".

Como mencionado anteriormente, o login do usuário está incluído em dois arquivos: o database, responsável pela conexão com o banco de dados, e o users.php. Vamos entender o que está sendo utilizado na classe users para realizar o login.

Arquivo: t05-session-php\src\users.php

public function getUserByEmail($email)
    {
        $sql = "SELECT id, username, email, password_hash, phone FROM users WHERE email = :email";
        $stmt = $this->db->prepare($sql);
        $stmt->execute([':email' => $email]);
        return $stmt->fetch();
    }

Essa função busca um usuário no banco de dados com base no email fornecido. Ela retorna os dados do usuário (como ID, nome de usuário, email, senha e telefone) caso o email exista no banco.

O código de login usa essa função com a linha:

$user = $users->getUserByEmail($email);

Ele chama getUserByEmail() para verificar se um usuário existe com o email fornecido no formulário. Se um usuário for encontrado, seus dados (incluindo a senha) são retornados e usados para verificar a senha fornecida.

Conclusão

Este exemplo básico demonstra como implementar um sistema de login com PHP usando sessões. O PHP facilita a criação de sessões com variáveis globais, permitindo que você armazene dados do usuário enquanto ele navega pelas páginas, tornando a experiência flúida.