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.