Material organizado para estudo progressivo, com leitura confortável, recursos complementares e navegação para a próxima etapa da disciplina.
Resumo
Aula 5: Foi construído o CRUD de Games, com listagem, cadastro, edição, exclusão e busca de jogos. A aula mostrou onde ficam os métodos no GameController.php, onde ficam as consultas no Game.php, como usar views em app/views/games e como tratar imagem do game por upload ou URL, incluindo campos como título, descrição, preço, estoque e categoria.
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 5 - CRUD completo de Games
Abra o material em tela cheia para estudar com conforto, sem sair da disciplina.
Aula 5 - CRUD completo de Games
100%
Carregando conteúdo interativo...
Aula 5 — CRUD de Games ◀▶ 1 / 0Tela cheia A5 GameStock 2026 V2 · Aula 5 CRUD completo de Games Vamos construir o primeiro CRUD completo do projeto: listar, buscar, cadastrar, editar, excluir e salvar imagem ou URL da imagem do game. Cadastrar Listar Editar Excluir Upload /games Pixel Quest Editar Excluir Cyber Kart Editar Excluir Dungeon Stack Editar Excluir 01 01·Objetivo da Aula O primeiro CRUD completo Listar Mostrar todos os games cadastrados no banco. Cadastrar Inserir novo game com título, preço, estoque e imagem. Editar Carregar dados existentes e atualizar o registro. Excluir e buscar Remover registros e filtrar games pelo título. A5 Resultado esperadoAo final, o painel de games já poderá alimentar a loja pública com dados reais. 02 02·Fluxo CRUD Como o CRUD circula? 1. View Formulário ou botão envia a ação. → 2. Controller Valida dados e chama o Model correto. → 3. Model Executa SQL com PDO e retorna o resultado. GET Usado para listar, buscar e abrir telas. POST Usado para criar, atualizar e excluir dados. Redirect Depois de salvar, redirecione para evitar reenvio de formulário. 03 03·Rotas Rotas do CRUD de Games Rota Método Ação ?url=games GET listar() ?url=games/criar GET criar() ?url=games/salvar POST salvar() ?url=games/editar&id=1 GET editar() ?url=games/atualizar POST atualizar() ?url=games/excluir POST excluir() ! ExclusãoEvite excluir por link GET. Use POST para ações que alteram dados. i BuscaA busca pode ficar em ?url=games&busca=texto, sem criar rota nova. ARQ Onde ficam?criar(), salvar(), editar(), atualizar(), excluir() e tratarImagem() ficam em app/controllers/GameController.php. 04 04·Model Game: listar, buscar e encontrar app/models/Game.php - listar/buscar/buscarPorId PHPCopiar <?php class Game extends BaseModel { public static function listarTodos(): array { $sql = 'SELECT * FROM games ORDER BY titulo ASC'; return self::db()->query($sql)->fetchAll(); } public static function buscarPorTitulo($termo): array { $sql = 'SELECT * FROM games WHERE titulo LIKE :term ORDER BY titulo ASC'; $stmt = self::db()->prepare($sql); $stmt->execute([':term' => '%' . $termo . '%']); return $stmt->fetchAll(); } public static function buscarPorId($id): ?array { $stmt = self::db()->prepare( 'SELECT * FROM games WHERE id = :id LIMIT 1' ); $stmt->execute([':id' => $id]); $game = $stmt->fetch(); return $game ?: null; } } L Listar listarTodos() lista todos os games. B Busca buscarPorTitulo() usa LIKE com consulta preparada. ID Edição buscarPorId() carrega um game específico. 05 05·Cadastrar Cadastrando um game app/models/Game.php - cadastrar() PHPCopiar public static function cadastrar($dados): bool { $sql = 'INSERT INTO games (titulo, descricao, preco, estoque, categoria, imagem, usuario_id) VALUES (:titulo, :descricao, :preco, :estoque, :categoria, :imagem, :usuario_id)'; $stmt = self::db()->prepare($sql); return $stmt->execute([ ':titulo' => $dados['titulo'], ':descricao' => $dados['descricao'], ':preco' => $dados['preco'], ':estoque' => $dados['estoque'], ':categoria' => $dados['categoria'], ':imagem' => $dados['imagem'], ':usuario_id' => $dados['usuario_id'] ]); } C CadastrarO cadastro recebe dados do formulário e insere um novo registro na tabela games. ! UsuárioEnquanto o login não estiver pronto, podemos usar usuario_id = 1 como temporário. 06 06·Atualizar e Excluir Editando e excluindo games app/models/Game.php - atualizar() PHPCopiar public static function atualizar($id, $dados): bool { $sql = 'UPDATE games SET titulo = :titulo, descricao = :descricao, preco = :preco, estoque = :estoque, categoria = :categoria, imagem = :imagem WHERE id = :id'; $stmt = self::db()->prepare($sql); return $stmt->execute([ ':id' => $id, ':titulo' => $dados['titulo'], ':descricao' => $dados['descricao'], ':preco' => $dados['preco'], ':estoque' => $dados['estoque'], ':categoria' => $dados['categoria'], ':imagem' => $dados['imagem'] ]); } app/models/Game.php - excluir() PHPCopiar public static function excluir($id): bool { $stmt = self::db()->prepare( 'DELETE FROM games WHERE id = :id' ); return $stmt->execute([ ':id' => $id ]); } ! CuidadoExcluir remove o registro. Mais tarde podemos trocar por status ativo/inativo. 07 07·Controller Salvando pelo GameController app/controllers/GameController.php - salvar() PHPCopiar public function salvar() { $dados = [ 'titulo' => trim($_POST['titulo'] ?? ''), 'descricao' => trim($_POST['descricao'] ?? ''), 'preco' => $_POST['preco'] ?? 0, 'estoque' => $_POST['estoque'] ?? 0, 'categoria' => trim($_POST['categoria'] ?? ''), 'imagem' => $this->tratarImagem(), 'usuario_id' => 1 ]; Game::cadastrar($dados); header('Location: ' . BASE_URL . '/index.php?url=games'); exit; } 1 Ler POST Dados chegam do formulário de cadastro. 2 Tratar imagem tratarImagem() decide upload ou URL. 3 Chamar Model Game::cadastrar() salva no banco. 4 Redirecionar Evita reenvio do POST ao atualizar a página. 08 08·Editar e Excluir Editar e excluir no Controller app/controllers/GameController.php - editar() e atualizar() PHPCopiar public function editar() { $id = $_GET['id'] ?? null; $game = Game::buscarPorId($id); if (!$game) { http_response_code(404); echo 'Game nao encontrado.'; return; } view('games/editar', [ 'titulo' => 'Editar Game', 'game' => $game ]); } public function atualizar() { $id = $_POST['id'] ?? null; $dados = $this->dadosGameDaRequisicao(); Game::atualizar($id, $dados); header('Location: ' . BASE_URL . '/index.php?url=games'); exit; } app/controllers/GameController.php - excluir() PHPCopiar public function excluir() { $id = $_POST['id'] ?? null; if ($id) { Game::excluir($id); } header('Location: ' . BASE_URL . '/index.php?url=games'); exit; } ARQ Mesmo arquivoeditar(), atualizar(), excluir() e o auxiliar dadosGameDaRequisicao() ficam em app/controllers/GameController.php. 09 09·Imagem Upload ou URL da imagem app/controllers/GameController.php - tratarImagem() PHPCopiar private function tratarImagem(): ?string { if (!empty($_POST['imagem_url'])) { return trim($_POST['imagem_url']); } if ( !isset($_FILES['imagem']) || $_FILES['imagem']['error'] !== UPLOAD_ERR_OK ) { return null; } $ext = pathinfo( $_FILES['imagem']['name'], PATHINFO_EXTENSION ); $fileName = uniqid('game_') . '.' . $ext; $destino = ROOT_PATH . '/public/uploads/games/' . $fileName; move_uploaded_file( $_FILES['imagem']['tmp_name'], $destino ); return $fileName; } URL Imagem externaSe o aluno usar URL, salvamos o endereço no campo imagem. UP UploadSe enviar arquivo, salvamos o nome gerado dentro de public/uploads/games. ! ValidaçãoEm projeto real, valide extensão, tamanho e tipo MIME antes de mover o arquivo. 10 10·Views Lista, busca e ações na View app/views/games/index.php PHP/HTMLCopiar <form method="get" action="<?= BASE_URL ?>/index.php"> <input type="hidden" name="url" value="games"> <input type="text" name="busca" value="<?= htmlspecialchars($busca ?? '') ?>"> <button>Buscar</button> </form> <table> <tbody> <?php foreach ($games as $game): ?> <tr> <td><?= htmlspecialchars($game['titulo']) ?></td> <td>R$ <?= number_format($game['preco'], 2, ',', '.') ?></td> <td> <a href="<?= BASE_URL ?>/index.php?url=games/editar&id=<?= $game['id'] ?>">Editar</a> <form method="post" action="<?= BASE_URL ?>/index.php?url=games/excluir"> <input type="hidden" name="id" value="<?= $game['id'] ?>"> <button>Excluir</button> </form> </td> </tr> <?php endforeach; ?> </tbody> </table> V ViewA View mostra dados e envia ações. Ela não deve executar SQL. ! EscapeUse htmlspecialchars() ao exibir texto vindo do banco. 11 11·Prévia Final Como a página pode ficar? /GameStock2026V2/public/index.php?url=games GameStock Games Usuários Sair Painel administrativo Games cadastrados Novo game Buscar por título... Buscar TOTAL 18 EM ESTOQUE 14 CATEGORIAS 6 CAPA Pixel Quest Aventura · Plataforma 2D R$ 59,90 12 un. EditarExcluir CAPA Cyber Kart Corrida · Futurista R$ 89,90 8 un. EditarExcluir URL Dungeon Stack RPG · Masmorra R$ 74,90 5 un. EditarExcluir UI Navegador fakeEssa é só uma representação visual para guiar o aluno. A implementação real pode usar tabela ou cards. OK Elementos esperadosBusca, botão de cadastro, imagem, título, categoria, preço, estoque e ações de editar/excluir. ! ResponsivoNo celular, essas linhas podem virar cards empilhados para não apertar o conteúdo. 12 12·Exercícios Prática da Aula 5 01 Adicione as rotas games/salvar, games/atualizar e games/excluir no front controller.FACIL▼ Use novos case no switch do public/index.php, chamando salvar(), atualizar() e excluir().Ver dica 02 Implemente Game::cadastrar() usando INSERT com PDO preparado.MEDIO▼ Use placeholders como :titulo, :preco e :categoria.Ver dica 03 Crie a tela games/editar.php preenchendo o formulário com os dados atuais.MEDIO▼ Use $game['titulo'], $game['preco'] e os demais campos como valores do formulário.Ver dica 04 Implemente upload de imagem e mantenha a imagem antiga quando nenhuma nova for enviada.DESAFIO▼ Na edição, envie um campo hidden com a imagem atual. Se não houver novo upload nem URL, use esse valor antigo.Ver dica 13 FIM·Resumo Resumo da Aula 5 01CRUD significa criar, listar, editar e excluir registros. 02O Model Game concentra as operações SQL da tabela games. 03O Controller recebe POST, chama o Model e redireciona após salvar. 04Imagem pode ser URL externa ou arquivo enviado para public/uploads/games. 05A loja pública já pode consumir os games cadastrados pelo painel. Próxima aula Aula 6 — CRUD de Usuários