Fácil PHP
Conexão e consulta simples com PDO
Enunciado
Crie um script PHP que se conecte a um banco SQLite em memória, crie uma tabela produtos com colunas id (inteiro, chave primária) e nome (texto), insira dois produtos e liste todos os produtos usando fetchAll com o modo padrão PDO::FETCH_ASSOC.
Requisitos
- Usar
new PDO('sqlite::memory:')para conectar. - Configurar
PDO::ATTR_ERRMODEparaPDO::ERRMODE_EXCEPTION. - Inserir pelo menos dois produtos com prepared statements.
- Exibir os produtos no formato
ID: nome.
Código inicial
<?php
// Seu código aqui
Saída esperada
1: Caneta
2: Caderno
Ver dica
Use $pdo->exec() para criar a tabela e $pdo->prepare() + execute() para inserir. Para listar, use $pdo->query('SELECT * FROM produtos')->fetchAll().
Mostrar solução
<?php
// Conexão com SQLite em memória
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// Cria tabela
$pdo->exec('CREATE TABLE produtos (id INTEGER PRIMARY KEY, nome TEXT)');
// Insere produtos com prepared statement
$stmt = $pdo->prepare('INSERT INTO produtos (nome) VALUES (:nome)');
$stmt->execute([':nome' => 'Caneta']);
$stmt->execute([':nome' => 'Caderno']);
// Consulta todos
$stmt = $pdo->query('SELECT id, nome FROM produtos');
$produtos = $stmt->fetchAll();
// Exibe
foreach ($produtos as $p) {
echo $p['id'] . ': ' . $p['nome'] . "\n";
}
Passo a passo
- Criamos a conexão PDO com SQLite em memória usando
new PDO('sqlite::memory:'). - Definimos
PDO::ATTR_ERRMODEcomoPDO::ERRMODE_EXCEPTIONpara que erros gerem exceções. - Também definimos o fetch mode padrão como
PDO::FETCH_ASSOCpara retornar arrays associativos. - Executamos um
CREATE TABLEcomexec(). - Preparamos um
INSERTcom placeholder nomeado:nomee executamos duas vezes com valores diferentes. - Fazemos um
SELECTcomquery()e recuperamos todos os registros comfetchAll(). - Iteramos e imprimimos cada produto no formato
ID: nome.
Por que funciona
O PDO abstrai a conexão e permite usar prepared statements que separam a estrutura SQL dos dados. O fetch mode padrão definido na conexão simplifica o código, pois não precisamos especificar PDO::FETCH_ASSOC a cada fetch.
Erros comuns
- Esquecer de definir
ATTR_ERRMODE: sem isso, erros podem passar silenciosamente. Corrija com$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);. - Usar
fetchAll(PDO::FETCH_ASSOC)mas depois acessar como objeto: resultará em erro. Mantenha consistência. - Não usar prepared statements e concatenar strings: abre brecha para SQL injection.
Outra forma de resolver
Poderia usar foreach ($pdo->query('SELECT ...') as $p) para iterar diretamente, mas fetchAll é mais explícito para iniciantes.
Saída esperada
1: Caneta
2: Caderno