Programação

Como criar Sistema de Cadastro com PHP e MySQL

Crie um sistema de cadastro de usuários com PHP e MySQL: formulário, validação, verificação de usuário duplicado e senha com password_hash.

Capa: Como criar Sistema de Cadastro com PHP e MySQL

Este tutorial continua o sistema de login com PHP e MySQL. Aqui você cria a tela de cadastro, que valida os dados, impede usuários duplicados e grava a senha de forma segura.

Antes de começar

Use a mesma estrutura do login (arquivo conexao.php com PDO e tabela usuario). Vamos acrescentar uma coluna de nome:

ALTER TABLE usuario ADD COLUMN nome VARCHAR(150) NOT NULL AFTER usuario_id;

Formulário (cadastro.php)

<?php session_start(); ?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cadastro</title>
</head>
<body>
    <h1>Criar conta</h1>

    <?php if (!empty($_SESSION['status_cadastro'])): ?>
        <?php if ($_SESSION['status_cadastro'] === 'ok'): ?>
            <p style="color:green">Cadastro efetuado! <a href="index.php">Faça login</a>.</p>
        <?php elseif ($_SESSION['status_cadastro'] === 'existe'): ?>
            <p style="color:#b00020">Esse usuário já existe. Escolha outro.</p>
        <?php else: ?>
            <p style="color:#b00020">Preencha todos os campos (senha com no mínimo 8 caracteres).</p>
        <?php endif; ?>
        <?php unset($_SESSION['status_cadastro']); ?>
    <?php endif; ?>

    <form action="cadastrar.php" method="POST">
        <label>Nome <input type="text" name="nome" required></label>
        <label>Usuário <input type="text" name="usuario" required></label>
        <label>Senha <input type="password" name="senha" minlength="8" required></label>
        <button type="submit">Cadastrar</button>
    </form>
</body>
</html>

Gravando o usuário (cadastrar.php)

O script valida os campos, verifica se o usuário já existe e só então grava, sempre com consultas preparadas:

<?php
session_start();
require 'conexao.php';

$nome    = trim($_POST['nome'] ?? '');
$usuario = trim($_POST['usuario'] ?? '');
$senha   = $_POST['senha'] ?? '';

if ($nome === '' || $usuario === '' || strlen($senha) < 8) {
    $_SESSION['status_cadastro'] = 'invalido';
    header('Location: cadastro.php');
    exit;
}

// já existe?
$stmt = $pdo->prepare('SELECT COUNT(*) FROM usuario WHERE usuario = :usuario');
$stmt->execute(['usuario' => $usuario]);

if ($stmt->fetchColumn() > 0) {
    $_SESSION['status_cadastro'] = 'existe';
    header('Location: cadastro.php');
    exit;
}

// grava com hash da senha
$stmt = $pdo->prepare('INSERT INTO usuario (nome, usuario, senha) VALUES (:nome, :usuario, :senha)');
$stmt->execute([
    'nome'    => $nome,
    'usuario' => $usuario,
    'senha'   => password_hash($senha, PASSWORD_DEFAULT),
]);

$_SESSION['status_cadastro'] = 'ok';
header('Location: cadastro.php');
exit;

Por que verificar duplicidade e ter UNIQUE

A verificação dá uma mensagem amigável, mas a garantia real vem da restrição UNIQUE na coluna usuario (já criada no tutorial de login). Em caso de acesso simultâneo, o banco recusa o segundo registro.

Melhorias recomendadas

  • Peça confirmação de e-mail antes de ativar a conta.
  • Adicione um campo de confirmação de senha e um indicador de força.
  • Proteja o formulário com token CSRF e, se necessário, um captcha.
  • Use HTTPS em produção.

Fluxo completo

  1. O usuário se cadastra em cadastro.php.
  2. Entra em index.php (tutorial de login).
  3. Acessa o painel.php, protegido por verifica_login.php.

Mais artigos