Cadastro de usuários no sistema
Criar conexão com banco de dados via PDO (exemplo do projeto conex)
Arquivo: t04-db/database.php
class Database
{
private static $instance = null;
private $conn;
private function __construct()
{
$config = require __DIR__ . '/config.php';
if (!isset($config['database']['host'], $config['database']['port'], $config['database']['username'], $config['database']['password'], $config['database']['dbname'])) {
throw new Exception("Configuração do banco de dados incompleta");
}
$dsn = "mysql:host={$config['database']['host']};port={$config['database']['port']};dbname={$config['database']['dbname']};charset=utf8mb4";
try {
$this->conn = new PDO($dsn, $config['database']['username'], $config['database']['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
} catch (PDOException $e) {
throw new Exception("Falha na conexão com o banco de dados: " . $e->getMessage());
}
}
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function getConnection()
{
return $this->conn;
}
}
Código responsável por estabelecer a conexão com o banco de dados.
No exemplo apresentado, a classe "Database" é implementada utilizando o design pattern "Singleton". Esse pattern tem como objetivo garantir que exista apenas uma instância da classe durante o tempo de execução da aplicação, facilitando o gerenciamento e o reuso da conexão com o banco de dados.
Observações
$config = require __DIR__ . '/config.php';
Aqui, o código carrega um arquivo chamado config.php que contém as configurações do banco de dados.
if (!isset($config['database']['host'], $config['database']['port'], $config['database']['username'], $config['database']['password'], $config['database']['dbname'])) {
throw new Exception("Configuração do banco de dados incompleta");
}
Aqui, o código verifica se todas as chaves necessárias (host, port, username, password, dbname) existem no array $config['database'].
$dsn = "mysql:host={$config['database']['host']};port={$config['database']['port']};dbname={$config['database']['dbname']};charset=utf8mb4";
O DSN é a string usada pelo PDO para conectar ao banco de dados.
Host (host
), Porta (port
), Nome do banco (dbname
), Charset (utf8mb4
)
try {
$this->conn = new PDO($dsn, $config['database']['username'], $config['database']['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
} catch (PDOException $e) {
throw new Exception("Falha na conexão com o banco de dados: " . $e->getMessage());
}
Aqui, o código tenta criar uma conexão com o banco de dados usando a classe PDO.
Arquivo: t04-db/config.php
<?php
return [
'database' => [
'host' => 'localhost',
'port' => '3306',
'username' => 'root',
'password' => '',
'dbname' => 'conex'
]
];
🚨 Para usuários de XAMPP:
- Teste e Validação:
- Salve o arquivo
database.php
no diretório do seu servidor (htdocs no XAMPP).- Acesse
http://localhost/database.php
no navegador.- Caso a conexão seja bem-sucedida, a página ficará em branco.
Implementar backend da view "signup.php" (exemplo do projeto conex)
Arquivo: t04-db\view\signup.php
<form class="form-group" method="POST" action="../src/post-user.php">
<div class="icon">
<img src="../public/img/logo.svg" alt="logo" class="logo" />
</div>
<!-- resto do código... -->
Com esssa alteração o form de cadastro agora está referenciado ao codigo de controle de cadastro de usuários, seguido do verbo http POST
Arquivo: Arquivo: t04-db\src\post-user.php
<?php
require_once __DIR__ . '/../database.php';
require_once __DIR__ . '/users.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = trim($_POST['name']);
$phone = trim($_POST['phone']);
$email = trim($_POST['email']);
$password = $_POST['password'];
$password_confirm = $_POST['password-confirm'];
if (empty($name) || empty($phone) || empty($email) || empty($password) || empty($password_confirm)) {
$_SESSION['error'] = "Todos os campos são obrigatórios!";
header("Location: /view/signup.php?error=todos-os-campos-obrigatorios");
exit();
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$_SESSION['error'] = "Email inválido!";
header("Location: /view/signup.php?error=email-invalido");
exit();
}
if ($password !== $password_confirm) {
$_SESSION['error'] = "As senhas não coincidem!";
header("Location: /view/signup.php?error=confirmação-de-senha-diferente");
exit();
}
$database = Database::getInstance();
$users = new Users($database);
if ($users->checkEmailExists($email)) {
$_SESSION['error'] = "Este email já está registrado!";
header("Location: /view/signup.php?error=email-ja-registrado");
exit();
}
$password_hash = password_hash($password, PASSWORD_ARGON2I);
if ($users->createUser($name, $email, $password_hash, $phone)) {
$_SESSION['success'] = "Usuário cadastrado com sucesso!";
header("Location: /");
exit();
} else {
$_SESSION['error'] = "Erro ao cadastrar o usuário!";
header("Location: /view/signup.php?error=erro-ao-cadastrar-usuario");
exit();
}
}
Aqui, o código processa o formulário de cadastro de usuários (signup.php
) enviado via método POST. Ele valida os dados recebidos, verifica se o e-mail já está cadastrado, cria um novo usuário no banco de dados e redireciona o usuário com mensagens de sucesso ou erro.
O objetivo principal deste código é:
-
Processar o formulário de cadastro de usuários.
-
Validar os dados fornecidos pelo usuário (campos obrigatórios, formato de e-mail, confirmação de senha).
-
Verificar se o e-mail já está cadastrado no banco de dados.
-
Criar um novo usuário no banco de dados com os dados fornecidos.
-
Redirecionar o usuário com feedback adequado (sucesso ou erro).
Arquivo: t04-db\src\users.php
class Users
{
private $db;
public function __construct(Database $db)
{
$this->db = $db->getConnection();
}
public function createUser($username, $email, $password, $phone)
{
$sql = "INSERT INTO users (username, email, password_hash, phone) VALUES (:username, :email, :password_hash, :phone)";
$stmt = $this->db->prepare($sql);
return $stmt->execute([
':username' => $username,
':email' => $email,
':password_hash' => $password,
':phone' => $phone
]);
}
public function checkEmailExists($email)
{
$sql = "SELECT id FROM users WHERE email = :email";
$stmt = $this->db->prepare($sql);
$stmt->execute([':email' => $email]);
return $stmt->fetch() ? true : false;
}
}
Aqui, o código define uma classe chamada Users que tem como objetivo gerenciar operações relacionadas a usuários no banco de dados, especificamente a criação de novos usuários e a verificação se um e-mail já está cadastrado.
Conclusão
Este tópico abordou de maneira prática a criação, conexão e cadastro de um usuário em um banco de dados.
O exemplo demonstrou como configurar a conexão ao banco de dados utilizando PDO
no PHP
, garantindo que a comunicação entre o servidor e o banco seja segura e eficiente. Além disso, o código abordou o processo de cadastro de um novo usuário, incluindo validações de entrada, como a verificação de e-mail e confirmação de senha, bem como a utilização de hashing para armazenamento seguro da senha no banco de dados.