Material organizado para estudo progressivo, com leitura confortável, recursos complementares e navegação para a próxima etapa da disciplina.
Resumo
Aula 6: Foi criado o CRUD de Usuários, com cadastro de nome, e-mail, senha segura usando password_hash() e perfil de acesso como admin ou editor. A aula explicou os métodos do UserController.php, as consultas do User.php, as telas em app/views/users e também incluiu validações simples com JavaScript no public/assets/js/app.js.
Linguagens de Programação16/04/2026Aula interativa importada
Leitura pensada para estudo, consulta e revisão. Use a navegação lateral para alternar entre etapas da aula.
Estudo
Conteúdo interativo — HTML importado
Aula 6 - CRUD de Usuários
Abra o material em tela cheia para estudar com conforto, sem sair da disciplina.
Aula 6 - CRUD de Usuários
100%
Carregando conteúdo interativo...
Aula 6 — CRUD de Usuarios ◀▶ 1 / 0Tela cheia A6 GameStock 2026 V2 · Aula 6 CRUD completo de Usuarios Vamos criar o CRUD de usuarios do painel: nome, e-mail, senha com password_hash(), perfil de acesso e validacoes simples com JavaScript. Usuarios Senha segura Perfil Validacao JS CRUD /users Ana Souza admin Editar Bruno Lima editor Editar Carla Dias editor Editar 01 01·Objetivo da Aula O que o CRUD de usuarios faz? Listar Mostrar usuarios cadastrados no painel. Cadastrar Salvar nome, e-mail, senha segura e perfil. Editar Atualizar dados e trocar senha apenas se preenchida. Excluir Remover usuarios do painel administrativo. A6 ImportanteO CRUD de usuarios prepara a base para a proxima aula: login, sessao e protecao das paginas administrativas. 02 02·Campos Dados do usuario Campo Tipo Uso id INT Identificador unico. nome VARCHAR Nome exibido no painel. email VARCHAR UNIQUE Usado para login. senha VARCHAR(255) Hash da senha. perfil ENUM admin ou editor. HASH Senha seguraO banco nunca recebe a senha pura. Ele recebe o resultado de password_hash(). PERFIL Nivel de acessoadmin pode gerenciar tudo; editor pode alimentar o cadastro de games. 03 03·Rotas Rotas do CRUD de usuarios Rota Metodo Acao ?url=users GET listar() ?url=users/criar GET criar() ?url=users/salvar POST salvar() ?url=users/editar&id=1 GET editar() ?url=users/atualizar POST atualizar() ?url=users/excluir POST excluir() app/controllers/UserController.php - listar() e criar() PHPCopiar public function listar() { $usuarios = User::listarTodos(); view('users/index', [ 'titulo' => 'Usuarios', 'usuarios' => $usuarios ]); } public function criar() { view('users/criar', [ 'titulo' => 'Novo Usuario' ]); } ARQ ControllerOs metodos listar(), criar(), salvar(), editar(), atualizar() e excluir() ficam em app/controllers/UserController.php. ! ExclusaoAssim como nos games, excluir deve usar POST. 04 04·Model User: listar e buscar app/models/User.php - listar/buscar PHPCopiar <?php class User extends BaseModel { public static function listarTodos(): array { $sql = 'SELECT id, nome, email, perfil FROM usuarios ORDER BY nome ASC'; return self::db()->query($sql)->fetchAll(); } public static function buscarPorId($id): ?array { $stmt = self::db()->prepare( 'SELECT id, nome, email, perfil FROM usuarios WHERE id = :id LIMIT 1' ); $stmt->execute([':id' => $id]); $usuario = $stmt->fetch(); return $usuario ?: null; } public static function buscarPorEmail($email): ?array { $stmt = self::db()->prepare( 'SELECT * FROM usuarios WHERE email = :email LIMIT 1' ); $stmt->execute([':email' => $email]); $usuario = $stmt->fetch(); return $usuario ?: null; } } L Listar listarTodos() alimenta a tela users/index.php. ID Editar buscarPorId() carrega o usuario escolhido. @ E-mail buscarPorEmail() ajuda a evitar e-mail duplicado e sera usado no login. 05 05·Cadastrar Cadastrando usuario com senha segura app/models/User.php - cadastrar() PHPCopiar public static function cadastrar($dados): bool { $senhaHash = password_hash( $dados['senha'], PASSWORD_DEFAULT ); $sql = 'INSERT INTO usuarios (nome, email, senha, perfil) VALUES (:nome, :email, :senha, :perfil)'; $stmt = self::db()->prepare($sql); return $stmt->execute([ ':nome' => $dados['nome'], ':email' => $dados['email'], ':senha' => $senhaHash, ':perfil' => $dados['perfil'] ]); } OK Password hashpassword_hash() cria um hash seguro. O banco guarda o hash, não a senha digitada. PDO Consulta preparadaOs valores entram por placeholders, mantendo o mesmo padrão usado no CRUD de games. @ E-mail unicoAntes de cadastrar, o Controller deve conferir se o e-mail já existe. 06 06·Atualizar e Excluir Atualizando dados e senha opcional app/models/User.php - atualizar() PHPCopiar public static function atualizar($id, $dados): bool { if (!empty($dados['senha'])) { $sql = 'UPDATE usuarios SET nome = :nome, email = :email, senha = :senha, perfil = :perfil WHERE id = :id'; $parametros = [ ':id' => $id, ':nome' => $dados['nome'], ':email' => $dados['email'], ':senha' => password_hash($dados['senha'], PASSWORD_DEFAULT), ':perfil' => $dados['perfil'] ]; } else { $sql = 'UPDATE usuarios SET nome = :nome, email = :email, perfil = :perfil WHERE id = :id'; $parametros = [ ':id' => $id, ':nome' => $dados['nome'], ':email' => $dados['email'], ':perfil' => $dados['perfil'] ]; } $stmt = self::db()->prepare($sql); return $stmt->execute($parametros); } app/models/User.php - excluir() PHPCopiar public static function excluir($id): bool { $stmt = self::db()->prepare( 'DELETE FROM usuarios WHERE id = :id' ); return $stmt->execute([ ':id' => $id ]); } SENHA EdiçãoNa edição, se o campo senha ficar vazio, a senha antiga permanece no banco. ! ExclusãoEm sistemas reais, pode ser melhor inativar o usuario. Nesta aula, vamos praticar o DELETE simples. 07 07·Controller Salvando usuario no UserController app/controllers/UserController.php - salvar() PHPCopiar public function salvar() { $dados = $this->dadosUsuarioDaRequisicao(); if (!$this->validarUsuario($dados, true)) { return; } if (User::buscarPorEmail($dados['email'])) { echo 'E-mail ja cadastrado.'; return; } User::cadastrar($dados); header('Location: ' . BASE_URL . '/index.php?url=users'); exit; } 1 Ler POST dadosUsuarioDaRequisicao() organiza os campos do formulário. 2 Validar Nome, e-mail, senha e perfil passam por regras simples. @ Evitar duplicidade buscarPorEmail() impede dois usuarios com o mesmo e-mail. 4 Redirecionar Depois de salvar, o sistema volta para a lista de usuarios. 08 08·Controller Editar e atualizar usuarios app/controllers/UserController.php - editar() PHPCopiar public function editar() { $id = $_GET['id'] ?? null; $usuario = User::buscarPorId($id); if (!$usuario) { http_response_code(404); echo 'Usuario nao encontrado.'; return; } view('users/editar', [ 'titulo' => 'Editar Usuario', 'usuario' => $usuario ]); } app/controllers/UserController.php - atualizar() PHPCopiar public function atualizar() { $id = $_POST['id'] ?? null; $dados = $this->dadosUsuarioDaRequisicao(); if (!$this->validarUsuario($dados, false)) { return; } $usuarioComEmail = User::buscarPorEmail($dados['email']); if ($usuarioComEmail && $usuarioComEmail['id'] != $id) { echo 'E-mail ja usado por outro usuario.'; return; } User::atualizar($id, $dados); header('Location: ' . BASE_URL . '/index.php?url=users'); exit; } 09 09·Controller Excluir e validar no Controller app/controllers/UserController.php - excluir() PHPCopiar public function excluir() { $id = $_POST['id'] ?? null; if ($id) { User::excluir($id); } header('Location: ' . BASE_URL . '/index.php?url=users'); exit; } POST Botao excluirNa View, a exclusão sai de um formulário POST, não de um link GET. app/controllers/UserController.php - helpers privados PHPCopiar private function dadosUsuarioDaRequisicao(): array { return [ 'nome' => trim($_POST['nome'] ?? ''), 'email' => trim($_POST['email'] ?? ''), 'senha' => $_POST['senha'] ?? '', 'perfil' => $_POST['perfil'] ?? 'editor' ]; } private function validarUsuario($dados, $senhaObrigatoria): bool { if (strlen($dados['nome']) < 3) { echo 'Nome deve ter pelo menos 3 caracteres.'; return false; } if (!filter_var($dados['email'], FILTER_VALIDATE_EMAIL)) { echo 'E-mail invalido.'; return false; } $senhaCurta = !empty($dados['senha']) && strlen($dados['senha']) < 6; if (($senhaObrigatoria && empty($dados['senha'])) || $senhaCurta) { echo 'Senha deve ter pelo menos 6 caracteres.'; return false; } return in_array($dados['perfil'], ['admin', 'editor']); } 10 10·Views Formulario de usuario app/views/users/criar.php ou app/views/users/editar.php PHP/HTMLCopiar <?php $editando = isset($usuario); $acao = $editando ? 'users/atualizar' : 'users/salvar'; ?> <form data-form-usuario method="post" action="<?= BASE_URL ?>/index.php?url=<?= $acao ?>"> <?php if ($editando): ?> <input type="hidden" name="id" value="<?= $usuario['id'] ?>"> <?php endif; ?> <input type="text" name="nome" value="<?= htmlspecialchars($usuario['nome'] ?? '') ?>" placeholder="Nome"> <input type="email" name="email" value="<?= htmlspecialchars($usuario['email'] ?? '') ?>" placeholder="E-mail"> <input type="password" name="senha" data-senha-obrigatoria="<?= isset($usuario) ? '0' : '1' ?>" placeholder="Senha"> <select name="perfil"> <option value="editor" <?= ($usuario['perfil'] ?? 'editor') === 'editor' ? 'selected' : '' ?>>Editor</option> <option value="admin" <?= ($usuario['perfil'] ?? '') === 'admin' ? 'selected' : '' ?>>Administrador</option> </select> <button type="submit">Salvar usuario</button> </form> ARQ Onde ficaUse esse formulario em app/views/users/criar.php e também em app/views/users/editar.php. A variável $acao escolhe salvar ou atualizar. JS MarcadorO atributo data-form-usuario deixa o JavaScript encontrar esse formulario sem depender de classe visual. EDIT Senha opcionalNa edição, envie também um campo hidden com o id do usuario. 11 11·JavaScript Validação simples no front-end public/assets/js/app.js - validacao do formulario JSCopiar const formUsuario = document.querySelector('[data-form-usuario]'); if (formUsuario) { formUsuario.addEventListener('submit', function (event) { const mensagens = []; const nome = this.nome.value.trim(); const email = this.email.value.trim(); const senha = this.senha.value; const perfil = this.perfil.value; const senhaObrigatoria = this.senha.dataset.senhaObrigatoria === '1'; if (nome.length < 3) { mensagens.push('Informe um nome com pelo menos 3 letras.'); } if (!email.includes('@') || !email.includes('.')) { mensagens.push('Informe um e-mail valido.'); } if ((senhaObrigatoria || senha) && senha.length < 6) { mensagens.push('A senha deve ter pelo menos 6 caracteres.'); } if (!['admin', 'editor'].includes(perfil)) { mensagens.push('Escolha um perfil valido.'); } if (mensagens.length > 0) { event.preventDefault(); alert(mensagens.join('\n')); } }); } UX Resposta rapidaA validação no navegador avisa antes de mandar dados incompletos para o PHP. PHP Nao substitui o back-endMesmo com JavaScript, o PHP continua validando. O usuario pode desativar JS no navegador. 12 12·Prévia Final Como a tela de usuarios pode ficar? /GameStock2026V2/public/index.php?url=users GameStock Games Usuarios Sair Painel administrativo Usuarios cadastrados Novo usuario Buscar por nome ou e-mail... Buscar Nome E-mail Perfil Acoes Ana Souza ana@gamestock.com admin EditarExcluir Bruno Lima bruno@gamestock.com editor EditarExcluir Carla Dias carla@gamestock.com editor EditarExcluir UI Navegador fakeEssa representação ajuda a visualizar o resultado final do CRUD de usuarios. OK Elementos esperadosLista de usuarios, botão de cadastro, busca, perfil e ações de editar/excluir. LOGIN Próximo passoEsses usuarios serão usados para autenticar o painel administrativo. 13 13·Exercícios Prática da Aula 6 01 Crie a rota users no public/index.php e chame UserController::listar().FACIL▼ Siga o mesmo padrão usado nas rotas de games.Ver dica 02 Implemente User::cadastrar() usando password_hash().MEDIO▼ Nunca salve $_POST['senha'] direto no banco. Gere o hash antes do INSERT.Ver dica 03 Monte app/views/users/index.php com tabela, botão editar e formulário POST para excluir.MEDIO▼ Exiba nome, e-mail e perfil. Use htmlspecialchars() nos textos.Ver dica 04 Adicione validação com JavaScript para nome, e-mail, senha e perfil.DESAFIO▼ Use data-form-usuario para localizar o formulário e event.preventDefault() quando houver erro.Ver dica FIM FIM·Resumo Resumo da Aula 6 01Criamos o CRUD de usuarios seguindo o mesmo MVC do CRUD de games. 02O Model User concentra INSERT, UPDATE, DELETE e consultas da tabela usuarios. 03A senha sempre passa por password_hash() antes de ser salva. 04O perfil admin ou editor prepara o projeto para controle de acesso. 05A validação JS melhora a experiência, mas o PHP continua sendo obrigatório. Próxima aula Aula 7 — Login, sessão e proteção