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
- O usuário se cadastra em
cadastro.php. - Entra em
index.php(tutorial de login). - Acessa o
painel.php, protegido porverifica_login.php.
