Material organizado para estudo progressivo, com leitura confortável, recursos complementares e navegação para a próxima etapa da disciplina.
Resumo
Aula 4: A aula foi focada na conexão com banco de dados usando PDO e MySQL, com a criação do Database.php, configuração do projeto e uso do BaseModel.php para centralizar o acesso ao banco. Também foram apresentados exemplos de consultas reais com prepared statements, preparando o sistema para os CRUDs.
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 4 - PDO e Conexão com MySQL
Abra o material em tela cheia para estudar com conforto, sem sair da disciplina.
Aula 4 - PDO e Conexão com MySQL
100%
Carregando conteúdo interativo...
Aula 4 — PDO e MySQL ◀▶ 1 / 0Tela cheia A4 GameStock 2026 V2 · Aula 4 PDO e Conexão com MySQL Agora o GameStock deixa de usar dados mockados e começa a conversar com o banco de dados usando PHP 8, PDO e consultas preparadas. PDO MySQL Database.php BaseModel Prepared statements PDO Model Game::all() PDO prepare() / execute() MySQL tabela games 01 01·Objetivo da Aula O que vamos entregar? Banco criado Base gamestock2026_v2 com tabelas iniciais. Database.php Classe central para abrir conexão com PDO. BaseModel Models passam a acessar a conexão do banco. Primeiras queries Listar e buscar games usando SQL real. A4 Virada do projetoNa Aula 3 usamos arrays. Nesta aula, os dados passam a vir do MySQL, mantendo o mesmo fluxo MVC. 02 02·Por que PDO? PDO é a ponte segura PHP O controller chama um model, como Game::all(). → PDO Executa SQL, trata erros e retorna os registros. → MySQL Armazena usuários, games, estoque e preços. Portável PDO é uma API padronizada para acessar bancos em PHP. Seguro Consultas preparadas reduzem risco de SQL Injection. Organizado A conexão fica centralizada em uma classe. 03 03·SQL Inicial Banco e tabelas principais phpMyAdmin / SQL SQLCopiar CREATE DATABASE IF NOT EXISTS gamestock2026_v2 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE gamestock2026_v2; CREATE TABLE usuarios ( id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(120) NOT NULL, email VARCHAR(160) NOT NULL UNIQUE, senha VARCHAR(255) NOT NULL, perfil ENUM('admin', 'editor') DEFAULT 'editor' ); CREATE TABLE games ( id INT AUTO_INCREMENT PRIMARY KEY, titulo VARCHAR(160) NOT NULL, descricao TEXT NOT NULL, preco DECIMAL(10,2) NOT NULL, estoque INT NOT NULL DEFAULT 0, categoria VARCHAR(80) NOT NULL, imagem VARCHAR(255) DEFAULT NULL, usuario_id INT NOT NULL ); Campo Por quê preco DECIMAL Valores financeiros. senha VARCHAR(255) Hash gerado pelo PHP. imagem Nome do arquivo enviado. usuario_id Relação com quem cadastrou. ! SenhaO usuário admin será criado com PHP usando password_hash(), não com senha em texto puro. 04 04·Configuração Credenciais no config.php app/config/config.php PHPCopiar <?php define('ROOT_PATH', dirname(__DIR__, 2)); define('APP_PATH', ROOT_PATH . '/app'); define('VIEW_PATH', APP_PATH . '/views'); define('BASE_URL', '/GameStock2026V2/public'); // Configuracao do banco local no XAMPP define('DB_HOST', 'localhost'); define('DB_NAME', 'gamestock2026_v2'); define('DB_USER', 'root'); define('DB_PASS', ''); define('DB_CHARSET', 'utf8mb4'); CFG CentralizarAs credenciais ficam em um ponto só, evitando repetir host, usuário e nome do banco. ! ProduçãoEm projeto real, senha e credenciais não devem ficar expostas no repositório. Aqui é ambiente didático local. 05 05·Classe de Conexão Criando o Database.php app/config/Database.php PHPCopiar <?php class Database { private static ?PDO $connection = null; public static function getConnection(): PDO { if (self::$connection === null) { $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET; try { self::$connection = new PDO($dsn, DB_USER, DB_PASS); self::$connection->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); self::$connection->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC ); } catch (PDOException $e) { die('Erro ao conectar no banco: ' . $e->getMessage()); } } return self::$connection; } } 1 DSN String que informa banco, host, nome da base e charset. 2 Exception Erros de banco aparecem como exceções. 3 FETCH_ASSOC Resultados chegam como array associativo. 4 Reuso A conexão é criada uma vez e reaproveitada. 06 06·BaseModel Models usando a conexão app/models/BaseModel.php PHPCopiar <?php abstract class BaseModel { protected static function db(): PDO { return Database::getConnection(); } } OK ResponsabilidadeO BaseModel não sabe listar games nem usuários. Ele só entrega a conexão para os models filhos. i ExemploDepois, Game herda de BaseModel e usa self::db() para consultar a tabela games. 07 07·Teste Testando a conexão public/teste-conexao.php PHPCopiar <?php require_once __DIR__ . '/../app/config/config.php'; require_once APP_PATH . '/config/Database.php'; try { $pdo = Database::getConnection(); $stmt = $pdo->query('SELECT NOW() AS agora'); $resultado = $stmt->fetch(); echo 'Conexao OK: ' . $resultado['agora']; } catch (Exception $e) { echo 'Erro: ' . $e->getMessage(); } Se aparecer Significa Conexao OK PDO abriu conexão. Unknown database Banco não foi criado. Access denied Usuário ou senha errados. could not find driver Extensão PDO MySQL desativada. ! Arquivo temporárioO teste ajuda na aula, mas depois pode ser removido ou protegido. 08 08·Model Real Listando games com PDO app/models/Game.php PHPCopiar <?php class Game extends BaseModel { public static function all(): array { $sql = 'SELECT * FROM games ORDER BY titulo ASC'; $stmt = self::db()->query($sql); return $stmt->fetchAll(); } public static function find($id): ?array { $sql = 'SELECT * FROM games WHERE id = :id LIMIT 1'; $stmt = self::db()->prepare($sql); $stmt->execute([':id' => $id]); $game = $stmt->fetch(); return $game ?: null; } } 1 all() Busca todos os games para a vitrine e painel. 2 query() Pode ser usada quando não há parâmetros externos. 3 prepare() Deve ser usada quando existe dado vindo da URL, formulário ou usuário. 09 09·Busca Segura Pesquisando por nome Game::search() PHPCopiar public static function search($term): array { $sql = 'SELECT * FROM games WHERE titulo LIKE :term ORDER BY titulo ASC'; $stmt = self::db()->prepare($sql); $stmt->execute([ ':term' => '%' . $term . '%' ]); return $stmt->fetchAll(); } OK Consulta preparadaO valor buscado não é colado diretamente no SQL. Ele entra como parâmetro. ! EviteNunca monte SQL assim: "... WHERE titulo = '$term'". Isso abre porta para SQL Injection. 10 10·Integração MVC Controller usando o Model real app/controllers/GameController.php PHPCopiar <?php class GameController { public function index() { $busca = $_GET['busca'] ?? ''; if ($busca !== '') { $games = Game::search($busca); } else { $games = Game::all(); } view('games/index', [ 'titulo' => 'Loja de Games', 'games' => $games, 'busca' => $busca ]); } } MVC Fluxo mantidoO controller continua chamando o model e carregando a view. A diferença é que agora o model consulta o MySQL. ! ValidaçãoMesmo usando PDO, ainda precisamos validar campos, tipos e regras antes de salvar dados. 11 11·Exercícios Prática da Aula 4 01 Crie o banco gamestock2026_v2 no phpMyAdmin e rode o SQL inicial.FACIL▼ Use a aba SQL do phpMyAdmin e confira se as tabelas usuarios e games apareceram.Ver dica 02 Implemente a classe Database com getConnection().MEDIO▼ Use DSN, PDO::ATTR_ERRMODE e PDO::FETCH_ASSOC.Ver dica 03 Troque o array fake do Model Game por uma consulta SELECT.MEDIO▼ Crie o método all() chamando self::db()->query().Ver dica 04 Crie uma busca por título usando prepare() e LIKE.DESAFIO▼ Use WHERE titulo LIKE :term e envie '%' . $term . '%' no execute.Ver dica 12 FIM·Resumo Resumo da Aula 4 01PDO é a ponte entre PHP e MySQL no GameStock. 02As credenciais ficam em config.php e a conexão em Database.php. 03BaseModel centraliza o acesso à conexão para os models filhos. 04Use query() em consultas sem entrada externa e prepare() quando houver parâmetros. 05A vitrine agora pode listar games vindos do banco real. Próxima aula Aula 5 — CRUD de Games